diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 654e007d89..0000000000 --- a/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "presets": ["env"], - "plugins": ["syntax-dynamic-import"] -} \ No newline at end of file diff --git a/.deployignore b/.deployignore new file mode 100644 index 0000000000..d2b01a8e0b --- /dev/null +++ b/.deployignore @@ -0,0 +1,14 @@ +.deployignore +.editorconfig +.github +.github/** +.htaccess +.vscode +.vscode/** +composer.json +package-lock.json +package.json +postcss.config.js +README.md +scripts +uglify.json diff --git a/.editorconfig b/.editorconfig index d2d7f0fbe1..3caa99f9c1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,6 +11,9 @@ insert_final_newline = true indent_size = 4 trim_trailing_whitespace = false +[*.twig] +indent_size = 2 + [site/templates/**.php] indent_size = 2 diff --git a/.github/workflows/algolia.yml b/.github/workflows/algolia.yml deleted file mode 100644 index 2fef6d9d1a..0000000000 --- a/.github/workflows/algolia.yml +++ /dev/null @@ -1,29 +0,0 @@ -# Updates the Algolia search index on all content changes - -name: Update Algolia index -on: - push: - branches: - - master - paths: - - content/**.txt - - site/config/algolia.php - - site/models/** - - site/plugins/** - -jobs: - algolia: - name: Update Algolia index - runs-on: ubuntu-latest - - steps: - - name: Cancel previous workflow runs - uses: styfle/cancel-workflow-action@0.7.0 - - - name: Checkout - uses: actions/checkout@v2 - - - name: Update the Algolia index - run: scripts/algolia-index - env: - ALGOLIA_KEY: ${{ secrets.ALGOLIA_KEY }} diff --git a/.gitignore b/.gitignore index 494ba3990b..d6c7fdd87c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,74 @@ -node_modules -.vscode -.idea +# System files +# ------------ + +Icon .DS_Store -/backstop_data -/www/media -/site/accounts -/site/cache -/site/config/keys + +# Temporary files +# --------------- + +/media/* +!/media/index.html +/node_modules/ + +# Plugin cruft +# --------------- + +/site/plugins/*/vendor/**/.* +/site/plugins/*/vendor/**/*.json +/site/plugins/*/vendor/**/*.txt +/site/plugins/*/vendor/**/*.md +/site/plugins/*/vendor/**/*.yml +/site/plugins/*/vendor/**/*.yaml +/site/plugins/*/vendor/**/*.xml +/site/plugins/*/vendor/**/*.dist +/site/plugins/*/vendor/**/*.php_cs +/site/plugins/*/vendor/**/readme.php +/site/plugins/*/vendor/**/COPYING +/site/plugins/*/vendor/**/COMMITMENT +/site/plugins/*/vendor/**/VERSION +/site/plugins/*/vendor/**/.github/* +/site/plugins/*/vendor/**/.circleci/* +/site/plugins/*/vendor/**/docs/* +/site/plugins/*/vendor/**/example/* +/site/plugins/*/vendor/**/examples/* +/site/plugins/*/vendor/**/test/* +/site/plugins/*/vendor/**/tests/* +/site/plugins/*/vendor/**/php4/* +/site/plugins/ray + + +# Lock files +# --------------- +.lock + +# -------------SECURITY------------- +# NEVER publish these files via Git! +# -------------SECURITY------------- + +# Cache Files +# --------------- + +/site/cache/* +!/site/cache/index.html + +# Config +# ------ + +/site/config/keys/* + +# Accounts +# --------------- + +/site/accounts/* +!/site/accounts/index.html + +# Sessions +# --------------- + +/site/sessions/* +!/site/sessions/index.html + +# License +# --------------- /site/config/.license -/site/sessions -/backstop.json -/config.json diff --git a/.htaccess b/.htaccess new file mode 100755 index 0000000000..95d626c8cf --- /dev/null +++ b/.htaccess @@ -0,0 +1,64 @@ +# Kirby .htaccess +# revision 2020-06-15 + +# rewrite rules + + +# enable awesome urls. i.e.: +# http://yourdomain.com/about-us/team +RewriteEngine on + +# make sure to set the RewriteBase correctly +# if you are running the site in a subfolder; +# otherwise links or the entire site will break. +# +# If your homepage is http://yourdomain.com/mysite, +# set the RewriteBase to: +# +# RewriteBase /mysite + +# In some environments it's necessary to +# set the RewriteBase to: +# +# RewriteBase / + +# block files and folders beginning with a dot, such as .git +# except for the .well-known folder, which is used for Let's Encrypt and security.txt +RewriteRule (^|/)\.(?!well-known\/) index.php [L] + +# block all files in the content folder from being accessed directly +RewriteRule ^content/(.*) index.php [L] + +# block all files in the site folder from being accessed directly +RewriteRule ^site/(.*) index.php [L] + +# block direct access to Kirby and the Panel sources +RewriteRule ^kirby/(.*) index.php [L] + +# make site links work +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^(.*) index.php [L] + + + +# pass the Authorization header to PHP +SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 + +# Make sure cache gets revalidated for JS modules + + +Header set Cache-Control "no-cache" + + + +# compress text file responses + +AddOutputFilterByType DEFLATE text/plain +AddOutputFilterByType DEFLATE text/html +AddOutputFilterByType DEFLATE text/css +AddOutputFilterByType DEFLATE text/javascript +AddOutputFilterByType DEFLATE application/json +AddOutputFilterByType DEFLATE application/javascript +AddOutputFilterByType DEFLATE application/x-javascript + diff --git a/.stylelintrc b/.stylelintrc deleted file mode 100644 index cd296e250f..0000000000 --- a/.stylelintrc +++ /dev/null @@ -1,38 +0,0 @@ -{ - "extends": "stylelint-config-standard", - - "plugins": [ - "stylelint-scss", - "stylelint-order" - ], - - "rules": { - "number-leading-zero": "never", - "at-rule-no-unknown": null, - "selector-list-comma-newline-after": null, - "no-descending-specificity": null, - "selector-descendant-combinator-no-non-space": null, - "selector-attribute-quotes": "always", - "string-quotes": "double", - "function-url-quotes": "always", - "at-rule-empty-line-before": [ - "always", { - "ignore": ["after-comment"], - "ignoreAtRules": [ "else", "import", "include" ], - } - ], - "block-opening-brace-space-before": "always", - "block-closing-brace-newline-after": [ - "always", { - "ignoreAtRules": [ "if", "else", "error", "warn", "info" ] - } - ], - "at-rule-name-space-after": "always", - - "order/order": [ - "custom-properties", - "declarations" - ], - "order/properties-alphabetical-order": true - } -} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..1e003ad344 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "[markdown]": { + "editor.wordWrap": "on", + "editor.quickSuggestions": false + }, + "files.associations": { + "*.txt": "markdown" + } +} diff --git a/README.md b/README.md index 8da455f75f..5bd12f0fa1 100644 --- a/README.md +++ b/README.md @@ -5,113 +5,15 @@ This repo contains the whole website. ## Requirements - Local development server running PHP 7.3+ (e.g. Apache, nginx, MAMP). -- Node.js 10+ (LTS release) + NPM ## Installation and setup -### Step 1: Clone the repo into an empty folder +Clone the repo into an empty folder ``` git clone git@github.com:getkirby/getkirby.com.git ``` -### Step 2: Install dependencies - -``` -npm install -``` - -### Step 3: Configuration - -We are using [Laravel Mix](https://laravel.com/docs/5.6/mix) as our build tool, -which also provides BrowserSync for an optimal developer experience. By default, -it expects a copy of the site to run at `http://getkirby.test`. The document root -of the site is the subfolder `www/`. - -You can override the default domain if you prefer to run the site -at a different domain. To do so, just copy `config.default.json` to a file -named `config.json`. You can define a custom domain that new file. - -## Start the build tool for development - -``` -cd [root folder of this repo] -npm start -``` - -This will run BrowserSync and watch your CSS, JS and template files for changes. - -Stop the server by pressing `CRTL+C` or by closing the CLI window. - -## Build for production - -Before committing anything back to the repo, make sure to run a production build, -as our server does not build assets by itself. It’s always a good idea to lint -your code, before committing anything to the repo. You can do so, by running the -dedicated lint task: - -``` -npm run lint -``` - -If the linters do not produce any errors, you can create a production build, as -follows: - -``` -npm run build -``` - -## Linters - -Our site uses `eslint` and `stylelint` for keeping the contents of JS and SCSS -files consistent. It is highly recommended that you intall the corresponding -integration plugin for your editor or IDE. If your development tool of choice -does not offer the corresponding integration, you can alternatively run the -linters manually before commiting anything back to the repository, by executing: - -``` -npm run lint -``` - -## Visual regression tests - -When refactoring and style sheets or for testing how any change will affect the -site appearance, you are encouraged to use the integrated backstop testing. First -of all, you have to create a local configuration. To generate the tests, run: - -``` -npm run backstop-config -```` - -This will create a file called `backstop.json` within your project root. To -generate reference screenshots of the site, run: - -``` -npm run backstop-reference -``` - -After your reference has been generated (this will take a while), make your -changes to to any CSS file, template or anything else that could affect page -appearance. Now, run: - -``` -npm run backstop-test -``` - -This will generate a second set of screenshots. Backstop will compare these to -the reference set of screenshots and open a report in your browser after the -process has finished, allowing you to revisit every change. - -To open the report again, run: - -``` -npm run backstop-report -``` - -The testing scenarios for Backstop are defined in `site/plugins/backstop/index.php`, -in case you want to add a new template and add a page where it’s acutally used -to the scenarios. - ## Metadata for search engines and social media -See `site/plugins/meta/README.md` for further information. +See [`site/plugins/meta/README.md`](/site/plugins/meta/README.md) for further information. diff --git a/assets/css/framework/aspect-ratio.css b/assets/css/framework/aspect-ratio.css new file mode 100644 index 0000000000..ddbeee9279 --- /dev/null +++ b/assets/css/framework/aspect-ratio.css @@ -0,0 +1,25 @@ +[style*="--aspect-ratio"] { + aspect-ratio: var(--aspect-ratio); + object-fit: cover; +} + +@supports not (aspect-ratio) { + [style*="--aspect-ratio"] { + position: relative; + } + [style*="--aspect-ratio"]::before { + content: ""; + display: block; + padding-bottom: calc(100% / (var(--aspect-ratio))); + } + [style*="--aspect-ratio"] > :first-child { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + height: 100%; + width: 100%; + object-fit: cover; + } +} diff --git a/assets/css/framework/buttons.css b/assets/css/framework/buttons.css new file mode 100644 index 0000000000..e16e9206a1 --- /dev/null +++ b/assets/css/framework/buttons.css @@ -0,0 +1,44 @@ +:root { + --btn-bg: var(--color-black); + --btn-color: var(--color-black); + --btn-filled-bg: var(--color-black); + --btn-filled-color: var(--color-white); +} + +button { + overflow: hidden; + text-overflow: ellipsis; +} + +.btn { + display: inline-flex; + padding: .5rem 1.5rem; + align-items: center; + justify-content: center; + font-size: var(--text-sm); + color: var(--btn-color); + cursor: pointer; + border: 2px solid transparent; + border-radius: var(--rounded-xs); + font-family: var(--font-mono); + white-space: nowrap; + background: none; +} +.btn svg { + margin-right: .75rem; +} +.btn--outlined { + border-color: var(--btn-bg); +} +.btn--outlined.btn--white { + border-color: var(--color-white); + color: var(--color-white); +} +.btn--filled { + border-color: var(--btn-filled-bg); + background: var(--btn-filled-bg); + color: var(--btn-filled-color) !important; +} +.btn--filled svg { + color: var(--color-yellow-500); +} diff --git a/assets/css/framework/code.css b/assets/css/framework/code.css new file mode 100644 index 0000000000..f8a54ef0fe --- /dev/null +++ b/assets/css/framework/code.css @@ -0,0 +1,64 @@ +.code-token.code-punctuation, +.code-token.code-comment, +.code-token.code-doctype { + color: var(--color-gray-500); +} +.code-token.code-tag, +.code-token.code-markup, +.code-token.code-variable, +.code-token.code-this, +.code-token.code-selector, +.code-token.code-key, +.code-token.code-kirbytag-bracket, +.code-token.code-prolog, +.code-token.code-delimiter { + color: var(--color-red-500); +} +.code-token.code-constant, +.code-token.code-number, +.code-token.code-boolean, +.code-token.code-boolean.code-important, +.code-token.code-attr-name, +.code-token.code-kirbytag-attr, +.code-token.code-kirbytag-name, +.code-token.code-entity, +.code-token.code-bold, +.code-token.code-bold > .code-punctuation { + color: var(--color-orange-400); +} +.code-token.code-keyword, +.code-token.code-italic, +.code-token.code-italic > .code-punctuation { + color: var(--color-purple-400); +} +.code-token.code-function { + color: var(--color-blue-400); +} +.code-token.code-operator, +.code-token.code-title { + color: var(--color-aqua-400); +} +.code-token.code-string, +.code-token.code-attr-value, +.code-token.code-attr-value .code-punctuation, +.code-token.code-list.code-punctuation { + color: var(--color-green-400); +} +.code-token.code-scope, +.code-token.code-class-name, +.code-token.code-property, +.code-token.code-url { + color: var(--color-yellow-400); +} +.code-token.code-title, +.code-token.code-kirbytag-bracket, +.code-token.code-list.code-punctuation, +.code-token.code-bold { + font-weight: var(--font-bold); +} +.code-token.code-title .code-punctuation { + color: var(--color-gray-300); +} +.code-token.code-italic { + font-style: italic; +} diff --git a/assets/css/framework/debug.css b/assets/css/framework/debug.css new file mode 100644 index 0000000000..681504bcb5 --- /dev/null +++ b/assets/css/framework/debug.css @@ -0,0 +1,20 @@ +.debug .container::before, +.debug .container::after { + content: ""; + position: absolute; + top: 0; + width: var(--spacing-6); + bottom: 0; + background: red; + opacity: .5; +} +.debug .container::before { + left: 0; +} +.debug .container::after { + right: 0; +} + +.todo { + outline: 1px solid red; +} diff --git a/assets/css/framework/grid.css b/assets/css/framework/grid.css new file mode 100644 index 0000000000..f0d167b540 --- /dev/null +++ b/assets/css/framework/grid.css @@ -0,0 +1,62 @@ +.columns { + --columns: 12; + --columns-sm: 1; + --gap: var(--spacing-6); + --column-gap: var(--gap); + --row-gap: var(--gap); + display: grid; + grid-column-gap: var(--column-gap); + grid-row-gap: var(--row-gap); + grid-template-columns: repeat(var(--columns-sm), 1fr); +} +.columns > * { + --span: 1; + --span-sm: 1; + grid-column: span var(--span-sm); + min-width: 0; +} +.columns--reverse { + direction: rtl; +} +.columns--reverse > * { + direction: ltr; +} + +@media screen and (min-width: 40rem) { + .columns { + --columns-md: var(--columns); + grid-template-columns: repeat(var(--columns-md), 1fr); + } + .columns > * { + --span-md: var(--span); + grid-column: span var(--span-md); + } +} + +@media screen and (min-width: 72rem) { + .columns { + --columns-lg: var(--columns); + grid-template-columns: repeat(var(--columns-lg), 1fr); + } + .columns > * { + --span-lg: var(--span); + grid-column: span var(--span-lg); + } +} + +.auto-fill, +.auto-fit { + --min: 13rem; + --max: 1fr; + --gap: var(--spacing-6); + --column-gap: var(--gap); + --row-gap: var(--gap); + display: grid; + grid-column-gap: var(--column-gap); + grid-row-gap: var(--row-gap); + grid-template-columns: repeat(auto-fill, minmax(var(--min), var(--max))); +} +.auto-fit { + grid-template-columns: repeat(auto-fit, minmax(var(--min), var(--max))); +} + diff --git a/assets/css/framework/headings.css b/assets/css/framework/headings.css new file mode 100644 index 0000000000..df245df4a9 --- /dev/null +++ b/assets/css/framework/headings.css @@ -0,0 +1,47 @@ +.h1, +.prose h1 { + font-size: var(--text-h1); + line-height: 1; +} +.h2, +.prose h2 { + font-size: var(--text-3xl); + line-height: 1.125; +} +.h3, +.prose h3 { + font-size: var(--text-xl); + line-height: var(--leading-tight); +} +.h4, +.prose h4 { + font-size: var(--text-lg); + line-height: var(--leading-snug); + font-weight: 500; +} +.h5, +.prose h5 { + font-size: var(--text-base); + font-weight: 500; +} +.h6, +.prose h6 { + font-size: var(--text-sm); + font-family: var(--font-mono); +} + +.h1 code, +.h2 code, +.h3 code, +.h4 code, +.h5 code, +.h6 code, +.prose h1 code, +.prose h2 code, +.prose h3 code, +.prose h4 code, +.prose h5 code, +.prose h6 code { + font-size: .875em; + font-weight: 400; +} diff --git a/assets/css/framework/masonry.css b/assets/css/framework/masonry.css new file mode 100644 index 0000000000..04b3570852 --- /dev/null +++ b/assets/css/framework/masonry.css @@ -0,0 +1,27 @@ +.masonry { + --columns: 4; + --columns-sm: 1; + --columns-md: 2; + --gap: var(--spacing-6); + columns: var(--columns-sm); + column-gap: var(--gap); +} +.masonry > * { + display: inline-block; + break-inside: avoid; + margin-bottom: var(--gap); +} + +@media screen and (min-width: 40rem) { + .masonry { + columns: var(--columns-md); + } +} + +@media screen and (min-width: 72rem) { + .masonry { + --columns-lg: var(--columns); + columns: var(--columns-lg); + } +} + diff --git a/assets/css/framework/overlay.css b/assets/css/framework/overlay.css new file mode 100644 index 0000000000..5fe3243e62 --- /dev/null +++ b/assets/css/framework/overlay.css @@ -0,0 +1,19 @@ +.overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: grid; + place-items: center; + width: 100%; + height: 100%; + background: var(--color-backdrop); +} +dialog.overlay { + display: none; +} +dialog.overlay[open] { + display: grid; +} diff --git a/assets/css/framework/prose.css b/assets/css/framework/prose.css new file mode 100644 index 0000000000..6de3d0a9e7 --- /dev/null +++ b/assets/css/framework/prose.css @@ -0,0 +1,285 @@ +:root { + --prose-code-bg: rgba(0,0,0, .1); + --prose-pre-bg: var(--color-black); + --prose-size: var(--text-xl); + --prose-color-text: var(--color-gray-700); + --prose-color-highlight: var(--color-black); +} + +.prose { + font-size: var(--prose-size); + line-height: var(--leading-normal); + color: var(--prose-color-text); +} + +/* Links */ +.prose a { + color: var(--prose-color-highlight); + max-width: 100%; + word-break: break-word; +} + +/* Special elements */ +.prose abbr { + text-decoration: none; +} +.prose abbr a { + text-decoration-color: var(--color-gray-500); + text-decoration-style: dotted; + cursor: help; +} +.prose strong { + font-weight: var(--font-semibold); +} + +/* Highlight elements */ +.prose h1, +.prose h2, +.prose h3, +.prose h4, +.prose h5, +.prose h6, +.prose .intro, +.prose strong, +.prose em, +.prose b { + color: var(--prose-color-highlight); +} + +/* Margins */ +.prose > :first-child { + padding-top: 0; + margin-top: 0; +} +.prose > :last-child { + margin-bottom: 0; +} +.prose * + blockquote, +.prose * + .box, +.prose * + .code, +.prose * + .columns, +.prose * + .filesystem, +.prose * + h4, +.prose * + h5, +.prose * + hr, +.prose * + nav, +.prose * + p, +.prose * + ol, +.prose * + ul, +.prose * + .screencast, +.prose * + .since, +.prose * + .table { + margin-top: 1.5em; +} + + +/* Lists */ +.prose li::marker { + color: var(--prose-color-highlight); +} +.prose ul { + margin-left: 1em; +} +.prose ol { + margin-left: 1.5em; +} +.prose ol p, +.prose ul p { + margin-top: 0; +} +.prose ol > li { + list-style: decimal-leading-zero; + padding-left: .25em; +} +.prose ol > li::marker { + font-variant-numeric: tabular-nums; + font-weight: var(--font-bold); + font-size: var(--text-xs); + font-family: var(--font-mono); +} +.prose ul > li { + list-style: disc; +} +.prose ul ul > li { + list-style: circle; +} + +/** Headings **/ +.prose h1 a, +.prose h2 a, +.prose h3 a, +.prose h4 a, +.prose h5 a, +.prose h6 a { + color: inherit; + text-decoration: none; +} +.prose h2, +.prose h3 { + scroll-margin-top: var(--spacing-6); +} +.prose h2 { + font-size: 1.625em; + line-height: 1.15em; +} +.prose * + h2 { + margin-top: 3em; +} +.prose h3 { + font-size: 1.25em; +} +.prose * + h3 { + margin-top: 3em; +} +.prose h2 + h3 { + margin-top: 1.5em; +} +.prose h4 { + font-size: 1em; + font-weight: var(--font-normal); +} +.prose * + h4 { + margin-top: 3em; +} +.prose h4 + * { + margin-top: var(--spacing-3); +} + +/** Code **/ +.prose :not(pre) > code { + font-family: var(--font-mono); + display: inline-flex; + font-size: .825em; + max-width: 100%; + padding: 0 var(--spacing-2); + border-radius: 3px; + background: var(--prose-code-bg); + color: var(--prose-color-highlight); + white-space: nowrap; + overflow-y: hidden; + overflow-x: auto; +} +.prose code a { + text-decoration: none; + color: inherit; +} + +/** Codeblocks **/ + +/** Blockquotes **/ +.prose > blockquote { + margin: 3em 0; +} +.prose > blockquote p { + border-left: 2px solid #000; + padding-left: .75rem; + max-width: 20em; + font-size: 1.25em; + line-height: var(--leading-snug); + color: var(--prose-color-highlight); +} + + +/** Horizontal Rule **/ +.hr { + height: var(--spacing-2px); + background: currentColor; + width: var(--spacing-4); +} + +/** Definition Lists **/ +.prose dt { + font-weight: var(--font-bold); +} + +.prose p, +.prose ul, +.prose ol, +.prose blockquote, +.prose h1, +.prose h2, +.prose h3, +.prose h4, +.prose h5, +.prose h6, +.prose .box { + max-width: 42rem; +} + +/** Images **/ +.prose img { + width: auto; + max-width: 100%; +} +.prose figure.image { + margin-top: 3rem; + margin-bottom: 3rem; +} +.prose .image a { + display: inline-block; +} +.prose .image img { + box-shadow: var(--shadow-2xl); + background: var(--color-gray-200); +} +.prose .image figcaption { + font-size: var(--text-sm); + padding-top: var(--spacing-3); +} + +/* Intro */ +.prose .intro { + line-height: var(--leading-tight); + font-size: var(--text-2xl); +} + +/* since */ +.since { + position: relative; + padding-bottom: 1.5rem; +} +.since::before, +.since::after { + content: ""; + position: absolute; +} +.since::before { + top: calc(.75rem - 1px); + left: -1.5rem; + bottom: 0; + border: 1px solid var(--color-gray-300); + border-right: none; + width: 1.5rem; +} +.since[open]::after { + bottom: -.5rem; + left: 0; + width: 1px; + margin-top: -1px; + height: 1rem; + background: var(--color-gray-300); +} +.since:not([open])::after { + content: "• • •"; + bottom: -.825rem; + color: var(--color-gray-300); + left: 0; +} +.since summary { + position: relative; + z-index: 1; + font-family: var(--font-mono); + font-size: var(--text-xs); + display: inline-block; + padding: var(--spacing-2px) var(--spacing-3); + background: var(--color-light); + border: 1px solid var(--color-gray-300); + border-radius: 3rem; + margin-left: -.75rem; +} +.since summary a { + text-decoration: none; +} +.since > div { + margin-top: var(--spacing-6); +} diff --git a/assets/css/framework/reset.css b/assets/css/framework/reset.css new file mode 100644 index 0000000000..c88b115a2a --- /dev/null +++ b/assets/css/framework/reset.css @@ -0,0 +1,102 @@ +*, +*::after, +*::before { + border-width: 0; + border-style: solid; + border-color: currentColor; + box-sizing: border-box; + margin: 0; + padding: 0; +} + +a { + color: currentColor; + text-decoration: none; +} + +audio, +canvas, +embed, +figure, +iframe, +img, +object, +svg, +video { + display: block; + vertical-align: middle; +} + +body { + overflow-x: hidden; +} + +button { + font: inherit; + background: none; + color: currentColor; + cursor: pointer; + line-height: inherit; +} +button::-moz-focus-inner { + padding: 0; + border: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +html { + font-family: var(--font-sans); + line-height: var(--leading-normal); +} + +img { + max-width: 100%; + width: 100%; + transform-style: preserve-3d; +} + +input { + font: inherit; +} + +ol, +ul { + list-style: none; +} + +strong, +b { + font-weight: var(--font-bold); +} + +summary { + cursor: pointer; +} +summary:focus { + outline: 0; +} +summary:focus-visible { + outline: solid; + outline: 5px auto -webkit-focus-ring-color; +} + +table { + font-variant-numeric: tabular-nums; + border-spacing: 0; + width: 100%; +} +th, +td { + text-align: left; + vertical-align: top; +} + diff --git a/assets/css/framework/skipper.css b/assets/css/framework/skipper.css new file mode 100644 index 0000000000..64fbf433c0 --- /dev/null +++ b/assets/css/framework/skipper.css @@ -0,0 +1,9 @@ +.skipper { + position: absolute; + left: -100%; + z-index: 1; +} +.skipper:focus-visible { + top: var(--spacing-1); + left: var(--spacing-1); +} diff --git a/assets/css/framework/social.css b/assets/css/framework/social.css new file mode 100644 index 0000000000..ef3caf9725 --- /dev/null +++ b/assets/css/framework/social.css @@ -0,0 +1,10 @@ +.social { + display: flex; + align-items: center; +} +.social a { + display: grid; + place-items: center; + width: var(--spacing-10); + height: var(--spacing-10); +} diff --git a/assets/css/framework/table.css b/assets/css/framework/table.css new file mode 100644 index 0000000000..1c52ef0bc0 --- /dev/null +++ b/assets/css/framework/table.css @@ -0,0 +1,28 @@ +.table { + overflow-x: auto; + overflow-y: hidden; + -webkit-overflow-scrolling: touch; + background: var(--color-white); + border: 1px solid var(--color-gray-300); + border-radius: var(--rounded); +} +.table table { + color: inherit; + min-width: 25rem; +} +.table th, +.table td { + padding: .75rem 1rem; + border-bottom: 1px solid var(--color-gray-300); + vertical-align: baseline; + font-size: var(--text-base); + line-height: var(--leading-normal); +} +.table th { + font-weight: var(--font-bold); + white-space: nowrap; + color: var(--color-black); +} +.table tr:last-child td { + border-bottom: 0; +} diff --git a/assets/css/framework/utilities.css b/assets/css/framework/utilities.css new file mode 100644 index 0000000000..4a25bb087e --- /dev/null +++ b/assets/css/framework/utilities.css @@ -0,0 +1,350 @@ +.absolute { + position: absolute; +} + +.auto-rows-fr { + grid-auto-rows: 1fr; +} + +.bg-black { + background: var(--color-black); +} +.bg-white { + background: var(--color-white); +} + +.block { + display: block; +} + +.color-black { + color: var(--color-black); +} +.color-white { + color: var(--color-white); +} + +.container { + position: relative; + max-width: var(--container); + margin: 0 auto; + padding: 0 var(--container-padding); +} + +.fixed { + position: fixed; +} + +.flex { + --gap: 0; + display: flex; +} +.flex > * + * { + margin-left: var(--gap); +} +.flex-wrap { + flex-wrap: wrap; +} +.flex-column { + flex-direction: column; +} +.flex-grow { + flex-grow: 1; +} +.flex-shrink-0 { + flex-shrink: 0; +} + +.font-bold { + font-weight: var(--font-bold); +} +.font-mono { + font-family: var(--font-mono); +} +.font-normal { + font-weight: var(--font-normal); +} +.font-sans { + font-family: var(--font-sans); +} +.font-thin { + font-weight: var(--font-thin); +} + +.grid { + display: grid; +} + +.hidden { + display: none !important; +} + +.inline-flex { + display: inline-flex; +} + +.inset-0 { + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.invisible { + visibility: hidden; +} + +.italic { + font-style: italic; +} + +.items-start { + align-items: flex-start; +} +.items-baseline { + align-items: baseline; +} +.items-center { + align-items: center; +} +.items-end { + align-items: flex-end; +} + +.justify-between { + justify-content: space-between; +} +.justify-center { + justify-content: center; +} + +.leading-snug { + line-height: var(--leading-snug); +} +.leading-tight { + line-height: var(--leading-tight); +} + +.list-none { + list-style: none; +} +.list-none > summary::-webkit-details-marker { + display: none; +} + +.mb-0 { + margin-bottom: 0; +} +.mb-1 { + margin-bottom: var(--spacing-1); +} +.mb-3 { + margin-bottom: var(--spacing-3); +} +.mb-6 { + margin-bottom: var(--spacing-6); +} +.mb-12 { + margin-bottom: var(--spacing-12); +} +.mb-24 { + margin-bottom: var(--spacing-24); +} +.mb-36 { + margin-bottom: var(--spacing-36); +} +.mb-42 { + margin-bottom: var(--spacing-42); +} + +.ml-auto { + margin-left: auto; +} + +.mr-1 { + margin-right: var(--spacing-1); +} +.mr-3 { + margin-right: var(--spacing-3); +} + +.mx-1 { + margin-left: var(--spacing-1); + margin-right: var(--spacing-1); +} +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.overflow-hidden { + overflow: hidden; +} + +.place-items-center { + display: grid; + place-items: center; + align-content: center; +} + + +.p-container { + padding: var(--container-padding); +} +.p-1 { + padding: var(--spacing-1); +} +.p-3 { + padding: var(--spacing-3); +} +.p-6 { + padding: var(--spacing-6); +} +.p-12 { + padding: var(--spacing-12); +} +.p-24 { + padding: var(--spacing-24); +} +.pt-1 { + padding-top: var(--spacing-1); +} +.pt-3 { + padding-top: var(--spacing-3); +} +.pt-6 { + padding-top: var(--spacing-6); +} +.pt-12 { + padding-top: var(--spacing-12); +} +.px-1 { + padding-left: var(--spacing-1); + padding-right: var(--spacing-1); +} +.px-3 { + padding-left: var(--spacing-3); + padding-right: var(--spacing-3); +} +.px-6 { + padding-left: var(--spacing-6); + padding-right: var(--spacing-6); +} +.px-12 { + padding-left: var(--spacing-12); + padding-right: var(--spacing-12); +} +.py-1 { + padding-bottom: var(--spacing-1); + padding-top: var(--spacing-1); +} +.py-3 { + padding-bottom: var(--spacing-3); + padding-top: var(--spacing-3); +} +.py-6 { + padding-bottom: var(--spacing-6); + padding-top: var(--spacing-6); +} +.py-12 { + padding-bottom: var(--spacing-12); + padding-top: var(--spacing-12); +} + +.relative { + position: relative; +} + +.rounded { + border-radius: var(--rounded); +} + +.shadow { + box-shadow: var(--shadow); +} +.shadow-lg { + box-shadow: var(--shadow-lg); +} +.shadow-xl { + box-shadow: var(--shadow-xl); +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +@media screen and (min-width: 30rem) { + .sticky { + --top: 0; + position: sticky; + top: var(--top); + } +} + +.text-center { + text-align: center; +} +.text-right { + text-align: right; +} + +.text-xs { + font-size: var(--text-xs); +} +.text-sm { + font-size: var(--text-sm); +} +.text-base { + font-size: var(--text-base); +} +.text-lg { + font-size: var(--text-lg); +} +.text-xl { + font-size: var(--text-xl); +} +.text-2xl { + font-size: var(--text-2xl); + line-height: 1.175em; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.underline { + text-decoration: underline; +} + +.w-100\% { + width: 100%; +} +.w-auto { + width: auto; +} +.w-full { + width: 100vw; + position: relative; + left: 50%; + right: 50%; + margin-left: -50vw; + margin-right: -50vw; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.z-1 { + z-index: 1; +} diff --git a/assets/css/framework/variables.css b/assets/css/framework/variables.css new file mode 100644 index 0000000000..629c902a33 --- /dev/null +++ b/assets/css/framework/variables.css @@ -0,0 +1,101 @@ +:root { + --color-backdrop: rgba(0,0,0, .6); + --color-black: #000; + --color-light: var(--color-gray-200); + --color-white: #fff; + + --container-padding: var(--spacing-4); + + --color-gray-100: #F7F7F7; + --color-gray-200: #EFEFEF; + --color-gray-300: #DDDDDD; + --color-gray-400: #CCCCCC; + --color-gray-500: #999999; + --color-gray-600: #777777; + --color-gray-700: #595959; + --color-gray-800: #3E3E3E; + --color-gray-900: #292929; + + --container: 90rem; + + --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + --font-mono: "SFMono-Regular", Consolas, Liberation Mono, Menlo, Courier, monospace; + + --font-thin: 300; + --font-normal: 400; + --font-semibold: 500; + --font-bold: 600; + + --leading-none: 1; + --leading-tight: 1.25; + --leading-snug: 1.375; + --leading-normal: 1.5; + --leading-relaxed: 1.625; + --leading-loose: 2; + + --rounded-xs: 1px; + --rounded-sm: 0.125rem; + --rounded: 0.25rem; + + --shadow: 0 1px 3px 0 rgba(0,0,0, 0.1), 0 1px 2px 0 rgba(0,0,0, 0.06); + --shadow-md: 0 4px 6px -1px rgba(0,0,0, 0.1), 0 2px 4px -1px rgba(0,0,0, 0.06); + --shadow-lg: 0 10px 15px -3px rgba(0,0,0, 0.1), 0 4px 6px -2px rgba(0,0,0, 0.05); + --shadow-xl: 0 20px 25px -5px rgba(0,0,0, 0.1), 0 10px 10px -5px rgba(0,0,0, 0.04); + --shadow-2xl: rgba(0,0,0, .025) 0 0 10px, rgba(0,0,0, .075) 0 5px 40px, rgba(0,0,0, .075) 0 30px 100px; + --shadow-outline: currentColor 0 0 0 2px; + --shadow-inset: inset 0 2px 4px 0 rgba(0,0,0, 0.06); + + --spacing-0: 0; + --spacing-px: 1px; + --spacing-2px: 2px; + --spacing-1: .25rem; + --spacing-2: .5rem; + --spacing-3: .75rem; + --spacing-4: 1rem; + --spacing-5: 1.25rem; + --spacing-6: 1.5rem; + --spacing--6: -1.5rem; + --spacing-8: 2rem; + --spacing-10: 2.5rem; + --spacing-12: 3rem; + --spacing--12: -3rem; + --spacing-16: 4rem; + --spacing-20: 5rem; + --spacing-24: 6rem; + --spacing-36: 9rem; + --spacing-42: 10.5rem; + + --text-xs: 0.75rem; + --text-sm: 0.875rem; + --text-base: 1rem; + --text-lg: 1.125rem; + --text-xl: 1.25rem; + --text-2xl: 1.5rem; + --text-3xl: 1.75rem; + --text-4xl: 2.5rem; + --text-5xl: 3rem; + --text-6xl: 4rem; + + --text-h1: var(--text-4xl); +} + +@media screen and (min-width: 22rem) { + :root { + --container-padding: var(--spacing-6); + } +} +@media screen and (min-width: 30rem) { + :root { + --container-padding: var(--spacing-12); + } +} +@media screen and (min-width: 40rem) { + :root { + --text-h1: var(--text-5xl); + } +} +@media screen and (min-width: 72rem) { + :root { + --container-padding: var(--spacing-24); + } +} diff --git a/assets/css/index.css b/assets/css/index.css new file mode 100644 index 0000000000..3bb676bc09 --- /dev/null +++ b/assets/css/index.css @@ -0,0 +1,40 @@ +@import "framework/variables.css"; +@import "framework/reset.css"; +@import "framework/buttons.css"; +@import "framework/grid.css"; +@import "framework/headings.css"; +@import "framework/aspect-ratio.css"; +@import "framework/masonry.css"; +@import "framework/overlay.css"; +@import "framework/prose.css"; +@import "framework/social.css"; +@import "framework/skipper.css"; +@import "framework/table.css"; +@import "framework/code.css"; + +@import "site/details.css"; +@import "site/filters.css"; +@import "site/variables.css"; +@import "site/links.css"; +@import "site/header.css"; +@import "site/brands.css"; +@import "site/boxes.css"; +@import "site/code.css"; +@import "site/highlight.css"; +@import "site/filesystem.css"; +@import "site/lightbox.css"; +@import "site/logo.css"; +@import "site/menu.css"; +@import "site/search.css"; +@import "site/sidebar.css"; +@import "site/types.css"; +@import "site/toc.css"; +@import "site/footer.css"; +@import "site/screencast.css"; +@import "site/kosmos.css"; +@import "site/with-sidebar.css"; +@import "site/voice.css"; +@import "site/utilities.css"; + + +@import "framework/utilities.css"; diff --git a/assets/css/layouts/features.css b/assets/css/layouts/features.css new file mode 100644 index 0000000000..7d81120a26 --- /dev/null +++ b/assets/css/layouts/features.css @@ -0,0 +1,70 @@ +.features-xl { + --columns-md: 1; + --columns: 2; + --row-gap: var(--spacing-12); + --column-gap: var(--spacing-24); +} + +.features-checklist { + font-size: var(--text-lg); + line-height: var(--leading-snug); +} +.features-checklist li { + display: flex; + margin-bottom: var(--spacing-2); +} +.features-checklist svg { + margin-right: var(--spacing-3); + margin-top: .215rem; + flex-shrink: 0; +} + + +.features-section { + margin-bottom: var(--spacing-42); +} +.features-section-figure { + grid-area: figure; + margin-top: var(--spacing-12); +} +.features-section-header { + grid-area: header; +} +.features-section-text { + grid-area: text; + margin-top: var(--spacing-6); +} +.features-section-voice { + grid-area: voice; + margin-top: var(--spacing-12); +} +.features-section-grid { + grid-area: grid; + margin-top: var(--spacing-12); +} + + +@media screen and (min-width: 72rem) { + .features-section-figure { + margin-top: 0; + } + .features-section-voice { + align-self: flex-end; + } + .features-section { + display: grid; + grid-column-gap: var(--spacing-24); + grid-template-columns: 1fr 1fr; + grid-template-rows: auto auto auto 1fr; + grid-template-areas: "figure header" + "figure text" + "figure grid" + "figure voice"; + } + .features-section--reverse { + grid-template-areas: "header figure" + "text figure" + "grid figure" + "voice figure"; + } +} diff --git a/assets/css/layouts/home.css b/assets/css/layouts/home.css new file mode 100644 index 0000000000..ad75b29a56 --- /dev/null +++ b/assets/css/layouts/home.css @@ -0,0 +1,567 @@ +.playground { + --spacing-42: 6rem; +} + +@supports (padding: clamp(6rem, 10vh, 10.5rem)) { + .playground { + --spacing-42: clamp(6rem, 10vh, 10.5rem) + } +} + + +/** UTILITIES **/ +.mb-56 { + margin-bottom: calc(var(--spacing-1) * 56); +} + +.playground .hr-h { + height: 1px; + background: var(--color-gray-300); +} +.playground .hr-v { + width: 1px; + background: var(--color-gray-300); +} +.playground .columns { + --columns: 24; + --gap: 0; + --rows: 0; + grid-template-columns: repeat(var(--columns), 1fr); + grid-template-rows: repeat(var(--rows), auto); +} + +/** BANNER **/ +.banner { + position: absolute; + top: 5rem; + right: 0; + display: none; +} +.banner::before { + position: absolute; + top: -6px; + right: 4.5rem; + content: ""; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; +} +@media screen and (min-width: 60rem) { + .banner { + display: block; + } +} + + + +/** HEADER **/ +/** Shared */ +.playground-header-menu a { + position: relative; + display: block; + white-space: nowrap; + padding: var(--spacing-2px); +} +.playground-header-menu a[aria-current]::before { + position: absolute; + content: ""; + top: 50%; + left: calc(var(--spacing-12) * -1); + width: var(--spacing-8); + height: 1px; + background: var(--color-gray-300); +} +.playground-header-menu a[aria-current]::after { + position: absolute; + content: ""; + width: 10px; + height: 10px; + top: 50%; + margin-top: -4px; + left: -1.25rem; + background: var(--color-light); + border-radius: 50%; + border: 1px solid var(--color-gray-300); +} +.playground-header-layout { + display: grid; + max-width: 110rem; + margin: 0 auto; + grid-gap: var(--spacing-12); + grid-template-columns: auto 12rem; +} +.playground-header-figure { + position: relative; + z-index: 1; +} +.playground-header-figure-wrapper { + display: block; + box-shadow: var(--shadow-2xl); + background: var(--color-light); + overflow: hidden; + transition: all .2s; +} +.playground-header-figure-wrapper.loading { + box-shadow: none; +} +.playground-header-figure-wrapper img { + transition: all .3s; +} +.playground-header-figure-wrapper.loading img { + opacity: 0; +} + +/** Mobile */ +@media screen and (max-width: 50rem) { + .playground-header-menu a[aria-current]::before { + height: 16rem; + width: 1rem; + left: calc(var(--spacing-6) * -1); + border-top: 1px solid var(--color-gray-300); + border-left: 1px solid var(--color-gray-300); + background: none; + } + .playground-header-menu a[aria-current]::after { + left: -1rem; + } + .playground-header-layout { + grid-gap: 0; + grid-template-columns: 1fr; + } + .playground-header-menu { + grid-row: 1; + margin-left: var(--container-padding); + margin-bottom: var(--spacing-3); + } + .playground-header-menu ul { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); + grid-column-gap: var(--spacing-3); + padding: 0 var(--spacing-6); + } +} + +/** Large */ +@media screen and (min-width: 50rem) { + .playground-header-figure-wrapper { + border-top-right-radius: var(--spacing-2); + border-bottom-right-radius: var(--spacing-2); + } +} + +/** Huge */ +@media screen and (min-width: 110.1rem) { + .playground-header-figure-wrapper { + border-radius: var(--spacing-2); + } +} + + +/** FILESYSTEM **/ +/** Shared */ +.playground-filesystem-header { + padding: var(--spacing-42) 0 var(--spacing-12) var(--spacing-6); +} +.playground-filesystem .hr-indent { + margin-left: 4.75rem; +} +.playground-filesystem-folders { + margin-left: -.5rem; +} + +.playground-filesystem .filesystem { + overflow: hidden; + --border: var(--color-gray-300); + --icon-aqua: var(--color-aqua-500); + --icon-blue: var(--color-blue-500); + --icon-green: var(--color-green-500); + --icon-orange: var(--color-orange-500); + --icon-purple: var(--color-purple-500); + --icon-red: var(--color-red-500); + --icon-yellow: var(--color-yellow-500); + pointer-events: none; + padding: 0; + background: none; + color: currentColor; +} + +.playground-filesystem .hr-end { + grid-column: 1/-1; +} + +/** Mobile */ +@media screen and (max-width: 64rem) { + .playground-filesystem-header { + border-left: 1px solid var(--color-gray-300); + } +} + +/** Tablet */ +@media screen and (min-width: 40rem) { + .playground-filesystem .hr-end { + grid-column: 1/17; + } +} + +/** Large */ +@media screen and (min-width: 64rem) { + .playground-filesystem .hr-end { + grid-column: 10/17; + } + .playground-filesystem-layout { + display: grid; + grid-template-columns: repeat(24, 1fr); + } + .playground-filesystem-files { + position: relative; + padding-top: var(--spacing-42); + grid-row: 1; + grid-column: 10/-1; + } + .playground-filesystem-files::before { + position: absolute; + content: ""; + height: var(--spacing-42); + width: 1px; + background: var(--color-gray-300); + top: 0; + } + + .playground-filesystem-header { + padding: var(--spacing-42) 0 var(--spacing-12); + grid-column: 1/10; + } +} + +/** BACKEND **/ +/** Shared */ +.playground-backend-header { + padding-top: var(--spacing-42); + padding-bottom: var(--spacing-42); + justify-self: end; +} +.playground-backend-logos .hr-h { + width: 3rem; +} +.playground-backend-logos svg { + width: auto; + max-width: 100%; + height: 3rem; +} +.playground-backend .hr-end { + grid-column: 1/-1; +} + +/** Mobile */ +@media screen and (max-width: 40rem) { + .playground-backend-header { + grid-column: 1/-1; + border-right: 1px solid var(--color-gray-300); + padding-bottom: var(--spacing-12); + padding-right: var(--spacing-6); + } + .playground-backend-logos { + grid-column: 1/-1; + justify-self: flex-end; + border-right: 1px solid var(--color-gray-300); + padding-bottom: var(--spacing-42); + padding-right: var(--spacing-6); + } + .playground-backend-logos hr { + display: none; + } +} + +/** Large */ +@media screen and (min-width: 40rem) { + .playground-backend-logos { + grid-column: 17/-1; + border-left: 1px solid var(--color-gray-300); + } + .playground-backend-header { + grid-column: 1/15; + } + .playground-backend .hr-end { + grid-column: 1/17; + } +} + +@media screen and (min-width: 45rem) { + .playground-backend .hr-end { + grid-column: 12/17; + } +} + +/** MEDIUM **/ +/** Shared */ +.playground-medium .dots { + display: flex; + align-items: center; +} +.playground-medium .dots i { + width: 10px; + height: 10px; + border-radius: 50%; + background: var(--color-gray-300); + margin-right: 4px; +} +.playground-medium-header { + padding-top: var(--spacing-42); + padding-bottom: var(--spacing-42); +} +.playground-medium-browser header { + border-bottom: 1px solid var(--color-light); +} +.playground-medium-browser .columns { + --gap: var(--spacing-3); + --columns: 12; + grid-template-columns: repeat(var(--columns), 1fr); +} +.playground-medium-browser .columns > * { + --span-sm: var(--span); +} +.playground-medium-browser-body .text-2xs { + font-size: 9px; +} +.playground-medium-browser-body .text-3xs { + font-size: 7px; +} +.playground-medium-browser-body .btn { + font-family: var(--font-sans); + font-size: 8px; + padding: 2px 6px; + pointer-events: none; +} + +.playground-medium-browser-gallery { + display: grid; + align-self: flex-start; + grid-gap: var(--spacing-1); + grid-template-columns: repeat(4, 1fr); +} +.playground-medium-browser-gallery *:first-child { + grid-column: 1/-1; +} + +.playground-medium-phone > div { + border: 6px solid #fff; +} +.playground-medium-phone > div::after { + position: absolute; + content: ""; + top: .75rem; + left: 50%; + margin-left: -1rem; + z-index: 1; + height: 6px; + width: 2rem; + background: #fff; + border-radius: 6rem; +} +.playground-medium-phone header { + position: absolute; + bottom: 0; + left: 0; + right: 0; + z-index: 1; + padding: var(--spacing-24) var(--spacing-2) var(--spacing-2) var(--spacing-2); + background: linear-gradient(rgba(0,0,0,0), rgba(0,0,0,.5)); + font-size: 9px; + white-space: nowrap; +} +.playground-medium-api .toolbar { + display: none; +} +.playground-medium-api pre code { + font-size: var(--text-xs); +} +.playground-medium .hr-h.hr-end { + display: none; +} + + +/** Mobile */ +@media screen and (max-width: 45rem) { + .playground-medium .hr-v, + .playground-medium .hr-h { + display: none; + } + .playground-medium .hr-v.hr-main { + grid-column: 1; + grid-row: 1/5; + height: 100%; + display: block; + } + .playground-medium-header { + padding-top: var(--spacing-42); + padding-left: var(--spacing-6); + padding-bottom: var(--spacing-12); + grid-column: 1/-1; + grid-row: 1; + } + .playground-medium-browser { + grid-row: 2; + grid-column: 1/-1; + margin-left: var(--spacing-6); + } + .playground-medium-phone { + grid-row: 3; + grid-column: 1/10; + margin-left: var(--spacing-6); + margin-top: var(--spacing-6); + } + .playground-medium-api { + grid-row: 3; + grid-column: 10/-1; + margin-left: var(--spacing-6); + margin-top: var(--spacing-6); + } + .playground-medium-api pre { + padding: var(--spacing-3); + } + .playground-medium-api pre code { + font-size: 7px; + } +} + +@media screen and (min-width: 32rem) { + .playground-medium-api pre code { + font-size: 10px; + } +} + +/** Large */ +@media screen and (min-width: 45rem) { + .playground-medium .hr-main { + grid-column: 12; + grid-row: 1; + height: 100% + } + .playground-medium-header { + grid-column: 14/-1; + grid-row: 1; + } + .playground-medium-browser { + grid-row: 1; + grid-column: 1/11; + align-self: center; + } + .playground-medium-phone { + grid-column: 13/17; + } + .playground-medium-api { + grid-column: 18/-1; + } + .playground-medium-api pre code { + font-size: 11px; + } +} + +@media screen and (min-width: 60rem) { + .playground-medium-phone header { + padding: var(--spacing-24) var(--spacing-3) var(--spacing-3) var(--spacing-3); + font-size: var(--text-sm); + } +} + +@media screen and (max-width: 60rem) { + .playground-medium .hr-end { + display: block; + } +} + +/** AUDIENCE **/ +/** Shared */ +.playground-audience .columns { + --columns: 1; +} +.playground-audience-header { + padding-top: var(--spacing-42); + padding-bottom: var(--spacing-12); +} +.playground-audience-links a { + display: block; +} +.playground-audience-links a::before, +.playground-audience-links a::after { + position: absolute; + content: ""; +} +.playground-audience-links a::after { + width: 10px; + height: 10px; + background: var(--color-light); + border-radius: 50%; + border: 1px solid var(--color-gray-300); +} + +/** Mobile */ +@media screen and (max-width: 60rem) { + .playground-audience .hr-v { + display: none; + } + .playground-audience-header { + border-left: 1px solid var(--color-gray-300); + padding-left: var(--spacing-6); + } + .playground-audience-links a { + position: relative; + padding-left: var(--spacing-12); + padding-bottom: var(--spacing-6); + } + .playground-audience-links a::before { + top: -5.45rem; + left: 0; + height: 6rem; + width: var(--spacing-6); + border-left: 1px solid var(--color-gray-300); + border-bottom: 1px solid var(--color-gray-300); + } + .playground-audience-links a::after { + top: .25rem; + left: var(--spacing-6); + } +} + +/** Large */ +@media screen and (min-width: 60rem) { + .playground-audience .columns { + --columns: 24; + } + .playground-audience-header { + grid-column: 1/8; + } + .playground-audience-links a { + position: relative; + padding-top: var(--spacing-12); + border-top: 1px solid var(--color-gray-300); + } + .playground-audience-links a:last-child { + border-top: 0; + } + .playground-audience-links a > * { + margin-left: -.625rem; + } + .playground-audience-links a::before { + top: 0; + height: var(--spacing-8); + width: 1px; + background: var(--color-gray-300); + } + .playground-audience-links a::after { + top: var(--spacing-8); + left: -4px; + } + .playground-audience-links a:nth-child(1) { + grid-column: 3/9; + } + .playground-audience-links a:nth-child(2) { + grid-column: 9/15; + } + .playground-audience-links a:nth-child(3) { + grid-column: 15/21; + } + .playground-audience-links a:nth-child(4) { + grid-column: 21/24; + } +} diff --git a/assets/css/layouts/reference.css b/assets/css/layouts/reference.css new file mode 100644 index 0000000000..0b0bcb6e7e --- /dev/null +++ b/assets/css/layouts/reference.css @@ -0,0 +1,296 @@ +html { + height: 100%; +} +.reference { + display: flex; + flex-direction: column; +} + +/* Layout */ +.reference-header { + border-bottom: 1px solid var(--color-gray-300); + margin-bottom: 0; + padding: 0 1.5rem; + flex-shrink: 0; +} +.reference-header .header-content { + padding: 0; +} +.reference-header .logo { + padding: var(--spacing-3); +} +.reference-header .logo svg { + height: 2rem; + width: 2rem; +} +.reference-panels { + display: flex; + flex-grow: 1; + overflow: hidden; +} +.reference-panel { + -webkit-overflow-scrolling: touch; + overflow-y: auto; +} +.reference-panel:not(:last-child) { + border-right: 1px solid var(--color-gray-300); +} +.reference-sidebar { + width: 14rem; + flex-shrink: 0; + padding: var(--spacing-6) var(--spacing-12); + margin-left: 3px; + white-space: nowrap; +} + +.reference-entries { + flex-shrink: 0; + width: 20rem; +} +.reference-content { + --px: var(--spacing-6); + flex-grow: 1; + padding: var(--spacing-12) var(--px) var(--spacing-24); +} +.reference-content article { + max-width: var(--container); +} +.reference-sidebar + .reference-content article { + max-width: calc(var(--container) - 14rem); +} +.reference-entries + .reference-content article { + max-width: calc(var(--container) - 14rem - 20rem); +} + +@media screen and (min-width: 60rem) { + .reference-content { + --px: var(--spacing-12); + } +} +@media screen and (min-width: 80rem) { + .reference-content { + --px: var(--spacing-24); + } +} + +.reference-footer { + padding-top: 9rem; +} +.reference-entries a { + position: relative; + overflow: hidden; + padding: var(--spacing-3) var(--spacing-6); + border-bottom: 1px solid var(--color-gray-300); +} + +.reference-section { + grid-auto-rows: 1fr; + font-size: var(--text-sm); + font-family: var(--font-mono); +} +.reference-section a { + width: 100%; + max-width: 100%; + border-top: 1px solid var(--color-gray-300); + padding: var(--spacing-3) 0; + height: 100%; +} + +.reference-entries a > *, +.reference-entries a h4, +.reference-entries a h4 + div, +.reference-section a > * { + min-width: 0; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} + +/* Mobile menu */ +.reference-menu { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid var(--color-gray-300); + background: var(--color-gray-100); + font-family: var(--font-mono); + font-size: var(--text-sm); +} + +.reference-menu svg { + margin-right: var(--spacing-2); +} + +@media screen and (min-width: 60rem) { + .reference-menu { + display: none; + } + + .reference, + .reference-panels { + overflow: hidden; + height: 100%; + } + + .reference-panel { + -webkit-overflow-scrolling: touch; + overflow-y: auto; + } +} + +@media screen and (max-width: 60rem) { + .reference-panel:not(:last-child) { + display: none; + width: 100%; + background: var(--color-gray-100); + } +} + +/* Meta badges */ +.reference-meta { + display: flex; + flex-wrap: wrap; + font-size: var(--text-sm); + margin-bottom: var(--spacing-6); +} +.reference-meta li { + margin-bottom: var(--spacing-2); +} +.reference-meta li:not(:last-child) { + margin-right: var(--spacing-3); +} + +.reference-meta :not(.since) a, +.reference-meta :not(.since) code { + display: inline-flex; + align-items: center; + font-family: var(--font-mono); + font-size: var(--text-xs); + background: var(--prose-code-bg); + padding: var(--spacing-1) var(--spacing-2); + border-radius: var(--rounded-sm); + color: inherit; +} + +.reference-meta svg { + margin-right: var(--spacing-2); +} +.reference-meta .since { + font-family: var(--font-mono); + font-size: var(--text-xs); + padding: var(--spacing-2px) var(--spacing-3); + background: var(--color-light); + border: 1px solid var(--color-gray-300); + border-radius: 3rem; + margin-left: -.75rem; +} +.reference-meta .since::before, +.reference-meta .since::after { + display: none; +} + +/* Advanced toggle */ + +.reference-advanced { + margin-bottom: var(--spacing-8); +} +.reference-advanced > a { + padding: var(--spacing-1) var(--spacing-2); + background: var(--color-gray-200); +} +.reference-advanced > a[aria-current] { + background: var(--color-black); + color: var(--color-white); +} +.reference-advanced > a:first-child { + margin-right: var(--spacing-2px); +} + +/* Parameters tables */ + +@media screen and (max-width: 60rem) { + + .parameters, + .parameters thead, + .parameters tbody, + .parameters th, + .parameters tr, + .parameters td { + display: block; + } + + .parameters thead { + position: absolute; + top: -9999px; + left: -9999px; + } + + .parameters tr { + display: flex; + flex-direction: row; + flex-wrap: wrap; + } + + .parameters tr:not(:last-child) { + border-bottom: 1px solid var(--color-gray-300); + } + + .parameters tr:before { + display: block; + content: ""; + height: 0; + order: 2; + width: 100%; + } + + .parameters td { + padding: var(--spacing-3); + border: none; + } + + .parameters tr:nth-child(odd) td:nth-child(n+3) { + background: none; + } + + .parameters td:first-child, + .parameters td:nth-child(2) { + order: 1; + color: var(--color-gray-900); + display: flex; + align-items: center; + } + .parameters td:first-child { + flex: 0 0 auto; + padding-right: 1ch; + } + .parameters td:first-child code { + background: none; + padding: 0; + } + .parameters td:nth-child(2) { + flex: 2 0 0; + padding-left: 0; + } + .parameters td:nth-child(n+3) { + order: 3; + padding-bottom: 0; + } + + .parameters td:last-child, + .parameters tr:last-child td:last-child { + width: 100%; + padding-bottom: var(--spacing-3); + } + + .parameters td[data-label]::before { + content: attr(data-label); + font-weight: 700; + padding-right: 1ch; + } +} + +.required-mark { + padding-left: .2rem; + color: var(--color-blue-600) +} diff --git a/assets/css/site/boxes.css b/assets/css/site/boxes.css new file mode 100644 index 0000000000..592e913e17 --- /dev/null +++ b/assets/css/site/boxes.css @@ -0,0 +1,38 @@ +:root { + --box-default: var(--color-light); + --box-alert: var(--color-red-300); + --box-info: var(--color-blue-300); + --box-success: var(--color-green-300); + --box-warning: var(--color-orange-300); +} + +.box { + position: relative; + --bg: var(--box-default); + background: var(--bg); + border-radius: var(--rounded); + overflow: hidden; +} +.box .box-text { + color: var(--color-black); + padding: var(--spacing-6); + margin-right: var(--spacing-6); +} +.box .box-icon { + color: var(--bg); + position: absolute; + top: 0; + right: 0; +} +.box--alert { + --bg: var(--box-alert); +} +.box--info { + --bg: var(--box-info); +} +.box--success { + --bg: var(--box-success); +} +.box--warning { + --bg: var(--box-warning); +} diff --git a/assets/css/site/brands.css b/assets/css/site/brands.css new file mode 100644 index 0000000000..9b6388e75c --- /dev/null +++ b/assets/css/site/brands.css @@ -0,0 +1,20 @@ +.brands { + --columns: 2; + display: grid; + grid-template-columns: repeat(var(--columns), 1fr); + grid-gap: var(--spacing-10); +} +@media screen and (min-width: 30rem) { + .brands { + --columns: 3; + } +} +@media screen and (min-width: 54rem) { + .brands { + --columns: 6; + } +} +.brands svg { + width: 100%; + max-height: 2rem; +} diff --git a/assets/css/site/code.css b/assets/css/site/code.css new file mode 100644 index 0000000000..7c41f42576 --- /dev/null +++ b/assets/css/site/code.css @@ -0,0 +1,57 @@ +.code { + background: var(--prose-pre-bg); + border-radius: var(--rounded); + color: var(--color-gray-300); +} +.code figcaption { + font-family: var(--font-mono); + font-size: var(--text-sm); + border-bottom: 1px solid var(--color-gray-800); + padding: var(--spacing-2) var(--spacing-3); +} +.code pre { + padding: var(--spacing-6); + line-height: var(--leading-relaxed); + font-size: var(--text-base); + font-family: var(--font-mono); + overflow-x: auto; + overflow-y: hidden; + -webkit-overflow-scrolling: touch; +} +.code pre code { + font: inherit; +} + +.code-toolbar { + position: relative; +} +.code-toolbar .toolbar { + position: absolute; + bottom: var(--spacing-3); + right: var(--spacing-3); + opacity: 0; + transition: opacity .2s; +} +.code-toolbar:hover .toolbar { + opacity: 1; +} +.code-toolbar button { + position: relative; + display: flex; + align-items: center; + padding: var(--spacing-1) var(--spacing-2); + background-color: var(--color-black); + color: var(--color-gray-500); + font-size: var(--text-xs); + cursor: pointer; + transition: background-color .2s; + border-radius: var(--rounded-sm); + outline: none; +} +.code-toolbar button:hover { + background-color: var(--color-gray-800); +} +.code-toolbar button > svg { + margin-right: var(--spacing-1); + fill: var(--color-white); +} diff --git a/assets/css/site/details.css b/assets/css/site/details.css new file mode 100644 index 0000000000..c3f59db032 --- /dev/null +++ b/assets/css/site/details.css @@ -0,0 +1,29 @@ +.details summary { + position: relative; + list-style: none; +} +.details > * { + padding-left: 1.75rem; +} +.details summary::-webkit-details-marker { + display: none; +} +.details summary::after { + position: absolute; + top: 0; + margin-top: .5rem; + left: 0; + content: ""; + display: grid; + place-items: center; + width: 1rem; + height: 1rem; + border-radius: var(--rounded); + background: var(--color-gray-200) url("/assets/icons/plus.svg") no-repeat center center; +} +.details[open] summary::after { + background-image: url("/assets/icons/minus.svg"); +} +.details summary:focus { + outline: 0; +} diff --git a/assets/css/site/filesystem.css b/assets/css/site/filesystem.css new file mode 100644 index 0000000000..8e122c0a7e --- /dev/null +++ b/assets/css/site/filesystem.css @@ -0,0 +1,103 @@ +.filesystem { + --border: #3c3c3c; + --icon-aqua: var(--color-aqua-400); + --icon-blue: var(--color-blue-400); + --icon-green: var(--color-green-400); + --icon-orange: var(--color-orange-400); + --icon-purple: var(--color-purple-400); + --icon-red: var(--color-red-400); + --icon-yellow: var(--color-yellow-400); + --gradient: linear-gradient(var(--border), var(--border)); + padding: var(--spacing-4); + background: var(--color-black); + color: var(--color-gray-100); + font-family: var(--font-mono); + line-height: var(--leading-relaxed); + border-radius: var(--rounded); + font-size: var(--text-base); + overflow-x: auto; + overflow-y: hidden; + -webkit-overflow-scrolling: touch; +} + +.filesystem details { + padding-right: var(--spacing-4); + width: min-content; +} + +.filesystem-label { + --icon: var(--color-white); + min-height: 1.625rem; + display: flex; + align-items: center; + white-space: nowrap; + text-overflow: ellipsis; +} +.filesystem-label svg { + margin-right: var(--spacing-2); + color: var(--icon); + flex-shrink: 0; +} +.filesystem summary { + outline: none; + list-style: none; +} +.filesystem summary::-webkit-details-marker { + display: none; +} + +/** Filesystem **/ +.filesystem ul { + margin: 0 !important; +} +.filesystem li { + list-style: none !important; +} + +/* Filesystem Lines */ +.filesystem li li { + background: var(--gradient) 0.4375rem 0/0.0625rem 100% no-repeat, var(--gradient) 0.4375rem 0.75em/0.5rem 0.0625rem no-repeat; + padding-left: 1.625rem; +} +.filesystem li li:last-child { + background: var(--gradient) 0.4375rem 0/0.0625rem 0.75em no-repeat, var(--gradient) 0.4375rem 0.75em/0.5rem 0.0625rem no-repeat; +} + +/* Filesystem icons */ +.filesystem [data-type="folder-collapsed"], +.filesystem [data-type="folder-expanded"], +.filesystem [data-type="php"], +.filesystem [data-type="css"] { + --icon: var(--icon-blue); +} + +.filesystem [data-type="image"], +.filesystem [data-type="code"], +.filesystem [data-type="archive"] { + --icon: var(--icon-green); +} + +.filesystem [data-type="video"] { + --icon: var(--icon-purple); +} + +.filesystem [data-type="javascript"], +.filesystem [data-type="html"], +.filesystem [data-type="yaml"] { + --icon: var(--icon-orange); +} + +.filesystem [data-type="text"] { + --icon: var(--icon-yellow); +} + +.filesystem [data-type="markdown"], +.filesystem [data-type="document"], +.filesystem [data-type="font"] { + --icon: var(--icon-aqua); +} + +.filesystem [data-type="git"], +.filesystem [data-type="audio"] { + --icon: var(--icon-red); +} diff --git a/assets/css/site/filters.css b/assets/css/site/filters.css new file mode 100644 index 0000000000..f97f8082b1 --- /dev/null +++ b/assets/css/site/filters.css @@ -0,0 +1,12 @@ +.filters a, +.filters button { + display: flex; + align-items: center; + margin-bottom: var(--spacing-1); +} +.filters svg { + margin-right: var(--spacing-3); +} +.filters hr { + margin: var(--spacing-3) 0; +} diff --git a/assets/css/site/footer.css b/assets/css/site/footer.css new file mode 100644 index 0000000000..b5c6b0ab78 --- /dev/null +++ b/assets/css/site/footer.css @@ -0,0 +1,19 @@ +.footer .container { + padding-top: 9rem; +} +.footer-info { + max-width: 10rem; +} +.footer-info .social { + margin-left: -.75rem; +} + +.footer-menu a { + display: block; +} +.footer-menu-partners a { + padding: .25rem 0; +} +.footer-menu-partners svg { + height: 1.5rem; +} diff --git a/assets/css/site/header.css b/assets/css/site/header.css new file mode 100644 index 0000000000..ad0f9aa451 --- /dev/null +++ b/assets/css/site/header.css @@ -0,0 +1,10 @@ +.header-content { + margin: 0 -.75rem; + padding: var(--spacing-3) 0; +} + +@media screen and (min-width: 40rem) { + .header-content { + padding: var(--spacing-6) 0; + } +} diff --git a/assets/css/site/highlight.css b/assets/css/site/highlight.css new file mode 100644 index 0000000000..6fe2460ee6 --- /dev/null +++ b/assets/css/site/highlight.css @@ -0,0 +1,9 @@ +.highlight { + padding: var(--spacing-6); +} + +@media screen and (min-width: 30rem) { + .highlight { + padding: var(--spacing-12); + } +} diff --git a/assets/css/site/kosmos.css b/assets/css/site/kosmos.css new file mode 100644 index 0000000000..f83a056f7e --- /dev/null +++ b/assets/css/site/kosmos.css @@ -0,0 +1,26 @@ +.kosmos-fields { + margin-left: -1.5rem; + display: flex; + flex-wrap: wrap; +} +.kosmos-field { + flex-grow: 1; + flex-basis: 33.33%; + min-width: 12rem; + margin-bottom: 1.5rem; + margin-left: 1.5rem; +} +.kosmos-field:last-child { + flex-basis: auto; + margin-bottom: 0; +} + +@media screen and (min-width: 45rem) { + .kosmos-form label { + height: 2rem; + margin-bottom: 0; + } + .kosmos-form .btn { + margin-top: 2rem; + } +} diff --git a/assets/css/site/lightbox.css b/assets/css/site/lightbox.css new file mode 100755 index 0000000000..d762d436f8 --- /dev/null +++ b/assets/css/site/lightbox.css @@ -0,0 +1,80 @@ +.lightbox { + opacity: .01; + transition: opacity .4s ease; + will-change: opacity; +} + +.lightbox[data-visible]{ + opacity: 1; +} + +.lightbox > button { + --size: 2rem; + + position: absolute; + top: 50%; + transform: translateY(-50%); + width: var(--size); + height: var(--size); + background: black; + color: white; + z-index: 3; + opacity: 0; + transition: opacity .4s ease; + will-change: opacity; + pointer-events: none; +} +.lightbox > button:focus { + outline: none; +} +.lightbox > button:first-of-type { + left: 0; +} +.lightbox > button:last-of-type { + right: 0; +} +.lightbox[data-has-prev] > button:first-of-type, +.lightbox[data-has-next] > button:last-of-type { + opacity: 1; + pointer-events: all; +} + +.lightbox > div { + --px: 3rem; + --py: 1rem; + + position: absolute; + top: var(--py); + bottom: var(--py); + right: var(--px); + left: var(--px); + display: flex; + align-items: center; + justify-content: center; + transform: scale(.9); + transition: transform .4s ease; + will-change: transform; + z-index: 1; +} + +.lightbox[data-visible] > div { + transform: scale(1); +} + +.lightbox img { + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; +} + +@media screen and (min-width: 60rem) { + .lightbox > div { + --px: 4.5rem; + --py: 1.5rem; + } + + .lightbox > button { + --size: 3rem; + } +} diff --git a/assets/css/site/links.css b/assets/css/site/links.css new file mode 100644 index 0000000000..b24e22e67c --- /dev/null +++ b/assets/css/site/links.css @@ -0,0 +1,18 @@ +.filters a[aria-current], +.prose a, +.toc a, +.sidebar ul a[aria-current], +.playground-header-menu a[aria-current], +.reference-entries a[aria-current] h4, +.link { + text-decoration: underline; + text-decoration-color: var(--color-yellow-500); + text-decoration-thickness: 2px; +} +.link:hover, +.prose a:hover, +.toc a:hover, +.sidebar ul a:hover { + text-decoration-color: var(--color-yellow-600); +} + diff --git a/assets/css/site/logo.css b/assets/css/site/logo.css new file mode 100644 index 0000000000..3032de4433 --- /dev/null +++ b/assets/css/site/logo.css @@ -0,0 +1,7 @@ +.logo { + display: flex; + padding: var(--spacing-3); +} +.logo svg { + display: flex; +} diff --git a/assets/css/site/menu.css b/assets/css/site/menu.css new file mode 100644 index 0000000000..23947a7287 --- /dev/null +++ b/assets/css/site/menu.css @@ -0,0 +1,164 @@ +:root { + --menu-dropdown-bg: var(--color-black); + --menu-dropdown-color: var(--color-white); +} + +/** All sizes **/ +.menu a, +.menu label { + padding: .5rem .75rem; + display: block; + line-height: var(--leading-none); + white-space: nowrap; +} +.menu nav { + display: flex; +} + +/** Try > Love > Buy **/ +.menu-steps a { + position: relative; + font-weight: var(--font-bold); + display: flex; + align-items: center; +} +.menu-steps a::after { + position: absolute; + right: -.125rem; + content: "\203A"; + font-weight: 400; +} +.menu-steps li:last-child a::after { + display: none; +} +.menu-steps svg * { + fill: currentColor; +} + +/** Menu Toggle **/ +.menu input { + position: absolute; + visibility: hidden; + width: 0; + height: 0; + opacity: 0; +} +.menu-toggle { + cursor: pointer; +} + +.menu-2 .is-external { + position: relative; + padding-right: 3rem; +} +.menu-2 .is-external::after { + position: absolute; + content: "→"; + top: 50%; + right: .75rem; + transform: translateY(-50%) rotate(-45deg); + color: var(--color-gray-400); +} + +/** Small **/ +@media screen and (max-width: 60rem) { + .menu nav { + position: absolute; + top: 100%; + width: 100%; + max-width: 18rem; + right: .5rem; + display: none; + padding: var(--spacing-3); + background: var(--menu-dropdown-bg); + color: var(--menu-dropdown-color); + font-size: var(--text-sm); + flex-direction: column; + border-radius: var(--rounded-xs); + box-shadow: var(--shadow-xl); + z-index: 3; + } + .menu input:checked ~ nav { + display: flex; + } + .menu ul { + padding-top: .25rem; + padding-bottom: .25rem; + } + .menu-1 > .has-submenu > a { + font-weight: var(--font-bold); + } + .menu-2 a { + opacity: .75; + padding-left: var(--spacing-6); + } + .menu-steps { + display: flex; + align-items: center; + } +} + +/** Large **/ +@media screen and (min-width: 60rem) { + .menu input, + .menu label { + display: none; + } + .menu-1 { + display: flex; + align-items: center; + } + .menu-1 > li { + position: relative; + } + .menu-1 > .has-submenu > a { + padding-right: 1.75rem; + } + .menu-1 > .has-submenu > a::after { + content: "\203A"; + position: absolute; + margin-top: -.4rem; + right: .75rem; + top: 50%; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + } + .menu-2 { + position: absolute; + display: none; + top: 100%; + left: 50%; + z-index: 1; + transform: translateX(-50%); + background: var(--menu-dropdown-bg); + color: var(--menu-dropdown-color); + padding-top: .375rem; + padding-bottom: .375rem; + border-radius: var(--rounded-xs); + box-shadow: var(--shadow-xl); + } + .menu-2 a { + padding: .375rem 1rem; + font-size: var(--text-sm); + } + .menu-2::before { + --arrow: var(--spacing-1); + position: absolute; + top: calc(var(--arrow) * -1); + left: 50% ; + transform: translateX(-50%); + content: ""; + border-bottom: var(--arrow) solid var(--menu-dropdown-bg); + border-left: var(--arrow) solid transparent; + border-right: var(--arrow) solid transparent; + } + .menu-1 > li:focus .menu-2, + .menu-1 > li:focus-within .menu-2, + .menu-1 > li:hover .menu-2 { + display: block; + } + .menu-steps { + margin: 0 .75rem; + } +} + diff --git a/assets/css/site/screencast.css b/assets/css/site/screencast.css new file mode 100644 index 0000000000..6175bde887 --- /dev/null +++ b/assets/css/site/screencast.css @@ -0,0 +1,27 @@ +.screencast { + grid-template-columns: 1fr; + border-radius: var(--rounded); + overflow: hidden; +} + +.screencast .h6, +.screencast .h2 { + color: var(--color-white); + margin-top: 0; +} + +.screencast a { + text-decoration: none; +} + +@media screen and (min-width: 42rem) { + .screencast { + grid-template-columns: 1fr 1fr; + } +} + +@media screen and (min-width: 72rem) { + .screencast { + grid-template-columns: 1fr 2fr; + } +} diff --git a/assets/css/site/search.css b/assets/css/site/search.css new file mode 100644 index 0000000000..3f207df1b2 --- /dev/null +++ b/assets/css/site/search.css @@ -0,0 +1,159 @@ +.search .search-button { + padding: .5rem .75rem; +} + +.search-dialog { + display: grid; +} +.search-dialog form { + width: calc(100% - 3rem); + max-width: 35rem; + border-radius: var(--rounded-sm); +} + +.search-input { + border-bottom: 1px solid var(--color-light); +} +.search-input > figure { + position: absolute; + top: 0; + left: 0; + height: 3rem; + width: 2.5rem; +} +.search-input input { + padding: 0 var(--spacing-3) 0 2.5rem; + height: 3rem; + width: 100%; + background: none; +} +.search-input input:focus { + outline-offset: -2px; +} +.search-input-area { + width: 7.5rem; +} +.search-input-area button { + display: block; + width: 100%; + text-align: left; + padding: 0 var(--spacing-3); +} +.search-input-area > button { + height: 3rem; + width: 7.5rem; +} +.search-input-area > button > span { + position: relative; +} +.search-input-area > button > span::after { + position: absolute; + top: 50%; + right: .5rem; + content: ""; + margin-top: -3px; + border-top: 4px solid #000; + border-left: 4px solid transparent; + border-right: 4px solid transparent; +} +.search-input-area ul { + position: absolute; + top: 100%; + right: 0; + left: 0; + padding: var(--spacing-2) 0; +} +.search-input-area ul::before { + --arrow: var(--spacing-1); + position: absolute; + top: calc(var(--arrow) * -1); + left: 50% ; + transform: translateX(-50%); + content: ""; + border-bottom: var(--arrow) solid var(--menu-dropdown-bg); + border-left: var(--arrow) solid transparent; + border-right: var(--arrow) solid transparent; +} +.search-input-area li { + padding: var(--spacing-1) var(--spacing-3); + white-space: nowrap; +} +.search-input-area li:first-child { + border-bottom: 1px solid var(--color-gray-700); + padding-bottom: var(--spacing-3); + margin-bottom: var(--spacing-2); +} + +.search-area[data-area] { + padding: var(--spacing-1) var(--spacing-2); + background: var(--color-light); + font-family: var(--font-mono); + font-size: var(--text-xs); + border-radius: var(--rounded-sm); +} +.search-area[data-area]:empty { + visibility: hidden; +} +.search-area[data-area="guide"] { + background: var(--color-yellow-400); +} +.search-area[data-area="reference"] { + background: var(--color-blue-400); +} +.search-area[data-area="cookbook"] { + background: var(--color-purple-400); +} +.search-area[data-area="plugin"] { + background: var(--color-aqua-400); +} +.search-area[data-area="kosmos"] { + background: var(--color-red-400); +} + +.search-results li { + border-bottom: 1px solid var(--color-light); +} +.search-results li a { + display: grid; + grid-column-gap: var(--spacing-6); + grid-template-columns: minmax(0, 4fr) 1fr; + justify-items: start; + align-items: start; + padding: var(--spacing-3); + overflow: hidden; + text-overflow: ellipsis; +} +.search-results li a aside { + justify-self: end; +} +.search-results li a small { + display: block; + min-width: 0; + max-width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.search-footer { + height: 3rem; + background: var(--color-gray-200); + border-bottom-left-radius: var(--rounded-sm); + border-bottom-right-radius: var(--rounded-sm); +} +.search-footer a { + padding: 0 var(--spacing-3); + height: 3rem; + display: inline-flex; + align-items: center; +} +.search-footer a svg { + height: 1rem; + margin-left: .75rem; +} + +.search-results li:focus-within, +.search-more:focus-within { + outline: solid; + outline: 5px auto -webkit-focus-ring-color; +} diff --git a/assets/css/site/sidebar.css b/assets/css/site/sidebar.css new file mode 100644 index 0000000000..7e257efcff --- /dev/null +++ b/assets/css/site/sidebar.css @@ -0,0 +1,35 @@ +.sidebar { + font-size: var(--text-base); +} +.sidebar ul a { + font-weight: var(--font-bold); +} +.sidebar ul a[aria-current] { + color: var(--color-black); +} + +.sidebar li { + margin-bottom: .25rem; +} + +.sidebar .details { + margin-left: -1.75rem; +} +.sidebar .details summary::after { + margin-top: .25rem; +} + +.sidebar-menu-2 { + position: relative; + font-size: var(--text-sm); + line-height: 1; + padding-top: .625rem; + padding-bottom: .125rem; +} +.sidebar-menu-2 li { + margin-bottom: .5rem; +} +.sidebar-menu-2 li > a { + font-weight: normal; + color: var(--color-gray-700); +} diff --git a/assets/css/site/toc.css b/assets/css/site/toc.css new file mode 100644 index 0000000000..b27e6e6da6 --- /dev/null +++ b/assets/css/site/toc.css @@ -0,0 +1,20 @@ +.toc ol { + padding-top: var(--spacing-4); + padding-left: var(--spacing-12); + border-left: 2px solid var(--color-black); + font-size: var(--text-xl); +} +.toc li { + list-style: decimal-leading-zero; + padding-left: .25em; +} +.toc li::marker { + font-variant-numeric: tabular-nums; + font-weight: var(--font-bold); + font-size: var(--text-xs); + font-family: var(--font-mono); + color: var(--color-black); +} +.toc a { + display: inline-flex; +} diff --git a/assets/css/site/types.css b/assets/css/site/types.css new file mode 100644 index 0000000000..66a8431169 --- /dev/null +++ b/assets/css/site/types.css @@ -0,0 +1,25 @@ +.type { + white-space: nowrap; +} +.type-link { + text-decoration: none !important; +} +.type.type-string { + background: var(--color-green-300); +} +.type.type-int { + background: var(--color-orange-300); +} +.type.type-float { + background: var(--color-red-300); +} +.type.type-bool { + background: var(--color-purple-300); +} +.type.type-array { + background: var(--color-aqua-300); +} +.type.type-object, +.type.type-class { + background: var(--color-yellow-300); +} diff --git a/assets/css/site/utilities.css b/assets/css/site/utilities.css new file mode 100644 index 0000000000..4c12a8255b --- /dev/null +++ b/assets/css/site/utilities.css @@ -0,0 +1,84 @@ +html { + background: linear-gradient(to right, var(--color-white), var(--color-gray-100), #fbf8f4); +} + +.badge { + font-family: var(--font-mono); + font-size: var(--text-xs); + background: var(--color-black); + color: var(--color-white); + padding: var(--spacing-2px) var(--spacing-3); + display: inline-flex; + white-space: nowrap; +} + +.bg-light { + background: var(--color-light); +} +.bg-dark { + background: var(--color-dark); +} + +.border { + position: relative; + border: 2px solid var(--color-black); +} +.border-top { + border-top: 2px solid var(--color-black); +} + +.color-gray-400 { + color: var(--color-gray-400); +} +.color-gray-500 { + color: var(--color-gray-500); +} +.color-gray-600 { + color: var(--color-gray-600); +} +.color-gray-700 { + color: var(--color-gray-700); +} + +.dimmed { + background: var(--color-black); +} +.dimmed img { + opacity: .8; +} + +.h-3 { + height: 3rem; +} + +.iconbox { + --size: 2rem; + width: var(--size); + height: var(--size); + display: grid; + place-items: center; + border-radius: var(--rounded-sm); + flex-shrink: 0; +} + +.input { + background: var(--color-white); + padding: var(--spacing-2) var(--spacing-3); + width: 100%; + border-radius: var(--rounded-sm); +} + +.max-w-xs { + max-width: 20rem; +} +.max-w-xl { + max-width: 36rem; +} + +.rounded-xl { + border-radius: var(--spacing-2); +} + +.shadow-2xl { + box-shadow: var(--shadow-2xl); +} diff --git a/assets/css/site/variables.css b/assets/css/site/variables.css new file mode 100644 index 0000000000..339d2e1370 --- /dev/null +++ b/assets/css/site/variables.css @@ -0,0 +1,84 @@ +:root { + + --color-aqua-100: #EFFAFB; + --color-aqua-200: #DEF5F7; + --color-aqua-300: #C2EDF0; + --color-aqua-400: #A1E4E8; + --color-aqua-500: #52D9E0; + --color-aqua-600: #00C4CE; + --color-aqua-700: #00AAB2; + --color-aqua-800: #088B91; + --color-aqua-900: #006266; + + --color-blue-100: #F0F7FF; + --color-blue-200: #E5F1FF; + --color-blue-300: #CCE3FF; + --color-blue-400: #B3D4FF; + --color-blue-500: #75B1FF; + --color-blue-600: #4093FF; + --color-blue-700: #1371EC; + --color-blue-800: #0F5ABD; + --color-blue-900: #004299; + + --color-green-100: #F7FAE5; + --color-green-200: #EEF5C7; + --color-green-300: #E8F1B1; + --color-green-400: #DAE981; + --color-green-500: #CFE25A; + --color-green-600: #B9D700; + --color-green-700: #9BB500; + --color-green-800: #7E9108; + --color-green-900: #586600; + + --color-orange-100: #FFF5EB; + --color-orange-200: #FFE6CC; + --color-orange-300: #FFD9B3; + --color-orange-400: #FFC48A; + --color-orange-500: #FFAB57; + --color-orange-600: #FF9326; + --color-orange-700: #E57300; + --color-orange-800: #C2660A; + --color-orange-900: #804000; + + --color-pink-100: #FFEEFA; + --color-pink-200: #FFDDF6; + --color-pink-300: #FEBEED; + --color-pink-400: #FE98E2; + --color-pink-500: #FF71D7; + --color-pink-600: #FF4CCD; + --color-pink-700: #EC17B1; + --color-pink-800: #BD0F8C; + --color-pink-900: #8E0067; + + --color-purple-100: #F8F0FF; + --color-purple-200: #F4E5FF; + --color-purple-300: #E8CCFF; + --color-purple-400: #DDB3FF; + --color-purple-500: #C070FF; + --color-purple-600: #A93CFF; + --color-purple-700: #8D0DF2; + --color-purple-800: #710AC2; + --color-purple-900: #550099; + + --color-red-100: #FFF0F0; + --color-red-200: #FFE5E6; + --color-red-300: #FFCCCC; + --color-red-400: #FFB3B3; + --color-red-500: #FF8080; + --color-red-600: #FE4C4C; + --color-red-700: #E51A1A; + --color-red-800: #B81414; + --color-red-900: #800000; + + --color-yellow-100: #FEF8E2; + --color-yellow-200: #FCEFC0; + --color-yellow-300: #FBE9A8; + --color-yellow-400: #F9E086; + --color-yellow-500: #F6D355; + --color-yellow-600: #FDC500; + --color-yellow-700: #E5B300; + --color-yellow-800: #C29A0A; + --color-yellow-900: #806400; + + --color-dark: #313740; +} diff --git a/assets/css/site/voice.css b/assets/css/site/voice.css new file mode 100644 index 0000000000..83cfb94ca3 --- /dev/null +++ b/assets/css/site/voice.css @@ -0,0 +1,5 @@ +.voice > p { + border-left: 2px solid var(--color-black); + padding-left: .75rem; + max-width: 25rem; +} diff --git a/assets/css/site/with-sidebar.css b/assets/css/site/with-sidebar.css new file mode 100644 index 0000000000..e24adfd63f --- /dev/null +++ b/assets/css/site/with-sidebar.css @@ -0,0 +1,15 @@ +@media screen and (min-width: 48rem) { + .with-sidebar { + display: grid; + grid-gap: 3rem; + grid-template-columns: repeat(4, 1fr); + } + .with-sidebar > :first-child { + grid-column-start: 2; + grid-column-end: -1; + } + .with-sidebar > :last-child { + grid-row-start: 1; + grid-column-start: 1; + } +} diff --git a/assets/icons/alert.svg b/assets/icons/alert.svg new file mode 100644 index 0000000000..a8786993c9 --- /dev/null +++ b/assets/icons/alert.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/algolia.svg b/assets/icons/algolia.svg new file mode 100644 index 0000000000..03a4c4357a --- /dev/null +++ b/assets/icons/algolia.svg @@ -0,0 +1,4 @@ + + Algolia + + diff --git a/assets/icons/analytics.svg b/assets/icons/analytics.svg new file mode 100644 index 0000000000..6c1a059175 --- /dev/null +++ b/assets/icons/analytics.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/audio.svg b/assets/icons/audio.svg new file mode 100644 index 0000000000..abbee94871 --- /dev/null +++ b/assets/icons/audio.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/book.svg b/assets/icons/book.svg new file mode 100644 index 0000000000..d1cde4dbba --- /dev/null +++ b/assets/icons/book.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/cart.svg b/assets/icons/cart.svg new file mode 100644 index 0000000000..09fce56d85 --- /dev/null +++ b/assets/icons/cart.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/check.svg b/assets/icons/check.svg new file mode 100644 index 0000000000..a6e62ec89b --- /dev/null +++ b/assets/icons/check.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/code.svg b/assets/icons/code.svg new file mode 100644 index 0000000000..593f02bd2c --- /dev/null +++ b/assets/icons/code.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/cross.svg b/assets/icons/cross.svg new file mode 100644 index 0000000000..6cb1bc03d1 --- /dev/null +++ b/assets/icons/cross.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/css.svg b/assets/icons/css.svg new file mode 100644 index 0000000000..e16c00f325 --- /dev/null +++ b/assets/icons/css.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/discord.svg b/assets/icons/discord.svg new file mode 100644 index 0000000000..89f183f171 --- /dev/null +++ b/assets/icons/discord.svg @@ -0,0 +1,4 @@ + + Discord + + diff --git a/assets/icons/document.svg b/assets/icons/document.svg new file mode 100644 index 0000000000..eabfad9fc1 --- /dev/null +++ b/assets/icons/document.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/download.svg b/assets/icons/download.svg new file mode 100644 index 0000000000..634dbb99ab --- /dev/null +++ b/assets/icons/download.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/file.svg b/assets/icons/file.svg new file mode 100644 index 0000000000..e9b2d7b57b --- /dev/null +++ b/assets/icons/file.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/flash.svg b/assets/icons/flash.svg new file mode 100644 index 0000000000..55a477e255 --- /dev/null +++ b/assets/icons/flash.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/folder-collapsed.svg b/assets/icons/folder-collapsed.svg new file mode 100644 index 0000000000..2a6fc2120f --- /dev/null +++ b/assets/icons/folder-collapsed.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/folder-expanded.svg b/assets/icons/folder-expanded.svg new file mode 100644 index 0000000000..6a8eebac8e --- /dev/null +++ b/assets/icons/folder-expanded.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/font.svg b/assets/icons/font.svg new file mode 100644 index 0000000000..a18e6a9a2a --- /dev/null +++ b/assets/icons/font.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/forms.svg b/assets/icons/forms.svg new file mode 100644 index 0000000000..20379d5300 --- /dev/null +++ b/assets/icons/forms.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/git.svg b/assets/icons/git.svg new file mode 100644 index 0000000000..c01f75585b --- /dev/null +++ b/assets/icons/git.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/github.svg b/assets/icons/github.svg new file mode 100755 index 0000000000..6a496bc194 --- /dev/null +++ b/assets/icons/github.svg @@ -0,0 +1,4 @@ + + GitHub + + diff --git a/assets/icons/globe.svg b/assets/icons/globe.svg new file mode 100644 index 0000000000..f21b0fade7 --- /dev/null +++ b/assets/icons/globe.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/heart.svg b/assets/icons/heart.svg new file mode 100644 index 0000000000..c412a75afb --- /dev/null +++ b/assets/icons/heart.svg @@ -0,0 +1,4 @@ + + Love + + diff --git a/assets/icons/html.svg b/assets/icons/html.svg new file mode 100644 index 0000000000..45e5f25d01 --- /dev/null +++ b/assets/icons/html.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/icon.svg b/assets/icons/icon.svg new file mode 100644 index 0000000000..fa47eff2c9 --- /dev/null +++ b/assets/icons/icon.svg @@ -0,0 +1,5 @@ + + Kirby CMS + + + diff --git a/assets/icons/image.svg b/assets/icons/image.svg new file mode 100644 index 0000000000..43737531d6 --- /dev/null +++ b/assets/icons/image.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/info.svg b/assets/icons/info.svg new file mode 100644 index 0000000000..9eee9e961d --- /dev/null +++ b/assets/icons/info.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/instagram.svg b/assets/icons/instagram.svg new file mode 100644 index 0000000000..dadc6122c5 --- /dev/null +++ b/assets/icons/instagram.svg @@ -0,0 +1,4 @@ + + Instagram + + diff --git a/assets/icons/integration.svg b/assets/icons/integration.svg new file mode 100644 index 0000000000..3ff0c70f8f --- /dev/null +++ b/assets/icons/integration.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/javascript.svg b/assets/icons/javascript.svg new file mode 100644 index 0000000000..d7ce2ef939 --- /dev/null +++ b/assets/icons/javascript.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/keycdn.svg b/assets/icons/keycdn.svg new file mode 100644 index 0000000000..ecd4c08b26 --- /dev/null +++ b/assets/icons/keycdn.svg @@ -0,0 +1,4 @@ + + KeyCDN + + diff --git a/assets/icons/list.svg b/assets/icons/list.svg new file mode 100644 index 0000000000..5358061562 --- /dev/null +++ b/assets/icons/list.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/lock.svg b/assets/icons/lock.svg new file mode 100644 index 0000000000..5f114add1d --- /dev/null +++ b/assets/icons/lock.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/markdown.svg b/assets/icons/markdown.svg new file mode 100644 index 0000000000..87b2723033 --- /dev/null +++ b/assets/icons/markdown.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/menu.svg b/assets/icons/menu.svg new file mode 100644 index 0000000000..c2130592c9 --- /dev/null +++ b/assets/icons/menu.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/minus.svg b/assets/icons/minus.svg new file mode 100644 index 0000000000..fa8f621e1a --- /dev/null +++ b/assets/icons/minus.svg @@ -0,0 +1 @@ + diff --git a/content/1_docs/1_guide/15_virtual-pages/content-360deg.svg b/assets/icons/outline/360deg.svg similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/content-360deg.svg rename to assets/icons/outline/360deg.svg diff --git a/content/1_docs/1_guide/17_plugins/3d-29.svg b/assets/icons/outline/3d.svg similarity index 100% rename from content/1_docs/1_guide/17_plugins/3d-29.svg rename to assets/icons/outline/3d.svg diff --git a/assets/icons/outline/archive.svg b/assets/icons/outline/archive.svg new file mode 100644 index 0000000000..3fefd66b06 --- /dev/null +++ b/assets/icons/outline/archive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/blocks.svg b/assets/icons/outline/blocks.svg new file mode 100644 index 0000000000..e38b02a4e2 --- /dev/null +++ b/assets/icons/outline/blocks.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/book.svg b/assets/icons/outline/book.svg new file mode 100644 index 0000000000..7dd804a12c --- /dev/null +++ b/assets/icons/outline/book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/bookmark.svg b/assets/icons/outline/bookmark.svg new file mode 100644 index 0000000000..1d82cdc25e --- /dev/null +++ b/assets/icons/outline/bookmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/cloud.svg b/assets/icons/outline/cloud.svg new file mode 100644 index 0000000000..1aef3bacb5 --- /dev/null +++ b/assets/icons/outline/cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/1_docs/1_guide/5_templates/components.svg b/assets/icons/outline/components.svg similarity index 100% rename from content/1_docs/1_guide/5_templates/components.svg rename to assets/icons/outline/components.svg diff --git a/assets/icons/outline/console.svg b/assets/icons/outline/console.svg new file mode 100644 index 0000000000..966b24431e --- /dev/null +++ b/assets/icons/outline/console.svg @@ -0,0 +1 @@ + diff --git a/content/1_docs/1_guide/4_content/single-copy-04.svg b/assets/icons/outline/content.svg similarity index 100% rename from content/1_docs/1_guide/4_content/single-copy-04.svg rename to assets/icons/outline/content.svg diff --git a/content/home/features/7_data-sources/database.svg b/assets/icons/outline/database.svg similarity index 100% rename from content/home/features/7_data-sources/database.svg rename to assets/icons/outline/database.svg diff --git a/content/1_docs/1_guide/11_routing/directions.svg b/assets/icons/outline/directions.svg similarity index 100% rename from content/1_docs/1_guide/11_routing/directions.svg rename to assets/icons/outline/directions.svg diff --git a/content/1_docs/1_guide/13_emails/email-85.svg b/assets/icons/outline/email.svg similarity index 100% rename from content/1_docs/1_guide/13_emails/email-85.svg rename to assets/icons/outline/email.svg diff --git a/content/1_docs/1_guide/6_blueprints/form.svg b/assets/icons/outline/form.svg similarity index 100% rename from content/1_docs/1_guide/6_blueprints/form.svg rename to assets/icons/outline/form.svg diff --git a/content/1_docs/1_guide/7_languages/globe.svg b/assets/icons/outline/globe.svg similarity index 100% rename from content/1_docs/1_guide/7_languages/globe.svg rename to assets/icons/outline/globe.svg diff --git a/assets/icons/outline/hierarchy.svg b/assets/icons/outline/hierarchy.svg new file mode 100644 index 0000000000..22be212955 --- /dev/null +++ b/assets/icons/outline/hierarchy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/hook.svg b/assets/icons/outline/hook.svg new file mode 100644 index 0000000000..d353efb475 --- /dev/null +++ b/assets/icons/outline/hook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/json.svg b/assets/icons/outline/json.svg new file mode 100644 index 0000000000..edf067c41c --- /dev/null +++ b/assets/icons/outline/json.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/link.svg b/assets/icons/outline/link.svg new file mode 100644 index 0000000000..0194de0908 --- /dev/null +++ b/assets/icons/outline/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/lock.svg b/assets/icons/outline/lock.svg new file mode 100644 index 0000000000..8bb4682be6 --- /dev/null +++ b/assets/icons/outline/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/1_docs/1_guide/16_api/node.svg b/assets/icons/outline/node.svg similarity index 100% rename from content/1_docs/1_guide/16_api/node.svg rename to assets/icons/outline/node.svg diff --git a/assets/icons/outline/panel.svg b/assets/icons/outline/panel.svg new file mode 100644 index 0000000000..ca59729690 --- /dev/null +++ b/assets/icons/outline/panel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/performance.svg b/assets/icons/outline/performance.svg new file mode 100644 index 0000000000..a82e07f2b0 --- /dev/null +++ b/assets/icons/outline/performance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/spaceship.svg b/assets/icons/outline/spaceship.svg new file mode 100644 index 0000000000..8fef942d90 --- /dev/null +++ b/assets/icons/outline/spaceship.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/tag.svg b/assets/icons/outline/tag.svg new file mode 100644 index 0000000000..0577fd76ce --- /dev/null +++ b/assets/icons/outline/tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/thumb.svg b/assets/icons/outline/thumb.svg new file mode 100644 index 0000000000..3d542d4854 --- /dev/null +++ b/assets/icons/outline/thumb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outline/users.svg b/assets/icons/outline/users.svg new file mode 100644 index 0000000000..be3824a053 --- /dev/null +++ b/assets/icons/outline/users.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/home/features/9_vue/vue.svg b/assets/icons/outline/vue.svg similarity index 100% rename from content/home/features/9_vue/vue.svg rename to assets/icons/outline/vue.svg diff --git a/assets/icons/panel.svg b/assets/icons/panel.svg new file mode 100644 index 0000000000..3819b5abf6 --- /dev/null +++ b/assets/icons/panel.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/performance.svg b/assets/icons/performance.svg new file mode 100644 index 0000000000..3e287c6eb8 --- /dev/null +++ b/assets/icons/performance.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/php.svg b/assets/icons/php.svg new file mode 100644 index 0000000000..5a16140b5a --- /dev/null +++ b/assets/icons/php.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/plus.svg b/assets/icons/plus.svg new file mode 100644 index 0000000000..75befeaa13 --- /dev/null +++ b/assets/icons/plus.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/readme.svg b/assets/icons/readme.svg new file mode 100644 index 0000000000..30d7d645ba --- /dev/null +++ b/assets/icons/readme.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/search.svg b/assets/icons/search.svg new file mode 100644 index 0000000000..f108c06b51 --- /dev/null +++ b/assets/icons/search.svg @@ -0,0 +1,4 @@ + + Search + + diff --git a/assets/icons/seo.svg b/assets/icons/seo.svg new file mode 100644 index 0000000000..d609f88131 --- /dev/null +++ b/assets/icons/seo.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/spaceship.svg b/assets/icons/spaceship.svg new file mode 100644 index 0000000000..3718f7da33 --- /dev/null +++ b/assets/icons/spaceship.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/spreadsheet.svg b/assets/icons/spreadsheet.svg new file mode 100644 index 0000000000..9839683c09 --- /dev/null +++ b/assets/icons/spreadsheet.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/star.svg b/assets/icons/star.svg new file mode 100644 index 0000000000..214921f25e --- /dev/null +++ b/assets/icons/star.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/success.svg b/assets/icons/success.svg new file mode 100644 index 0000000000..939264f5eb --- /dev/null +++ b/assets/icons/success.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/sun.svg b/assets/icons/sun.svg new file mode 100644 index 0000000000..c198aec157 --- /dev/null +++ b/assets/icons/sun.svg @@ -0,0 +1,4 @@ + + Light + + diff --git a/assets/icons/text.svg b/assets/icons/text.svg new file mode 100644 index 0000000000..d847feae9b --- /dev/null +++ b/assets/icons/text.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/twitter.svg b/assets/icons/twitter.svg new file mode 100644 index 0000000000..e6f19df184 --- /dev/null +++ b/assets/icons/twitter.svg @@ -0,0 +1,4 @@ + + Twitter + + diff --git a/assets/icons/video.svg b/assets/icons/video.svg new file mode 100644 index 0000000000..316dbe7687 --- /dev/null +++ b/assets/icons/video.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/wand.svg b/assets/icons/wand.svg new file mode 100644 index 0000000000..8e0b254dcc --- /dev/null +++ b/assets/icons/wand.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/warning.svg b/assets/icons/warning.svg new file mode 100644 index 0000000000..8f881319f4 --- /dev/null +++ b/assets/icons/warning.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/widget.svg b/assets/icons/widget.svg new file mode 100644 index 0000000000..84056e66f5 --- /dev/null +++ b/assets/icons/widget.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/word.svg b/assets/icons/word.svg new file mode 100644 index 0000000000..2ae95febf5 --- /dev/null +++ b/assets/icons/word.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/yaml.svg b/assets/icons/yaml.svg new file mode 100644 index 0000000000..08b0b5cbfd --- /dev/null +++ b/assets/icons/yaml.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/youtube.svg b/assets/icons/youtube.svg new file mode 100644 index 0000000000..b1a8b24d76 --- /dev/null +++ b/assets/icons/youtube.svg @@ -0,0 +1,4 @@ + + YouTube + + diff --git a/assets/icons/zip.svg b/assets/icons/zip.svg new file mode 100644 index 0000000000..b632ac97cc --- /dev/null +++ b/assets/icons/zip.svg @@ -0,0 +1 @@ + diff --git a/www/favicon.ico b/assets/images/favicon.ico similarity index 100% rename from www/favicon.ico rename to assets/images/favicon.ico diff --git a/www/favicon.png b/assets/images/favicon.png similarity index 100% rename from www/favicon.png rename to assets/images/favicon.png diff --git a/www/kirby-signet.svg b/assets/images/kirby-signet.svg similarity index 100% rename from www/kirby-signet.svg rename to assets/images/kirby-signet.svg diff --git a/www/opensearch.png b/assets/images/opensearch.png similarity index 100% rename from www/opensearch.png rename to assets/images/opensearch.png diff --git a/www/safari-mask-icon.svg b/assets/images/safari-mask-icon.svg similarity index 100% rename from www/safari-mask-icon.svg rename to assets/images/safari-mask-icon.svg diff --git a/assets/js/components/affiliates.js b/assets/js/components/affiliates.js new file mode 100644 index 0000000000..4341dd2b30 --- /dev/null +++ b/assets/js/components/affiliates.js @@ -0,0 +1,52 @@ + +const PADDLE_VENDOR_ID = 1129; +const PADDLE_SCRIPT_URL = "https://cdn.paddle.com/paddle/paddle.js"; + +export default class { + + constructor() { + this.init(); + } + + async init() { + // don’t do anything further, if the current page already contains + // the Paddle.js script. + if ( + "Paddle" in window || + document.querySelector(`script[src="${PADDLE_SCRIPT_URL}"]`) !== null + ) { + return; + } + + const p = new URLSearchParams(window.location.search); + + // load paddle.js and set vendor id, if coming from an affiliate + // link, so the script can store affiliate tracking information + // in a cookie. + if ( + p.has("status") && + p.has("expires") && + p.has("seller") && + p.has("affiliate") && + p.has("link") && + p.has("p_tok") + ) { + this.load(); + } + } + + load() { + // create script tag for external paddle.js + const script = document.createElement("script"); + script.src = PADDLE_SCRIPT_URL; + + // set callback for when script is loaded + script.onload = () => { + Paddle.Setup({ vendor: PADDLE_VENDOR_ID }); + }; + + // insert in DOM + const at = document.getElementsByTagName("script")[0]; + at.parentNode.insertBefore(script, at); + } +} diff --git a/assets/js/components/code.js b/assets/js/components/code.js new file mode 100644 index 0000000000..8f498964e2 --- /dev/null +++ b/assets/js/components/code.js @@ -0,0 +1,72 @@ + +export default class { + + constructor() { + this.init(); + } + + async init() { + await import("../libraries/prism.js"); + this.setClass(); + this.setLanguages(); + this.setToolbar(); + Prism.highlightAll(); + } + + setClass() { + Prism.plugins.customClass.prefix("code-"); + } + + setLanguages() { + Prism.languages.kirbytext = Prism.languages.extend("markdown", {}); + + Prism.languages.insertBefore("kirbytext", "prolog", { + "kirbytag": { + pattern: /\([a-z0-9_-]+:.*?\)/i, + inside: { + "kirbytag-bracket": /^\(|\)$/, + "kirbytag-name": { + pattern: /^[a-z0-9_-]+:/i, + }, + "kirbytag-attr": { + pattern: /([^:]\s+)[a-z0-9_-]+:/i, + lookbehind: true, + }, + } + }, + }); + + Prism.languages.kirbycontent = { + "delimiter": /\n----\s*\n*/, + "property": { + pattern: /(^\n*|\n----\s*\n*)[a-zA-Z0-9_\-\u0020]+:/, + lookbehind: true, + } + }; + } + + setToolbar() { + Prism.plugins.toolbar.registerButton('select-code', (env) => { + const button = document.createElement('button'); + button.insertAdjacentHTML("beforeend", ' '); + + const text = document.createElement("span"); + text.textContent = "Copy"; + button.appendChild(text); + + button.addEventListener("click", async () => { + const { default: clipboard } = await import("../libraries/clipboard.js"); + try { + await clipboard(env.code); + text.textContent = "Copied!"; + } catch (error) { + text.textContent = "Press Ctrl+C/⌘+C to copy"; + } finally { + setTimeout(() => { text.textContent = "Copy" }, 5000); + } + }); + + return button; + }); + } +} diff --git a/assets/js/components/lightbox.js b/assets/js/components/lightbox.js new file mode 100644 index 0000000000..a52aafd6c8 --- /dev/null +++ b/assets/js/components/lightbox.js @@ -0,0 +1,153 @@ +export default class { + + constructor() { + this.$thumbs = document.querySelectorAll("[data-lightbox]"); + this.$group = []; + this.$dialog = null; + this.current = null; + + [...this.$thumbs].forEach(thumb => { + thumb.addEventListener('touchmove', {}); + thumb.addEventListener("click", e => { + e.preventDefault(); + this.open(thumb); + }); + }); + } + + create() { + this.$dialog = document.createElement("dialog"); + this.$dialog.classList.add("lightbox"); + this.$dialog.classList.add("overlay"); + + // Polyfill for all browsers that don't support yet + // (see `/assets/js/polyfills/dialog.js`) + polyfillDialog(this.$dialog); + + // Navigation buttons + const prev = document.createElement("button"); + prev.innerHTML = "←" + prev.addEventListener("click", (e) => { + e.stopPropagation(); + this.prev(); + }); + this.$dialog.appendChild(prev); + + const next = document.createElement("button"); + next.innerHTML = "→" + next.addEventListener("click", (e) => { + e.stopPropagation(); + this.next(); + }); + this.$dialog.appendChild(next); + + // Content wrapper + const content = document.createElement("div"); + this.$dialog.appendChild(content); + + document.body.appendChild(this.$dialog); + + // Close dialog when clicking on backdrop + this.$dialog.addEventListener("click", (e) => { + const content = this.$dialog.lastElementChild.firstElementChild; + if (content.contains(e.target) === false) { + this.close(); + } + }); + + document.addEventListener("keyup", (e) => { + if (this.current !== null) { + // Close dialog when hitting ESC + if (e.key === "Escape") { + return this.close(); + } + + // Keyboard navigation + if (e.key === "ArrowRight") { + return this.next(); + } + + if (e.key === "ArrowLeft") { + return this.prev(); + } + } + }) + } + + open(element) { + if (this.$dialog === null) { + this.create(); + } + + this.current = element; + + const group = this.current.dataset.lightbox; + + if (group) { + this.$group = [...this.$thumbs].filter(thumb => thumb.dataset.lightbox === group); + } else { + this.$group = []; + } + + if (this.hasPrev() === true) { + this.$dialog.dataset.hasPrev = group; + } else { + delete this.$dialog.dataset.hasPrev; + } + + if (this.hasNext() === true) { + this.$dialog.dataset.hasNext = group; + } else { + delete this.$dialog.dataset.hasNext; + } + + // Add image to the dialog + this.$dialog.lastElementChild.innerHTML = ``; + + // Open dialog and lock body scroll + this.$dialog.show(); + document.documentElement.style.overflow = "hidden"; + + // Slightly delay adding data-visible to trigger CSS transition + setTimeout(() => { + this.$dialog.dataset.visible = true; + }, 50); + } + + close() { + this.current = null; + + // Remove data-visible + delete this.$dialog.dataset.visible; + + // Delay closing dialog until fade-out transition has finished + setTimeout(() => { + this.$dialog.close(); + document.documentElement.style.overflow = null; + }, 400); + } + + currentIndex() { + return this.$group.findIndex(x => x === this.current); + } + + hasPrev() { + return this.currentIndex() > 0; + } + + hasNext() { + return this.currentIndex() < (this.$group.length - 1); + } + + prev() { + if (this.hasPrev() === true) { + this.open(this.$group[this.currentIndex() - 1]); + } + } + + next() { + if (this.hasNext() === true) { + this.open(this.$group[this.currentIndex() + 1]); + } + } +} diff --git a/assets/js/components/menu.js b/assets/js/components/menu.js new file mode 100644 index 0000000000..6c88050eb5 --- /dev/null +++ b/assets/js/components/menu.js @@ -0,0 +1,18 @@ + +export default class { + + constructor() { + this.$el = document.querySelector(".menu-toggle") + + if (this.$el) { + this.$el.addEventListener("keydown", this.onKey, true); + } + } + + onKey(e) { + if (e.key === "Enter") { + e.target.click(); + } + } + +} diff --git a/assets/js/components/playground.js b/assets/js/components/playground.js new file mode 100644 index 0000000000..466496bbf9 --- /dev/null +++ b/assets/js/components/playground.js @@ -0,0 +1,44 @@ + +export class Playground { + + constructor() { + this.$el = document.querySelector(".playground"); + + document.addEventListener("click", (e) => { + const link = e.target.closest(".playground-header-menu a:not(.more)"); + + if (link) { + e.preventDefault(); + this.switchTo(link); + } + }) + } + + switchTo(link) { + // fade out the old image + this.$el.querySelector(".playground-header-figure-wrapper").classList.add("loading"); + + setTimeout(async () => { + const response = await fetch(link); + const body = await response.text(); + const parser = new DOMParser(); + const doc = parser.parseFromString(body, "text/html"); + + // hide the new image before it gets injected + doc.querySelector(".playground-header-figure-wrapper").classList.add("loading"); + + // replace the playground + this.$el.innerHTML = doc.querySelector(".playground").innerHTML; + + // fade in the image on load + this.$el.querySelector(".playground-header-figure img").addEventListener("load", function () { + setTimeout(() => { + this.parentNode.classList.remove("loading"); + }, 200); + }); + + // reactivate code highlighting + Prism.highlightAll(); + }, 200); + } +} diff --git a/assets/js/components/reference.js b/assets/js/components/reference.js new file mode 100644 index 0000000000..e15adc2581 --- /dev/null +++ b/assets/js/components/reference.js @@ -0,0 +1,47 @@ +export class Menu { + constructor() { + this.$menu = document.querySelector(".reference-menu"); + this.$toggles = this.$menu.querySelectorAll("button"); + this.$sidebar = document.querySelector(".reference-sidebar"); + this.$entries = document.querySelector(".reference-entries"); + this.$content = document.querySelector(".reference-content"); + + this.menu = null; + this.isOpen = false; + this.hasEntries = !!this.$entries; + + for (let i = 0; i < this.$toggles.length - 1; i++) { + this.$toggles[i].addEventListener("click", () => { + this.menu = i === 0 ? this.$sidebar : this.$entries; + this.open() + }); + } + + this.$toggles[this.$toggles.length - 1].addEventListener("click", this.close.bind(this)); + } + + toggle() { + this.isOpen = !this.isOpen; + + if (this.isOpen && this.menu === this.$entries) { + this.$menu.style.justifyContent = "flex-end"; + } else { + this.$menu.style.justifyContent = null; + } + + [...this.$toggles].forEach(toggle => toggle.classList.toggle("hidden")); + } + + open() { + this.menu.style.display = "block"; + this.$content.style.display = "none"; + this.toggle(); + } + + close() { + this.menu.style.display = null; + this.$content.style.display = null; + this.menu = null; + this.toggle(); + } +} diff --git a/assets/js/components/search.js b/assets/js/components/search.js new file mode 100644 index 0000000000..e32b9493a9 --- /dev/null +++ b/assets/js/components/search.js @@ -0,0 +1,263 @@ + +const ALGOLIA_APP = "S7OGBIAJTV"; +const ALGOLIA_KEY = "d161a2f4cd2d69247c529a3371ad3050"; +const ALGOLIA_INDEX = "getkirby-3"; + +export default class { + + constructor() { + this.$btn = document.querySelectorAll(".search-button"); + this.$dialog = document.querySelector(".search-dialog"); + + if (!this.$dialog) { + return; + } + + this.$form = this.$dialog.querySelector("form"); + this.$area = new AreaSelector(this); + this.$input = this.$form.querySelector("input[name=q]"); + this.$results = this.$form.querySelector(".search-results ul"); + this.$result = this.$form.querySelector(".search-results template"); + this.$more = this.$form.querySelector(".search-more a"); + + this.q = ""; + this.results = []; + this.total = 0; + + // Register event for all search buttons + [...this.$btn].forEach(btn => { + btn.addEventListener("click", () => this.open(btn)); + }); + + this.$dialog.addEventListener("click", this.onBlur.bind(this)); + this.$input.addEventListener("input", debounce(this.onInput.bind(this), 200)); + this.$dialog.addEventListener("keydown", this.onKey.bind(this)); + + // Keyboard shortcut: + // `/` if no focus + // `Alt + /` always + // `Cmd + k` or `Ctrl + k` always + document.addEventListener("keydown", (e) => { + const withSlash = e.key === "/" || e.code === "Slash"; + const withMeta = e.ctrlKey === true || e.metaKey === true; + + if ( + (e.target === document.body && withSlash) || + (e.altKey === true && withSlash) || + (withMeta && e.key === "k") + ) { + this.open(this.$btn[0]) + e.preventDefault(); + } + }); + } + + open(btn) { + this.$dialog.show(); + document.documentElement.style.overflow = "hidden"; + this.$area.select(btn.dataset.area); + this.$input.focus(); + } + + close(e) { + this.$dialog.close(); + document.documentElement.style.overflow = null; + this.$input.value = "" + this.q = ""; + this.results = []; + this.total = 0; + this.$area.value = "all"; + this.$area.update(); + this.render(); + } + + async fetch(q) { + + const params = { + query: q, + hitsPerPage: 5 + }; + + if (this.$area.value !== "all") { + params.filters = "area:" + this.$area.value; + } + + // Call the Algolia API + const response = await fetch( + `https://${ALGOLIA_APP}-dsn.algolia.net/1/indexes/${ALGOLIA_INDEX}/query`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-Algolia-Application-Id": ALGOLIA_APP, + "X-Algolia-API-Key": ALGOLIA_KEY, + }, + body: JSON.stringify(params), + } + ); + const { hits, nbHits } = await response.json(); + + // Show View all item if there are any hits and + // there are more hits than those displayed in the popup. + this.total = nbHits; + + return hits; + } + + render() { + // Clear results list in dialog + this.$results.innerHTML = null; + + // Build a list entry for each result from HTML template + // and append to results list + for (let i = 0; i < this.results.length; i++) { + const result = this.$result.content.cloneNode(true); + const link = result.querySelector("a"); + link.href = "/" + this.results[i].objectID; + + const label = result.querySelector("strong"); + label.innerText = this.results[i].title; + const info = result.querySelector("small"); + info.innerText = this.results[i].objectID; + + if (this.results[i].area) { + const area = result.querySelector("aside"); + area.dataset.area = this.results[i].area; + area.innerText = this.results[i].area[0].toUpperCase() + this.results[i].area.slice(1); + } + + this.$results.appendChild(result); + } + + // Show/hide "View all" button + if (this.total > 5) { + this.$more.href = `/search?q=${this.q}&area=${this.$area.value}`; + const count = this.$more.querySelector(".search-more-count"); + count.innerText = this.total; + this.$more.classList.remove("hidden"); + } else { + this.$more.classList.add("hidden"); + } + } + + async search() { + this.q = this.$input.value.trim(); + this.results = []; + this.total = 0; + + if (this.q.length > 2) { + this.results = await this.fetch(this.q); + } + + this.render(); + this.$input.focus(); + } + + onBlur(e) { + if (this.$area.$el.contains(e.target) === false) { + this.$area.close(); + } + if (this.$form.contains(e.target) === false) { + this.close(); + } + } + + onInput() { + // If input value is same as previous search + // don't do anything + if (this.$input.value.trim() === this.q) { + return; + } + + this.search(); + } + + onKey(e) { + if (e.key === "Escape") { + this.onEscape(); + } else if (e.key === "ArrowDown") { + this.onArrowDown(e); + } else if (e.key === "ArrowUp") { + this.onArrowUp(e); + } + } + + onEscape() { + // If input is empty, close dialog. + // Otherwise first clear input. + if (this.q === "") { + this.close(); + } else { + this.$input.value = ""; + this.$input.dispatchEvent(new Event('input')); + } + } + + onArrowDown(e) { + e.preventDefault(); + const current = document.activeElement; + + if (current === this.$input) { + this.$results.firstElementChild.firstElementChild.focus(); + } else if (current.parentNode.nextElementSibling) { + current.parentNode.nextElementSibling.firstElementChild.focus(); + } else { + this.$more.focus(); + } + } + onArrowUp(e) { + e.preventDefault(); + const current = document.activeElement; + + if (current === this.$results.firstElementChild.firstElementChild) { + this.$input.focus(); + } else if (current === this.$more) { + this.$results.lastElementChild.firstElementChild.focus(); + } else if (current.parentNode.previousElementSibling) { + current.parentNode.previousElementSibling.firstElementChild.focus(); + } + } +} + +export class AreaSelector { + + constructor(parent) { + this.$parent = parent; + this.$el = parent.$form.querySelector(".search-input > nav"); + this.$btn = parent.$form.querySelector(".search-input > nav > button"); + this.$label = this.$btn.querySelector("[data-area]"); + this.$dropdown = this.$el.querySelector("ul"); + this.$options = this.$dropdown.querySelectorAll("[data-area]"); + this.$input = this.$el.querySelector("input[name=area]"); + + this.value = this.$input.value; + + this.$btn.addEventListener("click", this.toggle.bind(this)); + + [...this.$options].forEach(option => { + option.addEventListener("click", (e) => this.select(e.target.dataset.area)); + }); + } + + close() { + this.$dropdown.classList.add("hidden"); + } + + toggle() { + this.$dropdown.classList.toggle("hidden"); + } + + select(area) { + this.value = area; + this.$input.value = area; + this.update(); + this.close(); + this.$parent.search(); + } + + update() { + this.$label.dataset.area = this.value; + this.$label.innerText = [...this.$options].filter(option => option.dataset.area === this.value)[0].innerText; + } + +} diff --git a/assets/js/index.js b/assets/js/index.js new file mode 100644 index 0000000000..485327a1b8 --- /dev/null +++ b/assets/js/index.js @@ -0,0 +1,26 @@ + +// Helpers + +window.debounce = (callback, delay) => { + let timeout; + return () => { + clearTimeout(timeout); + timeout = setTimeout(callback, delay); + } +} + +// Components + +import Affiliates from "./components/affiliates.js"; +import Code from "./components/code.js"; +import Lightbox from "./components/lightbox.js"; +import Menu from "./components/menu.js"; +import Search from "./components/search.js"; + +new Affiliates(); +new Code(); +new Lightbox(); +new Menu(); +new Search(); + +import "./polyfills/dialog.js"; diff --git a/assets/js/libraries/clipboard.js b/assets/js/libraries/clipboard.js new file mode 100644 index 0000000000..fe5af0a8b8 --- /dev/null +++ b/assets/js/libraries/clipboard.js @@ -0,0 +1,2 @@ +/*! clipboard-copy. MIT License. Feross Aboukhadijeh */ +export default clipboardCopy;function makeError(){return new DOMException("The request is not allowed","NotAllowedError")}async function copyClipboardApi(e){if(!navigator.clipboard)throw makeError();return navigator.clipboard.writeText(e)}async function copyExecCommand(e){const o=document.createElement("span");o.textContent=e,o.style.whiteSpace="pre",o.style.webkitUserSelect="auto",o.style.userSelect="all",document.body.appendChild(o);const t=window.getSelection(),r=window.document.createRange();t.removeAllRanges(),r.selectNode(o),t.addRange(r);let n=!1;try{n=window.document.execCommand("copy")}finally{t.removeAllRanges(),window.document.body.removeChild(o)}if(!n)throw makeError()}async function clipboardCopy(e){try{await copyClipboardApi(e)}catch(o){try{await copyExecCommand(e)}catch(e){throw e||o||makeError()}}} diff --git a/assets/js/libraries/prism.js b/assets/js/libraries/prism.js new file mode 100755 index 0000000000..912ec48b73 --- /dev/null +++ b/assets/js/libraries/prism.js @@ -0,0 +1,16 @@ +/* PrismJS 1.23.0 +https://prismjs.com/download.html#themes=prism-dark&languages=markup+css+clike+javascript+bash+javadoclike+markdown+markup-templating+php+php-extras+yaml&plugins=custom-class+toolbar */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(r.length>n.length)return;if(!(k instanceof W)){var b,x=1;if(h){if(!(b=z(p,y,n,f)))break;var w=b.index,A=b.index+b[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var S=m;S!==r.tail&&(Pl.reach&&(l.reach=N);var j=m.prev;O&&(j=I(r,j,O),y+=O.length),q(r,j,x);var C=new W(o,g?M.tokenize(E,g):E,d,E);if(m=I(r,j,C),L&&I(r,m,L),1l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],r=e.head.next;for(;r!==e.tail;)n.push(r.value),r=r.next;return n}(a)},hooks:{all:{},add:function(e,n){var r=M.hooks.all;r[e]=r[e]||[],r[e].push(n)},run:function(e,n){var r=M.hooks.all[e];if(r&&r.length)for(var t,a=0;t=r[a++];)t(n)}},Token:W};function W(e,n,r,t){this.type=e,this.content=n,this.alias=r,this.length=0|(t||"").length}function z(e,n,r,t){e.lastIndex=n;var a=e.exec(r);if(a&&t&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,r){var t=n.next,a={value:r,prev:n,next:t};return n.next=a,t.prev=a,e.length++,a}function q(e,n,r){for(var t=n.next,a=0;a"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language,t=n.code,a=n.immediateClose;u.postMessage(M.highlight(t,M.languages[r],r)),a&&u.close()},!1)),M;var e=M.util.currentScript();function r(){M.manual||M.highlightAll()}if(e&&(M.filename=e.src,e.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var t=document.readyState;"loading"===t||"interactive"===t&&e&&e.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:s}};n["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var t={};t[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",t)}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),string:{pattern:e,greedy:!0},property:/(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),s.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/(^|["'\s])style\s*=\s*(?:"[^"]*"|'[^']*')/i,lookbehind:!0,inside:{"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{style:{pattern:/(["'])[\s\S]+(?=["']$)/,lookbehind:!0,alias:"language-css",inside:s.languages.css},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},"attr-name":/^style/i}}},t.tag))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-flags":/[a-z]+$/,"regex-delimiter":/^\/|\/$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript; +!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b\w+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)(["'])(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|(?!\2)[^\\`$])*\2/,lookbehind:!0,greedy:!0,inside:a}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],i=a.variable[1].inside,o=0;o=d.length);t++){var a=n[t];if("string"==typeof a||a.content&&"string"==typeof a.content){var r=d[m],o=p.tokenStack[r],c="string"==typeof a?a:a.content,i=v(k,r),u=c.indexOf(i);if(-1|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;a.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?={))/i,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},keyword:[{pattern:/(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*[a-z0-9_|]\|\s*)(?:null|false)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?[a-z0-9_|]\|\s*)(?:null|false)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:null|false)\b/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i],"argument-name":/\b[a-z_]\w*(?=\s*:(?!:))/i,"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:/\w+\s*(?=\()/,property:{pattern:/(->)[\w]+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)*)/,lookbehind:!0,inside:a.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];a.languages.insertBefore("php","variable",{string:r}),a.languages.insertBefore("php","variable",{attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=]$)/,lookbehind:!0,inside:{comment:e,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|]$/,alias:"punctuation"}}}}),a.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){a.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi)}}),a.hooks.add("after-tokenize",function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism); +!function(p){var a=p.languages.javadoclike={parameter:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*@(?:param|arg|arguments)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(a,"addSupport",{value:function(a,e){"string"==typeof a&&(a=[a]),a.forEach(function(a){!function(a,e){var n="doc-comment",t=p.languages[a];if(t){var r=t[n];if(!r){var o={"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}};r=(t=p.languages.insertBefore(a,"comment",o))[n]}if(r instanceof RegExp&&(r=t[n]={pattern:r}),Array.isArray(r))for(var i=0,s=r.length;i/g,function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?!\n|\r\n?))"}),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var e="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",t="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,function(){return e}),a="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";u.languages.markdown=u.languages.extend("markup",{}),u.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"font-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:u.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+t+a+"(?:"+t+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+t+a+")(?:"+t+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(e),inside:u.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+t+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+t+"$"),inside:{"table-header":{pattern:RegExp(e),alias:"important",inside:u.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/``.+?``|`[^`\r\n]+`/,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n("(~~?)(?:(?!~))+?\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},url:{pattern:n('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(e){["url","bold","italic","strike"].forEach(function(n){e!==n&&(u.languages.markdown[e].inside.content.inside[n]=u.languages.markdown[n])})}),u.hooks.add("after-tokenize",function(n){"markdown"!==n.language&&"md"!==n.language||!function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"}),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|]|}|(?:[\r\n]\\s*)?#))".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return e});return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,function(){return t})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return"(?:"+a+"|"+d+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("true|false","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.?\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); +!function(){if("undefined"!=typeof self&&self.Prism||"undefined"!=typeof global&&global.Prism){var a,e,t="";Prism.plugins.customClass={add:function(n){a=n},map:function(s){e="function"==typeof s?s:function(n){return s[n]||n}},prefix:function(n){t=n||""}},Prism.hooks.add("wrap",function(s){if(a){var n=a({content:s.content,type:s.type,language:s.language});Array.isArray(n)?s.classes.push.apply(s.classes,n):n&&s.classes.push(n)}(e||t)&&(s.classes=s.classes.map(function(n){return t+(e?e(n,s.language):n)}))})}}(); +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var i=[],l={},c=function(){};Prism.plugins.toolbar={};var e=Prism.plugins.toolbar.registerButton=function(e,n){var t;t="function"==typeof n?n:function(e){var t;return"function"==typeof n.onClick?((t=document.createElement("button")).type="button",t.addEventListener("click",function(){n.onClick.call(this,e)})):"string"==typeof n.url?(t=document.createElement("a")).href=n.url:t=document.createElement("span"),n.className&&t.classList.add(n.className),t.textContent=n.text,t},e in l?console.warn('There is a button with the key "'+e+'" registered already.'):i.push(l[e]=t)},t=Prism.plugins.toolbar.hook=function(a){var e=a.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&!e.parentNode.classList.contains("code-toolbar")){var t=document.createElement("div");t.classList.add("code-toolbar"),e.parentNode.insertBefore(t,e),t.appendChild(e);var r=document.createElement("div");r.classList.add("toolbar");var n=i,o=function(e){for(;e;){var t=e.getAttribute("data-toolbar-order");if(null!=t)return(t=t.trim()).length?t.split(/\s*,\s*/g):[];e=e.parentElement}}(a.element);o&&(n=o.map(function(e){return l[e]||c})),n.forEach(function(e){var t=e(a);if(t){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(t),r.appendChild(n)}}),t.appendChild(r)}};e("label",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-label")){var n,a,r=t.getAttribute("data-label");try{a=document.querySelector("template#"+r)}catch(e){}return a?n=a.content:(t.hasAttribute("data-url")?(n=document.createElement("a")).href=t.getAttribute("data-url"):n=document.createElement("span"),n.textContent=r),n}}),Prism.hooks.add("complete",t)}}(); diff --git a/assets/js/polyfills/dialog.js b/assets/js/polyfills/dialog.js new file mode 100644 index 0000000000..b02c12d86a --- /dev/null +++ b/assets/js/polyfills/dialog.js @@ -0,0 +1,10 @@ + +window.polyfillDialog = (dialog) => { + if (typeof HTMLDialogElement !== 'function') { + dialog.show = () => dialog.setAttribute("open", ""); + dialog.close = () => dialog.removeAttribute("open"); + } +}; + +const dialogs = document.querySelectorAll("dialog"); +[...dialogs].forEach(dialog => polyfillDialog(dialog)); diff --git a/backstop.default.json b/backstop.default.json deleted file mode 100644 index b2080d6834..0000000000 --- a/backstop.default.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "id": "getkirby", - "viewports": [ - { - "label": "mobile", - "width": 320, - "height": 480 - }, - { - "label": "s", - "width": 608, - "height": 400 - }, - { - "label": "m", - "width": 896, - "height": 500 - }, - { - "label": "l", - "width": 1200, - "height": 600 - } - ], - "scenarios": [ - { - "label": "BackstopJS Homepage", - "cookiePath": "backstop_data/engine_scripts/cookies.json", - "url": "https://garris.github.io/BackstopJS/", - "referenceUrl": "", - "readyEvent": "", - "readySelector": "", - "delay": 0, - "hideSelectors": [], - "removeSelectors": [], - "hoverSelector": "", - "clickSelector": "", - "postInteractionWait": 0, - "selectors": [], - "selectorExpansion": true, - "expect": 0, - "misMatchThreshold" : 0.1, - "requireSameDimensions": true - } - ], - "paths": { - "bitmaps_reference": "backstop_data/bitmaps_reference", - "bitmaps_test": "backstop_data/bitmaps_test", - "engine_scripts": "backstop_data/engine_scripts", - "html_report": "backstop_data/html_report", - "ci_report": "backstop_data/ci_report" - }, - "engine": "chrome", - "engineOptions": { - "chromeFlags": ["--force-device-scale-factor=1","--disable-infobars=true"] - }, - "debug": false, - "delay": 300 -} diff --git a/composer.json b/composer.json new file mode 100644 index 0000000000..499d4f10ea --- /dev/null +++ b/composer.json @@ -0,0 +1,16 @@ +{ + "name": "getkirby/getkirby.com", + "description": "The entire getkirby.com website", + "type": "project", + "homepage": "https://getkirby.com", + "require": { + "php": ">=7.3.0", + "getkirby/cms": "^3.5" + }, + "scripts": { + "run": "php -S localhost:8181 kirby/router.php" + }, + "config": { + "optimize-autoloader": true + } +} diff --git a/config.default.json b/config.default.json deleted file mode 100644 index 2155fc89d5..0000000000 --- a/config.default.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "host": "getkirby.test" -} diff --git a/content/0_product/1_features/link.txt b/content/0_product/1_features/link.txt deleted file mode 100644 index 3e921bcff2..0000000000 --- a/content/0_product/1_features/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Features - ----- - -Link: features diff --git a/content/0_product/2_why/link.txt b/content/0_product/2_why/link.txt deleted file mode 100644 index ac4795d5eb..0000000000 --- a/content/0_product/2_why/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Why Kirby? - ----- - -Link: why diff --git a/content/0_product/3_made-with-kirby/link.txt b/content/0_product/3_made-with-kirby/link.txt deleted file mode 100644 index 50fcc323f0..0000000000 --- a/content/0_product/3_made-with-kirby/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Showcase - ----- - -Link: love diff --git a/content/0_product/4_roadmap/link.txt b/content/0_product/4_roadmap/link.txt deleted file mode 100644 index eb27d5620a..0000000000 --- a/content/0_product/4_roadmap/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Roadmap - ----- - -Link: https://kirby.nolt.io/roadmap diff --git a/content/0_product/link.txt b/content/0_product/link.txt deleted file mode 100644 index 8556123682..0000000000 --- a/content/0_product/link.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Product - ----- - -Submenu: true - ----- - -Link: features diff --git a/content/1_docs/1_guide/13_emails/guide.txt b/content/1_docs/1_guide/13_emails/guide.txt deleted file mode 100644 index 65bf333e69..0000000000 --- a/content/1_docs/1_guide/13_emails/guide.txt +++ /dev/null @@ -1,276 +0,0 @@ -Title: Emails - ----- - -Description: How to use built-in classes and helpers to send emails from within Kirby. - ----- - -Intro: Kirby has a built-in email engine, which can be used to send notifications to your users, replies to filled in contact forms and more. - ----- -Text: - -## Simple - -```php -try { - $kirby->email([ - 'from' => 'welcome@supercompany.com', - 'replyTo' => 'no-reply@supercompany.com', - 'to' => 'someone@gmail.com', - 'cc' => 'anotherone@gmail.com', - 'bcc' => 'secret@gmail.com', - 'subject' => 'Welcome!', - 'body'=> 'It\'s great to have you with us', - ]); -} catch (Exception $error) { - echo $error; -} - -// errors will be thrown as Exceptions. If you want to notice/output -// errors, always use try-catch -``` - - - -### With custom name - -```php -$from = new \Kirby\Cms\User([ - 'email' => 'e@mail.com', - 'name' => 'Vorname Nachname', -]); - -try { - $kirby->email([ - 'from' => $from, - 'to' => 'someone@example.com', - 'subject' => 'Welcome!', - 'body'=> 'It\'s great to have you with us', - ]); -} catch (Exception $error) { - echo $error; -} -``` - - - -### With multiple recipients: - -```php -$kirby->email([ - 'from' => 'welcome@supercompany.com', - 'to' => [ - 'someone@gmail.com', - 'numbertwo@gmail.com' - ], - 'subject' => 'Welcome!', - 'body'=> 'It\'s great to have you with us', -]); - -// or with a collection of users -$kirby->email([ - 'to' => $kirby->users()->filterBy('role', 'newbies'), - … -]); -``` - - -## Plain Text - -```php -$kirby->email([ - 'to' => 'peter@lustig.de', - 'template' => 'my-email', - 'data' => [ - 'num' => '2' - ] -]); -``` - -```php "/site/templates/emails/my-email.php" -Welcome to Newsletter No. ! -``` - -## HTML & Plain Text - -```php "/site/templates/emails/media.html.php" -

Hi

-

-``` - -```php "in site/templates/emails/media.text.php" -Hi , - - -``` - -```php -$kirby->email([ - 'template' => 'media', - 'data' => [ - 'name' => 'Peter', - 'text' => 'welcome to our wonderful email list' - ] -]); -``` - -## Personalized emails to multiple users - -```php -foreach ($users as $user) { - try { - $kirby->email('management', [ - 'to' => $user, - 'template' => 'user-specific', - 'data' => [ - 'user' => $user - ] - ]); - } catch (Exception $error) { - echo $error; - } -} -``` -```php "/site/templates/emails/user-specific.php" -Welcome, name() ?>! -Great to have you with us since yearJoinedCompany() ?>. -``` - -## Sending Email with attachments - -```php -$kirby->email([ - 'from' => 'welcome@supercompany.com', - 'to' => 'someone@gmail.com', - 'subject' => 'Welcome!', - 'body' => 'Here are some attachments', - 'attachments' => [ - $page->file('somefile.jpg'), - $page->file('someotherfile.jpg') - ] -]); -``` - -## Check if email is sent successfully - -```php -$success = kirby()->email([ - 'from' => 'welcome@supercompany.com', - 'to' => 'someone@gmail.com', - 'subject' => 'Welcome!', - 'body' => 'We will never reply', -])->isSent(); -``` - -## Setting plain text and html body - -```php -kirby()->email([ - 'from' => 'welcome@supercompany.com', - 'to' => 'someone@gmail.com', - 'subject' => 'Welcome!', - 'body' => [ - 'html' => Html::a('https://getkirby.com'), - 'text' => 'https://getkirby.com', - ], -]); -``` - -## Email presets - -```php "/site/config/config.php" - -return [ - 'email' => [ - 'presets' => [ - 'contact' => [ - 'from' => 'no-reply@supercompany.com', - 'subject' => 'Thank you for your contact request', - 'cc' => 'marketing@supercompany.com', - 'body' => 'We will never reply' - ] - ] - ] -]; -``` - -```php -$kirby->email('contact', [ - 'to' => 'peter@lustig.de' -]); -``` - -## Transport configuration - -```php "/site/config/config.php" - -return [ - 'email' => [ - 'transport' => [ - 'type' => 'smtp', - 'host' => 'smtp.company.com', - 'port' => 465, - 'security' => true - ] - ] -]; -``` - - -If `security` is set to `true`, Kirby automatically converts it to `'tls'` or `'ssl'` depending on the configured port. If no port is given and secure transport is enabled, the port is set to 587 (the common port for SMTP over TLS). - - -You can also use `'tls'` or `'ssl'` explicitly via the `security` key. - -### With authentication - -```php "/site/config/config.php" - -return [ - 'email' => [ - 'transport' => [ - 'type' => 'smtp', - 'host' => 'smtp.server.com', - 'port' => 465, - 'security' => true, - 'auth' => true, - 'username' => '...', - 'password' => '...', - ] - ] -]; -``` - -## Access PHPMailer instance - - -You can get access to the underlying PHPMailer instance via the `beforeSend` callback: - -```php -$kirby->email([ - // … - 'beforeSend' => function ($mailer) { - $mailer->SMTPOptions = [ - 'ssl' => [ - 'verify_peer' => false, - 'verify_peer_name' => false, - 'allow_self_signed' => true - ] - ]; - - return $mailer; - } -]); -``` - - - -The `beforeSend` callback can also be added as [preset](#email-presets). - - -## More information -- (link: docs/reference/objects/kirby/email text: `$kirby->email()` ) -- (link: docs/cookbook/forms/basic-contact-form text: Email contact form) -- (link: docs/cookbook/forms/email-with-attachments text: Email with attachments) diff --git a/content/1_docs/1_guide/17_plugins/3_plugin-setup-basic/guide.txt b/content/1_docs/1_guide/17_plugins/3_plugin-setup-basic/guide.txt deleted file mode 100644 index 4d3687bbf1..0000000000 --- a/content/1_docs/1_guide/17_plugins/3_plugin-setup-basic/guide.txt +++ /dev/null @@ -1,144 +0,0 @@ -Title: Basic plugin setup - ----- - -Intro: Kirby plugins can be installed via three methods. You will learn how to support all of them in your published plugins. - ----- - -Text: - -## The three plugin installation methods - -Before we get started, let's take a look at the common plugin installation methods: - -1. **Simple "drag and drop" installation from a ZIP file** - This method is the most common for beginners or for sites that don't have a complex build and deploy process. Users download the current plugin version with the big green GitHub download button as a ZIP file, extract it and manually drop it into the `site/plugins` directory. No further steps (especially no `npm` or `composer` commands) should be needed, so the ZIP download needs to include everything the plugin needs. -2. **Installation as a Git submodule** - The version control system Git makes it pretty simple to import other Git repos into the site's repo with the [`git submodule add `](https://www.git-tower.com/learn/git/ebook/en/command-line/advanced-topics/submodules#start) command. Git will fetch the plugin repo and will place it into the `site/plugins` directory for the user. Again, there should be no further steps, so the contents of the repo need to be ready for use. -3. **Installation with Composer** - [Composer](https://getcomposer.org) is a dependency manager for PHP. It needs to be setup once by the users, but can then install Kirby plugins as well as other libraries automatically. It is particularly useful when working in a team or when a deployment setup is used and is therefore often used by advanced Kirby users. Plugins need support for Composer with a `composer.json` file. - -As you can see, each installation method has its own special requirements. But don't worry, all of our plugin setup tutorials are designed with all three methods in mind. - -It's important that your published plugin supports *all three* methods, as each of them has advantages and disadvantages. Depending on the personal preference of plugin users and their use-case and project requirements, a different method will be best for them. By supporting all three methods, you can increase your audience by quite a bit. That being said: If your plugin was just built for your own use, you don't need to care about any of this and only need to support the method(s) you personally use. - -So let's get started with the basic steps you need to take care of for published plugins. - -## The Pluginkit: Our example plugin - -We have created a simple example plugin called the [Pluginkit](https://github.com/getkirby/pluginkit). It has several Git branches for the different plugin setup tutorials. - -You can find the code for this basic tutorial in the [`1-basic`](https://github.com/getkirby/pluginkit/tree/1-basic) branch. - -If you want to follow along, you can [download a ZIP file of that branch](https://github.com/getkirby/pluginkit/archive/1-basic.zip) or get it via Composer: - -```bash -composer create-project getkirby/pluginkit site/plugins/your-plugin dev-1-basic --remove-vcs -``` - -Please note that using Composer on the command line is *not* required for this tutorial, not even for supporting plugin installation via Composer. For most plugins, you can use the ZIP file of the Pluginkit and never have to touch the command line (unless you want to, which is fine too). - - -The `composer create-project` command creates a `vendor` directory and a `composer.lock` file inside your new plugin directory. Both are not required if you don't plan to use Composer for plugin dependencies or autoloading, however they are also not harmful. In case you don't want to deal with them at all, download the [ZIP file](https://github.com/getkirby/pluginkit/archive/1-basic.zip), which does not include these files. - - -## General recommended setup - -### Your plugin's Git repo - -Your plugin needs to live inside its own **Git repository**. This is required for the Git submodule installation method. Where that Git repo lives does not matter. Most Kirby plugins are published on [GitHub](https://github.com), which makes collaboration with other users (e.g. bug reports, pull requests, forks of your plugin) easier. However it's also possible to set your Git repo up at a different provider like [GitLab](https://about.gitlab.com) or on your own [Gitea server](https://gitea.io/en-us/). - -### Basic files for configuration and documentation - -The Pluginkit contains several basic files that we recommend for all plugins: - -```filesystem -.editorconfig -.gitattributes -.gitignore -LICENSE.md -README.md -SECURITY.md -``` - -- The `.editorconfig` file contains rules for your code editor or IDE. It makes sure that the coding style (indentation, whitespace handling etc.) is consistent. We recommend it because it will make your life easier when contributors send a pull request to your plugin. If their code editor supports the standard as well, they won't need to do anything manually to use the same coding style as you. You can read more about the EditorConfig standard on [their website](https://editorconfig.org). -- The `.gitignore` file contains a list of files that should not be included in the Git repository. It should include all files that are never needed for your plugin (e.g. npm or Composer dependencies that are only used in development as well as build files and invisible operating system files). Never include any files your plugin needs (e.g. libraries you required via Composer). Also see the tutorial for the (link: docs/guide/plugins/plugin-setup-composer text: plugin setup with Composer dependencies) about this. -- The `.gitattributes` file is similar in that it ignores files. However it doesn't ignore files completely from the repo, but instead just from the ZIP download and the installation via Composer. It should contain files that are needed in the repo, but not for use of the plugin (e.g. unit and integration tests, the dotfiles like `.gitignore` and `.gitattributes` itself, scripts for development etc.). It is optional and only needed for that last ✨. Again, don't ignore any files that are needed for your plugin. Otherwise the ZIP download and Composer installation methods won't work. -- Much more important is the `LICENSE.md`. It tells your users which license your plugin is published under. The `MIT` license is pretty common, but you can of course use any license you like, open-source or not. You can find more about software licenses on . -- Equally important is the `README.md` file. It contains information about your plugin as well as installation and usage instructions. You can find an example `README` in the [Pluginkit](https://github.com/getkirby/pluginkit/blob/1-basic/README.md). -- We also recommend to include a security policy in `SECURITY.md`. This file will automatically be picked up by GitHub's "Security" tab and will tell your users which versions of your plugin are supported and what to do when a user finds a vulnerability in your plugin code. - -## The `composer.json` - -The `composer.json` file is the most important configuration file for your plugin. It enables users to install your plugin with Composer and also provides (link: docs/guide/plugins/plugin-basics#plugin-information text: useful metadata in the Kirby installation). - -The most basic form for a Kirby plugin looks like this: - -```js "composer.json" -{ - "name": "getkirby/pluginkit", - "description": "Kirby Example Plugin", - "type": "kirby-plugin", - "license": "MIT", - "authors": [ - { - "name": "Your Name", - "email": "you@example.com" - } - ], - "require": { - "getkirby/composer-installer": "^1.1" - } -} -``` - -- The `name` field is required and will later determine the name under which your plugin is available for installation via Composer. -- The fields `description`, `license` and `authors` are metadata fields. The contents of those fields are not important for plugin installation, but will show up in different places, like on [Packagist](https://packagist.org). -- The `type` and `require` fields are required for the correct installation of your plugin. By defining the package type as `kirby-plugin`, our `getkirby/composer-installer` package will know that your plugin needs to be installed to the `site/plugins` directory. For that to work, the `getkirby/composer-installer` package needs to be loaded explicitly. - - -*Both* the `type` field and the `getkirby/composer-installer` dependency are **required** for your plugin to work, otherwise it won't be loaded correctly by Kirby. - -Do *not* use the `composer/installers` package, it does not fully support Kirby 3 plugins. Our own `getkirby/composer-installer` was designed with this tutorial in mind. - - -The Composer installer will install your plugin to `site/plugins/{{ name }}` by default, so in this example to `site/plugins/pluginkit`. If your Composer package name differs from the name of your plugin (e.g. if it is `superwoman/kirby-plugin-superplugin`), you can override the plugin name in your `composer.json`: - -```js "composer.json" -{ - "name": "superwoman/kirby-plugin-superplugin", - ... - "type": "kirby-plugin", - ... - "require": { - "getkirby/composer-installer": "^1.1" - } - "extra": { - "installer-name": "superplugin" - } -} -``` - -Composer supports [many additional configuration options](https://getcomposer.org/doc/04-schema.md). Please note that the options that are defined as "root-only" do *not* apply to plugins. - -## The `index.php` - -Now let's get to the actual code of your plugin. - -The entry point for your plugin is the `index.php` file. You can read more about this file in the (link: docs/guide/plugins/plugin-basics text: Plugin Basics). - -Your plugin may have any number of additional code files. How to load them dynamically is described in the tutorial for the (link: docs/guide/plugins/plugin-setup-autoloader text: plugin setup with autoloader). - - -The setup with a separate `config.php` file for Composer is no longer recommended as it can cause issues with the autoloading order. If you put your code directly into the `index.php` file and *don't* autoload it with Composer, Kirby will pick it up just fine. - - -## Publish your plugin - -Once your plugin is ready, you can publish it with the following steps: - -1. Push your code to your Git repository. -2. Create a Git tag with the version number of your release. -3. Publish your plugin on [Packagist](https://packagist.org) to enable installation via Composer (only needed once, Packagist will pick up new Git tags automatically after that). -4. If you want to advertise your plugin in the [plugin directory](https://github.com/getkirby/getkirby.com/tree/master/content/plugins) on our (link: https://getkirby.com/plugins text: getkirby.com website), fork the (link: https://github.com/getkirby/getkirby.com text: getkirby.com repo), add the required pages for your plugin, and make a pull request. Or tell everybody about it on the (link: https://forum.getkirby.com text: forum) in the plugins category. diff --git a/content/1_docs/1_guide/1_quickstart/guide.txt b/content/1_docs/1_guide/1_quickstart/guide.txt deleted file mode 100644 index be2715decd..0000000000 --- a/content/1_docs/1_guide/1_quickstart/guide.txt +++ /dev/null @@ -1,232 +0,0 @@ -Title: Get up and running - ----- - -Description: All you need to know to get Kirby up and running: Installation, requirements and updates. - ----- - -Todos: -- Add a nice screenshot of the starterkit -- Add a glossary entry for document root and link it in the installation step - ----- - -Text: - -## Download and installation - -1. We provide two downloadable kits for you to get started with. - -(docs: kits) - -2. Extract the contents of the ZIP file into your server's web root -3. Visit your new Kirby site in your browser at `yourdomain.com` -4. Visit the (glossary: Panel) at `yourdomain.com/panel` - -(screenshot: panel.png) - - -When copying files to a remote server via (S)FTP, make sure to copy the `.htaccess` file as well. By default, files starting with a dot are invisible in the filesystem, so make sure enable the display of invisible files before copying. - - -## Requirements - - - - - - - - - - -
Web serverPHP
- Any of the following: -
    -
  • Apache 2
  • -
  • Nginx
  • -
  • LiteSpeed
  • -
  • Caddy
  • -
- - Server Features: -
    -
  • URL rewriting
  • -
-
-
    -
  • PHP 7.3, 7.4 or 8.0
    (PHP 7.4 is recommended)
  • -
  • mbstring extension
  • -
  • curl extension
  • -
  • ctype extension
  • -
  • gd extension
  • -
-
- -The server OS must be POSIX compatible. - -If you want to use PHP's built-in server, you have to start it up with Kirby's router: - -```php -php -S localhost:8000 kirby/router.php -``` - -Other servers (link: docs/reference/system/options/servers text: may work), but are not officially supported. - -### Browsers for the Panel - -Kirby does not modify the output of your site's templates and thus has no effect on its browser requirements. The Panel is built on modern browser features though and has a couple browser requirements which need to be met by your site's editors. - - - - - - - - - - -
DesktopMobile
-
    -
  • Chrome 57+
  • -
  • Firefox 54+
  • -
  • Safari 10.1+
  • -
  • Edge 16+
  • -
  • Opera 44+
  • -
-
-
    -
  • Mobile Safari 10.3+
  • -
  • Android Browser 67+
  • -
  • Chrome for Android 70+
  • -
-
- -### Alternative ways to install Kirby - -There are alternative installation methods for advanced users who prefer to install and update Kirby using commands on the command line or in their version control tool. Check them out and use whichever method you prefer. - -- (link: docs/cookbook/setup/composer text: Installation via Composer) -- (link: docs/cookbook/setup/git text: Installation as Git submodule) - - -If you don't have a local development environment yet and don't know what to use, check out our (link: docs/cookbook/setup/development-environment text: Local development environment) recipe. - - -### Installation guides for webhosts -Some providers have created dedicated guides how to install Kirby on their servers. If you are with one of these providers, keep on reading: -- (link: https://lab.uberspace.de/guide_kirby.html text: Installation on Uberspace) -- (link: https://help.fortrabbit.com/install-kirby-3 text: Installation on fortrabbit) -- (link: https://www.rosehosting.com/blog/how-to-install-kirby-cms-on-ubuntu-18-04/ text: Installation on RoseHosting) - - -## Create your first account - -Kirby's control panel (aka. the Panel) comes without any pre-installed accounts. Open `http://yourdomain.com/panel` in the browser to start the installer and create the first account. - - -For security reasons, you cannot install the Panel on a public server by default. To allow this, you can enable the (link: docs/reference/system/options/panel#allow-the-panel-to-be-installed-on-a-remote-server text: `panel.install` option): - - -## Register your installation - -Once you publish your website, you need to (link: buy text: purchase a Kirby license). We will send you a unique license code for your domain. You can register your installation with the following steps. - -1. Open the Panel at `http://yourdomain.com/panel` and log in. -2. Click on "Register" at the top. -3. Enter your license code and your email address and press "Ok". - -### Without using the Panel - - - -If you don’t want the Panel to connect to our server, registration via the Panel fails, or you are not using the Panel at all, you can download your license files directly from our licenses website: - -1. Visit (link: https://licenses.getkirby.com). -2. Log in with the email you used when you purchased the license and any order number. -3. In the list of your licenses, click on the key you want to register. -4. Use the "Download license file" button to download the license file. -5. Rename the downloaded file to `.license` (without extensions). -6. Place it in the `/site/config/` folder of your Kirby installation. - - - -## Updates - -To update Kirby, download the latest version and replace the `kirby` folder. - -Make sure to delete the media folder. It will be automatically recreated. - -That's it! Because Kirby does not use a database by default, you don't have to run any database migrations. - - -Never update a live website directly on the server. Test updates locally first to see if something breaks. - - -### Updating Kirby with the advanced methods - -If you used one of the advanced installation methods, you can also use them to update Kirby: - -- (link: docs/cookbook/setup/composer#updating-kirby text: Update via Composer) -- (link: docs/cookbook/setup/git#updating-kirby text: Update of the Git submodule) - - -**Upgrade from Kirby 2** -If you want to upgrade an existing Kirby 2 installation, head over to our (link: docs/cookbook/setup/migrate-site text: upgrade guide). - - -## Where to go from here - -(columns…) - -### (link: docs/guide/tour text: A tour around the house) -Now that you have successfully installed Kirby on your server, it's time to explore your new CMS. Get yourself a cup of tea (or whatever you like most) and go on a (link: docs/guide/tour text: tour to explore the Starterkit) with us. - -++++ - -### (link: docs/cookbook/setup/kirby-in-a-nutshell text: Kirby in a nutshell) -Get (link: docs/cookbook/setup/kirby-in-a-nutshell text: a concise overview) of how Kirby works and what to keep in mind when you start your project. It's all about what you wish you had known when you started your first Kirby project. - -(…columns) - -(columns…) - -### (link: docs/guide text: Guide) - -Our guide introduces you to every aspect of Kirby. From your first (glossary: template text: template) to complex extensions. It should always be the (link: docs/guide text: starting point for your research). - -++++ - -### (link: docs/reference text: Reference) - -Once you have familiarized yourself with the basics, the (link: docs/reference text: Reference) is the number one resource you will keep getting back to. It's a collection of every method, option, helper, tag, root, url and more. - -(…columns) - -(columns…) - -### (link: docs/cookbook text: Cookbook) - -The (link: docs/cookbook text: Cookbook) is a collection of solutions you can build with Kirby, explaining how to build them step by step. Starting from simple things like menus to frontend authentication, headless CMS setups and more. - -++++ - -### (link: plugins text: Plugins) -Our plugin developers created dozens of fantastic plugins for Kirby. Check out our (link: plugins text: official plugin repository) before creating your own solution for common features. - -(…columns) - -(columns…) - -### (link: docs/guide/troubleshooting text: Troubleshooting) - -If you encounter any problems, make sure to check our (link: docs/guide/troubleshooting text: guide on some common pitfalls) and how to solve them. - -++++ - -### (link: https://forum.getkirby.com/ text: Forum) - -The community in the (link: https://forum.getkirby.com/ text: Kirby Forum) is always there to help out whenever you get stuck. It's likely that someone already had the same problem, so using the search function might uncover a solution within seconds. If you can't find a helpful topic, drop us your question. - -(…columns) diff --git a/content/1_docs/1_guide/4_content/2_creating-pages/guide.txt b/content/1_docs/1_guide/4_content/2_creating-pages/guide.txt deleted file mode 100644 index 7409e99791..0000000000 --- a/content/1_docs/1_guide/4_content/2_creating-pages/guide.txt +++ /dev/null @@ -1,94 +0,0 @@ -Title: Creating pages - ----- -Intro: - -Pages can be created via the Panel, directly in the file system, or programmatically. If you create a new page via the Panel, it is always created as a draft. In the file system, you can create pages with any state directly. - ----- - -Text: - -## Creating pages in the Panel - -Before you can add new pages via the Panel, you have to set up a (link: docs/reference/panel/sections/pages text: pages section) in your page or site blueprint, with the status set to `draft` or `all`. - -Click on the "Add" button in the top right corner of a pages section. Every new page in the Panel is created as a draft first. This prevents accidental publishing of a page that is not ready yet. - -(picture: Bildschirmfoto2018-07-05um14.34.45.png) - -Drafts are stored in a `_drafts` subfolder for every page. These drafts are only accessible when you are logged in. - - - -If you want to automatically publish new pages created via the Panel, you can set up a (link: docs/reference/system/options/hooks text: `page.create:after` hook) in your `config.php` file. - - -## Creating published pages manually - -Pages are stored as subfolders of the `/content` folder. To create a new page manually, create a new folder and add a text file with the extension `.txt` (default) or `.md` (optional configuration setting). - -A simple folder structure could look like this: - -```filesystem -/content/ - /home/ - home.txt - /projects/ - project.txt - /blog/ - blog.txt - /contact/ - contact.txt -``` - -If you want to create a site with different languages using Kirby's built-in (link: docs/guide/languages text: multi-lang feature), you need to add language code extensions for each language, e.g. `home.en.txt`, `home.de.txt` etc. - - -The naming of these content files is important, because it defines which template is used to render the content. - -| Content filename | Template filename | -| -----------------| ------------------| -| home.txt | home.php | -| projects.txt | projects.php | -| contact.txt | contact.php | - - -If there is no corresponding template, the `default.php` template is used to render the page. - - -Each page folder is accessible via its URL, e.g. you can access the projects folder by entering the domain name followed by the UID of the folder into your browser's address bar: `https://example.com/projects`. If your projects folder contains subpages, the subpage `project-a` would therefore be accessible via `https://example.com/projects/project-a` etc. - -URLs can be modified using (link: docs/guide/routing text: Kirby's router). - -## Creating drafts manually - -If you want to create a draft manually in the content folder you can create a `_drafts` subfolder in the parent page folder (if it's not there yet) and inside create your draft page folder. - -```filesystem -/content/projects/_drafts/my-project-draft/ -``` - - -## Creating pages programmatically - -Pages can also be created via Kirby's API methods in a controller, template, plugin, hook etc. This is useful if you want to create pages from form data, external files (like an Excel or `.csv` file), or from an external API. - -The basic syntax for creating a page with code looks like this: - -```php - 'An interesting title', - 'text' => 'Some great content here…' -]; - -$page->createChild([ - 'content' => $content, - 'slug' => 'test-article', - 'template' => 'article' -]); -``` - -The above code only works if you are either logged in and have the necessary permissions for the action, or if you authenticate the user programmatically to perform the action (link: docs/guide/templates/php-api#permissions text: Learn more about permissions and impersonating users). diff --git a/content/1_docs/1_guide/5_templates/1_basics/guide.txt b/content/1_docs/1_guide/5_templates/1_basics/guide.txt deleted file mode 100644 index 932d69ef3d..0000000000 --- a/content/1_docs/1_guide/5_templates/1_basics/guide.txt +++ /dev/null @@ -1,251 +0,0 @@ -Title: Templates - ----- - -Description: Templates contain the HTML for your pages, spiced up with some PHP to dynamically pull in your content. - ----- - -Subtitle: Define your page layout with HTML and PHP - ----- - -Intro: - -Templates contain the HTML for your pages, spiced up with some PHP to dynamically pull in your content. - ----- - -Text: - -## TL;DR - -- All templates are stored in the `/site/templates` folder -- To create a new template for a page, create a .php file with a filename that matches the filename of the content file -- You can use the `$page`, `$site` and `$pages` variables to easily access the content of your pages/site - -## Naming your templates - -When you open a page in the browser, Kirby reads the name of the text file to determine what template to use to render the page. If Kirby finds a template with the same name as the text file, it loads it and executes the code contained in it. If there is no matching template, the default template is used instead. - - -Template names must be lowercase, for example `default.php` or `blog.php`. - - -Here are some example of content file and template file counterparts: - -| Text file | Template | -| - | - | -| /content/home/home.txt | /site/templates/home.php | -| /content/projects/projects.txt | /site/templates/projects.php | -| /content/projects/project-1/project.txt | /site/templates/project.php | -| /content/projects/project-2/project.txt | /site/templates/project.php | - -## The default template - -The default template is the only required template. It is called `default.php` and must exist in your `/site/templates` folder. When you get started with a completely new site you might want to start with just the default template as your foundation. - -## Shared templates - -Pages with the same or a similar content structure can share a single template. For example, all the notes subpages in the `/notes` page or the album subpages of the `/photography` page of the Starterkit share the same template called `note.php` and `album.php` respectively. - - -## Basic usage - -Let's start with looking at a very simple HTML template and how we can replace parts of it with the content of our text files. - -```html - - - - My first page - - -

Hello world!

- - -``` - -Nothing very special here, just a static HTML page with a title tag in the head and a headline in the body. - -Kirby provides some API variables for each template that are instantly available and allow us to fetch content from our pages, namely the `$site`, the `$page` and the `$pages` variables. - -## The `$site` variable - -The `$site` object contains important information about the site in general and the data stored in `/content/site.txt`. Let's replace the hard-coded document title with something more dynamic: - -```php - - - - <?= $site->title()->html() ?> - - - Hello world! - - -``` - -With `$site->title()` we fetch the value of the title field from `/content/site.txt`. - -The `site.txt` file of the Starterkit looks like this: - - -```kirbycontent "/content/site.txt" - Title: Kirby Starterkit - - ---- - - Author: Bastian Allgeier GmbH - - ---- - - Description: This is Kirby's Starterkit. - - ---- - - Copyright: © 2009–(date: Year) (link: http://getkirby.com text: The Kirby Team) -``` - -The above code would therefore render "Kirby Starterkit" as our document title. - - -The `$site` object is the perfect place for storing any data that you want to reuse throughout your site. Next to typical things like data for the title and description meta tags, you can also store copyright information or social media accounts. - - -All this data can be used in your templates instantly: - -```php - - - - - - <?= $site->title()->html() ?> - - - - -
-

- - title()->html() ?> - -

-
- - Hello world! - -
- -
- - - -``` - -As you can see, the `$site` object also contains the main URL of your site, which can be used to link the logo back to your homepage for example. The `$site` object has many more methods you can find in the (link: docs/reference text: Reference). - -## The `$page` variable - -The `$page` object is probably the variable you will use the most throughout your templates. `$page` always refers to the currently active page. - -Like the `$site` variable, the `$page` variable has many methods that allow us to get information from the page. You can find all available methods in the (link: docs/reference text: Reference). - -```php - - - - - - - <?= $page->title()->html() ?> | <?= $site->title()->html() ?> - - - - -
-

- - title()->html() ?> - -

-
- -
-

title()->html() ?>

- text()->kirbytext() ?> -
- -
- -
- - - -``` - -The document title and the main container of the page are now completed with data from the currently visited page. - -With - -```php -title() ?> -``` - we fetch the title of the page and with - -```php -text() ?> -``` -we get the data from the text field of the page. - - -The `html()` (glossary: field-method text: field method) is used to escape content. - - -All fields we added to our page content files are now accessible like this. - - - -Fieldnames are converted to lowercase and any punctuation is replaced with underscores as PHP does not support special characters in method names. - - - -## A note on reserved words - -If you use field names in your text file, which are also used by native Kirby methods, e.g. "image", "videos", "audio", or "num", you cannot fetch the data like described above. To fetch the content of such fields, you have to use the `content()` method: - -| Field name | Variable | -| - | - | -| `Image:` | `$page->content()->image()` | -| `Videos:` | `$page->content()->videos()` | -| `Audio:` | `$page->content()->audio()` | - -## Setting response types - -In your templates, you can set different response types depending on content. - -For example, to send an `application/json` response: - -```php -response()->json(); -echo json_encode(['your' => 'data']); -``` - -You can also send other response types by extension or MIME type: - -```php -response()->type('txt'); -$kirby->response()->type('text/plain'); -``` - -## More information - -- (link: docs/cookbook/templating/custom-post-types text: Custom post types) -- (link: docs/cookbook/templating/php-templates text: Kirby templates 101) -- (link: docs/cookbook/setup/debugging-basics text: Basic error hunting & prevention) -- (link: docs/cookbook/templating/one-pager text: One-pager site) diff --git a/content/1_docs/1_guide/6_blueprints/0_introduction/guide.txt b/content/1_docs/1_guide/6_blueprints/0_introduction/guide.txt deleted file mode 100644 index 4a7a02fe15..0000000000 --- a/content/1_docs/1_guide/6_blueprints/0_introduction/guide.txt +++ /dev/null @@ -1,118 +0,0 @@ -Title: Introduction - ----- - -Intro: Blueprints are configuration files written in YAML that let you customize the (glossary: Panel) to make it truly yours. - ----- - -Text: - -## TL;DR - -- Blueprints are stored in `/site/blueprints`. -- Blueprints configure the Panel layout of the site, pages, files and users. -- Start simple with presets. -- Create your own layouts with tabs, columns and sections. - -## Blueprint types - -The Panel layouts for `site`, `pages`, `files` and `users` all get their own blueprints. The blueprint folder is structured accordingly: - -```filesystem -/site/blueprints/site.yml -/site/blueprints/files/ -/site/blueprints/pages/ -/site/blueprints/users/ -``` - -(reference: panel/blueprints) - - -The start page (Dashboard) of the Panel is defined in the `/site/blueprints/site.yml` blueprint. - - -## Presets - -We added three useful presets (`page`, `pages` and `files`) to our blueprints that you can use to create single pages, blogs, galleries and more with almost zero configuration. - -(link: docs/guide/blueprints/presets text: Learn more about presets…) - -## Layout - -When presets are not enough, you can be the interface designer. You decide which features are needed for each type of page, file or user and how to arrange them in (link: docs/guide/blueprints/tabs text: tabs), (link: docs/guide/blueprints/layout#defining-columns text: columns) and (link: docs/guide/blueprints/layout#adding-sections text: sections). - -(picture: tabs.png) - -(link: docs/guide/blueprints/layout text: Learn more about layouts…) - -## Fields - -With fields you can break up your content into digestable chunks and structure it according to your content model, rather than storing everything in a huge text field. You can add as many fields of different field types as you need. - -(link: docs/guide/blueprints/fields text: Learn more about fields…) - -## Query language - -Kirby comes with a blueprint query language that offers basically the same functionality as Kirby's PHP API with a simple dot notation. - -(link: docs/guide/blueprints/query-language text: Learn more about Kirby's blueprint query language…) - -## Extending blueprints - -You can store fields, sections, tabs and entire blueprint layouts in separate files so that they can be reused within your blueprints. If you want, you can even create a complete component system to apply to multiple projects. - -(link: docs/guide/blueprints/extending-blueprints text: Learn more about how to extend and reuse blueprints…) - -## Translating blueprints - -For editors from various language backgrounds, you can translate blueprint titles, form field labels, section headlines, help text, options, and more. - -(link: docs/guide/blueprints/translations text: Learn more about translating blueprints…) - -## Example blueprints - -We have put together an extensive collection of example blueprints for typical setups like a blog, a shop, a project portfolio and more for you to use as a basis for your own. - -(link: docs/reference/panel/samples text: Check out the example blueprints…) - -## More docs - -Our reference has more in-depth documentation about blueprints and their different components. - -(link: docs/reference/panel text: Check out the reference…) - -## Tips & Tricks - -### Using special characters in blueprint labels etc. - -To use special characters in labels etc., wrap the text in double quotes: - -```yaml -field1: - label: "Fotograf*in" - type: text -field2: - label: "Must do: this" - type: text -``` - -### Naming fields - -Make sure to only use alpha-numerical characters and underscores in field names. You cannot use dashes. - -Yes: - -```yaml -field_1: - label: Headline - type: text -``` - -No: - -```yaml -field-1: - label: Headline - type: text -``` \ No newline at end of file diff --git a/content/1_docs/1_guide/guide.svg b/content/1_docs/1_guide/guide.svg deleted file mode 100644 index c59965befe..0000000000 --- a/content/1_docs/1_guide/guide.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/cookbook-recipe.txt b/content/1_docs/2_cookbook/10_panel/0_custom-block-type/cookbook-recipe.txt deleted file mode 100644 index a5940b36f8..0000000000 --- a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/cookbook-recipe.txt +++ /dev/null @@ -1,893 +0,0 @@ -Title: Creating a custom block type from scratch - ----- - - -Published: 2021-03-01 - ----- - -Description: A step-by-step guide to creating custom blocks with a preview using the example of an audio block with a poster and some additional settings. - ----- - -Text: - -Kirby's (link: docs/reference/panel/fields/blocks text: blocks field) comes with quite a few (link: docs/reference/panel/blocks text: default block types) that are great for most purposes and can be customized to your needs. But you probably wouldn't be reading this if you wouldn't be striving for more, and this recipe will hopefully be a great first step into your bright future as a custom block type developer 😉. - -## Prerequisites - -- A Kirby (link: docs/guide/quickstart#download-and-installation text: Plainkit or Starterkit) for testing -- A code editor -- Basic understanding (link: docs/guide/plugins/plugin-basics text: how to create plugins in Kirby) -- For the single file approach, (link: https://parceljs.org/ text: Parcel) must be installed on your system, unless you use your own custom build process. But don't worry, we also show you how to build this block without such a build process (see link below). -- Probably a big pot of hot coffee and a cool head. We are going to dive deep. - -## Resources - -- (file: sample.mp3 text: A sample mp3 file) -- (file: mr-pod.jpg text: A sample podcast cover) - -## Useful links -- (link: docs/guide/plugins/plugin-basics#kirby-plugin-one-ring-to-rule-them-all text: Registering extensions) -- (link: docs/reference/plugins/extensions/blocks text: Block previews) -- (link: docs/cookbook/panel/to-bundle-or-not-to-bundle text: To bundle or not to bundle: differences of creating plugins with or without a build process) - - -## What we will be building - -(screenshot: audio-block-panel-preview.png caption: Preview of our amazing audio block in the Panel) - -We are going to use the example of an audio block type to show you how to create custom block types for the blocks field from scratch, complete with an inline editable preview for the Panel using a single file component with a build process. - -A block type plugin basically consists of the following files: - -- An `index.php` to register the plugin (required for all plugins) -- A block yaml file that defines the fields available for the block type (required) -- A block snippet that renders the block on the frontend (required) -- An `index.js` file to render a Panel preview (optional) -- A `.vue` single component file (optional, requires build process) -- A package.json file for the bundler (optional) - -After finishing this tutorial, you should have a solid understanding about block types that will enable you to start building your own, even if you will never ever need an audio block at all. - -## Final plugin folder structure - -When we will be finished, the resulting folder structure of our plugin will look like this. When you are unsure where to put what, you can come back to this overview. - -```filesystem -plugins/ - audio-block/ - blueprints/ - blocks/ - audio.yml - files/ - audio.yml - poster.yml - snippets/ - blocks/ - audio.php - src/ - components/ - Audio.vue - index.js - index.php - index.js (auto-generated file) - package.json -``` - -## Register a new plugin - -Let's start with the most important plugin file, the `index.php`, where we register the blueprints for the block, two file blueprints to restrict file uploads, and the snippet to render the audio block on the frontend. - -```php "/site/plugins/audio-block/index.php" - [ - 'blocks/audio' => __DIR__ . '/blueprints/blocks/audio.yml', - 'files/audio' => __DIR__ . '/blueprints/files/audio.yml', - 'files/poster' => __DIR__ . '/blueprints/files/poster.yml', - ], - 'snippets' => [ - 'blocks/audio' => __DIR__ . '/snippets/blocks/audio.php', - ], -]); -``` -## The block blueprint - -In the audio block blueprint, we define the fields for the block that will later show up in the drawer in the Panel. In addition to the files field we need for the audio file itself, we add some additional settings for the audio tag like the controls and the autoplay attributes. And to make it less boring and more enlightening, our block gets a poster image, headlines and a description. - -You can adapt this blueprint to your needs, particularly if you want to add track files for audio transcriptions to make your audio files more accessible. - -```yaml "/site/plugins/audio-block/blueprints/blocks/audio.yml" -name: Audio -icon: file-audio -tabs: - main: - label: Main - fields: - poster: - type: files - query: page.images.template('poster') - uploads: poster - multiple: false - width: 1/2 - source: - type: files - query: page.audio.template('audio') - uploads: audio - multiple: false - width: 1/2 - title: - type: text - placeholder: Title - subtitle: - type: text - placeholder: Subtitle - description: - type: writer - icon: text - inline: true - placeholder: Description - marks: - - bold - - italic - settings: - label: Settings - fields: - controls: - type: toggle - text: Show controls? - width: 1/2 - default: true - autoplay: - type: toggle - text: autoplay - width: 1/2 - default: false -``` - -In our blueprint, we create two tabs, one for the general stuff and a second one for the audio settings. This is just to show (off) that you can use tabs to separate your different settings. - -When this block is open, the drawer will look like this: - -(screenshot: audio-block-drawer.png) -## File blueprints - -Since we want to prevent users from uploading non-audio files in the `source` field, we need a (link: docs/reference/panel/blueprints/file text: file blueprint), in which we can restrict file uploads via the `accept` property. - -We keep this simple, but of course, you can add fields to allow users to add meta data for the audio files. - -```yaml "/site/plugins/audio-block/blueprints/files/audio.yml" -title: Audio - -accept: - extension: mp3 - -fields: - # some fields here if you want -``` - -And while we are at it, let's add the `poster.yml` blueprint to restrict the file types allowed for the poster field as well. We also want an `alt` field to fill the `alt` attribute. - -```yaml "/site/plugins/audio-block/blueprints/files/poster.yml" -title: Poster - -accept: - extension: jpg, jpeg, png, webp - -fields: - alt: - type: text -``` - -## Snippet for the frontend - -Inside the block snippet, you have access to the full `$block` (link: docs/reference/objects/blocktext: Block object) with all kinds of properties and methods, and of course to the fields we defined for the block in the block blueprint. - -```php "/site/plugins/audio-block/snippets/blocks/audio.php" -source()->toFile()): ?> -
- poster()->toFile()): ?> -
- crop(200, 200) ?> -
- -
-

title()->html() ?>

-

subtitle()->html() ?>

-
- description() ?> -
- -
-
- -``` - -In the first line, we check if we can convert the filename stored in the source field into a file object, so that the markup of the snippet is only rendered if there is an audio file. - -We then check if we have a poster file object, and if that is the case, we render a figure tag with the image. - -For the audio element's source tag, we need the file's URL and the mime type, which are available through the file object. - -We also check whether to show the controls, and if the audio should start auto-playing on load. - -In most cases, controls should be present to allow users to interact with the audio, and autoplay should be off. It's up to you whether you want to make these setting available to the user at all. If not, remove the corresponding fields from the audio block blueprint. Or add other (link: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio#attributes text: attributes) available for the audio element. - -We should probably also add some basic styling: - -```html - -``` - -For the sake of this tutorial, we put the styles within a style tag at the top of the `audio.php` block snippet. But you can also provide a sample CSS file with your block plugin. Users of your block type can then properly include those styles in their own frontend code. - -At this point, our new block is ready to be used in the Panel and can be rendered on the frontend. Time to give yourself a first pat on the shoulder. - -## Using the new block in the blocks field - -To use the new block type, for example in a page blueprint, let's add it to our blocks field. - -If you are using the Starterkit, open the file `/site/blueprints/pages/note.yml`, where we already have a blocks field. It currently looks like this: - -```yaml "/site/blueprints/pages/note.yml" -fields: - text: - type: blocks -``` - -To add our custom block, we need to list all fieldsets we want to use for this block: - -```yaml "/site/blueprints/pages/note.yml" -fields: - text: - type: blocks - fieldsets: - - heading - - text - - gallery - - audio - # more block types here if you want -``` - -The order we use here will determine the order in which these blocks will appear in the block list. - -If you use a Plainkit, add this blocks field definition in the `/site/blueprints/pages/default.yml` blueprint or create a new blueprint. - - -For more information how to list fieldsets, create groups of fieldsets etc., check out the (link: docs/reference/panel/fields/blocks text: blocks field docs). - - -Now head over to the Panel, fill in some data, and open the page on the frontend. It will look similar to this: - -(screenshot: audio-block-frontend.png) - -However, our block in the Panel currently looks like this: - -(screenshot: audio-block-without-preview.png) - -We can surely do better. In the next step, we are going to change this and create a slightly more pleasant preview with an audio tag. - -## Simple `index.js` - -We can start very basic with an `index.js` **next to the main `index.php` file**: - -```js "/site/plugins/audio-block/index.js" -panel.plugin("cookbook/audio-block", { - blocks: { - audio: { - template: ` -
- Listen to Mr. Pod talk about stuff -
- ` - } - } -}); -``` - -(screenshot: audio-block-creating-preview-step-one.png) - -Not really what we want to end up with, but easy, right? - -Let's replace this with an audio tag and the title from our block (we leave the other fields for later to prevent being too repetitive): - -```js "/site/plugins/audio-block/index.js" -panel.plugin("cookbook/audio-block", { - blocks: { - audio: { - template: ` -
-

{{ content.title }}

- -
- ` - } - } -}); -``` - -We have access to the fields through `content`, so we can get the title with `content.title`. The `content.source` files field returns an array of file objects, so we can fetch the first one with the index `0` and the URL from the `url` property. - -Now listen to this! We have a simple audio tag preview with a title (provided that we selected a file before). - -But hold on! If we tried to add an audio block now in the Panel, we will run into an error. Try it out. Why's that? Because we haven't made sure that we actually have a file. Let's change this with a computed method to pass to the `src` attribute: - -```js "/site/plugins/audio-block/index.js" -panel.plugin("cookbook/audio-block", { - blocks: { - audio: { - computed: { - source() { - return this.content.source[0] || {}; - } - }, - template: ` -
-
-

{{ content.title }}

- -
-
No audio selected
-
- ` - } - } -}); -``` - -The computed `source` method checks if the file exists and returns an empty object otherwise. In the template we can now use the `v-if`/`v-else` directive to render either the audio element or a message that no audio file was selected if the URL is missing in that object. - -(screenshot: audio-block-with-audio-tag.png) - -Theoretically, we could now go ahead and put all our methods and the complete template into this file. Additional styling could be applied by creating an `index.css` file for our plugin. - -But that gets a bit tedious for more complex block previews. We can make our lives a lot easier with single file components. - -Feel free to stop here and relax if your blocks don't require more than that. Or head over to our (link: docs/cookbook/panel/to-bundle-or-not-to-bundle text: To bundle or not to bundle: differences of creating plugins with or without a build process) recipe to learn how to create our complete example without a build process. - -## `index.js` with single file component - -Since we want to use a single file component in this example, let's move our current `index.js` file one level up into a new `src` folder. Our build process will then auto-generate the main `index.js` file from this file. - -We also need a `package.json` next to `index.php` with the following content: - -```js "/site/plugins/audio-block/package.json" -{ - "scripts": { - "dev": "parcel watch src/index.js --no-source-maps -d ./", - "build": "parcel build src/index.js --no-source-maps --experimental-scope-hoisting -d ./" - }, - "posthtml": { - "recognizeSelfClosing": true - } -} -``` -This file tells the (link: https://parceljs.org/ text: Parcel) bundler which files to compile and an output destination. Since our plugin setup is always the same in our documentation, it's the same file we also use in our other Panel related plugin recipes. - -If you haven't installed Parcel globally yet, you can do this by running the following command: - -``` -npm install -g parcel-bundler -``` - -The `package.json` file has two script commands, `dev` and `build`. The `dev` command runs a watcher that compiles the source files whenever we are making changes, the `build` command builds our production-ready file. - -Back to our `index.js`, where we import the yet to create `Audio.vue` component and assign it to the audio block: - -```js "/site/plugins/audio-block/src/index.js" -import Audio from './components/Audio.vue'; - -panel.plugin("cookbook/audio-block", { - blocks: { - audio: Audio - } -}); -``` - -From now on, all the stuff we had in the old `index.js` now moves into the component file. -## `Audio.vue` single file component - -Create an `Audio.vue` file in `/src/components`. Then let's start by recreating exactly what we had before: - -```html "/site/plugins/audio-block/src/components/Audio.vue" - - - -``` - -The only differences to our previous code is that we wrapped the HTML in a template tag, and export the JavaScript within script tags. - -### Compiling… - -To see the result of our endeavors, we compile the file. Open a terminal, `cd` into the plugin folder and run the command… - -``` -npm run dev -``` - -to start the watch process. - -If all went well, you will find a compiled `index.js` in the root of the audio-block plugin folder. In the Panel, everything should look exactly the same as before. - -## Refining - -Now for some refinements. After all, our poster is not there yet, nor have we made use of the other fields. -### A placeholder and the missing pieces - -As our first refinement step, we wrap the current HTML in a `k-block-figure` component to get a nice placeholder when there is no audio file selected yet. The exact same core component is also used for the image and video blocks. - -```html "/site/plugins/audio-block/src/components/Audio.vue" - -``` -(screenshot: audio-block-empty.png) - -We also add some missing pieces, i.e. the subtitle and the description. - -Note how we use the `v-html` directive to render the contents of the descriptions field, which is a writer field that contains HTML. If we would try to render it without this directive, all HTML tags would be shown as plain text. - - -`v-html` should only be used if you trust the HTML that's being entered. Our writer field already sanitizes the HTML so we are fine here. - - -### Adding the poster and some styling - -For the poster that is stored in the `poster` field, we take advantage of Kirby's `k-aspect-ratio` Vue component to display a square image. - -```html - - - -``` - -We use a hard-coded ratio and set the `cover` attribute to `true`, but this can of course be made configurable from the blueprint. - -We haven't defined the `posterUrl` method yet, which does the same as the `source` method for the audio. - -Here is the complete code for this step with some added styling: - -```html "/site/plugins/audio-block/src/components/Audio.vue" - - - - -``` - -It starts to look like what we anticipated at the beginning: - -(screenshot: audio-block-almost-there.png) -### Side quest: Getting the mime type through the API - -If you look closely, you will notice that we hard-coded the mime-type of the audio file all this time, because we don't have access to the mime type of the file through `content.source[0]`. In our example it doesn't really matter much because we limited the uploadable file types to `.mp3` files. But once we want to allow multiple files types or want to provide multiple file formats for the same audio file, we better find out how to get at the file object (who knows, maybe you need exactly that piece of information in one of your next custom blocks). - -Long story short, Kirby's API to the rescue. In this case, we need access to the endpoint `api/pages/:id/files/:filename`. - -To this purpose, let's fetch more information about the file in a watch method. - -```js -//... -data() { - return { - mime: null - }; -}, -watch: { - "source.link": { - handler(link) { - if (link) { - this.$api.get(link).then(file => { - this.mime = file.mime; - }); - } - }, - immediate: true - } -}, -// ... -``` - -Watch methods are a fantastic concept in Vue.js to react on changes in your component. In this case, we watch for any changes to the link key of our source object. Isn't it fantastic that we can even watch nested keys with the dot syntax? - -Whenever the source file changes, the handler method will run and fetch information about the file from the API with `this.$api.get(link)`. With `immediate: true` we can tell the watch method to be called for the first time when the component has been created. - -Once we get back the file from the API, we put the mime type into our new mime property, which we've defined in the component's data method. This will make it available in our template. - -New status of our code: - -```html "/site/plugins/audio-block/src/components/Audio.vue" - - - - - -``` - -Congratulations. Side quest completed! 👏 - -### Making the text fields editable - -Ok, that was a lot of stuff. But we are not ready yet. As promised in the intro, we want to make the headlines and the description editable. - -To do this, we will replace all text instances with `k-writer` components: - -So instead of the `h1` element - -```html -

{{content.title}}

-```` - -We use - -```html - -``` - -The writer component is a simple WYSIWYG editor for inline styles (bold, italic, etc.) With an enabled `inline` option, we will tell the editor to insert `
` instead of paragraphs for line breaks. With the `marks` option, we can activate or deactivate particular inline styles. We don't need them here. We could also use a simple input field instead, but the writer will adapt its size to the content and will also work better for the description field. - -Another speciality of a block preview component is the built-in `field` method. We can use it to access blueprint settings for fields in our drawer. This is super handy to get field properties for our WYSIWYG preview. In this case, we get the placeholders from the blueprint: `field('title').placeholder` - -If we repeat this procedure for every field, we end up with our final result: - -```html "/site/plugins/audio-block/src/components/Audio.vue" - - - - - -``` - -Note that we ignored the audio settings like controls and autoplay for the preview because they are not relevant here. If you want to change that, you should know enough by now to adapt all settings to your liking. - -You also might have noticed this line: - -```html -
-``` - -The `` component has a built-in handler to open the block drawer on double-click. This is cool, but it's not ideal for writer components. I.e. you might want to double-click to select some text. With `@dblclick.stop` we can prevent the double-click event from bubbling up. The drawer will not open when we double-click on one of the writers. - -You should definitely check out the docs for (link: https://vuejs.org/v2/guide/events.html text: Vue’s awesome event handling shortcuts) for more tricks like this. - - -## End result - -As a last step, we run the final build step with - -``` -npm run build -``` - -This will create the final `index.js` and `index.css` files that are now ready to be shipped. Your plugin is finished! - -In its different states the block now looks like this: - -(screenshot: audio-block-final-states.png) diff --git a/content/1_docs/2_cookbook/2_content/0_related-articles/cookbook-recipe.txt b/content/1_docs/2_cookbook/2_content/0_related-articles/cookbook-recipe.txt deleted file mode 100644 index 35030aca3f..0000000000 --- a/content/1_docs/2_cookbook/2_content/0_related-articles/cookbook-recipe.txt +++ /dev/null @@ -1,72 +0,0 @@ -Title: Related articles - ----- - -Description: Build relations between articles using YAML content and the pages field. - ----- -Text: - -With **(glossary: yaml text: YAML) content** and the **pages field** you can easily link information on your site with other sources in Kirby. All examples below are based on the (link: docs/guide/installation#installation text: Starterkit). - -## In your content files - -Add a new field to any of your content files to which you'd like to add related pages: - -```kirbycontent "/content/2_notes/20180625_a-night-in-the-forest/note.txt" - Title: A night in the forest - ---- - Text: Some insightful text for the audience - ---- - Related: - - - notes/across-the-ocean - - notes/in-the-jungle-of-sumatra -``` - -You are free to name the field that contains the related pages however you like, as long as you take care of using the right variable in the template later. - -Add any number of related pages with the (glossary: yaml text: YAML) syntax. To link pages, store their URI (the URL without your domain) in the content file. Since the URI is unique, Kirby will always be able to find the right page, even if you change its content or its sorting number. You have to be careful, however, if you change the location of a page or its folder name. - -If you don't want to add and edit the entries manually in the content file, make sure to (link: #in-the-panel text: set up the Panel) accordingly. - -## In your templates - -Accessing those related posts in your templates could look like this: - -```php "/site/templates/note.php" -related()->toPages(); -if ($related->count() > 0): -?> -

Related

- - -``` - -We use the field method [`->toPages()`](/docs/reference/templates/field-methods/to-pages) to convert the (glossary: yaml text: YAML) list of page ids from the field to a pages collection. After that we can iterate over the pages collection and use the familiar (link: docs/guide/templates/php-api text: Kirby PHP API). - - -## In the Panel - -If you use the (glossary: panel), you have to add the `related` field to your (glossary: blueprint text: blueprint). The **(link: docs/reference/panel/fields/pages text: pages field)** offers a great way to select one or more related articles. - - -```yaml "/site/blueprints/pages/note.yml" - related: - label: Related articles - type: pages - query: page.siblings(false) -``` - -We use the `query` option to display all sibling pages of the current page in the list. By passing `false` to the [`siblings()`](/docs/reference/objects/page/siblings) method, we exclude the current page from the list – we don't want the article itself to be a related article. (link: docs/guide/blueprints/query-language text: Learn more) about our query syntax. - -(screenshot: related.png) diff --git a/content/1_docs/2_cookbook/2_content/0_sitemap/cookbook-recipe.txt b/content/1_docs/2_cookbook/2_content/0_sitemap/cookbook-recipe.txt deleted file mode 100644 index 3e66db6f7d..0000000000 --- a/content/1_docs/2_cookbook/2_content/0_sitemap/cookbook-recipe.txt +++ /dev/null @@ -1,102 +0,0 @@ -Title: Sitemap for search engines - ----- - -Published: 2018-11-25 - ----- - -Description: Automatically create a sitemap for search engines. - ----- - -Text: - -For basic search engine optimization it's good to have a sitemap.xml file, which contains machine-readable information about all the pages and the structure of your site. - -The syntax for such a `sitemap.xml` file is fairly simple. You can find all about it on . - -Because you probably don't want to generate that file by hand, you can create a snippet that indexes your entire site and generates a `sitemap.xml` for you in a few steps: - - -## Create the snippet with your XML - -Create a new snippet with the following content in `/site/snippets`: - -```php "/site/snippets/sitemap.php" -'; ?> - - - uri(), $ignore)) continue ?> - - url()) ?> - modified('c', 'date') ?> - isHomePage()) ? 1 : number_format(0.5 / $p->depth(), 1) ?> - - - -``` - -## Create new routes - -In your `config.php`, create these two new (glossary: route text: routes): - -```php "/site/config/config.php" - [ - [ - 'pattern' => 'sitemap.xml', - 'action' => function() { - $pages = site()->pages()->index(); - - // fetch the pages to ignore from the config settings, - // if nothing is set, we ignore the error page - $ignore = kirby()->option('sitemap.ignore', ['error']); - - $content = snippet('sitemap', compact('pages', 'ignore'), true); - - // return response with correct header type - return new Kirby\Cms\Response($content, 'application/xml'); - } - ], - [ - 'pattern' => 'sitemap', - 'action' => function() { - return go('sitemap.xml', 301); - } - ] - ] -]; -``` - -You can now visit the sitemap of your Kirby site by browsing `http://yourdomain.com/sitemap` or `http://yourdomain.com/sitemap.xml`. The second route redirects to the first. - - -## Excluding pages from your sitemap - -You can do that in your config. Here we call the option `sitemap.ignore`. - -```php "/site/config/config.php" -return [ - 'sitemap.ignore' => ['error'], -]; -``` - -## Automatic Priorities - -The sitemap (glossary: template text: template) will automatically try to create priorites for each page, by using the `->depth()` attribute. The depth attribute is a simple number, which indicates how deep the page is nested. Main pages have a depth of 1, subpages of main pages have a depth of 2, etc. - -The `home` page will automatically get a priority of 1. You can easily change priorities or remove them entirely if you prefer. - - -## Submitting your sitemap to a search engine - -To let your favorite search engines know about your brand new sitemap, please read the instructions on [sitemap.org](http://www.sitemaps.org/protocol.html#informing). - -## Extending the basic example - -This is a very basic example. If you need something more complex, you can either use one of the (link: https://getkirby.com/plugins text: plugins provided by the community), or extend it yourself, for example, by fine-tuning the options for pages you want to ignore (e.g. filter by template), or adding images. - - diff --git a/content/1_docs/2_cookbook/7_extensions/0_kirby-loves-cdn/cookbook-recipe.txt b/content/1_docs/2_cookbook/7_extensions/0_kirby-loves-cdn/cookbook-recipe.txt deleted file mode 100644 index 8b7afbf472..0000000000 --- a/content/1_docs/2_cookbook/7_extensions/0_kirby-loves-cdn/cookbook-recipe.txt +++ /dev/null @@ -1,296 +0,0 @@ -Title: Kirby loves CDN - ----- - -Description: Set up custom components to deliver assets and files through a CDN. - ----- - -Published: 2021-01-05 - ----- - -Text: - -## Who is this recipe for? - -In this recipe we will look into using a CDN with Kirby to deliver static assets and files. This is particularly relevant for website owners who address a worldwide audience. - -## What is a CDN and why use it - -Usually, all your assets live on your own web server and are thus served from a single location. This is fine as long as your website visitors all come from the same region where your webserver is located. However, if your site is intended for an international audience, the latency caused by long distances between webserver and visitor will hurt your website's performance massively. - -A CDN––the acronym stands for Content Distribution Network––takes your assets and stores them on servers in different locations around the world. When a visitor requests your site, the CDN will locate the nearest available server and load all assets from there. This significantly reduces request times and your site will load faster no matter where your visitors come from. - -CDNs work with so-called Zones, either Push or Pull Zones. - -## Push Zones - -If you use a Push Zone, you upload all your assets via FTP or SSH to the CDN's servers and the CDN will spread them from there for you. This is great for static assets that don't change very often, or if you use a custom deploy script that automates the uploads for you when something changes. Once the Push Zone is created, you will get a public URL for your assets from the CDN, for example `https://mypushzone.mycdn.com/myfile.jpg`. - -Push Zones are often recommended or even required if you want to host files beyond a certain size. - -## Pull Zones - -A Pull Zone is the most common Zone type and easier to set up. With this method, the CDN automatically pulls content from your web server and caches it on the CDN's servers. Once the content is cached, visitor requests will be routed and delivered from the nearest possible server location. - -So for example if your logo is located at - -``` -https://yourdomain.com/assets/images/logo.png -``` - -it will be requested from your Pull Zone like this: - -``` -https://yourpullzone.yourcdn.com/assets/images/logo.png -``` - -The Pull Zone will fetch the logo on the first request and spread it across the network. - -In this recipe, we will look at using a Pull Zone approach with (link: https://www.keycdn.com/ text: KeyCDN), the CDN provider we also use on the Kirby website. However, this approach should also work similarly with other CDN providers. - -## Setting up your Pull Zone - -The first step is to create a Pull Zone in your CDN provider's account settings. For KeyCDN you can find the instructions in their documentation in the chapter (link: https://www.keycdn.com/support/create-a-pull-zone text: Create a Pull Zone). - -## Zone Alias - -Optionally, you can create a Zone Alias. Zone Aliases allow you to use your own custom CDN URL (e.g. `cdn.yourdomain.com`) instead of the KeyCDN URL. For this to work, you have to add the Zone Alias as CNAME record in your DNS. - -Head over to (link: https://www.keycdn.com/support/create-a-zone-alias text: Create a Zone Alias) if you want to do this and follow the instructions. - - -If your website uses TLS, set up a certificate first before you create a Zone Alias. - - -Once you have set up your Zone and an optional Zone Alias, you are ready to start working on the Kirby side of things. - -## CDN plugin - -On the Kirby side, we now have to make sure that the assets we want to serve from the CDN use the CDN's Zone URL instead of the ones linked to the website's domain, and this without us having to manually change each URL. We can achieve this with the (link: docs/reference/plugins/components/url text: `url` component extension), which will take care of rerouting the relevant paths. - -On a Kirby site there are typically two folders with files for which we would need to change the URL to point to a CDN: - -- assets -- media - - -If you use a different folder where you store your assets, you will have to change the path accordingly. - - -### Setting the CDN domain in `config.php` - -Let's start with configuring the options for the CDN plugin in `config.php` (if this file doesn't exist, create it in `/site/config`): - -```php "/site/config/config.php" - true, - 'cdn.domain' => 'https://yourpullzone.yourcdn.com' -]; -``` - -Here we set two options: With the `cdn` option we control if the plugin should route our assets through the plugin or not, so that we can easily disable it. With the `cdn.domain` option, we set the domain for the Pull Zone we created above. - -### The URL component - -Let's start with the (link: docs/reference/plugins/components/url text: URL component) for the static assets, leaving alone files from the media folder for the moment. - -```php "/site/plugins/cdn/index.php" - [ - 'url' => function ($kirby, $path, $options) { - if (option('cdn', false) !== false && Str::startsWith($path, 'assets')) { - return option('cdn.domain') . '/' . $path; - } - - $original = $kirby->nativeComponent('url'); - return $original($kirby, $path, $options); - }, - ] -]); -``` - -Without any limitations, the URL component would modify all Kirby URLs. Therefore, we first check if the `cdn` option is enabled, and if that's the case, we want limit the routes to URLs in the `/assets` path. We therefore check if the path matches the given regex pattern (i.e. if it begins with the `assets` bit): - -```php -Str::startsWith($path, 'assets') -``` -All other paths remain untouched. We use the original native `url` component for all other paths, retrieving it via `$kirby->nativeComponent()`. - -Almost there! But hold on: you will notice that we added the original path after the CDN domain. However, what if our assets are updated? How will the CDN know that it has to fetch a new file? Keep on reading! - -## Cache busting - -A problem when using CDNs is the lifespan of the assets on the network. When you upload a new `css` or `js` file, it may take some time until the new file is updated across the network and this could result in unwanted effects. - -This is where cache-busting is used to force the CDN to load the new version of a files once it has changed. The most common way of doing this is to add a version number or timestamp to the filename. There are different ways to achieve this. On the (link: https://getkirby.com text: getkirby.com) website, we do it with a plugin you can grab from the (link: https://github.com/getkirby/getkirby.com/tree/master/site/plugins/cachebuster text: getkirby.com repo). If we put this plugin into the `/site/plugins` folder, we can then modify the code above like this: - -```php "/site/plugins/cdn/index.php" - [ - 'url' => function ($kirby, $path, $options) { - if (Str::startsWith($path, 'assets')) { - $path = Cachebuster::path($path); - - if (option('cdn', false) !== false) { - return option('cdn.domain') . '/' . $path; - } - } - - $original = $kirby->nativeComponent('url'); - return $original($kirby, $path, $options); - }, - ] -]); -``` - -The `Cachebuster::path($path)` method adds a hash to each asset, which will then look something like this: - -``` -https://yourzone.kxcdn.com/assets/css/index.e63bf9fd.css -``` - - -If you already use another cache busting plugin or your own solution, you will have to replace the `Cachebuster::path($path)` part in the code above with the corresponding method of your choice. - - -## Serving files - -Let's extend the plugin code in order to route the URLs to these files automatically through KeyCDN as well. - -For this purpose, we have to create the (link: docs/reference/plugins/components/file-version text: `file::version`) and (link: docs/reference/plugins/components/file-urls text: `file::url`) components, and we also need a helper method that we use in both components. Here is the complete code with annotations for better understanding: - - -To process images using KeyCDN, you have to enable this feature in your Pull Zone settings. Allow for some time for your zone to catch up with the new settings. Note that image processing comes at an additional cost. - - -```php "/site/plugins/cdn/index.php" -mediaUrl(); - } - - // set the path - $path = Url::path($file); - - // return final URL - return option('cdn.domain') . '/' . $path . $query; -} - -Kirby::plugin('author/cdn', [ - 'components' => [ - 'url' => function ($kirby, $path, $options, $original) { - - static $original; - - if (Str::startsWith($path, 'assets')) { - $path = Cachebuster::path($path); - - if (option('cdn', false) !== false) { - return option('cdn.domain') . '/' . $path; - } - } - - if ($original === null) { - $original = $kirby->nativeComponent('url'); - } - - return $original($kirby, $path, $options); - }, - 'file::version' => function (Kirby $kirby, File $file, array $options = []) { - - static $original; - - // if cdn option is enabled - if (option('cdn', false) !== false) { - $url = cdn($file, $options); - // return a new FileVersion object with the given settings - return new FileVersion([ - 'modifications' => $options, - 'original' => $file, - 'root' => $file->root(), - 'url' => $url, - ]); - } - - // if static $original is null, get the original component - if ($original === null) { - $original = $kirby->nativeComponent('file::version'); - } - - // and return it with the given options - return $original($kirby, $file, $options); - }, - 'file::url' => function (Kirby $kirby, File $file): string { - - static $original; - - // if the file type is an image - if ($file->type() === 'image') { - // call the cdn method - return cdn($file); - } - - // if static $original is null, get the original component - if ($original === null) { - $original = $kirby->nativeComponent('file::url'); - } - - // and return it with the given options - return $original($kirby, $file); - } - ] -]); -``` - - -If you have other files than images that you also want to route through the CDN, remove the if-statement around the `cdn()` function call in the `file::url` component. - - -## Image processing - -KeyCDN offers image processing via URL parameters. That means KeyCDN fetches the original file on first load and returns either the original (if we do not request a file version) or a modified version according to the parameters we pass along when requesting a thumb. - -With this plugin in place, you can now use (link: https://www.keycdn.com/support/image-processing text: all image processing features supported by KeyCDN), by passing those parameters to the `thumb()` method, which will give you a lot more options than Kirby's native processing. - -```php -image()->thumb(['width' => 300, 'negate' => true]) ?> - -… or … - -image()->thumb([ - 'width' => 300, - 'height' => 300, - 'crop' => true, - 'blur' => 2 -]) ?> -``` - -Using Kirby's shortcuts `crop()`, `resize()`, `bw()` etc. is also still possible. diff --git a/content/1_docs/2_cookbook/9_setup/0_getkirby-com/cookbook-recipe.txt b/content/1_docs/2_cookbook/9_setup/0_getkirby-com/cookbook-recipe.txt deleted file mode 100644 index 331ab5121b..0000000000 --- a/content/1_docs/2_cookbook/9_setup/0_getkirby-com/cookbook-recipe.txt +++ /dev/null @@ -1,292 +0,0 @@ -Title: How we built getkirby.com - ----- - -Published: 2019-01-22 - ----- - -Description: Learn more about the hidden gems and secrets in our own website. - ----- - -Text: - -The Kirby website plays a very special role for us and has two main objectives: One is presenting Kirby and its features to the world and doing a good job to generate happy customers and hopefully some sales. The other is providing Kirby’s documentation––the part that has always been way more complex than the rest. - -(picture: home.jpg) - -In this article, I want to focus on all the hidden gems and secrets we built into this site to make our lives easier while maintaining the documentation and to give you better and more reliable docs. - -**** - -When we set out to create a new site for Kirby 3, we wanted to avoid repeating the mistakes we made with our old documentation that was built and maintained mainly by hand. That process was always error-prone and time-consuming. - -With the new Kirby version that comes with so many changes under the hood, we knew it would be too much effort to update everything manually. Fortunately, our new version has a very special feature we used to solve this… - -## Virtual pages - -While Kirby's main data source is still files and folders, you can now mix regular pages with content coming from a database, CSV file, API or anything else that PHP can parse. In our case, a huge part of our reference is generated directly from PHP reflections and other bits of magic. - -### Pages from PHP reflections - -"What are PHP reflections?" you might ask. PHP has (link: https://www.php.net/manual/en/book.reflection.php text: a built-in set of classes) that you can use to inspect your own code. If you want to know more details about a certain PHP class, for example, you can do the following: - -```php -$reflection = new ReflectionClass('MyClass'); - -foreach ($reflection->getMethods() as $method) { - var_dump($method->getName()); -} -``` - -Reflections have many handy little features such as getting the visibility of a method, a list of arguments, the return type and even access to the doc blocks in your code. - -To document our main classes (i.e. (link: docs/reference/objects/site text: $site), (link: docs/reference/objects/page text: $page), (link: docs/reference/objects/file text: $file)) and their methods, we use this feature inside a (link: docs/guide/templates/page-models text: page model) to create automatic subpages for each method. - -In our reference, we use regular pages to add each documented class: - -```filesystem -docs/ - reference/ - objects/ - file/ - class.txt - page/ - class.txt - site/ - class.txt -``` - -Each `class.txt` contains the full name of the class we want to document: - -```kirbycontent - Class: Kirby\Cms\Page - ---- -``` - -The class pages have their own page model. This page model overwrites the default children method to fetch subpages from the reflection. - -```php "/site/models/class.php" -class ClassPage extends Page -{ - - public function reflection() - { - return new ReflectionClass($this->class()->value()); - } - - public function children() - { - $methods = $this->reflection()->getMethods(); - $children = []; - - foreach ($methods as $method) { - $children[] = [ - 'slug' => Str::kebab($method->getName()), - 'model' => 'method', - 'template' => 'method', - 'parent' => $this, - ]; - } - - return Pages::factory($children, $this); - } - -} -``` - -Children are created as an array that we then pass to the `Pages::factory()` method. That's pretty much all you have to do to create virtual subpages that are not necessarily located in the file system. - -Those subpages are first-class citizens in Kirby and everything around them will work. You can filter or sort them, routing works out of the box, templates will work, etc. (link: docs/reference/objects/page/num text: Here's an example of such a virtual page). - -Here, we define that each subpage automatically gets a new `MethodPage` model. We use this model to fetch more information about each class method and to inject it into the template (arguments, method call, return type, etc.) You could nest this indefinitely if you want and combine it again with real pages in the file system. The possibilities are endless. - -We use the same technique for our (link: docs/reference/templates/helpers text: helpers), (link: docs/reference/system/validators text: validators), (link: docs/reference/templates/field-methods text: field methods) and (link: docs/reference text: more). - -### Pages from an SVG file - -Ok, it may sound weird, but you can actually create pages from an SVG icon sprite. As SVG is just XML, PHP can parse it. We wanted to document the icon set we use in the Panel to make it available for all plugin developers. That icon set is updated constantly with new icons and we wanted to reflect those changes in the docs without too much work. - -(screenshot: icons.jpg) - -To document our icon set, the reference has an icons page with an `icons.txt` - -```filesystem -docs/ - reference/ - icons/ - icons.txt -``` - -Like the `ClassPage` and `MethodPage` models there are also `IconsPage` and `IconPage` models. The `IconsPage` model fetches all icons from the sprite and the `IconPage` model injects additional information from the sprite into its template. - -Our icon sprite for the panel looks like this: -```xml - - - - - - - - -``` - -Here is the code for the `IconsPage` model: - -```php "/site/models/icons.php" - -class IconsPage extends Page -{ - - public function svg() - { - return F::read($this->kirby()->root('panel') . '/dist/img/icons.svg'); - } - - public function children() - { - $svg = new SimpleXMLElement($this->svg()); - $children = []; - - foreach ($svg->defs->children() as $symbol) { - $children[] = [ - 'slug' => str_replace('icon-', '', $symbol->attributes()->id), - 'template' => 'icon', - 'model' => 'icon', - 'num' => 0 - ]; - } - - return Pages::factory($children, $this)->sortBy('slug'); - } - -} -``` - -As you can see in the example above, the model takes the contents of the SVG directly from the panel dist files inside the kirby folder. So the icon documentation stays up to date as long as we keep our Kirby installation updated. Generating the subpages from the sprite is then a matter of parsing the SVG, looping through all symbols and passing the details to the `Pages::factory()`. - -### Automatic FTW - -Combining regular pages with such automated content generators has worked really great for us so far. Additionally, we can combine our auto-generated content with hand-written content to make it less technical and provide real-life examples, while making sure that tiny details are always correct. - -When things like arguments or return types are not correctly documented, we instantly know we need to fix this in our source code. That elevates our documentation to a real-time code quality tool. - -## Syntax highlighting - -Fabian spent a lot of time improving the syntax highlighter of our code examples. We use (link: https://prismjs.com/ text: prism.js) for the highlighting part and Fabian added quite a few enhancements to the Markdown parser (Parsedown) to implement more features for code blocks. - -We now have syntax highlighting for HTML, PHP, JS, CSS, JSON, YAML, and our own Kirby field syntax in text files. - -```kirbycontent - title: Hello world - ---- - text: Lorem ipsum … -``` - -Every code block has a copy button and we can inject the filename in a small toolbar above the example, showing you where to put the examples in your installations. - -```php "/site/templates/default.php" - - - - - -``` - -My favorite is the new filesystem block Fabian created. We used to document structures in the filesystem with screenshots, which was never user-friendly and hard to keep updated and consistent: - -```filesystem -content/ - projects/ - project-a/ - project.txt - example.jpg - download.pdf - code.js - styles.css - data.json -``` - -We can create those examples in our text files like this: - -``` -```filesystem -content/ - projects/ - project-a/ - project.txt - example.jpg - download.pdf - code.js - styles.css - data.json -``` - -The code detects folders and files automatically and adds icons that match the file type. I’m seriously in love with Fabian’s work here. - -## Our new glossary - -Some of you might have noticed that we have a new (link: docs/glossary text: glossary) in our docs menu. We wanted a simple page where newcomers can learn about the terms we use. A term like `blueprint` is confusing without further context. But a glossary is often ignored or not very helpful when you stumble upon such a term while reading the docs. That’s why we looked for a way to inject our short explanations from the glossary into any page without too much distraction. - -Fabian created a popup-bubble system that pulls in the description for a term as soon as we use the (`glossary: blueprint`) KirbyTag in our text. - -Here's an example: (glossary: blueprint) - -We still have to use these more often in our docs, but it's great to have such a tool at hand. Especially if it help to avoid detours in articles about other topics. - -## A new checkout - -Those of you who already purchased or upgraded a license met our new checkout powered by (link: http://paddle.com text: Paddle). After seven years with FastSpring, we decided to move forward and give Paddle a chance. Not an easy decision. FastSpring has been very reliable over all those years and their support was absolutely amazing. But we were never happy with the user experience of their checkout process. It always felt old and sluggish and we got many complaints from our customers. Paddle feels a lot closer to a modern checkout system like Stripe and we hope that it simplifies the process of buying licenses and makes it more enjoyable for you. - -## Our stack - -### Server - -Finally, a few words on our setup. We use a 4GB (link: https://www.linode.com/?r=64097ab6f175feee46523de8b645cb1cb45d15e0 text: Linode) VPS to run this site, just as we did for the old website. We use Nginx as our favorite server, PHP 7.2 with opcache enabled and APCU as our page cache engine. ((link: docs/guide/cache text: Kirby has a built-in APCU driver)) - -### KeyCDN -We host all our assets on (link: https://www.keycdn.com/ text: KeyCDN) with a tiny little KeyCDN plugin: - -```php - [ - 'url' => function ($kirby, $path, $options) { - $original = $kirby->nativeComponent('url'); - - if (preg_match('!assets!', $path)) { - $path = Cachebuster::path($path); - - if (option('keycdn', false) !== false) { - return option('keycdn.domain') . '/' . $path; - } - } - - return $original($kirby, $path, $options); - } - ] -]); -``` - -The plugin also takes care of optimizing images. Check out the (link: https://github.com/getkirby/getkirby.com/blob/master/site/plugins/keycdn/index.php text: source code) if you are interested in learning more about it. - -### Algolia - -We still trust in (link: https://algolia.com text: Algolia) for our search. They have been great over the last years and we get a very powerful search with very little effort. We re-index our content whenever we push updates to the server. This way we can make sure that the search index is always up to date. - -### Deployment - -Whenever we push changes to our (link: https://github.com/getkirby/getkirby.com text: master branch on Github), (link: https://deployhq.com text: DeployHQ) picks those changes up and deploys them to our server. This workflow is the fastest for us as a team and we can all work remotely on different parts of the site and iterate quickly over issues. - -## Get involved - -We try to keep everything as tidy and complete as possible. If you find anything that's not correct or missing, please let us know: https://github.com/getkirby/getkirby.com/issues - -You can even fix issues yourself if you like. **We appreciate all pull requests!** - -## It's all there - -If you are looking for more details about the implementations mentioned above, feel free to dive into our code and content and check out how we built it: https://github.com/getkirby/getkirby.com diff --git a/content/1_docs/2_cookbook/cookbook.txt b/content/1_docs/2_cookbook/cookbook.txt deleted file mode 100644 index 2a9bb04e9d..0000000000 --- a/content/1_docs/2_cookbook/cookbook.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Cookbook - ----- - -Description: Delicious recipes and solutions for common tasks. diff --git a/content/1_docs/3_reference/10_@/2_aliases/reference-section.txt b/content/1_docs/3_reference/10_@/2_aliases/reference-section.txt deleted file mode 100644 index 930d519589..0000000000 --- a/content/1_docs/3_reference/10_@/2_aliases/reference-section.txt +++ /dev/null @@ -1,13 +0,0 @@ -Title: Aliases - ----- - -Excerpt: In Kirby, classes are separated in different namespaces such as `Kirby\Cms\` or `Kirby\Http\`. Aliases help to access specific classes without the need to mention their namespace. - ----- - -Text: - -## Available aliases - -(docs: class-aliases) diff --git a/content/1_docs/3_reference/4_objects/0_asset/reference-class.txt b/content/1_docs/3_reference/4_objects/0_asset/reference-class.txt deleted file mode 100644 index de888cb355..0000000000 --- a/content/1_docs/3_reference/4_objects/0_asset/reference-class.txt +++ /dev/null @@ -1,31 +0,0 @@ -Class: Kirby\Cms\Asset - ----- -Since: 3.0.2 - ----- -Text: - -## Details - -You can create a new Asset object via the `asset()` helper or via the class constructor: - -### Via the helper - -```php -$asset = asset('assets/images/logo.svg'); -``` - -### Via the constructor - -```php -$asset = new Asset('assets/images/logo.svg'); -``` - -With the object defined, you can then start calling the class's methods: - -```php -if ($asset->exists()) { - echo $asset->width(); -} -``` \ No newline at end of file diff --git a/content/1_docs/3_reference/4_objects/0_block/reference-class.txt b/content/1_docs/3_reference/4_objects/0_block/reference-class.txt deleted file mode 100644 index 50526d12b0..0000000000 --- a/content/1_docs/3_reference/4_objects/0_block/reference-class.txt +++ /dev/null @@ -1,6 +0,0 @@ -Class: Kirby\Cms\Block - ----- - -Text: - diff --git a/content/1_docs/3_reference/4_objects/0_blocks/reference-class.txt b/content/1_docs/3_reference/4_objects/0_blocks/reference-class.txt deleted file mode 100644 index 0edc2b558a..0000000000 --- a/content/1_docs/3_reference/4_objects/0_blocks/reference-class.txt +++ /dev/null @@ -1,15 +0,0 @@ -Class: Kirby\Cms\Blocks - ----- - -Since: 3.5.0 - ----- - -Text: - -## What are blocks? - -When you want to work with the content of a Blocks field, you would use the `toBlocks` field method to convert it to a Blocks collection. The Blocks collection makes it easy to render the entire set of blocks or loop through blocks and create individual HTML for them. - -(docs: blocks/blocks) diff --git a/content/1_docs/3_reference/4_objects/0_file/0___construct/reference-classmethod.txt b/content/1_docs/3_reference/4_objects/0_file/0___construct/reference-classmethod.txt deleted file mode 100644 index d0031c0afb..0000000000 --- a/content/1_docs/3_reference/4_objects/0_file/0___construct/reference-classmethod.txt +++ /dev/null @@ -1,3 +0,0 @@ -Text: - -(docs: methods/file/props) diff --git a/content/1_docs/3_reference/4_objects/0_file/0_create/reference-classmethod.txt b/content/1_docs/3_reference/4_objects/0_file/0_create/reference-classmethod.txt deleted file mode 100644 index 0883dca0fd..0000000000 --- a/content/1_docs/3_reference/4_objects/0_file/0_create/reference-classmethod.txt +++ /dev/null @@ -1,21 +0,0 @@ -Auth: files.create - ----- - -Text: - -(docs: methods/file/props) - -## Example - -```php -$file = File::create([ - 'source' => kirby()->root('assets').'/images/some-image.jpg', - 'parent' => page('photography')->children()->listed()->first(), - 'filename' => 'new-image.jpg', - 'template' => 'cover', - 'content' => [ - 'caption' => 'A nice view from above', - ] -]); -``` diff --git a/content/1_docs/3_reference/4_objects/0_file/reference-class.txt b/content/1_docs/3_reference/4_objects/0_file/reference-class.txt deleted file mode 100644 index dec189a0eb..0000000000 --- a/content/1_docs/3_reference/4_objects/0_file/reference-class.txt +++ /dev/null @@ -1,46 +0,0 @@ -Class: Kirby\Cms\File - ----- - -Text: - -You can extend this set of methods with (link: docs/reference/plugins/extensions/file-methods text: custom file methods). - -## How to get a `$file` object - -You can get a `$file` object to use with these methods by fetching it from the `$site`, a `$page` or a `$user` object. - -### Site file -```php -files()->first()): ?> - - -``` - -### Page file -```php -files()->first()): ?> - - -``` - -### User file -```php -files()->first()): ?> - - -``` - - -Note how we use an if statement here to check if we have a file object before we call the `url()` method to prevent errors in case the page doesn't have any files. Never forget to do this in your own code. - - -## Examples - -### Resizing a file - -```php -image('myimage.jpg')): ?> - - -``` diff --git a/content/1_docs/3_reference/4_objects/0_files/reference-class.txt b/content/1_docs/3_reference/4_objects/0_files/reference-class.txt deleted file mode 100644 index 760929b0b5..0000000000 --- a/content/1_docs/3_reference/4_objects/0_files/reference-class.txt +++ /dev/null @@ -1,65 +0,0 @@ -Class: Kirby\Cms\Files - ----- - -Text: - -You can extend this set of methods with (link: docs/reference/plugins/extensions/files-methods text: custom files methods). - -## How to get a `$files` object - -Before you can use the methods of the `$files` class, you need a `$files` object. To get a files object, you fetch the files you need from the `$site`, `$page` or `$user` object: - - -Note that the default sorting order of files is according to their order in the file system. To sort files by their manual sorting order, you can use `$files->sortBy('sort')`, where `sort` is the field that stores the sorting number if you manually sort files in the Panel. - - -### Site files - -```php -$files = $site->files(); -``` - -### Page files - -```php -$files = $page->files(); -``` - -### User files - -```php -$files = $user->files(); -``` - -## Examples: - -With the `$files` object defined, you can now do all sorts of things: - -### Filter files - -```php -$filteredFiles = $files->filterBy('template', 'cover'); -``` - -### Group files - -```php -$groupedFiles = $files->groupBy('template'); -``` - -### Get the first file of the collection - - -```php -$firstFile = $files->first(); -``` - -### Only get three files - -```php -$files = $files->limit(3); -``` - - - diff --git a/content/1_docs/3_reference/4_objects/0_kirby/reference-class.txt b/content/1_docs/3_reference/4_objects/0_kirby/reference-class.txt deleted file mode 100644 index 41e9e2833d..0000000000 --- a/content/1_docs/3_reference/4_objects/0_kirby/reference-class.txt +++ /dev/null @@ -1,20 +0,0 @@ -Title: Kirby - ----- - -Class: Kirby\Cms\App - ----- - -Text: - -## How to fetch the `$kirby` object - -The `$kirby` class is accessible in Kirby's templates/snippets etc. through the `$kirby` variable. - -In any situation, you can define a `$kirby` object using the `kirby()` helper: - -```php -$kirby = kirby(); -```` - diff --git a/content/1_docs/3_reference/4_objects/0_language/reference-class.txt b/content/1_docs/3_reference/4_objects/0_language/reference-class.txt deleted file mode 100644 index 36326b83e7..0000000000 --- a/content/1_docs/3_reference/4_objects/0_language/reference-class.txt +++ /dev/null @@ -1,53 +0,0 @@ -Class: Kirby\Cms\Language - ----- - -Text: - -## Details - -To have access to the methods of the `$language` object, you need to get a language object first: - -### Default language - -```php -$language = $kirby->defaultLanguage(); -``` - -### The current language - -```php -$language = $kirby->language(); -``` - -### Any particular language - -```php -$language = $kirby->language('fr'); -``` - -## Examples - -With the object in place, you can use it like this: - -### Get the language code - -```php -echo $language->code(); -``` - -### Get the language name - -```php -echo $language->name(); -``` - -### Get the available translations - -```php -dump($language->translations()); -``` - - - - diff --git a/content/1_docs/3_reference/4_objects/0_languages/reference-class.txt b/content/1_docs/3_reference/4_objects/0_languages/reference-class.txt deleted file mode 100644 index 22b2bb8fc2..0000000000 --- a/content/1_docs/3_reference/4_objects/0_languages/reference-class.txt +++ /dev/null @@ -1,41 +0,0 @@ -Class: Kirby\Cms\Languages - ----- - -Text: - -## Details - -To use the methods of the `$languages` class, you need a `$languages` object, which you get can like this: - -```php -$languages = $kirby->languages(); -``` - -With the object in place, you can now use it like this: - -## Examples - -### Find a language by code - -```php -$language = $languages->find('de'); -``` - - -### Get the number of languages - -```php -$numberOfLanguage = $languages->count(); -``` - -### Sort languages by name - -```php -$sortedLanguages = $languages->sortBy('name', 'desc'); ----- - -Excerpt: - -The `$languages` object gives you a collection of all the languages that have been defined for your Kirby installation. The methods of this class allow you to filter, find, group, search the languages collection. - diff --git a/content/1_docs/3_reference/4_objects/0_layout/reference-class.txt b/content/1_docs/3_reference/4_objects/0_layout/reference-class.txt deleted file mode 100644 index 4dc59f01b0..0000000000 --- a/content/1_docs/3_reference/4_objects/0_layout/reference-class.txt +++ /dev/null @@ -1,9 +0,0 @@ -Class: Kirby\Cms\Layout - ----- - -Since: 3.5.0 - ----- - -Text: diff --git a/content/1_docs/3_reference/4_objects/0_layoutcolumn/reference-class.txt b/content/1_docs/3_reference/4_objects/0_layoutcolumn/reference-class.txt deleted file mode 100644 index 98ecbd25c0..0000000000 --- a/content/1_docs/3_reference/4_objects/0_layoutcolumn/reference-class.txt +++ /dev/null @@ -1,9 +0,0 @@ -Class: Kirby\Cms\LayoutColumn - ----- - -Since: 3.5.0 - ----- - -Text: diff --git a/content/1_docs/3_reference/4_objects/0_layouts/reference-class.txt b/content/1_docs/3_reference/4_objects/0_layouts/reference-class.txt deleted file mode 100644 index ed5fc3b822..0000000000 --- a/content/1_docs/3_reference/4_objects/0_layouts/reference-class.txt +++ /dev/null @@ -1,11 +0,0 @@ -Class: Kirby\Cms\Layouts - ----- - -Since: 3.5.0 - ----- - -Text: - -(docs: layouts/to-layouts) diff --git a/content/1_docs/3_reference/4_objects/0_page/0___construct/reference-classmethod.txt b/content/1_docs/3_reference/4_objects/0_page/0___construct/reference-classmethod.txt deleted file mode 100644 index 9045d1edeb..0000000000 --- a/content/1_docs/3_reference/4_objects/0_page/0___construct/reference-classmethod.txt +++ /dev/null @@ -1,3 +0,0 @@ -Text: - -(docs: methods/page/props) diff --git a/content/1_docs/3_reference/4_objects/0_page/0_create-file/reference-classmethod.txt b/content/1_docs/3_reference/4_objects/0_page/0_create-file/reference-classmethod.txt deleted file mode 100644 index 5e6395ff1c..0000000000 --- a/content/1_docs/3_reference/4_objects/0_page/0_create-file/reference-classmethod.txt +++ /dev/null @@ -1,7 +0,0 @@ -Auth: files.create - ----- - -Text: - -(docs: methods/file/props) diff --git a/content/1_docs/3_reference/4_objects/0_page/0_create/reference-classmethod.txt b/content/1_docs/3_reference/4_objects/0_page/0_create/reference-classmethod.txt deleted file mode 100644 index d3a1d0e9df..0000000000 --- a/content/1_docs/3_reference/4_objects/0_page/0_create/reference-classmethod.txt +++ /dev/null @@ -1,30 +0,0 @@ -Auth: pages.create - ----- - -Text: - -## The `$props` parameter - -Property | Type | ---|--| -`slug` | `string` | -`url` | `string` | -`template` | `string` | -`model` | `string` | -`num` | `mixed` | -`draft` | `bool` | -`content` | `array` | - -## Example - -```php -$page = Page::create([ - 'slug' => 'a-new-article', - 'template' => 'article', - 'content' => [ - 'title' => 'A new article', - 'author' => 'Homer Simpson' - ] -]); -``` diff --git a/content/1_docs/3_reference/4_objects/0_page/0_factory/reference-classmethod.txt b/content/1_docs/3_reference/4_objects/0_page/0_factory/reference-classmethod.txt deleted file mode 100644 index 9045d1edeb..0000000000 --- a/content/1_docs/3_reference/4_objects/0_page/0_factory/reference-classmethod.txt +++ /dev/null @@ -1,3 +0,0 @@ -Text: - -(docs: methods/page/props) diff --git a/content/1_docs/3_reference/4_objects/0_page/reference-class.txt b/content/1_docs/3_reference/4_objects/0_page/reference-class.txt deleted file mode 100644 index 1d9005159f..0000000000 --- a/content/1_docs/3_reference/4_objects/0_page/reference-class.txt +++ /dev/null @@ -1,80 +0,0 @@ -Class: Kirby\Cms\Page - ----- - -Text: - -You can extend this set of methods with (link: docs/reference/plugins/extensions/page-methods text: custom page methods) or in a (link: docs/reference/plugins/extensions/page-models text: page model). - -## How to fetch the `$page` object - -The `$page` class is available in Kirby's templates/snippets etc. through the `$page` variable that - unless otherwise defined – always refers to the current page. However, you can also define a `$page` object by calling a specific page using the [`page()` helper](/docs/reference/templates/helpers/page): - -```php -$page = page('somepage'); -``` - -Or getting it from a collection of pages - -```php -$page = $pages->first(); -``` - - -When getting a specific page via the [`page()` helper](/docs/reference/templates/helpers/page) or when trying to create a page object from field values stored in content, always verify that you have a page object before you call any of the Page methods. - - -## Content fields - -The `$page` class offers a magic caller for your (link: docs/guide/content/fields text: content fields). Instead of getting them via e.g. - -```php -$page->content()->get('your_field') -``` - -you can use the shorthand - -```php -$page->your_field() -``` - - -You can not use the shorthand for fields with names that conflict with the default methods of the `$page` class (see above) or used by custom page methods. - - - -## Examples - -With the `$page` object defined, you can start using the methods of the class: - -### Get a field of the page - -```php -title() ?> -``` - -### Get the children of the page - -```php -children() ?> -``` - -### Get all images of the page - -```php -images() ?> -``` - -### Check if the page is active - -```php -isActive(), 'active') ?> -``` - -### Check if the page has draft children - -```php -if ($page->hasDrafts()) { - echo "This page still has some children that haven't been published yet"; -} -``` diff --git a/content/1_docs/3_reference/4_objects/0_pages/reference-class.txt b/content/1_docs/3_reference/4_objects/0_pages/reference-class.txt deleted file mode 100644 index feb659220e..0000000000 --- a/content/1_docs/3_reference/4_objects/0_pages/reference-class.txt +++ /dev/null @@ -1,67 +0,0 @@ -Class: Kirby\Cms\Pages - ----- - -Text: - -You can extend this set of methods with (link: docs/reference/plugins/extensions/pages-methods text: custom pages methods). - -## How to get a `$pages` object - -The `$pages` variable is available by default in templates and snippets and refers to a collection of all first level pages. In addition to that, you can define a `$pages` object in various ways: - -### Children of a page -```php -$pages = $page->children(); -``` - -### All pages of the site -```php -$pages = $site->index(); -``` - -### A custom combination of pages -```php -// find specific pages in the site -$pages = $site->find('blog', 'projects', 'contact'); - -// find specific subpages -$pages = $page->find('article-a', 'article-b'); -``` - -## Examples - -With the `$pages` object in place, we can start using the methods of this class to do many different things: - -### Filter the collection by any criterium - -```php -$articles = $pages->filterBy('date', '>', time()); -``` - -### Get only listed pages - -```php -$articles = $pages->listed() -``` -### Get all files of all the pages in the collection - -```php -$files = $pages->files(); -``` - -### Get the first/last page - -```php -$firstPage = $pages->first(); -$lastPage = $pages->last(); -``` - - -### Sort pages - -```php -$sorted = $pages->sortBy(function ($page) { - return $page->date()->toDate(); -}, 'desc'); -``` diff --git a/content/1_docs/3_reference/4_objects/0_pagination/reference-class.txt b/content/1_docs/3_reference/4_objects/0_pagination/reference-class.txt deleted file mode 100644 index e456130e16..0000000000 --- a/content/1_docs/3_reference/4_objects/0_pagination/reference-class.txt +++ /dev/null @@ -1,36 +0,0 @@ -Class: Kirby\Cms\Pagination - ----- - -Text: - -## How to create a `$pagination` object - -To create a `$pagination` object, you have to paginate a collection of pages and then call the `pagination()` method: - -```php -$articles = page('blog')->children()->listed()->paginate(5); -$pagination = $articles->pagination(); -``` -This will give us 5 articles per pagination page. - -## Example - -With the object in place, we can now use the methods to create our pagination navigation - -```php -hasPages()): ?> - - -``` - diff --git a/content/1_docs/3_reference/4_objects/0_request/reference-class.txt b/content/1_docs/3_reference/4_objects/0_request/reference-class.txt deleted file mode 100644 index 6d5c52e218..0000000000 --- a/content/1_docs/3_reference/4_objects/0_request/reference-class.txt +++ /dev/null @@ -1,37 +0,0 @@ -Class: Kirby\Http\Request - ----- - -Text: - -## How to get a `$request` object - -The `$request` object is available via the `$kirby` object: - -```php -$request = $kirby->request(); -``` - -## Examples - -With the object in place, you have access to all the methods listed above. - -### Get a specific variable from the query string - -```php -$filter = $request->query()->filter(); -``` - -### Get the Params object - -The `$params` object contains all URL parameters - -```php -$params = $request->params(); -``` - -### Get the request method - -```php -$method = $request->method(); -``` diff --git a/content/1_docs/3_reference/4_objects/0_session/reference-class.txt b/content/1_docs/3_reference/4_objects/0_session/reference-class.txt deleted file mode 100644 index 68a1debee1..0000000000 --- a/content/1_docs/3_reference/4_objects/0_session/reference-class.txt +++ /dev/null @@ -1,17 +0,0 @@ -Title: Session - ----- - -Class: Kirby\Session\SessionData - ----- - -Text: - -## How to get the `$session` object - -The `$session` object is available via the `$kirby` object: - -```php -$session = $kirby->session(); -``` diff --git a/content/1_docs/3_reference/4_objects/0_site/0_create-file/reference-classmethod.txt b/content/1_docs/3_reference/4_objects/0_site/0_create-file/reference-classmethod.txt deleted file mode 100644 index 5e6395ff1c..0000000000 --- a/content/1_docs/3_reference/4_objects/0_site/0_create-file/reference-classmethod.txt +++ /dev/null @@ -1,7 +0,0 @@ -Auth: files.create - ----- - -Text: - -(docs: methods/file/props) diff --git a/content/1_docs/3_reference/4_objects/0_site/reference-class.txt b/content/1_docs/3_reference/4_objects/0_site/reference-class.txt deleted file mode 100644 index 61c7518d71..0000000000 --- a/content/1_docs/3_reference/4_objects/0_site/reference-class.txt +++ /dev/null @@ -1,53 +0,0 @@ -Class: Kirby\Cms\Site - ----- - -Text: - -## How to access the `$site` object - -The `$site` variable is automatically available in your templates and snippets. - -To access the `$site` object in extensions, you have to define it first: - -```php -// via the kirby object -$site = $kirby->site(); - -// using the `site()` helper -$site = site(); -``` - -## Examples - -### Get the site title - -```php -echo $site->title(); -``` - -### Get any custom field of the site - -```php -echo $site->description(); -``` - -### Get the files stored in the content folder - -```php -$siteFiles = $site->files(); -``` - -### Get all the pages of the site - -```php -$pageIndex = $site->index(); -``` - -### Get the URL of the site - -```php -$url = $site->url(); -``` - - diff --git a/content/1_docs/3_reference/4_objects/0_user/0___construct/reference-classmethod.txt b/content/1_docs/3_reference/4_objects/0_user/0___construct/reference-classmethod.txt deleted file mode 100644 index 59c5d360dd..0000000000 --- a/content/1_docs/3_reference/4_objects/0_user/0___construct/reference-classmethod.txt +++ /dev/null @@ -1,3 +0,0 @@ -Text: - -(docs: methods/user/props) diff --git a/content/1_docs/3_reference/4_objects/0_user/0_create-file/reference-classmethod.txt b/content/1_docs/3_reference/4_objects/0_user/0_create-file/reference-classmethod.txt deleted file mode 100644 index 5e6395ff1c..0000000000 --- a/content/1_docs/3_reference/4_objects/0_user/0_create-file/reference-classmethod.txt +++ /dev/null @@ -1,7 +0,0 @@ -Auth: files.create - ----- - -Text: - -(docs: methods/file/props) diff --git a/content/1_docs/3_reference/4_objects/0_user/0_create/reference-classmethod.txt b/content/1_docs/3_reference/4_objects/0_user/0_create/reference-classmethod.txt deleted file mode 100644 index b7f8a5ebf4..0000000000 --- a/content/1_docs/3_reference/4_objects/0_user/0_create/reference-classmethod.txt +++ /dev/null @@ -1,23 +0,0 @@ -Auth: users.create - ----- - -Text: - -(docs: methods/user/props) - -## Example - -```php -$newUser = User::create([ - 'email' => 'bastian@getkirby.com', - 'name' => 'Bastian', - 'role' => 'admin', - 'language' => 'en', - 'password' => 'topSecret', - 'content' => [ - 'twitter' => '@getkirby', - 'position' => 'founder' - ] -]); -``` diff --git a/content/1_docs/3_reference/4_objects/0_user/reference-class.txt b/content/1_docs/3_reference/4_objects/0_user/reference-class.txt deleted file mode 100644 index c2b7eda7eb..0000000000 --- a/content/1_docs/3_reference/4_objects/0_user/reference-class.txt +++ /dev/null @@ -1,70 +0,0 @@ -Class: Kirby\Cms\User - ----- - -Text: - -## How to create a `$user` object - -Before you can call the methods of the User class, you need a `$user` object. - -The `$user` object is available via the `$kirby` object: - -### The current user - -```php -$user = $kirby->user(); -``` - -### A specific user by user id or email address -```php -$user = $kirby->user('you@yourdomain.com'); -``` - -### The first user of the users collection -```php -$user = $kirby->users()->first(); -``` - - -Before calling any of the methods of the User class, verify that you have a valid User object. - - - -## Examples - -With the `$user` object in place, you can use the methods of the user class to get information about the user or modify the user object. - -### Check if the user is an admin - -```php -if ($user->isAdmin()) { - echo "Hey, great, you can do anything you like!" -} -``` - -### Convert user object to array - -```php -$userData = $user->toArray(); -``` - -### Change the user name programmatically - -```php -$user->changeName('new-name'); -``` - -### Fetch all files belonging to the user object - -```php -$userFiles = $user->files(); -``` - - -To keep the examples short, we don't [check if the (user) object exists](docs/cookbook/templating/php-templates#and-one-last-trick) in the examples above. In your code, you should always do that. - - - - - diff --git a/content/1_docs/3_reference/4_objects/0_users/reference-class.txt b/content/1_docs/3_reference/4_objects/0_users/reference-class.txt deleted file mode 100644 index 551bfe1fb3..0000000000 --- a/content/1_docs/3_reference/4_objects/0_users/reference-class.txt +++ /dev/null @@ -1,40 +0,0 @@ -Class: Kirby\Cms\Users - ----- - -Text: - -## How to get a `$users` object - -The users object is available via the `$kirby` object: - -```php -$users = $kirby->users(); -``` - -This will return a collection of all users of the site. - -## Examples - -With the `$users` object in place, you can now use all the methods of the class, for example: - -### Get all admin users - -```php -$admins = $users->filterBy('isAdmin'); -``` - -### Fetch all values of a user field into an array - -```php -$userEmails = $users->pluck('email'); -``` -This will return an array with all the email adresses of all users. - -### Sort users - -```php -$sorted = $users->sortBy('role'); -``` - - diff --git a/content/1_docs/3_reference/reference.txt b/content/1_docs/3_reference/reference.txt deleted file mode 100644 index 8921b4acd7..0000000000 --- a/content/1_docs/3_reference/reference.txt +++ /dev/null @@ -1,19 +0,0 @@ -Title: Reference - ----- - -Description: The Reference provides a quick but detailed reference to pretty much any aspect of Kirby. - ----- - -Excerpt: - -The Reference provides a quick but detailed reference to pretty much any aspect of Kirby. - ----- - -Changefreq: daily - ----- - -Priority: 0.9 \ No newline at end of file diff --git a/content/1_docs/5_glossary/content-representation/glossary-entry.txt b/content/1_docs/5_glossary/content-representation/glossary-entry.txt deleted file mode 100644 index b71f75283e..0000000000 --- a/content/1_docs/5_glossary/content-representation/glossary-entry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Content representation - ----- -Entry: - -Content Representations allow you to output your content in different formats, e.g. JSON for your frontend JS library of choice or to use Kirby as an API for other tools, an automatic RSS feed representation of your blog or a plain text representation of your résumé. ----- - -Link: docs/guide/templates/content-representations \ No newline at end of file diff --git a/content/1_docs/5_glossary/content/glossary-entry.txt b/content/1_docs/5_glossary/content/glossary-entry.txt deleted file mode 100644 index a29cef8317..0000000000 --- a/content/1_docs/5_glossary/content/glossary-entry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Content - ----- -Entry: - -Content can refer either to the content folder or to anything within the content folder: text files, media files or meta data files. - ----- -Link: docs/guide/content/introduction diff --git a/content/1_docs/5_glossary/controller/glossary-entry.txt b/content/1_docs/5_glossary/controller/glossary-entry.txt deleted file mode 100644 index aa26f10911..0000000000 --- a/content/1_docs/5_glossary/controller/glossary-entry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Controller - ----- -Entry: - -A PHP file that can contains the logic for a specific page template. Controllers are stored in `/site/controllers`. ----- - -Link: docs/guide/templates/controllers diff --git a/content/1_docs/5_glossary/field/glossary-entry.txt b/content/1_docs/5_glossary/field/glossary-entry.txt deleted file mode 100644 index 9ec87f42ed..0000000000 --- a/content/1_docs/5_glossary/field/glossary-entry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Field - ----- -Entry: - -The smallest content unit in a Kirby content file, comparable to a column header in a database. Fields can have different fields types that are defined in a blueprint file. - ----- -Link: docs/reference/panel/fields diff --git a/content/1_docs/5_glossary/markdown/glossary-entry.txt b/content/1_docs/5_glossary/markdown/glossary-entry.txt deleted file mode 100644 index 6d1f881125..0000000000 --- a/content/1_docs/5_glossary/markdown/glossary-entry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Markdown - ----- -Entry: - -A markup language that uses plain text formatting syntax that can be converted to HTML and other formats. Created by (link: https://daringfireball.net/projects/markdown/ text: John Gruber) in 2004. - ----- -Link: docs/guide/content/text-formatting#markdown diff --git a/content/1_docs/5_glossary/route/glossary-entry.txt b/content/1_docs/5_glossary/route/glossary-entry.txt deleted file mode 100644 index b45332ed71..0000000000 --- a/content/1_docs/5_glossary/route/glossary-entry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Title: Route - ----- -Entry: - -A route is a URL pattern that when called executes a defined action, for example return a particular page, create a new page, read data from a file etc. - ----- - -Link: docs/guide/routing diff --git a/content/1_docs/5_glossary/section/glossary-entry.txt b/content/1_docs/5_glossary/section/glossary-entry.txt deleted file mode 100644 index 454f7acce1..0000000000 --- a/content/1_docs/5_glossary/section/glossary-entry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Title: Section - ----- - -Entry: - -Sections are used in blueprints to organize content or to display information. Kirby comes with 4 built-in section types but you can create your own in a plugin. - ----- -Link: docs/guide/blueprints/layout diff --git a/content/1_docs/6_archive/archive.txt b/content/1_docs/6_archive/archive.txt deleted file mode 100644 index c7f748c2ca..0000000000 --- a/content/1_docs/6_archive/archive.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Versions - ----- - -Description: Docs for older versions of Kirby. - ----- - -Intro: Time travel is possible! diff --git a/content/2_resources/1_newsletter/link.txt b/content/2_resources/1_newsletter/link.txt deleted file mode 100644 index ac4f3dd9cd..0000000000 --- a/content/2_resources/1_newsletter/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Newsletter - ----- - -Link: kosmos diff --git a/content/2_resources/2_plugins/link.txt b/content/2_resources/2_plugins/link.txt deleted file mode 100644 index 2708469f5c..0000000000 --- a/content/2_resources/2_plugins/link.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Plugins - ----- - -Intro: Our plugin developers created dozens of fantastic plugins for Kirby. Below is a small selection of our favorite ones. You can find them all in our official plugin repository. - ----- - -Link: plugins diff --git a/content/2_resources/2_plugins/plugins.jpg b/content/2_resources/2_plugins/plugins.jpg deleted file mode 100644 index 4d006bfc29..0000000000 Binary files a/content/2_resources/2_plugins/plugins.jpg and /dev/null differ diff --git a/content/2_resources/3_themes/link.txt b/content/2_resources/3_themes/link.txt deleted file mode 100644 index d54ac05afb..0000000000 --- a/content/2_resources/3_themes/link.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Themes - ----- - -Intro: You are looking for a nice theme to get started with instead of creating your site from scratch? Check out dozens of free and commercial themes. - ----- - -Link: http://getkirby-themes.com diff --git a/content/2_resources/4_releases/link.txt b/content/2_resources/4_releases/link.txt deleted file mode 100644 index fd9969ca1d..0000000000 --- a/content/2_resources/4_releases/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Releases - ----- - -Link: https://github.com/getkirby/kirby/releases diff --git a/content/2_resources/5_press/link.txt b/content/2_resources/5_press/link.txt deleted file mode 100644 index 1991cae60d..0000000000 --- a/content/2_resources/5_press/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Presskit - ----- - -Link: press diff --git a/content/2_resources/link.txt b/content/2_resources/link.txt deleted file mode 100644 index 569ac133c2..0000000000 --- a/content/2_resources/link.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Resources - ----- - -Submenu: true - ----- - -Link: kosmos diff --git a/content/3_community/1_contributors/1_team/1_bastian-allgeier/bastian.jpg b/content/3_community/1_contributors/1_team/1_bastian-allgeier/bastian.jpg deleted file mode 100644 index 788eccf4e0..0000000000 Binary files a/content/3_community/1_contributors/1_team/1_bastian-allgeier/bastian.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/1_team/1_bastian-allgeier/mate.txt b/content/3_community/1_contributors/1_team/1_bastian-allgeier/mate.txt deleted file mode 100644 index 8decd9119e..0000000000 --- a/content/3_community/1_contributors/1_team/1_bastian-allgeier/mate.txt +++ /dev/null @@ -1,21 +0,0 @@ -Title: Bastian Allgeier - ----- - -Role: Founder - ----- - -Twitter: bastianallgeier - ----- - -Website: https://getkirby.com - ----- - -GitHub: bastianallgeier - ----- - -Email: bastian@getkirby.com diff --git a/content/3_community/1_contributors/1_team/2_sonja-broda/mate.txt b/content/3_community/1_contributors/1_team/2_sonja-broda/mate.txt deleted file mode 100644 index 7336246b87..0000000000 --- a/content/3_community/1_contributors/1_team/2_sonja-broda/mate.txt +++ /dev/null @@ -1,21 +0,0 @@ -Title: Sonja Broda - ----- - -Role: Support - ----- - -Twitter: texnixe - ----- - -Website: https://sonjabroda.com - ----- - -Email: sonja@getkirby.com - ----- - -GitHub: texnixe diff --git a/content/3_community/1_contributors/1_team/2_sonja-broda/sonja.jpg b/content/3_community/1_contributors/1_team/2_sonja-broda/sonja.jpg deleted file mode 100644 index 57863d3ca5..0000000000 Binary files a/content/3_community/1_contributors/1_team/2_sonja-broda/sonja.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/1_team/3_lukas-bestle/lukas.jpg b/content/3_community/1_contributors/1_team/3_lukas-bestle/lukas.jpg deleted file mode 100644 index fe2932e352..0000000000 Binary files a/content/3_community/1_contributors/1_team/3_lukas-bestle/lukas.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/1_team/3_lukas-bestle/mate.txt b/content/3_community/1_contributors/1_team/3_lukas-bestle/mate.txt deleted file mode 100644 index d018a4995b..0000000000 --- a/content/3_community/1_contributors/1_team/3_lukas-bestle/mate.txt +++ /dev/null @@ -1,21 +0,0 @@ -Title: Lukas Bestle - ----- - -Role: Development - ----- - -Twitter: lukasbestle - ----- - -Website: https://codesignd.com/ - ----- - -Email: lukas@getkirby.com - ----- - -GitHub: lukasbestle diff --git a/content/3_community/1_contributors/1_team/4_ahmet-bora/ahmet.jpg b/content/3_community/1_contributors/1_team/4_ahmet-bora/ahmet.jpg deleted file mode 100644 index debb78fb40..0000000000 Binary files a/content/3_community/1_contributors/1_team/4_ahmet-bora/ahmet.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/1_team/4_ahmet-bora/mate.txt b/content/3_community/1_contributors/1_team/4_ahmet-bora/mate.txt deleted file mode 100644 index 75e641261e..0000000000 --- a/content/3_community/1_contributors/1_team/4_ahmet-bora/mate.txt +++ /dev/null @@ -1,21 +0,0 @@ -Title: Ahmet Bora - ----- - -Role: Development - ----- - -Twitter: afbora - ----- - -Website: https://ahmetbora.com/ - ----- - -Email: ahmet@getkirby.com - ----- - -GitHub: afbora \ No newline at end of file diff --git a/content/3_community/1_contributors/1_team/5_nico-hoffmann/mate.txt b/content/3_community/1_contributors/1_team/5_nico-hoffmann/mate.txt deleted file mode 100644 index 0b0d93d3d5..0000000000 --- a/content/3_community/1_contributors/1_team/5_nico-hoffmann/mate.txt +++ /dev/null @@ -1,21 +0,0 @@ -Title: Nico Hoffmann - ----- - -Role: Development - ----- - -Twitter: distantnative - ----- - -Website: http://nhoffmann.com/ - ----- - -Email: nico@getkirby.com - ----- - -GitHub: distantnative diff --git a/content/3_community/1_contributors/1_team/5_nico-hoffmann/nico.jpg b/content/3_community/1_contributors/1_team/5_nico-hoffmann/nico.jpg deleted file mode 100644 index 77d44ecb13..0000000000 Binary files a/content/3_community/1_contributors/1_team/5_nico-hoffmann/nico.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/1_team/link.txt b/content/3_community/1_contributors/1_team/link.txt deleted file mode 100644 index 37fbc9a52c..0000000000 --- a/content/3_community/1_contributors/1_team/link.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Team - ----- - -Intro: Kirby grew from a one-man show to a team of dedicated developers, designers and writers. But the real team is made up of our independent developers and users who make Kirby great. - ----- - -Link: community/#team diff --git a/content/3_community/1_contributors/2_contributors/0_adam-paszternak/adam-paszternak.jpg b/content/3_community/1_contributors/2_contributors/0_adam-paszternak/adam-paszternak.jpg deleted file mode 100644 index 9ed1e05326..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_adam-paszternak/adam-paszternak.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_adam-paszternak/contributor.txt b/content/3_community/1_contributors/2_contributors/0_adam-paszternak/contributor.txt deleted file mode 100644 index 495cbfc0c2..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_adam-paszternak/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Adam Paszternak - ----- - -Link: https://paszternak.me diff --git a/content/3_community/1_contributors/2_contributors/0_alexander-gloeckner/alexander-gloeckner.jpg b/content/3_community/1_contributors/2_contributors/0_alexander-gloeckner/alexander-gloeckner.jpg deleted file mode 100644 index 668ed5a5cc..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_alexander-gloeckner/alexander-gloeckner.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_alexander-gloeckner/contributor.txt b/content/3_community/1_contributors/2_contributors/0_alexander-gloeckner/contributor.txt deleted file mode 100644 index 837b921360..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_alexander-gloeckner/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Alexander Glöckner - ----- - -Link: http://myvita.digital/alexander-gloeckner diff --git a/content/3_community/1_contributors/2_contributors/0_alexander-rink/alexander-rink.jpg b/content/3_community/1_contributors/2_contributors/0_alexander-rink/alexander-rink.jpg deleted file mode 100644 index 24a465a228..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_alexander-rink/alexander-rink.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_alexander-rink/contributor.txt b/content/3_community/1_contributors/2_contributors/0_alexander-rink/contributor.txt deleted file mode 100644 index bc92a78816..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_alexander-rink/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Alexander Rink - ----- - -Link: https://rcvd.io diff --git a/content/3_community/1_contributors/2_contributors/0_andreas-huber/andreas-huber.png b/content/3_community/1_contributors/2_contributors/0_andreas-huber/andreas-huber.png deleted file mode 100644 index 1e83ba4023..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_andreas-huber/andreas-huber.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_andreas-huber/contributor.txt b/content/3_community/1_contributors/2_contributors/0_andreas-huber/contributor.txt deleted file mode 100644 index 16b5e1e001..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_andreas-huber/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Andreas Huber - ----- - -Link: http://www.supersmart.at diff --git a/content/3_community/1_contributors/2_contributors/0_andrey/andrey.jpg b/content/3_community/1_contributors/2_contributors/0_andrey/andrey.jpg deleted file mode 100644 index 96d68a617a..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_andrey/andrey.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_andrey/contributor.txt b/content/3_community/1_contributors/2_contributors/0_andrey/contributor.txt deleted file mode 100644 index 6db9532fb3..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_andrey/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Andrey - ----- - -Link: http://andrey.bg diff --git a/content/3_community/1_contributors/2_contributors/0_andy-needham/andy-needham.png b/content/3_community/1_contributors/2_contributors/0_andy-needham/andy-needham.png deleted file mode 100644 index e03d6f87b9..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_andy-needham/andy-needham.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_andy-needham/contributor.txt b/content/3_community/1_contributors/2_contributors/0_andy-needham/contributor.txt deleted file mode 100644 index d51687613c..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_andy-needham/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Andy Needham - ----- - -Link: http://twitter.com/imcalledandy diff --git a/content/3_community/1_contributors/2_contributors/0_bart-vandeputte/bart-vandeputte.jpg b/content/3_community/1_contributors/2_contributors/0_bart-vandeputte/bart-vandeputte.jpg deleted file mode 100644 index fc13c2bbd7..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_bart-vandeputte/bart-vandeputte.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_bart-vandeputte/contributor.txt b/content/3_community/1_contributors/2_contributors/0_bart-vandeputte/contributor.txt deleted file mode 100644 index 4a4d03a36b..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_bart-vandeputte/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Bart Vandeputte - ----- - -Link: https://twitter.com/bvdputte/ diff --git a/content/3_community/1_contributors/2_contributors/0_bjoern-rohles/bjoern-rohles.jpg b/content/3_community/1_contributors/2_contributors/0_bjoern-rohles/bjoern-rohles.jpg deleted file mode 100644 index d84ee43bac..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_bjoern-rohles/bjoern-rohles.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_bjoern-rohles/contributor.txt b/content/3_community/1_contributors/2_contributors/0_bjoern-rohles/contributor.txt deleted file mode 100644 index 720721745e..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_bjoern-rohles/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Björn Rohles - ----- - -Link: https://rohles.net diff --git a/content/3_community/1_contributors/2_contributors/0_bnomei/bnomei.jpg b/content/3_community/1_contributors/2_contributors/0_bnomei/bnomei.jpg deleted file mode 100644 index 234200944f..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_bnomei/bnomei.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_bnomei/contributor.txt b/content/3_community/1_contributors/2_contributors/0_bnomei/contributor.txt deleted file mode 100644 index a79df16a90..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_bnomei/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Bruno Meilick - ----- - -Link: https://github.com/bnomei/ diff --git a/content/3_community/1_contributors/2_contributors/0_cdlx/cdlx.png b/content/3_community/1_contributors/2_contributors/0_cdlx/cdlx.png deleted file mode 100644 index 4c2c66db28..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_cdlx/cdlx.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_cdlx/contributor.txt b/content/3_community/1_contributors/2_contributors/0_cdlx/contributor.txt deleted file mode 100644 index 405fe6a31a..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_cdlx/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: CDLX - ----- - -Link: http://cdlx.de diff --git a/content/3_community/1_contributors/2_contributors/0_chris-martin/chris-martin.jpg b/content/3_community/1_contributors/2_contributors/0_chris-martin/chris-martin.jpg deleted file mode 100644 index 1754a39d8e..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_chris-martin/chris-martin.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_chris-martin/contributor.txt b/content/3_community/1_contributors/2_contributors/0_chris-martin/contributor.txt deleted file mode 100644 index fd4a699c53..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_chris-martin/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Chris Martin - ----- - -Link: https://imchr.is diff --git a/content/3_community/1_contributors/2_contributors/0_chris-preisler/chris-preisler.jpg b/content/3_community/1_contributors/2_contributors/0_chris-preisler/chris-preisler.jpg deleted file mode 100644 index 92e9bc8676..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_chris-preisler/chris-preisler.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_chris-preisler/contributor.txt b/content/3_community/1_contributors/2_contributors/0_chris-preisler/contributor.txt deleted file mode 100644 index d23501f760..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_chris-preisler/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Chris Preisler - ----- - -Link: http://www.chrispreisler.com diff --git a/content/3_community/1_contributors/2_contributors/0_christian-schley/christian-schley.jpg b/content/3_community/1_contributors/2_contributors/0_christian-schley/christian-schley.jpg deleted file mode 100644 index de5a9b67bd..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_christian-schley/christian-schley.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_christian-schley/contributor.txt b/content/3_community/1_contributors/2_contributors/0_christian-schley/contributor.txt deleted file mode 100644 index 2e9ec5d29a..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_christian-schley/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Christian Schley - ----- - -Link: https://www.lareus.media diff --git a/content/3_community/1_contributors/2_contributors/0_daniel-kratz/contributor.txt b/content/3_community/1_contributors/2_contributors/0_daniel-kratz/contributor.txt deleted file mode 100644 index e09d944b2d..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_daniel-kratz/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Daniel Kratz - ----- - -Link: https://danielkratz.com diff --git a/content/3_community/1_contributors/2_contributors/0_daniel-kratz/daniel-kratz.jpg b/content/3_community/1_contributors/2_contributors/0_daniel-kratz/daniel-kratz.jpg deleted file mode 100644 index eec9f0d5cb..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_daniel-kratz/daniel-kratz.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_david-somers/contributor.txt b/content/3_community/1_contributors/2_contributors/0_david-somers/contributor.txt deleted file mode 100644 index cdd846d09d..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_david-somers/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: David Somers - ----- - -Link: https://omz13.com diff --git a/content/3_community/1_contributors/2_contributors/0_david-somers/david-somers.jpg b/content/3_community/1_contributors/2_contributors/0_david-somers/david-somers.jpg deleted file mode 100644 index ae374b7d85..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_david-somers/david-somers.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_edward-lecock/contributor.txt b/content/3_community/1_contributors/2_contributors/0_edward-lecock/contributor.txt deleted file mode 100644 index b5bf2d21da..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_edward-lecock/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Edward Lecock - ----- - -Link: https://github.com/EdwardLecock/ diff --git a/content/3_community/1_contributors/2_contributors/0_edward-lecock/edward-lecock.png b/content/3_community/1_contributors/2_contributors/0_edward-lecock/edward-lecock.png deleted file mode 100644 index 5468be9656..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_edward-lecock/edward-lecock.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_eighth-day/contributor.txt b/content/3_community/1_contributors/2_contributors/0_eighth-day/contributor.txt deleted file mode 100644 index 08c0490ef8..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_eighth-day/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Eighth Day - ----- - -Link: https://eighthday.co.uk diff --git a/content/3_community/1_contributors/2_contributors/0_eighth-day/eighth-day.png b/content/3_community/1_contributors/2_contributors/0_eighth-day/eighth-day.png deleted file mode 100644 index 540f74cfbb..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_eighth-day/eighth-day.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_error-undefined/contributor.txt b/content/3_community/1_contributors/2_contributors/0_error-undefined/contributor.txt deleted file mode 100644 index 34622af378..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_error-undefined/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: error:undefined design - ----- - -Link: https://error-undefined.de diff --git a/content/3_community/1_contributors/2_contributors/0_error-undefined/error-undefined.png b/content/3_community/1_contributors/2_contributors/0_error-undefined/error-undefined.png deleted file mode 100644 index 2ecddec034..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_error-undefined/error-undefined.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_fabian-michael/contributor.txt b/content/3_community/1_contributors/2_contributors/0_fabian-michael/contributor.txt deleted file mode 100644 index 4213bfec11..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_fabian-michael/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Fabian Michael - ----- - -Link: https://fabianmichael.de diff --git a/content/3_community/1_contributors/2_contributors/0_fabian-michael/fabian.jpg b/content/3_community/1_contributors/2_contributors/0_fabian-michael/fabian.jpg deleted file mode 100644 index 4f71de0038..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_fabian-michael/fabian.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_fehmi-ozuseven/contributor.txt b/content/3_community/1_contributors/2_contributors/0_fehmi-ozuseven/contributor.txt deleted file mode 100644 index 675a719f21..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_fehmi-ozuseven/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Fehmi Özüseven - ----- - -Link: https://fehmi.ozuseven.com diff --git a/content/3_community/1_contributors/2_contributors/0_fehmi-ozuseven/fehmi-ozuseven.jpg b/content/3_community/1_contributors/2_contributors/0_fehmi-ozuseven/fehmi-ozuseven.jpg deleted file mode 100644 index cfe76fd64d..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_fehmi-ozuseven/fehmi-ozuseven.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_felix-de-montis/contributor.txt b/content/3_community/1_contributors/2_contributors/0_felix-de-montis/contributor.txt deleted file mode 100644 index 41fb9a8c76..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_felix-de-montis/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Felix De Montis - ----- - -Link: https://twitter.com/dervondenbergen diff --git a/content/3_community/1_contributors/2_contributors/0_felix-de-montis/felix-de-montis.jpg b/content/3_community/1_contributors/2_contributors/0_felix-de-montis/felix-de-montis.jpg deleted file mode 100644 index 5ce107b8cf..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_felix-de-montis/felix-de-montis.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_flo-kosiol/contributor.txt b/content/3_community/1_contributors/2_contributors/0_flo-kosiol/contributor.txt deleted file mode 100644 index a191290ddc..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_flo-kosiol/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Flo Kosiol - ----- - -Link: http://flokosiol.de diff --git a/content/3_community/1_contributors/2_contributors/0_flo-kosiol/flo-kosiol.jpg b/content/3_community/1_contributors/2_contributors/0_flo-kosiol/flo-kosiol.jpg deleted file mode 100644 index f646524192..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_flo-kosiol/flo-kosiol.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_florian-karsten/contributor.txt b/content/3_community/1_contributors/2_contributors/0_florian-karsten/contributor.txt deleted file mode 100644 index 05f566da0e..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_florian-karsten/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Florian Karsten - ----- - -Link: https://floriankarsten.com diff --git a/content/3_community/1_contributors/2_contributors/0_florian-karsten/florian-karsten.jpg b/content/3_community/1_contributors/2_contributors/0_florian-karsten/florian-karsten.jpg deleted file mode 100644 index 61949a3925..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_florian-karsten/florian-karsten.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_florian-kueker/contributor.txt b/content/3_community/1_contributors/2_contributors/0_florian-kueker/contributor.txt deleted file mode 100644 index 2788aadfa2..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_florian-kueker/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Florian Kueker - ----- - -Link: https://www.socialmusemedia.com diff --git a/content/3_community/1_contributors/2_contributors/0_florian-kueker/florian-kueker.jpg b/content/3_community/1_contributors/2_contributors/0_florian-kueker/florian-kueker.jpg deleted file mode 100644 index 06dda6474e..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_florian-kueker/florian-kueker.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_francesco-cavallieri/contributor.txt b/content/3_community/1_contributors/2_contributors/0_francesco-cavallieri/contributor.txt deleted file mode 100644 index b9bd61f5de..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_francesco-cavallieri/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Francesco Cavallieri - ----- - -Link: https://www.cavallieri.nl diff --git a/content/3_community/1_contributors/2_contributors/0_francesco-cavallieri/francesco-cavallieri.jpg b/content/3_community/1_contributors/2_contributors/0_francesco-cavallieri/francesco-cavallieri.jpg deleted file mode 100644 index 0792f572ce..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_francesco-cavallieri/francesco-cavallieri.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_frederik-rettberg/contributor.txt b/content/3_community/1_contributors/2_contributors/0_frederik-rettberg/contributor.txt deleted file mode 100644 index ff55a228ae..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_frederik-rettberg/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Frederik Rettberg - ----- - -Link: https://www.frettberg.de diff --git a/content/3_community/1_contributors/2_contributors/0_frederik-rettberg/frederik-rettberg.jpg b/content/3_community/1_contributors/2_contributors/0_frederik-rettberg/frederik-rettberg.jpg deleted file mode 100644 index b1131d69f3..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_frederik-rettberg/frederik-rettberg.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_georg-obermayr/contributor.txt b/content/3_community/1_contributors/2_contributors/0_georg-obermayr/contributor.txt deleted file mode 100644 index fc290b70c7..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_georg-obermayr/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Georg Obermayr - ----- - -Link: https://twitter.com/georgobermayr diff --git a/content/3_community/1_contributors/2_contributors/0_georg-obermayr/georg-obermayr.png b/content/3_community/1_contributors/2_contributors/0_georg-obermayr/georg-obermayr.png deleted file mode 100644 index f583addaf1..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_georg-obermayr/georg-obermayr.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_gilles-vauvarin/contributor.txt b/content/3_community/1_contributors/2_contributors/0_gilles-vauvarin/contributor.txt deleted file mode 100644 index aaa7716bc5..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_gilles-vauvarin/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Gilles Vauvarin - ----- - -Link: https://thewhale.cc diff --git a/content/3_community/1_contributors/2_contributors/0_gilles-vauvarin/gilles-vauvarin.jpg b/content/3_community/1_contributors/2_contributors/0_gilles-vauvarin/gilles-vauvarin.jpg deleted file mode 100644 index 1f523d8ecd..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_gilles-vauvarin/gilles-vauvarin.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_grand-public/contributor.txt b/content/3_community/1_contributors/2_contributors/0_grand-public/contributor.txt deleted file mode 100644 index bad7f05711..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_grand-public/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Grand Public - ----- - -Link: https://grandpublic.se diff --git a/content/3_community/1_contributors/2_contributors/0_grand-public/grand-public.png b/content/3_community/1_contributors/2_contributors/0_grand-public/grand-public.png deleted file mode 100644 index cb53d6267f..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_grand-public/grand-public.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_guido-ferreyra/contributor.txt b/content/3_community/1_contributors/2_contributors/0_guido-ferreyra/contributor.txt deleted file mode 100644 index fcefe5c727..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_guido-ferreyra/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Guido Ferreyra - ----- - -Link: http://tipografia.com.ar diff --git a/content/3_community/1_contributors/2_contributors/0_guido-ferreyra/guido-ferreyra.jpg b/content/3_community/1_contributors/2_contributors/0_guido-ferreyra/guido-ferreyra.jpg deleted file mode 100644 index fc00f14928..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_guido-ferreyra/guido-ferreyra.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_hanna-nils/contributor.txt b/content/3_community/1_contributors/2_contributors/0_hanna-nils/contributor.txt deleted file mode 100644 index 8310c856d6..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_hanna-nils/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: hana+nils · Büro für Gestaltung - ----- - -Link: https://hananils.de/ diff --git a/content/3_community/1_contributors/2_contributors/0_hanna-nils/hanna-nils.png b/content/3_community/1_contributors/2_contributors/0_hanna-nils/hanna-nils.png deleted file mode 100644 index b865968212..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_hanna-nils/hanna-nils.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_hector-romo/contributor.txt b/content/3_community/1_contributors/2_contributors/0_hector-romo/contributor.txt deleted file mode 100644 index 7ad64cbf10..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_hector-romo/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Hector Romo - ----- - -Link: https://www.hectorromo.com diff --git a/content/3_community/1_contributors/2_contributors/0_hector-romo/hector-romo.jpg b/content/3_community/1_contributors/2_contributors/0_hector-romo/hector-romo.jpg deleted file mode 100644 index f4ba5c7c6f..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_hector-romo/hector-romo.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_ignatius-nikulin/contributor.txt b/content/3_community/1_contributors/2_contributors/0_ignatius-nikulin/contributor.txt deleted file mode 100644 index 80ca478ce0..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_ignatius-nikulin/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Ignatius Nikulin - ----- - -Link: https://www.coneheadedcat.com/ diff --git a/content/3_community/1_contributors/2_contributors/0_ignatius-nikulin/ignatius-nikulin.jpg b/content/3_community/1_contributors/2_contributors/0_ignatius-nikulin/ignatius-nikulin.jpg deleted file mode 100644 index c531dce083..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_ignatius-nikulin/ignatius-nikulin.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_igor-couto/contributor.txt b/content/3_community/1_contributors/2_contributors/0_igor-couto/contributor.txt deleted file mode 100644 index 89adac9da9..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_igor-couto/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Igor Couto - ----- - -Link: https://cre8iv.click diff --git a/content/3_community/1_contributors/2_contributors/0_igor-couto/igor-couto.jpg b/content/3_community/1_contributors/2_contributors/0_igor-couto/igor-couto.jpg deleted file mode 100644 index 191d7b8606..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_igor-couto/igor-couto.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_jakob-ploens/contributor.txt b/content/3_community/1_contributors/2_contributors/0_jakob-ploens/contributor.txt deleted file mode 100644 index db87e4db39..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_jakob-ploens/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Jakob Plöns - ----- - -Link: http://jakobploens.com diff --git a/content/3_community/1_contributors/2_contributors/0_jakob-ploens/jakob-ploens.jpg b/content/3_community/1_contributors/2_contributors/0_jakob-ploens/jakob-ploens.jpg deleted file mode 100644 index 9bb7cc46d7..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_jakob-ploens/jakob-ploens.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_james-steel/contributor.txt b/content/3_community/1_contributors/2_contributors/0_james-steel/contributor.txt deleted file mode 100644 index 4706f68ec9..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_james-steel/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: James Steel - ----- - -Link: https://hashandsalt.com diff --git a/content/3_community/1_contributors/2_contributors/0_james-steel/james-steel.png b/content/3_community/1_contributors/2_contributors/0_james-steel/james-steel.png deleted file mode 100644 index 0e6c751d63..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_james-steel/james-steel.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_jan-peter-braun/contributor.txt b/content/3_community/1_contributors/2_contributors/0_jan-peter-braun/contributor.txt deleted file mode 100644 index d8f2331032..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_jan-peter-braun/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Jan-Peter Braun - ----- - -Link: http://jpbraun.de diff --git a/content/3_community/1_contributors/2_contributors/0_jan-peter-braun/jan-peter-braun.jpg b/content/3_community/1_contributors/2_contributors/0_jan-peter-braun/jan-peter-braun.jpg deleted file mode 100644 index 54673a285c..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_jan-peter-braun/jan-peter-braun.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_jason-taylor/contributor.txt b/content/3_community/1_contributors/2_contributors/0_jason-taylor/contributor.txt deleted file mode 100644 index e4e2ecd9f2..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_jason-taylor/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Jason Taylor - ----- - -Link: https://autonomybureau.com diff --git a/content/3_community/1_contributors/2_contributors/0_jason-taylor/jason-taylor.png b/content/3_community/1_contributors/2_contributors/0_jason-taylor/jason-taylor.png deleted file mode 100644 index d59f3ef10e..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_jason-taylor/jason-taylor.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_joern-roeder/contributor.txt b/content/3_community/1_contributors/2_contributors/0_joern-roeder/contributor.txt deleted file mode 100644 index 54769fdfd3..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_joern-roeder/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Jörn Röder - ----- - -Link: http://joernroeder.de diff --git a/content/3_community/1_contributors/2_contributors/0_joern-roeder/joern-roeder.jpg b/content/3_community/1_contributors/2_contributors/0_joern-roeder/joern-roeder.jpg deleted file mode 100644 index 068efd388a..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_joern-roeder/joern-roeder.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_joern-sieverneck/contributor.txt b/content/3_community/1_contributors/2_contributors/0_joern-sieverneck/contributor.txt deleted file mode 100644 index 311c52d403..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_joern-sieverneck/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Jörn Sieveneck - ----- - -Link: https://nero.is diff --git a/content/3_community/1_contributors/2_contributors/0_joern-sieverneck/joern-sieverneck.jpg b/content/3_community/1_contributors/2_contributors/0_joern-sieverneck/joern-sieverneck.jpg deleted file mode 100644 index cc96c1549a..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_joern-sieverneck/joern-sieverneck.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_johann-schopplich/contributor.txt b/content/3_community/1_contributors/2_contributors/0_johann-schopplich/contributor.txt deleted file mode 100644 index 7fdecf6ff9..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_johann-schopplich/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Johann Schopplich - ----- - -Link: https://jschopplich.com diff --git a/content/3_community/1_contributors/2_contributors/0_johann-schopplich/johann-schopplich.png b/content/3_community/1_contributors/2_contributors/0_johann-schopplich/johann-schopplich.png deleted file mode 100644 index 517d2def7b..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_johann-schopplich/johann-schopplich.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_jonas-doebertin/contributor.txt b/content/3_community/1_contributors/2_contributors/0_jonas-doebertin/contributor.txt deleted file mode 100644 index d4dfce8216..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_jonas-doebertin/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Jonas Döbertin - ----- - -Link: https://jd-powered.net/ diff --git a/content/3_community/1_contributors/2_contributors/0_jonas-doebertin/jonas-doebertin.jpg b/content/3_community/1_contributors/2_contributors/0_jonas-doebertin/jonas-doebertin.jpg deleted file mode 100644 index 7218663274..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_jonas-doebertin/jonas-doebertin.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_jonathan-baptistella/contributor.txt b/content/3_community/1_contributors/2_contributors/0_jonathan-baptistella/contributor.txt deleted file mode 100644 index 8fb9345259..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_jonathan-baptistella/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Jonathan Baptistella - ----- - -Link: https://www.baptistella.xyz/ diff --git a/content/3_community/1_contributors/2_contributors/0_jonathan-baptistella/jonathan-baptistella.jpg b/content/3_community/1_contributors/2_contributors/0_jonathan-baptistella/jonathan-baptistella.jpg deleted file mode 100644 index d9eb8cdad5..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_jonathan-baptistella/jonathan-baptistella.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_jonathan-hess/contributor.txt b/content/3_community/1_contributors/2_contributors/0_jonathan-hess/contributor.txt deleted file mode 100644 index af64e0b658..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_jonathan-hess/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Jonathan Hess - ----- - -Link: https://movingwater.ch diff --git a/content/3_community/1_contributors/2_contributors/0_jonathan-hess/jonathan-hess.jpg b/content/3_community/1_contributors/2_contributors/0_jonathan-hess/jonathan-hess.jpg deleted file mode 100644 index dd5d03b487..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_jonathan-hess/jonathan-hess.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_jonathan-reisdorf/contributor.txt b/content/3_community/1_contributors/2_contributors/0_jonathan-reisdorf/contributor.txt deleted file mode 100644 index 70811f3f22..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_jonathan-reisdorf/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Jonathan Reisdorf - ----- - -Link: https://www.linkedin.com/in/jreisdorf/ diff --git a/content/3_community/1_contributors/2_contributors/0_jonathan-reisdorf/jonathan-reisdorf.jpg b/content/3_community/1_contributors/2_contributors/0_jonathan-reisdorf/jonathan-reisdorf.jpg deleted file mode 100644 index 6efe7e17b3..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_jonathan-reisdorf/jonathan-reisdorf.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_joro-yordanov/contributor.txt b/content/3_community/1_contributors/2_contributors/0_joro-yordanov/contributor.txt deleted file mode 100644 index c8e264933b..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_joro-yordanov/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Joro Yordanov - ----- - -Link: https://yordanoff.net diff --git a/content/3_community/1_contributors/2_contributors/0_joro-yordanov/joro-yordanov.jpg b/content/3_community/1_contributors/2_contributors/0_joro-yordanov/joro-yordanov.jpg deleted file mode 100644 index 2ede6376ef..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_joro-yordanov/joro-yordanov.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_josh-heyer/contributor.txt b/content/3_community/1_contributors/2_contributors/0_josh-heyer/contributor.txt deleted file mode 100644 index fb20f71ae1..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_josh-heyer/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Josh Heyer - ----- - -Link: https://hyr.design diff --git a/content/3_community/1_contributors/2_contributors/0_josh-heyer/josh-heyer.jpg b/content/3_community/1_contributors/2_contributors/0_josh-heyer/josh-heyer.jpg deleted file mode 100644 index 31707365c4..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_josh-heyer/josh-heyer.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_lonely-alien/contributor.txt b/content/3_community/1_contributors/2_contributors/0_lonely-alien/contributor.txt deleted file mode 100644 index 5945044f11..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_lonely-alien/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Lonely Alien - ----- - -Link: https://lonelyalien.com/ diff --git a/content/3_community/1_contributors/2_contributors/0_lonely-alien/lonely-alien.png b/content/3_community/1_contributors/2_contributors/0_lonely-alien/lonely-alien.png deleted file mode 100644 index e42964621d..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_lonely-alien/lonely-alien.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_louis-d-walch/contributor.txt b/content/3_community/1_contributors/2_contributors/0_louis-d-walch/contributor.txt deleted file mode 100644 index a43f7e6d71..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_louis-d-walch/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Louis D Walch - ----- - -Link: http://www.hellolouis.com diff --git a/content/3_community/1_contributors/2_contributors/0_louis-d-walch/louis-d-walch.png b/content/3_community/1_contributors/2_contributors/0_louis-d-walch/louis-d-walch.png deleted file mode 100644 index b8b6c2a4ee..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_louis-d-walch/louis-d-walch.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_lukas-kleinschmidt/contributor.txt b/content/3_community/1_contributors/2_contributors/0_lukas-kleinschmidt/contributor.txt deleted file mode 100644 index 177b3506fe..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_lukas-kleinschmidt/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Lukas Kleinschmidt - ----- - -Link: https://github.com/lukaskleinschmidt diff --git a/content/3_community/1_contributors/2_contributors/0_lukas-kleinschmidt/lukas-kleinschmidt.png b/content/3_community/1_contributors/2_contributors/0_lukas-kleinschmidt/lukas-kleinschmidt.png deleted file mode 100644 index eab5fc8936..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_lukas-kleinschmidt/lukas-kleinschmidt.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_manu-moreale/contributor.txt b/content/3_community/1_contributors/2_contributors/0_manu-moreale/contributor.txt deleted file mode 100644 index e3c3f021d1..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_manu-moreale/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Manu Moreale - ----- - -Link: https://manuelmoreale.com diff --git a/content/3_community/1_contributors/2_contributors/0_manu-moreale/manu-moreale.jpg b/content/3_community/1_contributors/2_contributors/0_manu-moreale/manu-moreale.jpg deleted file mode 100644 index 691f1ffaa5..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_manu-moreale/manu-moreale.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_marc-thiele/contributor.txt b/content/3_community/1_contributors/2_contributors/0_marc-thiele/contributor.txt deleted file mode 100644 index b722821236..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_marc-thiele/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Marc Thiele - ----- - -Link: https://marcthiele.com diff --git a/content/3_community/1_contributors/2_contributors/0_marc-thiele/marc-thiele.jpg b/content/3_community/1_contributors/2_contributors/0_marc-thiele/marc-thiele.jpg deleted file mode 100644 index 7f4a9cbcab..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_marc-thiele/marc-thiele.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_marco-land/contributor.txt b/content/3_community/1_contributors/2_contributors/0_marco-land/contributor.txt deleted file mode 100644 index 6538b446c4..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_marco-land/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Marco Land - ----- - -Link: https://marco.land diff --git a/content/3_community/1_contributors/2_contributors/0_marco-land/marco-land.jpg b/content/3_community/1_contributors/2_contributors/0_marco-land/marco-land.jpg deleted file mode 100644 index d8dfc1a464..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_marco-land/marco-land.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_marco-mezzavilla/contributor.txt b/content/3_community/1_contributors/2_contributors/0_marco-mezzavilla/contributor.txt deleted file mode 100644 index f64c214aff..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_marco-mezzavilla/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Marco Mezzavilla - ----- - -Link: http://marcomezzavilla.com/ diff --git a/content/3_community/1_contributors/2_contributors/0_marco-mezzavilla/marco-mezzavilla.jpg b/content/3_community/1_contributors/2_contributors/0_marco-mezzavilla/marco-mezzavilla.jpg deleted file mode 100644 index 3c43b911f3..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_marco-mezzavilla/marco-mezzavilla.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_mario-keipert/contributor.txt b/content/3_community/1_contributors/2_contributors/0_mario-keipert/contributor.txt deleted file mode 100644 index 3ade262d56..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_mario-keipert/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Mario Keipert - ----- - -Link: https://twitter.com/mkeipert diff --git a/content/3_community/1_contributors/2_contributors/0_mario-keipert/mario-keipert.jpg b/content/3_community/1_contributors/2_contributors/0_mario-keipert/mario-keipert.jpg deleted file mode 100644 index c51424231d..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_mario-keipert/mario-keipert.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_matthias-huebner/contributor.txt b/content/3_community/1_contributors/2_contributors/0_matthias-huebner/contributor.txt deleted file mode 100644 index c03fe02995..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_matthias-huebner/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Matthias Hübner - ----- - -Link: https://www.possible.is diff --git a/content/3_community/1_contributors/2_contributors/0_matthias-huebner/matthias-huebner.jpg b/content/3_community/1_contributors/2_contributors/0_matthias-huebner/matthias-huebner.jpg deleted file mode 100644 index 9b6a4694d6..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_matthias-huebner/matthias-huebner.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_modufolio/contributor.txt b/content/3_community/1_contributors/2_contributors/0_modufolio/contributor.txt deleted file mode 100644 index be2e825c77..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_modufolio/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Modufolio - ----- - -Link: https://www.modufolio.com/ diff --git a/content/3_community/1_contributors/2_contributors/0_modufolio/modufolio.png b/content/3_community/1_contributors/2_contributors/0_modufolio/modufolio.png deleted file mode 100644 index 23080d5f6b..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_modufolio/modufolio.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_norman-posselt/contributor.txt b/content/3_community/1_contributors/2_contributors/0_norman-posselt/contributor.txt deleted file mode 100644 index 36a3f01b5e..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_norman-posselt/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Norman Posselt - ----- - -Link: http://www.normanposselt.com diff --git a/content/3_community/1_contributors/2_contributors/0_norman-posselt/norman-posselt.jpg b/content/3_community/1_contributors/2_contributors/0_norman-posselt/norman-posselt.jpg deleted file mode 100644 index 6dfc89a2e9..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_norman-posselt/norman-posselt.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_ola-christensson/contributor.txt b/content/3_community/1_contributors/2_contributors/0_ola-christensson/contributor.txt deleted file mode 100644 index 3293e38e9a..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_ola-christensson/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Ola Christensson - ----- - -Link: https://olachristensson.se diff --git a/content/3_community/1_contributors/2_contributors/0_ola-christensson/ola-christensson.jpg b/content/3_community/1_contributors/2_contributors/0_ola-christensson/ola-christensson.jpg deleted file mode 100644 index 598cabc2e7..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_ola-christensson/ola-christensson.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_ole-martin-bratteng/contributor.txt b/content/3_community/1_contributors/2_contributors/0_ole-martin-bratteng/contributor.txt deleted file mode 100644 index 9bcf94c225..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_ole-martin-bratteng/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Ole-Martin Bratteng - ----- - -Link: https://bratteng.solutions diff --git a/content/3_community/1_contributors/2_contributors/0_ole-martin-bratteng/ole-martin-bratteng.jpg b/content/3_community/1_contributors/2_contributors/0_ole-martin-bratteng/ole-martin-bratteng.jpg deleted file mode 100644 index d1335bc641..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_ole-martin-bratteng/ole-martin-bratteng.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_oliver-t-edwards/contributor.txt b/content/3_community/1_contributors/2_contributors/0_oliver-t-edwards/contributor.txt deleted file mode 100644 index c23182b027..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_oliver-t-edwards/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Oliver T. Edwards - ----- - -Link: https://ollyver.com diff --git a/content/3_community/1_contributors/2_contributors/0_oliver-t-edwards/oliver-t-edwards.jpg b/content/3_community/1_contributors/2_contributors/0_oliver-t-edwards/oliver-t-edwards.jpg deleted file mode 100644 index 4fc4b93849..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_oliver-t-edwards/oliver-t-edwards.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_patrick-roelofs/contributor.txt b/content/3_community/1_contributors/2_contributors/0_patrick-roelofs/contributor.txt deleted file mode 100644 index 5430e354dd..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_patrick-roelofs/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Patrick Roelofs - ----- - -Link: https://patrickroelofs.com diff --git a/content/3_community/1_contributors/2_contributors/0_patrick-roelofs/patrick-roelofs.png b/content/3_community/1_contributors/2_contributors/0_patrick-roelofs/patrick-roelofs.png deleted file mode 100644 index 2dd1a7c27f..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_patrick-roelofs/patrick-roelofs.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_paul-robert-llyod/contributor.txt b/content/3_community/1_contributors/2_contributors/0_paul-robert-llyod/contributor.txt deleted file mode 100644 index 093f3905d0..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_paul-robert-llyod/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Paul Robert Lloyd - ----- - -Link: https://paulrobertlloyd.com diff --git a/content/3_community/1_contributors/2_contributors/0_paul-robert-llyod/paul-robert-lloyd.jpg b/content/3_community/1_contributors/2_contributors/0_paul-robert-llyod/paul-robert-lloyd.jpg deleted file mode 100644 index 053a6eb615..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_paul-robert-llyod/paul-robert-lloyd.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_pedro-borges/contributor.txt b/content/3_community/1_contributors/2_contributors/0_pedro-borges/contributor.txt deleted file mode 100644 index bde5d61e5d..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_pedro-borges/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Pedro Borges - ----- - -Link: https://pedroborg.es diff --git a/content/3_community/1_contributors/2_contributors/0_pedro-borges/pedro-borges.jpg b/content/3_community/1_contributors/2_contributors/0_pedro-borges/pedro-borges.jpg deleted file mode 100644 index 1da911bfd6..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_pedro-borges/pedro-borges.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_philip-marnef/contributor.txt b/content/3_community/1_contributors/2_contributors/0_philip-marnef/contributor.txt deleted file mode 100644 index 334f2617c6..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_philip-marnef/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Philip Marnef - ----- - -Link: https://bureaumarnef.be diff --git a/content/3_community/1_contributors/2_contributors/0_philip-marnef/philip-marnef.png b/content/3_community/1_contributors/2_contributors/0_philip-marnef/philip-marnef.png deleted file mode 100644 index 5423c7dea6..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_philip-marnef/philip-marnef.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_philippe-gervaise/contributor.txt b/content/3_community/1_contributors/2_contributors/0_philippe-gervaise/contributor.txt deleted file mode 100644 index ea94c9301c..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_philippe-gervaise/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Philippe Gervaise - ----- - -Link: http://malvese.com diff --git a/content/3_community/1_contributors/2_contributors/0_philippe-gervaise/philippe-gervaise.png b/content/3_community/1_contributors/2_contributors/0_philippe-gervaise/philippe-gervaise.png deleted file mode 100644 index bc78f8b09a..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_philippe-gervaise/philippe-gervaise.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_project-a/contributor.txt b/content/3_community/1_contributors/2_contributors/0_project-a/contributor.txt deleted file mode 100644 index 89ade8057e..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_project-a/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Project A - ----- - -Link: https://www.project-a.com diff --git a/content/3_community/1_contributors/2_contributors/0_project-a/project-a.png b/content/3_community/1_contributors/2_contributors/0_project-a/project-a.png deleted file mode 100644 index 6a9f692934..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_project-a/project-a.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_ralf-goeke/contributor.txt b/content/3_community/1_contributors/2_contributors/0_ralf-goeke/contributor.txt deleted file mode 100644 index f7fd1c7020..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_ralf-goeke/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Ralf Göke - ----- - -Link: https://twitter.com/netzintelligenz diff --git a/content/3_community/1_contributors/2_contributors/0_ralf-goeke/ralf-goeke.jpg b/content/3_community/1_contributors/2_contributors/0_ralf-goeke/ralf-goeke.jpg deleted file mode 100644 index 2d360054fe..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_ralf-goeke/ralf-goeke.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_raphael-durrer/contributor.txt b/content/3_community/1_contributors/2_contributors/0_raphael-durrer/contributor.txt deleted file mode 100644 index a4049a1ccc..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_raphael-durrer/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Raphael Durrer - ----- - -Link: https://www.docono.io diff --git a/content/3_community/1_contributors/2_contributors/0_raphael-durrer/raphael-durrer.jpg b/content/3_community/1_contributors/2_contributors/0_raphael-durrer/raphael-durrer.jpg deleted file mode 100644 index 709678d8ed..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_raphael-durrer/raphael-durrer.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_rene-zschoch/contributor.txt b/content/3_community/1_contributors/2_contributors/0_rene-zschoch/contributor.txt deleted file mode 100644 index 09c0621f9b..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_rene-zschoch/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: René Zschoch - ----- - -Link: https://twitter.com/renezschoch diff --git a/content/3_community/1_contributors/2_contributors/0_rene-zschoch/rene-zschoch.jpg b/content/3_community/1_contributors/2_contributors/0_rene-zschoch/rene-zschoch.jpg deleted file mode 100644 index fce4ed67ae..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_rene-zschoch/rene-zschoch.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_renzo/contributor.txt b/content/3_community/1_contributors/2_contributors/0_renzo/contributor.txt deleted file mode 100644 index 1bcf748f79..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_renzo/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: renzo - ----- - -Link: https://www.docono.io diff --git a/content/3_community/1_contributors/2_contributors/0_renzo/renzo.jpg b/content/3_community/1_contributors/2_contributors/0_renzo/renzo.jpg deleted file mode 100644 index 5c00713e2c..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_renzo/renzo.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_richard-emanuel-hopp/contributor.txt b/content/3_community/1_contributors/2_contributors/0_richard-emanuel-hopp/contributor.txt deleted file mode 100644 index a6515e945d..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_richard-emanuel-hopp/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Richard Emanuel Hopp - ----- - -Link: https://reh.vision diff --git a/content/3_community/1_contributors/2_contributors/0_richard-emanuel-hopp/reh.png b/content/3_community/1_contributors/2_contributors/0_richard-emanuel-hopp/reh.png deleted file mode 100644 index a4559a84a6..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_richard-emanuel-hopp/reh.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_roberfreelance/contributor.txt b/content/3_community/1_contributors/2_contributors/0_roberfreelance/contributor.txt deleted file mode 100644 index 03ba2fe2de..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_roberfreelance/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Roberfreelance - ----- - -Link: https://roberfreelance.com diff --git a/content/3_community/1_contributors/2_contributors/0_roberfreelance/roberfreelance.png b/content/3_community/1_contributors/2_contributors/0_roberfreelance/roberfreelance.png deleted file mode 100644 index c6be9a63b0..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_roberfreelance/roberfreelance.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_robin-scholz/contributor.txt b/content/3_community/1_contributors/2_contributors/0_robin-scholz/contributor.txt deleted file mode 100644 index 6dade6b5e0..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_robin-scholz/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Robin Scholz - ----- - -Link: http://studioscholz.info diff --git a/content/3_community/1_contributors/2_contributors/0_robin-scholz/robin-scholz.jpg b/content/3_community/1_contributors/2_contributors/0_robin-scholz/robin-scholz.jpg deleted file mode 100644 index a60f021e93..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_robin-scholz/robin-scholz.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_sam-nabi/contributor.txt b/content/3_community/1_contributors/2_contributors/0_sam-nabi/contributor.txt deleted file mode 100644 index 8fd971191e..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_sam-nabi/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Sam Nabi - ----- - -Link: https://samnabi.com diff --git a/content/3_community/1_contributors/2_contributors/0_sam-nabi/sam-nabi.jpg b/content/3_community/1_contributors/2_contributors/0_sam-nabi/sam-nabi.jpg deleted file mode 100644 index a7d1ec4017..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_sam-nabi/sam-nabi.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_sander/contributor.txt b/content/3_community/1_contributors/2_contributors/0_sander/contributor.txt deleted file mode 100644 index 3fdc4813e0..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_sander/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Sander - ----- - -Link: http://sanderdlm.be diff --git a/content/3_community/1_contributors/2_contributors/0_sander/sander.jpg b/content/3_community/1_contributors/2_contributors/0_sander/sander.jpg deleted file mode 100644 index 19e271d06e..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_sander/sander.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_sascha-lack/contributor.txt b/content/3_community/1_contributors/2_contributors/0_sascha-lack/contributor.txt deleted file mode 100644 index 2365fa177b..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_sascha-lack/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Sascha Lack - ----- - -Link: https://slstudio.de diff --git a/content/3_community/1_contributors/2_contributors/0_sascha-lack/sascha-lack.jpg b/content/3_community/1_contributors/2_contributors/0_sascha-lack/sascha-lack.jpg deleted file mode 100644 index 4e243db841..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_sascha-lack/sascha-lack.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_sebastien-couragier/contributor.txt b/content/3_community/1_contributors/2_contributors/0_sebastien-couragier/contributor.txt deleted file mode 100644 index 53e18474f2..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_sebastien-couragier/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Sébastien Couragier - ----- - -Link: https://www.celinedesign.com diff --git a/content/3_community/1_contributors/2_contributors/0_sebastien-couragier/sebastien-couragier.jpg b/content/3_community/1_contributors/2_contributors/0_sebastien-couragier/sebastien-couragier.jpg deleted file mode 100644 index d0c8bac66f..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_sebastien-couragier/sebastien-couragier.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_sylvain-jule/contributor.txt b/content/3_community/1_contributors/2_contributors/0_sylvain-jule/contributor.txt deleted file mode 100644 index 0f846df9b5..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_sylvain-jule/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Sylvain Julé - ----- - -Link: https://sylvain-jule.fr diff --git a/content/3_community/1_contributors/2_contributors/0_sylvain-jule/sylvain-jule.jpg b/content/3_community/1_contributors/2_contributors/0_sylvain-jule/sylvain-jule.jpg deleted file mode 100644 index 3f905314f4..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_sylvain-jule/sylvain-jule.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_teunis/contributor.txt b/content/3_community/1_contributors/2_contributors/0_teunis/contributor.txt deleted file mode 100644 index ac4c8c1540..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_teunis/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Jan @ Teunis.be - ----- - -Link: https://www.Teunis.be/ diff --git a/content/3_community/1_contributors/2_contributors/0_teunis/teunis.png b/content/3_community/1_contributors/2_contributors/0_teunis/teunis.png deleted file mode 100644 index 883bacf148..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_teunis/teunis.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_the-streamable/contributor.txt b/content/3_community/1_contributors/2_contributors/0_the-streamable/contributor.txt deleted file mode 100644 index aae35e8e6f..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_the-streamable/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: The Streamable - ----- - -Link: https://thestreamable.com diff --git a/content/3_community/1_contributors/2_contributors/0_the-streamable/the-streamable.png b/content/3_community/1_contributors/2_contributors/0_the-streamable/the-streamable.png deleted file mode 100644 index 1d8431a3b3..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_the-streamable/the-streamable.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_thomas-guenther/contributor.txt b/content/3_community/1_contributors/2_contributors/0_thomas-guenther/contributor.txt deleted file mode 100644 index 411716a0ad..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_thomas-guenther/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Thomas Günther - ----- - -Link: https://www.medienbaecker.com/ diff --git a/content/3_community/1_contributors/2_contributors/0_thomas-guenther/thomas-guenther.jpg b/content/3_community/1_contributors/2_contributors/0_thomas-guenther/thomas-guenther.jpg deleted file mode 100644 index dadc434851..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_thomas-guenther/thomas-guenther.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_thomas-stana/contributor.txt b/content/3_community/1_contributors/2_contributors/0_thomas-stana/contributor.txt deleted file mode 100644 index d69fb47b15..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_thomas-stana/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Tomas Stana - ----- - -Link: https://twitter.com/tomasstana diff --git a/content/3_community/1_contributors/2_contributors/0_thomas-stana/thomas-stana.jpg b/content/3_community/1_contributors/2_contributors/0_thomas-stana/thomas-stana.jpg deleted file mode 100644 index 7c7ed0553c..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_thomas-stana/thomas-stana.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_tim-oetting/contributor.txt b/content/3_community/1_contributors/2_contributors/0_tim-oetting/contributor.txt deleted file mode 100644 index ed22fd5e01..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_tim-oetting/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Tim Ötting - ----- - -Link: https://twitter.com/TimOetting diff --git a/content/3_community/1_contributors/2_contributors/0_tim-oetting/tim-oetting.jpg b/content/3_community/1_contributors/2_contributors/0_tim-oetting/tim-oetting.jpg deleted file mode 100644 index deb91da804..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_tim-oetting/tim-oetting.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_timo-schneider/contributor.txt b/content/3_community/1_contributors/2_contributors/0_timo-schneider/contributor.txt deleted file mode 100644 index 24b98b498c..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_timo-schneider/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Timo Schneider - ----- - -Link: https://kleiner-als.de diff --git a/content/3_community/1_contributors/2_contributors/0_timo-schneider/timo-schneider.jpg b/content/3_community/1_contributors/2_contributors/0_timo-schneider/timo-schneider.jpg deleted file mode 100644 index c14b12609a..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_timo-schneider/timo-schneider.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_toast-communication-lab/contributor.txt b/content/3_community/1_contributors/2_contributors/0_toast-communication-lab/contributor.txt deleted file mode 100644 index 2856034969..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_toast-communication-lab/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Toast Communication Lab - ----- - -Link: https://toastlab.ch diff --git a/content/3_community/1_contributors/2_contributors/0_toast-communication-lab/toast.png b/content/3_community/1_contributors/2_contributors/0_toast-communication-lab/toast.png deleted file mode 100644 index 138eef9820..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_toast-communication-lab/toast.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_tobias-wolf/contributor.txt b/content/3_community/1_contributors/2_contributors/0_tobias-wolf/contributor.txt deleted file mode 100644 index ee76d4ab46..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_tobias-wolf/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Tobias Wolf - ----- - -Link: https://tobiaswolf.me diff --git a/content/3_community/1_contributors/2_contributors/0_tobias-wolf/tobias-wolf.jpg b/content/3_community/1_contributors/2_contributors/0_tobias-wolf/tobias-wolf.jpg deleted file mode 100644 index 41dd3d87ea..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_tobias-wolf/tobias-wolf.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_tristan-bagot/contributor.txt b/content/3_community/1_contributors/2_contributors/0_tristan-bagot/contributor.txt deleted file mode 100644 index 0e70958596..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_tristan-bagot/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Tristan Bagot - ----- - -Link: https://www.tristanbagot.com diff --git a/content/3_community/1_contributors/2_contributors/0_tristan-bagot/tristan-bagot.jpg b/content/3_community/1_contributors/2_contributors/0_tristan-bagot/tristan-bagot.jpg deleted file mode 100644 index 217ab585e7..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_tristan-bagot/tristan-bagot.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_urumqi/contributor.txt b/content/3_community/1_contributors/2_contributors/0_urumqi/contributor.txt deleted file mode 100644 index ab2abd0d8e..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_urumqi/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Ürümqi - ----- - -Link: https://urumqi.fr diff --git a/content/3_community/1_contributors/2_contributors/0_urumqi/urumqi.png b/content/3_community/1_contributors/2_contributors/0_urumqi/urumqi.png deleted file mode 100644 index b364fe33c1..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_urumqi/urumqi.png and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/0_wietse-neven/contributor.txt b/content/3_community/1_contributors/2_contributors/0_wietse-neven/contributor.txt deleted file mode 100644 index ea387ebbbf..0000000000 --- a/content/3_community/1_contributors/2_contributors/0_wietse-neven/contributor.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Wietse Neven - ----- - -Link: https://wietseneven.com diff --git a/content/3_community/1_contributors/2_contributors/0_wietse-neven/wietse-neven.jpg b/content/3_community/1_contributors/2_contributors/0_wietse-neven/wietse-neven.jpg deleted file mode 100644 index 81406d41f2..0000000000 Binary files a/content/3_community/1_contributors/2_contributors/0_wietse-neven/wietse-neven.jpg and /dev/null differ diff --git a/content/3_community/1_contributors/2_contributors/link.txt b/content/3_community/1_contributors/2_contributors/link.txt deleted file mode 100644 index 327406fa78..0000000000 --- a/content/3_community/1_contributors/2_contributors/link.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Contributors - ----- - -Intro: Kirby is well-known and loved for its friendly community. We keep tight contact with our customers to constantly improve our product and everything around it. - ----- - -Link: community/#contributors diff --git a/content/3_community/1_contributors/contributors.txt b/content/3_community/1_contributors/contributors.txt deleted file mode 100644 index 1d08584ad9..0000000000 --- a/content/3_community/1_contributors/contributors.txt +++ /dev/null @@ -1,17 +0,0 @@ -Title: Contributors - ----- - -Description: Get to know the team behind Kirby and the awesome community, that has formed around our product. - ----- - -Priority: 0.8 - ----- - -Intro: - -Kirby is well-known and loved for its friendly community. We keep tight contact with our customers and contributors to constantly improve our product and everything around it. - -Become a part of the community and join our forum. Find help, post your latest Kirby sites and just hang out with us. diff --git a/content/3_community/2_forum/link.txt b/content/3_community/2_forum/link.txt deleted file mode 100644 index c93c8b72be..0000000000 --- a/content/3_community/2_forum/link.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Support forum - ----- - -Intro: Our forum is the best place to meet the community, our core team and contributors. Find help, post your latest Kirby sites and just hang out with us. - ----- - -Link: https://forum.getkirby.com diff --git a/content/3_community/3_feedback/link.txt b/content/3_community/3_feedback/link.txt deleted file mode 100644 index 7e9799e285..0000000000 --- a/content/3_community/3_feedback/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Feature requests - ----- - -Link: https://feedback.getkirby.com diff --git a/content/3_community/4_discord/link.txt b/content/3_community/4_discord/link.txt deleted file mode 100644 index 6d1dafae45..0000000000 --- a/content/3_community/4_discord/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Discord chat - ----- - -Link: https://chat.getkirby.com diff --git a/content/3_community/5_youtube/link.txt b/content/3_community/5_youtube/link.txt deleted file mode 100644 index ddd0065342..0000000000 --- a/content/3_community/5_youtube/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Youtube channel - ----- - -Link: https://youtube.com/kirbycasts diff --git a/content/3_community/6_twitter/link.txt b/content/3_community/6_twitter/link.txt deleted file mode 100644 index 07638d8a81..0000000000 --- a/content/3_community/6_twitter/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Twitter - ----- - -Link: https://twitter.com/getkirby diff --git a/content/3_community/7_instagram/link.txt b/content/3_community/7_instagram/link.txt deleted file mode 100644 index cd2d51f0ed..0000000000 --- a/content/3_community/7_instagram/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Instagram - ----- - -Link: https://instagram.com/getkirby diff --git a/content/3_community/link.txt b/content/3_community/link.txt deleted file mode 100644 index 59613ee610..0000000000 --- a/content/3_community/link.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Community - ----- - -Submenu: true - ----- - -Link: community/contributors diff --git a/content/buy/answers/1_try/answer.txt b/content/buy/answers/1_try/answer.txt new file mode 100644 index 0000000000..96b68cdfee --- /dev/null +++ b/content/buy/answers/1_try/answer.txt @@ -0,0 +1,5 @@ +Title: Can I try it first? +---- +Text: + +Yes. It's important for us that you are confident with your choice before you purchase a license. There are (link: /try text: two ways to try Kirby): Explore our **online demo**, created instantly for you. Or **install Kirby locally or on a test server** and take it for a ride. Once your project is ready, buy a license and you're set for launch. diff --git a/content/buy/answers/1_domain-project/answer.txt b/content/buy/answers/2_multiple-domains/answer.txt similarity index 100% rename from content/buy/answers/1_domain-project/answer.txt rename to content/buy/answers/2_multiple-domains/answer.txt diff --git a/content/buy/answers/2_updates/answer.txt b/content/buy/answers/2_updates/answer.txt deleted file mode 100644 index 757ae3b8bc..0000000000 --- a/content/buy/answers/2_updates/answer.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Will updates be free? ----- -Text: - -Minor updates of Kirby (e.g. 3.1 to 3.2) will be free. Users with an older license will get a discount for major upgrades (e.g. 3.x to 4.0). diff --git a/content/buy/answers/3_students/answer.txt b/content/buy/answers/3_students/answer.txt deleted file mode 100644 index f55f1dfee2..0000000000 --- a/content/buy/answers/3_students/answer.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Do you offer student discounts? ----- -Text: - -Yes, students, educational projects, open-source projects or non-profit organizations can apply for a discount. Please (email: support@getkirby.com text: contact us) to apply. diff --git a/content/buy/answers/3_updates/answer.txt b/content/buy/answers/3_updates/answer.txt new file mode 100644 index 0000000000..4c2aa85c8e --- /dev/null +++ b/content/buy/answers/3_updates/answer.txt @@ -0,0 +1,7 @@ +Title: What about updates? +---- +Text: + +Minor updates of Kirby (e.g. 3.1 to 3.2) will be free. Users with an older license will get a discount for major upgrades (e.g. 3.x to 4.0). + +If you are still on v2, we offer attractive prices for all owners of a Kirby 2 license to upgrade to v3. (link: https://licenses.getkirby.com text: Upgrade your v2 license now). \ No newline at end of file diff --git a/content/buy/answers/3_upgrade/answer.txt b/content/buy/answers/3_upgrade/answer.txt deleted file mode 100644 index 10b08d17ad..0000000000 --- a/content/buy/answers/3_upgrade/answer.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Can I upgrade my v2 license? ----- -Text: - -Yes, we offer attractive upgrade prices for all owners of a Kirby 2 license. (link: https://licenses.getkirby.com text: Upgrade your v2 license now). \ No newline at end of file diff --git a/content/buy/answers/4_payment/answer.txt b/content/buy/answers/4_payment/answer.txt index e2085e5b8f..53a8212d95 100644 --- a/content/buy/answers/4_payment/answer.txt +++ b/content/buy/answers/4_payment/answer.txt @@ -2,4 +2,4 @@ Title: How can I pay for a license? ---- Text: -(link: https://paddle.com text: Paddle) currently supports all major credit cards, Paypal, Apple Pay and Purchase Order. +(link: https://paddle.com text: Paddle) currently supports all major credit cards, PayPal, Apple Pay and Purchase Order. diff --git a/content/buy/answers/6_invoice/answer.txt b/content/buy/answers/6_invoice/answer.txt index f76b198ecd..5ac5c198c6 100644 --- a/content/buy/answers/6_invoice/answer.txt +++ b/content/buy/answers/6_invoice/answer.txt @@ -4,4 +4,4 @@ Text: All sales are handled by (link: https://paddle.com/ text: Paddle). You will get an invoice from them. They are specialized in managing purchases including tax collection and invoicing for each country. You can customize your invoice yourself to fit your requirements. -If you got questions or complaints about invoices, please let us know at . \ No newline at end of file +If you have questions or complaints about invoices, please let us know at . diff --git a/content/buy/buy.txt b/content/buy/buy.txt index f699dcd81d..625ebaa56d 100644 --- a/content/buy/buy.txt +++ b/content/buy/buy.txt @@ -1,4 +1,4 @@ -Title: Pricing +Title: Buy ---- @@ -6,13 +6,9 @@ Description: Buy a Kirby license and get answers to common questions about buyin ---- -MenuTitle: Buy - ----- - -Intro: - -Kirby combines the transparency of an open-source project with a friendly community and a fair license model. +Thumbnail: + - + title: Buy license ---- diff --git a/content/clients/0_harvard/harvard.svg b/content/clients/0_harvard/harvard.svg deleted file mode 100644 index 1f70cfdbf1..0000000000 --- a/content/clients/0_harvard/harvard.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/clients/0_joyent/joyent.svg b/content/clients/0_joyent/joyent.svg deleted file mode 100644 index 93b0f36f4f..0000000000 --- a/content/clients/0_joyent/joyent.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/clients/0_mercedes/mercedes.svg b/content/clients/0_mercedes/mercedes.svg deleted file mode 100644 index c4cf6bc990..0000000000 --- a/content/clients/0_mercedes/mercedes.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/clients/0_nyt/nyt.svg b/content/clients/0_nyt/nyt.svg deleted file mode 100644 index d60d8d0667..0000000000 --- a/content/clients/0_nyt/nyt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/clients/0_philips/philips.svg b/content/clients/0_philips/philips.svg deleted file mode 100644 index b3f1c02e53..0000000000 --- a/content/clients/0_philips/philips.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/clients/0_smashingmagazine/smashingmagazine.svg b/content/clients/0_smashingmagazine/smashingmagazine.svg deleted file mode 100644 index 2aa954c060..0000000000 --- a/content/clients/0_smashingmagazine/smashingmagazine.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/clients/clients.txt b/content/clients/clients.txt deleted file mode 100644 index 8437282190..0000000000 --- a/content/clients/clients.txt +++ /dev/null @@ -1 +0,0 @@ -Title: Clients diff --git a/content/contact/contact.txt b/content/contact/contact.txt deleted file mode 100644 index e0ef68ff21..0000000000 --- a/content/contact/contact.txt +++ /dev/null @@ -1,52 +0,0 @@ -Title: Contact - ----- - -Description: Information about how to reach us, copyright information and disclaimer. - ----- - -Priority: .5 - ----- - -Contact: - -Bastian Allgeier GmbH -Böhmer Weg 22 -69151 Neckargemünd -Germany - - - - -**Follow Kirby on Twitter** - - -**Registergericht** -Amtsgericht Heidelberg - -**Registernummer** -HRB 718613 - -**USt.IdNr.** -DE293597540 - -**© Copyright 2009-(date: year)** -Bastian Allgeier GmbH. - -Responsible for all content accordant §10 paragraph 3 mdstv is Bastian Allgeier - ----- - -Disclaimer: - -»Author« in the sense of the following is the Bastian Allgeier GmbH. - -Online-contents: The author reserves the right not to be responsible for the topicality, correctness, completeness or quality of the information provided. Liability claims regarding damage caused by the use of any information provided, including any kind of information which is incomplete or incorrect, will therefore be rejected. All offers are not-binding and without obligation. Parts of the pages or the complete publication including all offers and information might be extended, changed or partly or completely deleted by the authoress without separate announcement. - -Referrals and links: The author is not responsible for any contents linked or referred to from their pages - unless they have full knowledge of illegal contents and would be able to prevent the visitors of their site from viewing those pages. If any damage occurs by the use of information presented there, only the author/authoress of the respective pages might be liable, not the one who has linked to these pages. Furthermore the authore is not liable for any postings or messages published by users of discussion boards, chatrooms, forums, guest books or mailing lists provided on their page. The author is not responsible for content posted by third parties there. Racist, sexist, and abusive messages will immediately be deleted by the authoress after knowledge. - -Copyright: The author intended not to use any copyrighted material for the publication or, if not possible, to indicate the copyright of the respective object. If you find any unindicated object protected by copyright, the copyright could not be determined by the author. In the case of such a unintentional copyright violation the authoress will remove the object from the publication or at least indicate it with the appropriate copyright after notification. The copyright for any material created by the author is reserved. Any duplication or use of such diagrams, sounds or texts in other electronic or printed publications is not permitted without the author's express prior consent. - -Legal force of this disclaimer: This disclaimer is to be regarded as part of the internet publication which you were referred from. If sections or individual formulations of this text are not legal or correct, the content or validity of the other parts remain uninfluenced by this fact. diff --git a/content/contact/text.txt b/content/contact/text.txt new file mode 100644 index 0000000000..a1e2247597 --- /dev/null +++ b/content/contact/text.txt @@ -0,0 +1,50 @@ +Title: Contact + +---- + +Description: Information about how to reach us, copyright information and disclaimer. + +---- + +Priority: .5 + +---- + +Text: + +Bastian Allgeier GmbH +Böhmer Weg 22 +69151 Neckargemünd +Germany + + + + +**Follow Kirby on Twitter** + + +**Registergericht** +Amtsgericht Heidelberg + +**Registernummer** +HRB 718613 + +**USt-IdNr. (EU VATIN)** +DE293597540 + +**© Copyright 2009-(date: year)** +Bastian Allgeier GmbH. + +Responsible for all content accordant §10 paragraph 3 mdstv is Bastian Allgeier + +## Disclaimer + +»Author« in the sense of the following is the Bastian Allgeier GmbH. + +Online-contents: The author reserves the right not to be responsible for the topicality, correctness, completeness or quality of the information provided. Liability claims regarding damage caused by the use of any information provided, including any kind of information which is incomplete or incorrect, will therefore be rejected. All offers are not-binding and without obligation. Parts of the pages or the complete publication including all offers and information might be extended, changed or partly or completely deleted by the authoress without separate announcement. + +Referrals and links: The author is not responsible for any contents linked or referred to from their pages - unless they have full knowledge of illegal contents and would be able to prevent the visitors of their site from viewing those pages. If any damage occurs by the use of information presented there, only the author/authoress of the respective pages might be liable, not the one who has linked to these pages. Furthermore the authore is not liable for any postings or messages published by users of discussion boards, chatrooms, forums, guest books or mailing lists provided on their page. The author is not responsible for content posted by third parties there. Racist, sexist, and abusive messages will immediately be deleted by the authoress after knowledge. + +Copyright: The author intended not to use any copyrighted material for the publication or, if not possible, to indicate the copyright of the respective object. If you find any unindicated object protected by copyright, the copyright could not be determined by the author. In the case of such a unintentional copyright violation the authoress will remove the object from the publication or at least indicate it with the appropriate copyright after notification. The copyright for any material created by the author is reserved. Any duplication or use of such diagrams, sounds or texts in other electronic or printed publications is not permitted without the author's express prior consent. + +Legal force of this disclaimer: This disclaimer is to be regarded as part of the internet publication which you were referred from. If sections or individual formulations of this text are not legal or correct, the content or validity of the other parts remain uninfluenced by this fact. diff --git a/content/1_docs/1_guide/10_authentication/1_login-methods/guide.txt b/content/docs/1_guide/10_authentication/1_login-methods/guide.txt similarity index 100% rename from content/1_docs/1_guide/10_authentication/1_login-methods/guide.txt rename to content/docs/1_guide/10_authentication/1_login-methods/guide.txt diff --git a/content/1_docs/1_guide/10_authentication/2_password-reset-form/guide.txt b/content/docs/1_guide/10_authentication/2_password-reset-form/guide.txt similarity index 100% rename from content/1_docs/1_guide/10_authentication/2_password-reset-form/guide.txt rename to content/docs/1_guide/10_authentication/2_password-reset-form/guide.txt diff --git a/content/1_docs/1_guide/10_authentication/2_password-reset-form/reset-password.png b/content/docs/1_guide/10_authentication/2_password-reset-form/reset-password.png similarity index 100% rename from content/1_docs/1_guide/10_authentication/2_password-reset-form/reset-password.png rename to content/docs/1_guide/10_authentication/2_password-reset-form/reset-password.png diff --git a/content/1_docs/1_guide/10_authentication/3_frontend-login/guide.txt b/content/docs/1_guide/10_authentication/3_frontend-login/guide.txt similarity index 100% rename from content/1_docs/1_guide/10_authentication/3_frontend-login/guide.txt rename to content/docs/1_guide/10_authentication/3_frontend-login/guide.txt diff --git a/content/1_docs/1_guide/10_authentication/4_sessions/guide.txt b/content/docs/1_guide/10_authentication/4_sessions/guide.txt similarity index 100% rename from content/1_docs/1_guide/10_authentication/4_sessions/guide.txt rename to content/docs/1_guide/10_authentication/4_sessions/guide.txt diff --git a/content/1_docs/1_guide/10_authentication/guide.txt b/content/docs/1_guide/10_authentication/guide.txt similarity index 100% rename from content/1_docs/1_guide/10_authentication/guide.txt rename to content/docs/1_guide/10_authentication/guide.txt diff --git a/content/1_docs/1_guide/10_authentication/users.svg b/content/docs/1_guide/10_authentication/users.svg similarity index 100% rename from content/1_docs/1_guide/10_authentication/users.svg rename to content/docs/1_guide/10_authentication/users.svg diff --git a/content/home/features/6_git/directions.svg b/content/docs/1_guide/11_routing/directions.svg similarity index 100% rename from content/home/features/6_git/directions.svg rename to content/docs/1_guide/11_routing/directions.svg diff --git a/content/1_docs/1_guide/11_routing/guide.txt b/content/docs/1_guide/11_routing/guide.txt similarity index 100% rename from content/1_docs/1_guide/11_routing/guide.txt rename to content/docs/1_guide/11_routing/guide.txt diff --git a/content/1_docs/1_guide/12_cache/database.svg b/content/docs/1_guide/12_cache/database.svg similarity index 100% rename from content/1_docs/1_guide/12_cache/database.svg rename to content/docs/1_guide/12_cache/database.svg diff --git a/content/1_docs/1_guide/12_cache/guide.txt b/content/docs/1_guide/12_cache/guide.txt similarity index 100% rename from content/1_docs/1_guide/12_cache/guide.txt rename to content/docs/1_guide/12_cache/guide.txt diff --git a/content/docs/1_guide/13_emails/email-85.svg b/content/docs/1_guide/13_emails/email-85.svg new file mode 100644 index 0000000000..c4455f0988 --- /dev/null +++ b/content/docs/1_guide/13_emails/email-85.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/docs/1_guide/13_emails/guide.txt b/content/docs/1_guide/13_emails/guide.txt new file mode 100644 index 0000000000..ae15d0db83 --- /dev/null +++ b/content/docs/1_guide/13_emails/guide.txt @@ -0,0 +1,276 @@ +Title: Emails + +---- + +Description: How to use built-in classes and helpers to send emails from within Kirby. + +---- + +Intro: Kirby has a built-in email engine, which can be used to send notifications to your users, replies to filled in contact forms and more. + +---- +Text: + +## Simple + +```php +try { + $kirby->email([ + 'from' => 'welcome@supercompany.com', + 'replyTo' => 'no-reply@supercompany.com', + 'to' => 'someone@gmail.com', + 'cc' => 'anotherone@gmail.com', + 'bcc' => 'secret@gmail.com', + 'subject' => 'Welcome!', + 'body'=> 'It\'s great to have you with us', + ]); +} catch (Exception $error) { + echo $error; +} + +// errors will be thrown as Exceptions. If you want to notice/output +// errors, always use try-catch +``` + + + +### With custom name + +```php +$from = new \Kirby\Cms\User([ + 'email' => 'e@mail.com', + 'name' => 'Vorname Nachname', +]); + +try { + $kirby->email([ + 'from' => $from, + 'to' => 'someone@example.com', + 'subject' => 'Welcome!', + 'body'=> 'It\'s great to have you with us', + ]); +} catch (Exception $error) { + echo $error; +} +``` + + + +### With multiple recipients: + +```php +$kirby->email([ + 'from' => 'welcome@supercompany.com', + 'to' => [ + 'someone@gmail.com', + 'numbertwo@gmail.com' + ], + 'subject' => 'Welcome!', + 'body'=> 'It\'s great to have you with us', +]); + +// or with a collection of users +$kirby->email([ + 'to' => $kirby->users()->filterBy('role', 'newbies'), + … +]); +``` + + +## Plain Text + +```php +$kirby->email([ + 'to' => 'peter@lustig.de', + 'template' => 'my-email', + 'data' => [ + 'num' => '2' + ] +]); +``` + +```php "/site/templates/emails/my-email.php" +Welcome to Newsletter No. ! +``` + +## HTML & Plain Text + +```php "/site/templates/emails/media.html.php" +

Hi

+

+``` + +```php "in site/templates/emails/media.text.php" +Hi , + + +``` + +```php +$kirby->email([ + 'template' => 'media', + 'data' => [ + 'name' => 'Peter', + 'text' => 'welcome to our wonderful email list' + ] +]); +``` + +## Personalized emails to multiple users + +```php +foreach ($users as $user) { + try { + $kirby->email('management', [ + 'to' => $user, + 'template' => 'user-specific', + 'data' => [ + 'user' => $user + ] + ]); + } catch (Exception $error) { + echo $error; + } +} +``` +```php "/site/templates/emails/user-specific.php" +Welcome, name() ?>! +Great to have you with us since yearJoinedCompany() ?>. +``` + +## Sending Email with attachments + +```php +$kirby->email([ + 'from' => 'welcome@supercompany.com', + 'to' => 'someone@gmail.com', + 'subject' => 'Welcome!', + 'body' => 'Here are some attachments', + 'attachments' => [ + $page->file('somefile.jpg'), + $page->file('someotherfile.jpg') + ] +]); +``` + +## Check if email is sent successfully + +```php +$success = kirby()->email([ + 'from' => 'welcome@supercompany.com', + 'to' => 'someone@gmail.com', + 'subject' => 'Welcome!', + 'body' => 'We will never reply', +])->isSent(); +``` + +## Setting plain text and html body + +```php +kirby()->email([ + 'from' => 'welcome@supercompany.com', + 'to' => 'someone@gmail.com', + 'subject' => 'Welcome!', + 'body' => [ + 'html' => Html::a('https://getkirby.com'), + 'text' => 'https://getkirby.com', + ], +]); +``` + +## Email presets + +```php "/site/config/config.php" + +return [ + 'email' => [ + 'presets' => [ + 'contact' => [ + 'from' => 'no-reply@supercompany.com', + 'subject' => 'Thank you for your contact request', + 'cc' => 'marketing@supercompany.com', + 'body' => 'We will never reply' + ] + ] + ] +]; +``` + +```php +$kirby->email('contact', [ + 'to' => 'peter@lustig.de' +]); +``` + +## Transport configuration + +```php "/site/config/config.php" + +return [ + 'email' => [ + 'transport' => [ + 'type' => 'smtp', + 'host' => 'smtp.company.com', + 'port' => 465, + 'security' => true + ] + ] +]; +``` + + +If `security` is set to `true`, Kirby automatically converts it to `'tls'` or `'ssl'` depending on the configured port. If no port is given and secure transport is enabled, the port is set to 587 (the common port for SMTP over TLS). + + +You can also use `'tls'` or `'ssl'` explicitly via the `security` key. + +### With authentication + +```php "/site/config/config.php" + +return [ + 'email' => [ + 'transport' => [ + 'type' => 'smtp', + 'host' => 'smtp.server.com', + 'port' => 465, + 'security' => true, + 'auth' => true, + 'username' => '...', + 'password' => '...', + ] + ] +]; +``` + +## Access PHPMailer instance + + +You can get access to the underlying PHPMailer instance via the `beforeSend` callback: + +```php +$kirby->email([ + // … + 'beforeSend' => function ($mailer) { + $mailer->SMTPOptions = [ + 'ssl' => [ + 'verify_peer' => false, + 'verify_peer_name' => false, + 'allow_self_signed' => true + ] + ]; + + return $mailer; + } +]); +``` + + + +The `beforeSend` callback can also be added as [preset](#email-presets). + + +## More information +- (link: docs/reference/objects/kirby/email text: `$kirby->email()`) +- (link: docs/cookbook/forms/basic-contact-form text: Email contact form) +- (link: docs/cookbook/forms/email-with-attachments text: Email with attachments) diff --git a/content/1_docs/1_guide/14_database/guide.txt b/content/docs/1_guide/14_database/guide.txt similarity index 100% rename from content/1_docs/1_guide/14_database/guide.txt rename to content/docs/1_guide/14_database/guide.txt diff --git a/content/1_docs/1_guide/14_database/server-rack.svg b/content/docs/1_guide/14_database/server-rack.svg similarity index 100% rename from content/1_docs/1_guide/14_database/server-rack.svg rename to content/docs/1_guide/14_database/server-rack.svg diff --git a/content/1_docs/1_guide/15_virtual-pages/1_simple-virtual-page/guide.txt b/content/docs/1_guide/15_virtual-pages/1_simple-virtual-page/guide.txt similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/1_simple-virtual-page/guide.txt rename to content/docs/1_guide/15_virtual-pages/1_simple-virtual-page/guide.txt diff --git a/content/1_docs/1_guide/15_virtual-pages/2_content-from-api/guide.txt b/content/docs/1_guide/15_virtual-pages/2_content-from-api/guide.txt similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/2_content-from-api/guide.txt rename to content/docs/1_guide/15_virtual-pages/2_content-from-api/guide.txt diff --git a/content/1_docs/1_guide/15_virtual-pages/2_content-from-api/review.jpg b/content/docs/1_guide/15_virtual-pages/2_content-from-api/review.jpg similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/2_content-from-api/review.jpg rename to content/docs/1_guide/15_virtual-pages/2_content-from-api/review.jpg diff --git a/content/1_docs/1_guide/15_virtual-pages/3_content-from-database/guide.txt b/content/docs/1_guide/15_virtual-pages/3_content-from-database/guide.txt similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/3_content-from-database/guide.txt rename to content/docs/1_guide/15_virtual-pages/3_content-from-database/guide.txt diff --git a/content/1_docs/1_guide/15_virtual-pages/4_content-from-csv/animals.csv b/content/docs/1_guide/15_virtual-pages/4_content-from-csv/animals.csv similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/4_content-from-csv/animals.csv rename to content/docs/1_guide/15_virtual-pages/4_content-from-csv/animals.csv diff --git a/content/1_docs/1_guide/15_virtual-pages/4_content-from-csv/animals.png b/content/docs/1_guide/15_virtual-pages/4_content-from-csv/animals.png similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/4_content-from-csv/animals.png rename to content/docs/1_guide/15_virtual-pages/4_content-from-csv/animals.png diff --git a/content/1_docs/1_guide/15_virtual-pages/4_content-from-csv/guide.txt b/content/docs/1_guide/15_virtual-pages/4_content-from-csv/guide.txt similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/4_content-from-csv/guide.txt rename to content/docs/1_guide/15_virtual-pages/4_content-from-csv/guide.txt diff --git a/content/1_docs/1_guide/15_virtual-pages/5_content-from-rss-feed/guide.txt b/content/docs/1_guide/15_virtual-pages/5_content-from-rss-feed/guide.txt similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/5_content-from-rss-feed/guide.txt rename to content/docs/1_guide/15_virtual-pages/5_content-from-rss-feed/guide.txt diff --git a/content/1_docs/1_guide/15_virtual-pages/6_merging-virtual-and-local-content/guide.txt b/content/docs/1_guide/15_virtual-pages/6_merging-virtual-and-local-content/guide.txt similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/6_merging-virtual-and-local-content/guide.txt rename to content/docs/1_guide/15_virtual-pages/6_merging-virtual-and-local-content/guide.txt diff --git a/content/1_docs/1_guide/15_virtual-pages/7_content-locking/guide.txt b/content/docs/1_guide/15_virtual-pages/7_content-locking/guide.txt similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/7_content-locking/guide.txt rename to content/docs/1_guide/15_virtual-pages/7_content-locking/guide.txt diff --git a/content/docs/1_guide/15_virtual-pages/content-360deg.svg b/content/docs/1_guide/15_virtual-pages/content-360deg.svg new file mode 100644 index 0000000000..cb5fc2af11 --- /dev/null +++ b/content/docs/1_guide/15_virtual-pages/content-360deg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/1_docs/1_guide/15_virtual-pages/guide.txt b/content/docs/1_guide/15_virtual-pages/guide.txt similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/guide.txt rename to content/docs/1_guide/15_virtual-pages/guide.txt diff --git a/content/1_docs/1_guide/15_virtual-pages/virtual-pages.png b/content/docs/1_guide/15_virtual-pages/virtual-pages.png similarity index 100% rename from content/1_docs/1_guide/15_virtual-pages/virtual-pages.png rename to content/docs/1_guide/15_virtual-pages/virtual-pages.png diff --git a/content/1_docs/1_guide/16_api/1_introduction/guide.txt b/content/docs/1_guide/16_api/1_introduction/guide.txt similarity index 100% rename from content/1_docs/1_guide/16_api/1_introduction/guide.txt rename to content/docs/1_guide/16_api/1_introduction/guide.txt diff --git a/content/1_docs/1_guide/16_api/2_authentication/guide.txt b/content/docs/1_guide/16_api/2_authentication/guide.txt similarity index 100% rename from content/1_docs/1_guide/16_api/2_authentication/guide.txt rename to content/docs/1_guide/16_api/2_authentication/guide.txt diff --git a/content/1_docs/1_guide/16_api/3_data/guide.txt b/content/docs/1_guide/16_api/3_data/guide.txt similarity index 100% rename from content/1_docs/1_guide/16_api/3_data/guide.txt rename to content/docs/1_guide/16_api/3_data/guide.txt diff --git a/content/1_docs/1_guide/16_api/guide.txt b/content/docs/1_guide/16_api/guide.txt similarity index 100% rename from content/1_docs/1_guide/16_api/guide.txt rename to content/docs/1_guide/16_api/guide.txt diff --git a/content/home/features/5_api/node.svg b/content/docs/1_guide/16_api/node.svg similarity index 100% rename from content/home/features/5_api/node.svg rename to content/docs/1_guide/16_api/node.svg diff --git a/content/1_docs/1_guide/17_plugins/1_plugin-basics/guide.txt b/content/docs/1_guide/17_plugins/1_plugin-basics/guide.txt similarity index 100% rename from content/1_docs/1_guide/17_plugins/1_plugin-basics/guide.txt rename to content/docs/1_guide/17_plugins/1_plugin-basics/guide.txt diff --git a/content/1_docs/1_guide/17_plugins/2_plugin-types/guide.txt b/content/docs/1_guide/17_plugins/2_plugin-types/guide.txt similarity index 100% rename from content/1_docs/1_guide/17_plugins/2_plugin-types/guide.txt rename to content/docs/1_guide/17_plugins/2_plugin-types/guide.txt diff --git a/content/docs/1_guide/17_plugins/3_plugin-setup-basic/guide.txt b/content/docs/1_guide/17_plugins/3_plugin-setup-basic/guide.txt new file mode 100644 index 0000000000..8185dc91ee --- /dev/null +++ b/content/docs/1_guide/17_plugins/3_plugin-setup-basic/guide.txt @@ -0,0 +1,144 @@ +Title: Basic plugin setup + +---- + +Intro: Kirby plugins can be installed via three methods. You will learn how to support all of them in your published plugins. + +---- + +Text: + +## The three plugin installation methods + +Before we get started, let's take a look at the common plugin installation methods: + +1. **Simple "drag and drop" installation from a ZIP file** + This method is the most common for beginners or for sites that don't have a complex build and deploy process. Users download the current plugin version with the big green GitHub download button as a ZIP file, extract it and manually drop it into the `site/plugins` directory. No further steps (especially no `npm` or `composer` commands) should be needed, so the ZIP download needs to include everything the plugin needs. +2. **Installation as a Git submodule** + The version control system Git makes it pretty simple to import other Git repos into the site's repo with the [`git submodule add `](https://www.git-tower.com/learn/git/ebook/en/command-line/advanced-topics/submodules#start) command. Git will fetch the plugin repo and will place it into the `site/plugins` directory for the user. Again, there should be no further steps, so the contents of the repo need to be ready for use. +3. **Installation with Composer** + [Composer](https://getcomposer.org) is a dependency manager for PHP. It needs to be setup once by the users, but can then install Kirby plugins as well as other libraries automatically. It is particularly useful when working in a team or when a deployment setup is used and is therefore often used by advanced Kirby users. Plugins need support for Composer with a `composer.json` file. + +As you can see, each installation method has its own special requirements. But don't worry, all of our plugin setup tutorials are designed with all three methods in mind. + +It's important that your published plugin supports *all three* methods, as each of them has advantages and disadvantages. Depending on the personal preference of plugin users and their use-case and project requirements, a different method will be best for them. By supporting all three methods, you can increase your audience by quite a bit. That being said: If your plugin was just built for your own use, you don't need to care about any of this and only need to support the method(s) you personally use. + +So let's get started with the basic steps you need to take care of for published plugins. + +## The Pluginkit: Our example plugin + +We have created a simple example plugin called the [Pluginkit](https://github.com/getkirby/pluginkit). It has several Git branches for the different plugin setup tutorials. + +You can find the code for this basic tutorial in the [`1-basic`](https://github.com/getkirby/pluginkit/tree/1-basic) branch. + +If you want to follow along, you can [download a ZIP file of that branch](https://github.com/getkirby/pluginkit/archive/1-basic.zip) or get it via Composer: + +```bash +composer create-project getkirby/pluginkit site/plugins/your-plugin dev-1-basic --remove-vcs +``` + +Please note that using Composer on the command line is *not* required for this tutorial, not even for supporting plugin installation via Composer. For most plugins, you can use the ZIP file of the Pluginkit and never have to touch the command line (unless you want to, which is fine too). + + +The `composer create-project` command creates a `vendor` directory and a `composer.lock` file inside your new plugin directory. Both are not required if you don't plan to use Composer for plugin dependencies or autoloading, however they are also not harmful. In case you don't want to deal with them at all, download the [ZIP file](https://github.com/getkirby/pluginkit/archive/1-basic.zip), which does not include these files. + + +## General recommended setup + +### Your plugin's Git repo + +Your plugin needs to live inside its own **Git repository**. This is required for the Git submodule installation method. Where that Git repo lives does not matter. Most Kirby plugins are published on [GitHub](https://github.com), which makes collaboration with other users (e.g. bug reports, pull requests, forks of your plugin) easier. However it's also possible to set your Git repo up at a different provider like [GitLab](https://about.gitlab.com) or on your own [Gitea server](https://gitea.io/en-us/). + +### Basic files for configuration and documentation + +The Pluginkit contains several basic files that we recommend for all plugins: + +```filesystem +.editorconfig +.gitattributes +.gitignore +LICENSE.md +README.md +SECURITY.md +``` + +- The `.editorconfig` file contains rules for your code editor or IDE. It makes sure that the coding style (indentation, whitespace handling etc.) is consistent. We recommend it because it will make your life easier when contributors send a pull request to your plugin. If their code editor supports the standard as well, they won't need to do anything manually to use the same coding style as you. You can read more about the EditorConfig standard on [their website](https://editorconfig.org). +- The `.gitignore` file contains a list of files that should not be included in the Git repository. It should include all files that are never needed for your plugin (e.g. npm or Composer dependencies that are only used in development as well as build files and invisible operating system files). Never include any files your plugin needs (e.g. libraries you required via Composer). Also see the tutorial for the (link: docs/guide/plugins/plugin-setup-composer text: plugin setup with Composer dependencies) about this. +- The `.gitattributes` file is similar in that it ignores files. However it doesn't ignore files completely from the repo, but instead just from the ZIP download and the installation via Composer. It should contain files that are needed in the repo, but not for use of the plugin (e.g. unit and integration tests, the dotfiles like `.gitignore` and `.gitattributes` itself, scripts for development etc.). It is optional and only needed for that last ✨. Again, don't ignore any files that are needed for your plugin. Otherwise the ZIP download and Composer installation methods won't work. +- Much more important is the `LICENSE.md`. It tells your users which license your plugin is published under. The `MIT` license is pretty common, but you can of course use any license you like, open-source or not. You can find more about software licenses on . +- Equally important is the `README.md` file. It contains information about your plugin as well as installation and usage instructions. You can find an example `README` in the [Pluginkit](https://github.com/getkirby/pluginkit/blob/1-basic/README.md). +- We also recommend to include a security policy in `SECURITY.md`. This file will automatically be picked up by GitHub's "Security" tab and will tell your users which versions of your plugin are supported and what to do when a user finds a vulnerability in your plugin code. + +## The `composer.json` + +The `composer.json` file is the most important configuration file for your plugin. It enables users to install your plugin with Composer and also provides (link: docs/guide/plugins/plugin-basics#plugin-information text: useful metadata in the Kirby installation). + +The most basic form for a Kirby plugin looks like this: + +```js "composer.json" +{ + "name": "getkirby/pluginkit", + "description": "Kirby Example Plugin", + "type": "kirby-plugin", + "license": "MIT", + "authors": [ + { + "name": "Your Name", + "email": "you@example.com" + } + ], + "require": { + "getkirby/composer-installer": "^1.1" + } +} +``` + +- The `name` field is required and will later determine the name under which your plugin is available for installation via Composer. +- The fields `description`, `license` and `authors` are metadata fields. The contents of those fields are not important for plugin installation, but will show up in different places, like on [Packagist](https://packagist.org). +- The `type` and `require` fields are required for the correct installation of your plugin. By defining the package type as `kirby-plugin`, our `getkirby/composer-installer` package will know that your plugin needs to be installed to the `site/plugins` directory. For that to work, the `getkirby/composer-installer` package needs to be loaded explicitly. + + +*Both* the `type` field and the `getkirby/composer-installer` dependency are **required** for your plugin to work, otherwise it won't be loaded correctly by Kirby. + +Do *not* use the `composer/installers` package, it does not fully support Kirby 3 plugins. Our own `getkirby/composer-installer` was designed with this tutorial in mind. + + +The Composer installer will install your plugin to `site/plugins/{{ name }}` by default, so in this example to `site/plugins/pluginkit`. If your Composer package name differs from the name of your plugin (e.g. if it is `superwoman/kirby-plugin-superplugin`), you can override the plugin name in your `composer.json`: + +```js "composer.json" +{ + "name": "superwoman/kirby-plugin-superplugin", + ... + "type": "kirby-plugin", + ... + "require": { + "getkirby/composer-installer": "^1.1" + } + "extra": { + "installer-name": "superplugin" + } +} +``` + +Composer supports [many additional configuration options](https://getcomposer.org/doc/04-schema.md). Please note that the options that are defined as "root-only" do *not* apply to plugins. + +## The `index.php` + +Now let's get to the actual code of your plugin. + +The entry point for your plugin is the `index.php` file. You can read more about this file in the (link: docs/guide/plugins/plugin-basics text: Plugin Basics). + +Your plugin may have any number of additional code files. How to load them dynamically is described in the tutorial for the (link: docs/guide/plugins/plugin-setup-autoloader text: plugin setup with autoloader). + + +The setup with a separate `config.php` file for Composer is no longer recommended as it can cause issues with the autoloading order. If you put your code directly into the `index.php` file and *don't* autoload it with Composer, Kirby will pick it up just fine. + + +## Publish your plugin + +Once your plugin is ready, you can publish it with the following steps: + +1. Push your code to your Git repository. +2. Create a Git tag with the version number of your release. +3. Publish your plugin on [Packagist](https://packagist.org) to enable installation via Composer (only needed once, Packagist will pick up new Git tags automatically after that). +4. If you want to advertise your plugin in the [plugin directory](https://github.com/getkirby/getkirby.com/tree/main/content/plugins) on our (link: https://getkirby.com/plugins text: getkirby.com website), fork the (link: https://github.com/getkirby/getkirby.com text: getkirby.com repo), add the required pages for your plugin, and make a pull request. Or tell everybody about it on the (link: https://forum.getkirby.com text: forum) in the plugins category. diff --git a/content/docs/1_guide/17_plugins/3d-29.svg b/content/docs/1_guide/17_plugins/3d-29.svg new file mode 100644 index 0000000000..9bf7b0c2a8 --- /dev/null +++ b/content/docs/1_guide/17_plugins/3d-29.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/1_docs/1_guide/17_plugins/4_plugin-setup-autoloader/guide.txt b/content/docs/1_guide/17_plugins/4_plugin-setup-autoloader/guide.txt similarity index 100% rename from content/1_docs/1_guide/17_plugins/4_plugin-setup-autoloader/guide.txt rename to content/docs/1_guide/17_plugins/4_plugin-setup-autoloader/guide.txt diff --git a/content/1_docs/1_guide/17_plugins/5_plugin-setup-composer/guide.txt b/content/docs/1_guide/17_plugins/5_plugin-setup-composer/guide.txt similarity index 100% rename from content/1_docs/1_guide/17_plugins/5_plugin-setup-composer/guide.txt rename to content/docs/1_guide/17_plugins/5_plugin-setup-composer/guide.txt diff --git a/content/1_docs/1_guide/17_plugins/6_plugin-setup-panel/guide.txt b/content/docs/1_guide/17_plugins/6_plugin-setup-panel/guide.txt similarity index 100% rename from content/1_docs/1_guide/17_plugins/6_plugin-setup-panel/guide.txt rename to content/docs/1_guide/17_plugins/6_plugin-setup-panel/guide.txt diff --git a/content/1_docs/1_guide/17_plugins/7_best-practices/guide.txt b/content/docs/1_guide/17_plugins/7_best-practices/guide.txt similarity index 100% rename from content/1_docs/1_guide/17_plugins/7_best-practices/guide.txt rename to content/docs/1_guide/17_plugins/7_best-practices/guide.txt diff --git a/content/1_docs/1_guide/17_plugins/guide.txt b/content/docs/1_guide/17_plugins/guide.txt similarity index 100% rename from content/1_docs/1_guide/17_plugins/guide.txt rename to content/docs/1_guide/17_plugins/guide.txt diff --git a/content/1_docs/1_guide/18_security/guide.txt b/content/docs/1_guide/18_security/guide.txt similarity index 100% rename from content/1_docs/1_guide/18_security/guide.txt rename to content/docs/1_guide/18_security/guide.txt diff --git a/content/1_docs/1_guide/18_security/lock.svg b/content/docs/1_guide/18_security/lock.svg similarity index 100% rename from content/1_docs/1_guide/18_security/lock.svg rename to content/docs/1_guide/18_security/lock.svg diff --git a/content/1_docs/1_guide/19_kirby-and-privacy/guide.txt b/content/docs/1_guide/19_kirby-and-privacy/guide.txt similarity index 100% rename from content/1_docs/1_guide/19_kirby-and-privacy/guide.txt rename to content/docs/1_guide/19_kirby-and-privacy/guide.txt diff --git a/content/1_docs/1_guide/19_kirby-and-privacy/privacy.svg b/content/docs/1_guide/19_kirby-and-privacy/privacy.svg similarity index 100% rename from content/1_docs/1_guide/19_kirby-and-privacy/privacy.svg rename to content/docs/1_guide/19_kirby-and-privacy/privacy.svg diff --git a/content/docs/1_guide/1_quickstart/guide.txt b/content/docs/1_guide/1_quickstart/guide.txt new file mode 100644 index 0000000000..ec47d2e542 --- /dev/null +++ b/content/docs/1_guide/1_quickstart/guide.txt @@ -0,0 +1,235 @@ +Title: Get up and running + +---- + +Description: All you need to know to get Kirby up and running: Installation, requirements and updates. + +---- +Intro: All you need to know to get Kirby up and running: Installation, requirements and updates. + +---- + +Todos: +- Add a nice screenshot of the starterkit +- Add a glossary entry for document root and link it in the installation step + +---- + +Text: + +(screencast: https://www.youtube.com/watch?v=EDVYjxWMecc title: How to install Kirby in 5 minutes text: We are using PHP's built-in server to create a simple local development environment.) + +## Download and installation + +1. We provide two downloadable kits for you to get started with. + +(docs: kits) + +2. Extract the contents of the ZIP file into your server's web root +3. Visit your new Kirby site in your browser at `yourdomain.com` +4. Visit the (glossary: Panel) at `yourdomain.com/panel` + +(screenshot: panel.png) + + +When copying files to a remote server via (S)FTP, make sure to copy the `.htaccess` file as well. By default, files starting with a dot are invisible in the filesystem, so make sure enable the display of invisible files before copying. + + +## Requirements + +
+ + + + + + + + + +
Web serverPHP
+

Any of the following:

+
    +
  • Apache 2
  • +
  • Nginx
  • +
  • LiteSpeed
  • +
  • Caddy
  • +
+ +

Server Features:

+
    +
  • URL rewriting
  • +
+
+
    +
  • PHP 7.2, 7.3 or 7.4
    (PHP 7.3 or 7.4 are recommended)
  • +
  • mbstring extension
  • +
  • curl extension
  • +
  • ctype extension
  • +
  • gd extension
  • +
+
+
+ +The server OS must be POSIX compatible. + +If you want to use PHP's built-in server, you have to start it up with Kirby's router: + +```php +php -S localhost:8000 kirby/router.php +``` + +Other servers (link: docs/reference/system/options/servers text: may work), but are not officially supported. + +### Browsers for the Panel + +Kirby does not modify the output of your site's templates and thus has no effect on its browser requirements. The Panel is built on modern browser features though and has a couple browser requirements which need to be met by your site's editors. + +
+ + + + + + + + + +
DesktopMobile
+
    +
  • Chrome 57+
  • +
  • Firefox 54+
  • +
  • Safari 10.1+
  • +
  • Edge 16+
  • +
  • Opera 44+
  • +
+
+
    +
  • Mobile Safari 10.3+
  • +
  • Android Browser 67+
  • +
  • Chrome for Android 70+
  • +
+
+
+ +### Alternative ways to install Kirby + +There are alternative installation methods for advanced users who prefer to install and update Kirby using commands on the command line or in their version control tool. Check them out and use whichever method you prefer. + +- (link: docs/cookbook/setup/composer text: Installation via Composer) +- (link: docs/cookbook/setup/git text: Installation as Git submodule) + + +If you don't have a local development environment yet and don't know what to use, check out our (link: docs/cookbook/setup/development-environment text: Local development environment) recipe. + + +### Installation guides for webhosts +Some providers have created dedicated guides how to install Kirby on their servers. If you are with one of these providers, keep on reading: +- (link: https://lab.uberspace.de/guide_kirby.html text: Installation on Uberspace) +- (link: https://help.fortrabbit.com/install-kirby-3 text: Installation on fortrabbit) +- (link: https://www.rosehosting.com/blog/how-to-install-kirby-cms-on-ubuntu-18-04/ text: Installation on RoseHosting) + + +## Create your first account + +Kirby's control panel (aka. the Panel) comes without any pre-installed accounts. Open `http://yourdomain.com/panel` in the browser to start the installer and create the first account. + + +For security reasons, you cannot install the Panel on a public server by default. To allow this, you can enable the (link: docs/reference/system/options/panel#allow-the-panel-to-be-installed-on-a-remote-server text: `panel.install` option): + + +## Register your installation + +Once you publish your website, you need to (link: buy text: purchase a Kirby license). We will send you a unique license code for your domain. You can register your installation with the following steps. + +1. Open the Panel at `http://yourdomain.com/panel` and log in. +2. Click on "Register" at the top. +3. Enter your license code and your email address and press "Ok". + +### Without using the Panel + + + +If you don’t want the Panel to connect to our server, registration via the Panel fails, or you are not using the Panel at all, you can download your license files directly from our licenses website: + +1. Visit (link: https://licenses.getkirby.com). +2. Log in with the email you used when you purchased the license and any order number. +3. In the list of your licenses, click on the key you want to register. +4. Use the "Download license file" button to download the license file. +5. Rename the downloaded file to `.license` (without extensions). +6. Place it in the `/site/config/` folder of your Kirby installation. + + + +## Updates + +To update Kirby, download the latest version and replace the `kirby` folder. + +Make sure to delete the media folder. It will be automatically recreated. + +That's it! Because Kirby does not use a database by default, you don't have to run any database migrations. + + +Never update a live website directly on the server. Test updates locally first to see if something breaks. + + +### Updating Kirby with the advanced methods + +If you used one of the advanced installation methods, you can also use them to update Kirby: + +- (link: docs/cookbook/setup/composer#updating-kirby text: Update via Composer) +- (link: docs/cookbook/setup/git#updating-kirby text: Update of the Git submodule) + + +**Upgrade from Kirby 2** +If you want to upgrade an existing Kirby 2 installation, head over to our (link: docs/cookbook/setup/migrate-site text: upgrade guide). + + +## Where to go from here + +(columns…) + +### (link: docs/guide/tour text: A tour around the house) +Now that you have successfully installed Kirby on your server, it's time to explore your new CMS. Get yourself a cup of tea (or whatever you like most) and go on a (link: docs/guide/tour text: tour to explore the Starterkit) with us. + +++++ + +### (link: docs/cookbook/setup/kirby-in-a-nutshell text: Kirby in a nutshell) +Get (link: docs/cookbook/setup/kirby-in-a-nutshell text: a concise overview) of how Kirby works and what to keep in mind when you start your project. It's all about what you wish you had known when you started your first Kirby project. + +++++ + +### (link: docs/guide text: Guide) + +Our guide introduces you to every aspect of Kirby. From your first (glossary: template text: template) to complex extensions. It should always be the (link: docs/guide text: starting point for your research). + +++++ + +### (link: docs/reference text: Reference) + +Once you have familiarized yourself with the basics, the (link: docs/reference text: Reference) is the number one resource you will keep getting back to. It's a collection of every method, option, helper, tag, root, url and more. + +++++ + +### (link: docs/cookbook text: Cookbook) + +The (link: docs/cookbook text: Cookbook) is a collection of solutions you can build with Kirby, explaining how to build them step by step. Starting from simple things like menus to frontend authentication, headless CMS setups and more. + +++++ + +### (link: plugins text: Plugins) +Our plugin developers created dozens of fantastic plugins for Kirby. Check out our (link: plugins text: official plugin repository) before creating your own solution for common features. + +++++ + +### (link: docs/guide/troubleshooting text: Troubleshooting) + +If you encounter any problems, make sure to check our (link: docs/guide/troubleshooting text: guide on some common pitfalls) and how to solve them. + +++++ + +### (link: https://forum.getkirby.com/ text: Forum) + +The community in the (link: https://forum.getkirby.com/ text: Kirby Forum) is always there to help out whenever you get stuck. It's likely that someone already had the same problem, so using the search function might uncover a solution within seconds. If you can't find a helpful topic, drop us your question. + +(…columns) diff --git a/content/1_docs/1_guide/1_quickstart/panel.png b/content/docs/1_guide/1_quickstart/panel.png similarity index 100% rename from content/1_docs/1_guide/1_quickstart/panel.png rename to content/docs/1_guide/1_quickstart/panel.png diff --git a/content/1_docs/1_guide/1_quickstart/spaceship.svg b/content/docs/1_guide/1_quickstart/spaceship.svg similarity index 100% rename from content/1_docs/1_guide/1_quickstart/spaceship.svg rename to content/docs/1_guide/1_quickstart/spaceship.svg diff --git a/content/1_docs/1_guide/2_tour/from-blueprint-to-frontend.png b/content/docs/1_guide/2_tour/from-blueprint-to-frontend.png similarity index 100% rename from content/1_docs/1_guide/2_tour/from-blueprint-to-frontend.png rename to content/docs/1_guide/2_tour/from-blueprint-to-frontend.png diff --git a/content/1_docs/1_guide/2_tour/guide.txt b/content/docs/1_guide/2_tour/guide.txt similarity index 100% rename from content/1_docs/1_guide/2_tour/guide.txt rename to content/docs/1_guide/2_tour/guide.txt diff --git a/content/1_docs/1_guide/2_tour/panel.jpg b/content/docs/1_guide/2_tour/panel.jpg similarity index 100% rename from content/1_docs/1_guide/2_tour/panel.jpg rename to content/docs/1_guide/2_tour/panel.jpg diff --git a/content/1_docs/1_guide/2_tour/tabs.png b/content/docs/1_guide/2_tour/tabs.png similarity index 100% rename from content/1_docs/1_guide/2_tour/tabs.png rename to content/docs/1_guide/2_tour/tabs.png diff --git a/content/1_docs/1_guide/2_tour/treasure-map-21.svg b/content/docs/1_guide/2_tour/treasure-map-21.svg similarity index 100% rename from content/1_docs/1_guide/2_tour/treasure-map-21.svg rename to content/docs/1_guide/2_tour/treasure-map-21.svg diff --git a/content/1_docs/1_guide/3_troubleshooting/1_installation/guide.txt b/content/docs/1_guide/3_troubleshooting/1_installation/guide.txt similarity index 100% rename from content/1_docs/1_guide/3_troubleshooting/1_installation/guide.txt rename to content/docs/1_guide/3_troubleshooting/1_installation/guide.txt diff --git a/content/1_docs/1_guide/3_troubleshooting/2_panel/guide.txt b/content/docs/1_guide/3_troubleshooting/2_panel/guide.txt similarity index 100% rename from content/1_docs/1_guide/3_troubleshooting/2_panel/guide.txt rename to content/docs/1_guide/3_troubleshooting/2_panel/guide.txt diff --git a/content/1_docs/1_guide/3_troubleshooting/3_thumbnails/guide.txt b/content/docs/1_guide/3_troubleshooting/3_thumbnails/guide.txt similarity index 100% rename from content/1_docs/1_guide/3_troubleshooting/3_thumbnails/guide.txt rename to content/docs/1_guide/3_troubleshooting/3_thumbnails/guide.txt diff --git a/content/1_docs/1_guide/3_troubleshooting/4_debugging/guide.txt b/content/docs/1_guide/3_troubleshooting/4_debugging/guide.txt similarity index 100% rename from content/1_docs/1_guide/3_troubleshooting/4_debugging/guide.txt rename to content/docs/1_guide/3_troubleshooting/4_debugging/guide.txt diff --git a/content/1_docs/1_guide/3_troubleshooting/guide.txt b/content/docs/1_guide/3_troubleshooting/guide.txt similarity index 100% rename from content/1_docs/1_guide/3_troubleshooting/guide.txt rename to content/docs/1_guide/3_troubleshooting/guide.txt diff --git a/content/1_docs/1_guide/3_troubleshooting/support.svg b/content/docs/1_guide/3_troubleshooting/support.svg similarity index 100% rename from content/1_docs/1_guide/3_troubleshooting/support.svg rename to content/docs/1_guide/3_troubleshooting/support.svg diff --git a/content/1_docs/1_guide/4_content/1_introduction/guide.txt b/content/docs/1_guide/4_content/1_introduction/guide.txt similarity index 100% rename from content/1_docs/1_guide/4_content/1_introduction/guide.txt rename to content/docs/1_guide/4_content/1_introduction/guide.txt diff --git a/content/docs/1_guide/4_content/2_creating-pages/guide.txt b/content/docs/1_guide/4_content/2_creating-pages/guide.txt new file mode 100644 index 0000000000..360b348ba9 --- /dev/null +++ b/content/docs/1_guide/4_content/2_creating-pages/guide.txt @@ -0,0 +1,98 @@ +Title: Creating pages + +---- +Intro: + +Pages can be created via the Panel, directly in the file system, or programmatically. If you create a new page via the Panel, it is always created as a draft. In the file system, you can create pages with any state directly. + +---- + +Thumbnail: screenshot.png + +---- + +Text: + +## Creating pages in the Panel + +Before you can add new pages via the Panel, you have to set up a (link: docs/reference/panel/sections/pages text: pages section) in your page or site blueprint, with the status set to `draft` or `all`. + +Click on the "Add" button in the top right corner of a pages section. Every new page in the Panel is created as a draft first. This prevents accidental publishing of a page that is not ready yet. + +(picture: Bildschirmfoto2018-07-05um14.34.45.png) + +Drafts are stored in a `_drafts` subfolder for every page. These drafts are only accessible when you are logged in. + + + +If you want to automatically publish new pages created via the Panel, you can set up a (link: docs/reference/system/options/hooks text: `page.create:after` hook) in your `config.php` file. + + +## Creating published pages manually + +Pages are stored as subfolders of the `/content` folder. To create a new page manually, create a new folder and add a text file with the extension `.txt` (default) or `.md` (optional configuration setting). + +A simple folder structure could look like this: + +```filesystem +/content/ + /home/ + home.txt + /projects/ + project.txt + /blog/ + blog.txt + /contact/ + contact.txt +``` + +If you want to create a site with different languages using Kirby's built-in (link: docs/guide/languages text: multi-lang feature), you need to add language code extensions for each language, e.g. `home.en.txt`, `home.de.txt` etc. + + +The naming of these content files is important, because it defines which template is used to render the content. + +| Content filename | Template filename | +| -----------------| ------------------| +| home.txt | home.php | +| projects.txt | projects.php | +| contact.txt | contact.php | + + +If there is no corresponding template, the `default.php` template is used to render the page. + + +Each page folder is accessible via its URL, e.g. you can access the projects folder by entering the domain name followed by the UID of the folder into your browser's address bar: `https://example.com/projects`. If your projects folder contains subpages, the subpage `project-a` would therefore be accessible via `https://example.com/projects/project-a` etc. + +URLs can be modified using (link: docs/guide/routing text: Kirby's router). + +## Creating drafts manually + +If you want to create a draft manually in the content folder you can create a `_drafts` subfolder in the parent page folder (if it's not there yet) and inside create your draft page folder. + +```filesystem +/content/projects/_drafts/my-project-draft/ +``` + + +## Creating pages programmatically + +Pages can also be created via Kirby's API methods in a controller, template, plugin, hook etc. This is useful if you want to create pages from form data, external files (like an Excel or `.csv` file), or from an external API. + +The basic syntax for creating a page with code looks like this: + +```php + 'An interesting title', + 'text' => 'Some great content here…' +]; + +$page->createChild([ + 'content' => $content, + 'slug' => 'test-article', + 'template' => 'article' +]); +``` + +The above code only works if you are either logged in and have the necessary permissions for the action, or if you authenticate the user programmatically to perform the action (link: docs/guide/templates/php-api#permissions text: Learn more about permissions and impersonating users). diff --git a/content/1_docs/1_guide/4_content/2_creating-pages/Bildschirmfoto2018-07-05um14.34.45.png b/content/docs/1_guide/4_content/2_creating-pages/screenshot.png similarity index 100% rename from content/1_docs/1_guide/4_content/2_creating-pages/Bildschirmfoto2018-07-05um14.34.45.png rename to content/docs/1_guide/4_content/2_creating-pages/screenshot.png diff --git a/content/1_docs/1_guide/4_content/3_publishing-workflow/Bildschirmfoto2018-07-05um14.30.12.png b/content/docs/1_guide/4_content/3_publishing-workflow/Bildschirmfoto2018-07-05um14.30.12.png similarity index 100% rename from content/1_docs/1_guide/4_content/3_publishing-workflow/Bildschirmfoto2018-07-05um14.30.12.png rename to content/docs/1_guide/4_content/3_publishing-workflow/Bildschirmfoto2018-07-05um14.30.12.png diff --git a/content/1_docs/1_guide/4_content/3_publishing-workflow/Bildschirmfoto2018-07-05um14.31.59.png b/content/docs/1_guide/4_content/3_publishing-workflow/Bildschirmfoto2018-07-05um14.31.59.png similarity index 100% rename from content/1_docs/1_guide/4_content/3_publishing-workflow/Bildschirmfoto2018-07-05um14.31.59.png rename to content/docs/1_guide/4_content/3_publishing-workflow/Bildschirmfoto2018-07-05um14.31.59.png diff --git a/content/1_docs/1_guide/4_content/3_publishing-workflow/content-locking.png b/content/docs/1_guide/4_content/3_publishing-workflow/content-locking.png similarity index 100% rename from content/1_docs/1_guide/4_content/3_publishing-workflow/content-locking.png rename to content/docs/1_guide/4_content/3_publishing-workflow/content-locking.png diff --git a/content/1_docs/1_guide/4_content/3_publishing-workflow/guide.txt b/content/docs/1_guide/4_content/3_publishing-workflow/guide.txt similarity index 100% rename from content/1_docs/1_guide/4_content/3_publishing-workflow/guide.txt rename to content/docs/1_guide/4_content/3_publishing-workflow/guide.txt diff --git a/content/1_docs/1_guide/4_content/3_publishing-workflow/unsaved-changes.png b/content/docs/1_guide/4_content/3_publishing-workflow/unsaved-changes.png similarity index 100% rename from content/1_docs/1_guide/4_content/3_publishing-workflow/unsaved-changes.png rename to content/docs/1_guide/4_content/3_publishing-workflow/unsaved-changes.png diff --git a/content/1_docs/1_guide/4_content/4_fields/guide.txt b/content/docs/1_guide/4_content/4_fields/guide.txt similarity index 100% rename from content/1_docs/1_guide/4_content/4_fields/guide.txt rename to content/docs/1_guide/4_content/4_fields/guide.txt diff --git a/content/1_docs/1_guide/4_content/5_files/Bildschirmfoto2018-07-09um21.13.28.jpg b/content/docs/1_guide/4_content/5_files/Bildschirmfoto2018-07-09um21.13.28.jpg similarity index 100% rename from content/1_docs/1_guide/4_content/5_files/Bildschirmfoto2018-07-09um21.13.28.jpg rename to content/docs/1_guide/4_content/5_files/Bildschirmfoto2018-07-09um21.13.28.jpg diff --git a/content/1_docs/1_guide/4_content/5_files/guide.txt b/content/docs/1_guide/4_content/5_files/guide.txt similarity index 100% rename from content/1_docs/1_guide/4_content/5_files/guide.txt rename to content/docs/1_guide/4_content/5_files/guide.txt diff --git a/content/1_docs/1_guide/4_content/6_text-formatting/caps-small.svg b/content/docs/1_guide/4_content/6_text-formatting/caps-small.svg similarity index 100% rename from content/1_docs/1_guide/4_content/6_text-formatting/caps-small.svg rename to content/docs/1_guide/4_content/6_text-formatting/caps-small.svg diff --git a/content/1_docs/1_guide/4_content/6_text-formatting/guide.txt b/content/docs/1_guide/4_content/6_text-formatting/guide.txt similarity index 100% rename from content/1_docs/1_guide/4_content/6_text-formatting/guide.txt rename to content/docs/1_guide/4_content/6_text-formatting/guide.txt diff --git a/content/1_docs/1_guide/4_content/guide.txt b/content/docs/1_guide/4_content/guide.txt similarity index 100% rename from content/1_docs/1_guide/4_content/guide.txt rename to content/docs/1_guide/4_content/guide.txt diff --git a/content/home/features/1_content/single-copy-04.svg b/content/docs/1_guide/4_content/single-copy-04.svg similarity index 100% rename from content/home/features/1_content/single-copy-04.svg rename to content/docs/1_guide/4_content/single-copy-04.svg diff --git a/content/docs/1_guide/5_templates/1_basics/guide.txt b/content/docs/1_guide/5_templates/1_basics/guide.txt new file mode 100644 index 0000000000..7c3ea5f156 --- /dev/null +++ b/content/docs/1_guide/5_templates/1_basics/guide.txt @@ -0,0 +1,253 @@ +Title: Templates + +---- + +Description: Templates contain the HTML for your pages, spiced up with some PHP to dynamically pull in your content. + +---- + +Subtitle: Define your page layout with HTML and PHP + +---- + +Intro: + +Templates contain the HTML for your pages, spiced up with some PHP to dynamically pull in your content. + +---- + +Text: + +## TL;DR + +- All templates are stored in the `/site/templates` folder +- To create a new template for a page, create a .php file with a filename that matches the filename of the content file +- You can use the `$page`, `$site` and `$pages` variables to easily access the content of your pages/site + +(screencast: https://www.youtube.com/watch?v=bmz6NYUNWPk title: Your first template text: Connect the content from your content folder with your static HTML and bring your pages to life.) + +## Naming your templates + +When you open a page in the browser, Kirby reads the name of the text file to determine what template to use to render the page. If Kirby finds a template with the same name as the text file, it loads it and executes the code contained in it. If there is no matching template, the default template is used instead. + + +Template names must be lowercase, for example `default.php` or `blog.php`. + + +Here are some example of content file and template file counterparts: + +| Text file | Template | +| - | - | +| /content/home/home.txt | /site/templates/home.php | +| /content/projects/projects.txt | /site/templates/projects.php | +| /content/projects/project-1/project.txt | /site/templates/project.php | +| /content/projects/project-2/project.txt | /site/templates/project.php | + +## The default template + +The default template is the only required template. It is called `default.php` and must exist in your `/site/templates` folder. When you get started with a completely new site you might want to start with just the default template as your foundation. + +## Shared templates + +Pages with the same or a similar content structure can share a single template. For example, all the notes subpages in the `/notes` page or the album subpages of the `/photography` page of the Starterkit share the same template called `note.php` and `album.php` respectively. + + +## Basic usage + +Let's start with looking at a very simple HTML template and how we can replace parts of it with the content of our text files. + +```html + + + + My first page + + +

Hello world!

+ + +``` + +Nothing very special here, just a static HTML page with a title tag in the head and a headline in the body. + +Kirby provides some API variables for each template that are instantly available and allow us to fetch content from our pages, namely the `$site`, the `$page` and the `$pages` variables. + +## The `$site` variable + +The `$site` object contains important information about the site in general and the data stored in `/content/site.txt`. Let's replace the hard-coded document title with something more dynamic: + +```php + + + + <?= $site->title()->html() ?> + + + Hello world! + + +``` + +With `$site->title()` we fetch the value of the title field from `/content/site.txt`. + +The `site.txt` file of the Starterkit looks like this: + + +```kirbycontent "/content/site.txt" + Title: Kirby Starterkit + + ---- + + Author: Bastian Allgeier GmbH + + ---- + + Description: This is Kirby's Starterkit. + + ---- + + Copyright: © 2009–(date: Year) (link: http://getkirby.com text: The Kirby Team) +``` + +The above code would therefore render "Kirby Starterkit" as our document title. + + +The `$site` object is the perfect place for storing any data that you want to reuse throughout your site. Next to typical things like data for the title and description meta tags, you can also store copyright information or social media accounts. + + +All this data can be used in your templates instantly: + +```php + + + + + + <?= $site->title()->html() ?> + + + + +
+

+ + title()->html() ?> + +

+
+ + Hello world! + +
+ +
+ + + +``` + +As you can see, the `$site` object also contains the main URL of your site, which can be used to link the logo back to your homepage for example. The `$site` object has many more methods you can find in the (link: docs/reference text: Reference). + +## The `$page` variable + +The `$page` object is probably the variable you will use the most throughout your templates. `$page` always refers to the currently active page. + +Like the `$site` variable, the `$page` variable has many methods that allow us to get information from the page. You can find all available methods in the (link: docs/reference text: Reference). + +```php + + + + + + + <?= $page->title()->html() ?> | <?= $site->title()->html() ?> + + + + +
+

+ + title()->html() ?> + +

+
+ +
+

title()->html() ?>

+ text()->kirbytext() ?> +
+ +
+ +
+ + + +``` + +The document title and the main container of the page are now completed with data from the currently visited page. + +With + +```php +title() ?> +``` + we fetch the title of the page and with + +```php +text() ?> +``` +we get the data from the text field of the page. + + +The `html()` (glossary: field-method text: field method) is used to escape content. + + +All fields we added to our page content files are now accessible like this. + + + +Fieldnames are converted to lowercase and any punctuation is replaced with underscores as PHP does not support special characters in method names. + + + +## A note on reserved words + +If you use field names in your text file, which are also used by native Kirby methods, e.g. "image", "videos", "audio", or "num", you cannot fetch the data like described above. To fetch the content of such fields, you have to use the `content()` method: + +| Field name | Variable | +| - | - | +| `Image:` | `$page->content()->image()` | +| `Videos:` | `$page->content()->videos()` | +| `Audio:` | `$page->content()->audio()` | + +## Setting response types + +In your templates, you can set different response types depending on content. + +For example, to send an `application/json` response: + +```php +response()->json(); +echo json_encode(['your' => 'data']); +``` + +You can also send other response types by extension or MIME type: + +```php +response()->type('txt'); +$kirby->response()->type('text/plain'); +``` + +## More information + +- (link: docs/cookbook/templating/custom-post-types text: Custom post types) +- (link: docs/cookbook/templating/php-templates text: Kirby templates 101) +- (link: docs/cookbook/setup/debugging-basics text: Basic error hunting & prevention) +- (link: docs/cookbook/templating/one-pager text: One-pager site) diff --git a/content/1_docs/1_guide/5_templates/2_snippets/guide.txt b/content/docs/1_guide/5_templates/2_snippets/guide.txt similarity index 100% rename from content/1_docs/1_guide/5_templates/2_snippets/guide.txt rename to content/docs/1_guide/5_templates/2_snippets/guide.txt diff --git a/content/1_docs/1_guide/5_templates/3_php-api/guide.txt b/content/docs/1_guide/5_templates/3_php-api/guide.txt similarity index 100% rename from content/1_docs/1_guide/5_templates/3_php-api/guide.txt rename to content/docs/1_guide/5_templates/3_php-api/guide.txt diff --git a/content/1_docs/1_guide/5_templates/4_controllers/guide.txt b/content/docs/1_guide/5_templates/4_controllers/guide.txt similarity index 100% rename from content/1_docs/1_guide/5_templates/4_controllers/guide.txt rename to content/docs/1_guide/5_templates/4_controllers/guide.txt diff --git a/content/1_docs/1_guide/5_templates/5_collections/guide.txt b/content/docs/1_guide/5_templates/5_collections/guide.txt similarity index 100% rename from content/1_docs/1_guide/5_templates/5_collections/guide.txt rename to content/docs/1_guide/5_templates/5_collections/guide.txt diff --git a/content/1_docs/1_guide/5_templates/6_page-models/guide.txt b/content/docs/1_guide/5_templates/6_page-models/guide.txt similarity index 100% rename from content/1_docs/1_guide/5_templates/6_page-models/guide.txt rename to content/docs/1_guide/5_templates/6_page-models/guide.txt diff --git a/content/1_docs/1_guide/5_templates/6_resize-images-on-the-fly/guide.txt b/content/docs/1_guide/5_templates/6_resize-images-on-the-fly/guide.txt similarity index 100% rename from content/1_docs/1_guide/5_templates/6_resize-images-on-the-fly/guide.txt rename to content/docs/1_guide/5_templates/6_resize-images-on-the-fly/guide.txt diff --git a/content/1_docs/1_guide/5_templates/7_content-representations/guide.txt b/content/docs/1_guide/5_templates/7_content-representations/guide.txt similarity index 100% rename from content/1_docs/1_guide/5_templates/7_content-representations/guide.txt rename to content/docs/1_guide/5_templates/7_content-representations/guide.txt diff --git a/content/docs/1_guide/5_templates/components.svg b/content/docs/1_guide/5_templates/components.svg new file mode 100644 index 0000000000..8f39845281 --- /dev/null +++ b/content/docs/1_guide/5_templates/components.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/1_docs/1_guide/5_templates/guide.txt b/content/docs/1_guide/5_templates/guide.txt similarity index 100% rename from content/1_docs/1_guide/5_templates/guide.txt rename to content/docs/1_guide/5_templates/guide.txt diff --git a/content/docs/1_guide/6_blueprints/0_introduction/guide.txt b/content/docs/1_guide/6_blueprints/0_introduction/guide.txt new file mode 100644 index 0000000000..5a0871fc1e --- /dev/null +++ b/content/docs/1_guide/6_blueprints/0_introduction/guide.txt @@ -0,0 +1,122 @@ +Title: Introduction + +---- + +Intro: Blueprints are configuration files written in YAML that let you customize the (glossary: Panel) to make it truly yours. + +---- + +Thumbnail: tabs.png + +---- + +Text: + +## TL;DR + +- Blueprints are stored in `/site/blueprints`. +- Blueprints configure the Panel layout of the site, pages, files and users. +- Start simple with presets. +- Create your own layouts with tabs, columns and sections. + +## Blueprint types + +The Panel layouts for `site`, `pages`, `files` and `users` all get their own blueprints. The blueprint folder is structured accordingly: + +```filesystem +/site/blueprints/site.yml +/site/blueprints/files/ +/site/blueprints/pages/ +/site/blueprints/users/ +``` + +(reference: panel/blueprints) + + +The start page (Dashboard) of the Panel is defined in the `/site/blueprints/site.yml` blueprint. + + +## Presets + +We added three useful presets (`page`, `pages` and `files`) to our blueprints that you can use to create single pages, blogs, galleries and more with almost zero configuration. + +(link: docs/guide/blueprints/presets text: Learn more about presets…) + +## Layout + +When presets are not enough, you can be the interface designer. You decide which features are needed for each type of page, file or user and how to arrange them in (link: docs/guide/blueprints/tabs text: tabs), (link: docs/guide/blueprints/layout#defining-columns text: columns) and (link: docs/guide/blueprints/layout#adding-sections text: sections). + +(picture: tabs.png) + +(link: docs/guide/blueprints/layout text: Learn more about layouts…) + +## Fields + +With fields you can break up your content into digestable chunks and structure it according to your content model, rather than storing everything in a huge text field. You can add as many fields of different field types as you need. + +(link: docs/guide/blueprints/fields text: Learn more about fields…) + +## Query language + +Kirby comes with a blueprint query language that offers basically the same functionality as Kirby's PHP API with a simple dot notation. + +(link: docs/guide/blueprints/query-language text: Learn more about Kirby's blueprint query language…) + +## Extending blueprints + +You can store fields, sections, tabs and entire blueprint layouts in separate files so that they can be reused within your blueprints. If you want, you can even create a complete component system to apply to multiple projects. + +(link: docs/guide/blueprints/extending-blueprints text: Learn more about how to extend and reuse blueprints…) + +## Translating blueprints + +For editors from various language backgrounds, you can translate blueprint titles, form field labels, section headlines, help text, options, and more. + +(link: docs/guide/blueprints/translations text: Learn more about translating blueprints…) + +## Example blueprints + +We have put together an extensive collection of example blueprints for typical setups like a blog, a shop, a project portfolio and more for you to use as a basis for your own. + +(link: docs/reference/panel/samples text: Check out the example blueprints…) + +## More docs + +Our reference has more in-depth documentation about blueprints and their different components. + +(link: docs/reference/panel text: Check out the reference…) + +## Tips & Tricks + +### Using special characters in blueprint labels etc. + +To use special characters in labels etc., wrap the text in double quotes: + +```yaml +field1: + label: "Fotograf*in" + type: text +field2: + label: "Must do: this" + type: text +``` + +### Naming fields + +Make sure to only use alpha-numerical characters and underscores in field names. You cannot use dashes. + +Yes: + +```yaml +field_1: + label: Headline + type: text +``` + +No: + +```yaml +field-1: + label: Headline + type: text +``` \ No newline at end of file diff --git a/content/1_docs/1_guide/6_blueprints/0_introduction/tabs.png b/content/docs/1_guide/6_blueprints/0_introduction/tabs.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/0_introduction/tabs.png rename to content/docs/1_guide/6_blueprints/0_introduction/tabs.png diff --git a/content/1_docs/1_guide/6_blueprints/1_presets/blog.png b/content/docs/1_guide/6_blueprints/1_presets/blog.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/1_presets/blog.png rename to content/docs/1_guide/6_blueprints/1_presets/blog.png diff --git a/content/1_docs/1_guide/6_blueprints/1_presets/gallery.png b/content/docs/1_guide/6_blueprints/1_presets/gallery.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/1_presets/gallery.png rename to content/docs/1_guide/6_blueprints/1_presets/gallery.png diff --git a/content/1_docs/1_guide/6_blueprints/1_presets/guide.txt b/content/docs/1_guide/6_blueprints/1_presets/guide.txt similarity index 100% rename from content/1_docs/1_guide/6_blueprints/1_presets/guide.txt rename to content/docs/1_guide/6_blueprints/1_presets/guide.txt diff --git a/content/1_docs/1_guide/6_blueprints/1_presets/simple-page.png b/content/docs/1_guide/6_blueprints/1_presets/simple-page.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/1_presets/simple-page.png rename to content/docs/1_guide/6_blueprints/1_presets/simple-page.png diff --git a/content/1_docs/1_guide/6_blueprints/2_layout/columns-complex.png b/content/docs/1_guide/6_blueprints/2_layout/columns-complex.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/2_layout/columns-complex.png rename to content/docs/1_guide/6_blueprints/2_layout/columns-complex.png diff --git a/content/1_docs/1_guide/6_blueprints/2_layout/columns-screen-1.png b/content/docs/1_guide/6_blueprints/2_layout/columns-screen-1.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/2_layout/columns-screen-1.png rename to content/docs/1_guide/6_blueprints/2_layout/columns-screen-1.png diff --git a/content/1_docs/1_guide/6_blueprints/2_layout/columns-screen-2.png b/content/docs/1_guide/6_blueprints/2_layout/columns-screen-2.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/2_layout/columns-screen-2.png rename to content/docs/1_guide/6_blueprints/2_layout/columns-screen-2.png diff --git a/content/1_docs/1_guide/6_blueprints/2_layout/columns-screen-3.png b/content/docs/1_guide/6_blueprints/2_layout/columns-screen-3.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/2_layout/columns-screen-3.png rename to content/docs/1_guide/6_blueprints/2_layout/columns-screen-3.png diff --git a/content/1_docs/1_guide/6_blueprints/2_layout/columns.png b/content/docs/1_guide/6_blueprints/2_layout/columns.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/2_layout/columns.png rename to content/docs/1_guide/6_blueprints/2_layout/columns.png diff --git a/content/1_docs/1_guide/6_blueprints/2_layout/fields.png b/content/docs/1_guide/6_blueprints/2_layout/fields.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/2_layout/fields.png rename to content/docs/1_guide/6_blueprints/2_layout/fields.png diff --git a/content/1_docs/1_guide/6_blueprints/2_layout/guide.txt b/content/docs/1_guide/6_blueprints/2_layout/guide.txt similarity index 100% rename from content/1_docs/1_guide/6_blueprints/2_layout/guide.txt rename to content/docs/1_guide/6_blueprints/2_layout/guide.txt diff --git a/content/1_docs/1_guide/6_blueprints/2_layout/sections.png b/content/docs/1_guide/6_blueprints/2_layout/sections.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/2_layout/sections.png rename to content/docs/1_guide/6_blueprints/2_layout/sections.png diff --git a/content/1_docs/1_guide/6_blueprints/2_tabs/guide.txt b/content/docs/1_guide/6_blueprints/2_tabs/guide.txt similarity index 100% rename from content/1_docs/1_guide/6_blueprints/2_tabs/guide.txt rename to content/docs/1_guide/6_blueprints/2_tabs/guide.txt diff --git a/content/1_docs/1_guide/6_blueprints/2_tabs/tabs-screen.png b/content/docs/1_guide/6_blueprints/2_tabs/tabs-screen.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/2_tabs/tabs-screen.png rename to content/docs/1_guide/6_blueprints/2_tabs/tabs-screen.png diff --git a/content/1_docs/1_guide/6_blueprints/2_tabs/tabs.png b/content/docs/1_guide/6_blueprints/2_tabs/tabs.png similarity index 100% rename from content/1_docs/1_guide/6_blueprints/2_tabs/tabs.png rename to content/docs/1_guide/6_blueprints/2_tabs/tabs.png diff --git a/content/1_docs/1_guide/6_blueprints/3_fields/guide.txt b/content/docs/1_guide/6_blueprints/3_fields/guide.txt similarity index 100% rename from content/1_docs/1_guide/6_blueprints/3_fields/guide.txt rename to content/docs/1_guide/6_blueprints/3_fields/guide.txt diff --git a/content/1_docs/1_guide/6_blueprints/4_query-language/guide.txt b/content/docs/1_guide/6_blueprints/4_query-language/guide.txt similarity index 100% rename from content/1_docs/1_guide/6_blueprints/4_query-language/guide.txt rename to content/docs/1_guide/6_blueprints/4_query-language/guide.txt diff --git a/content/1_docs/1_guide/6_blueprints/5_extending-blueprints/guide.txt b/content/docs/1_guide/6_blueprints/5_extending-blueprints/guide.txt similarity index 100% rename from content/1_docs/1_guide/6_blueprints/5_extending-blueprints/guide.txt rename to content/docs/1_guide/6_blueprints/5_extending-blueprints/guide.txt diff --git a/content/1_docs/1_guide/6_blueprints/6_translations/guide.txt b/content/docs/1_guide/6_blueprints/6_translations/guide.txt similarity index 100% rename from content/1_docs/1_guide/6_blueprints/6_translations/guide.txt rename to content/docs/1_guide/6_blueprints/6_translations/guide.txt diff --git a/content/docs/1_guide/6_blueprints/form.svg b/content/docs/1_guide/6_blueprints/form.svg new file mode 100644 index 0000000000..4d017c9167 --- /dev/null +++ b/content/docs/1_guide/6_blueprints/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/1_docs/1_guide/6_blueprints/guide.txt b/content/docs/1_guide/6_blueprints/guide.txt similarity index 100% rename from content/1_docs/1_guide/6_blueprints/guide.txt rename to content/docs/1_guide/6_blueprints/guide.txt diff --git a/content/1_docs/1_guide/7_languages/1_introduction/delete-language.png b/content/docs/1_guide/7_languages/1_introduction/delete-language.png similarity index 100% rename from content/1_docs/1_guide/7_languages/1_introduction/delete-language.png rename to content/docs/1_guide/7_languages/1_introduction/delete-language.png diff --git a/content/1_docs/1_guide/7_languages/1_introduction/guide.txt b/content/docs/1_guide/7_languages/1_introduction/guide.txt similarity index 100% rename from content/1_docs/1_guide/7_languages/1_introduction/guide.txt rename to content/docs/1_guide/7_languages/1_introduction/guide.txt diff --git a/content/1_docs/1_guide/7_languages/1_introduction/multilang-panel-1.jpg b/content/docs/1_guide/7_languages/1_introduction/multilang-panel-1.jpg similarity index 100% rename from content/1_docs/1_guide/7_languages/1_introduction/multilang-panel-1.jpg rename to content/docs/1_guide/7_languages/1_introduction/multilang-panel-1.jpg diff --git a/content/1_docs/1_guide/7_languages/1_introduction/multilang-panel-2.jpg b/content/docs/1_guide/7_languages/1_introduction/multilang-panel-2.jpg similarity index 100% rename from content/1_docs/1_guide/7_languages/1_introduction/multilang-panel-2.jpg rename to content/docs/1_guide/7_languages/1_introduction/multilang-panel-2.jpg diff --git a/content/1_docs/1_guide/7_languages/1_introduction/multilang-panel-3.jpg b/content/docs/1_guide/7_languages/1_introduction/multilang-panel-3.jpg similarity index 100% rename from content/1_docs/1_guide/7_languages/1_introduction/multilang-panel-3.jpg rename to content/docs/1_guide/7_languages/1_introduction/multilang-panel-3.jpg diff --git a/content/1_docs/1_guide/7_languages/2_translating-content/guide.txt b/content/docs/1_guide/7_languages/2_translating-content/guide.txt similarity index 100% rename from content/1_docs/1_guide/7_languages/2_translating-content/guide.txt rename to content/docs/1_guide/7_languages/2_translating-content/guide.txt diff --git a/content/1_docs/1_guide/7_languages/2_translating-content/translating-content.png b/content/docs/1_guide/7_languages/2_translating-content/translating-content.png similarity index 100% rename from content/1_docs/1_guide/7_languages/2_translating-content/translating-content.png rename to content/docs/1_guide/7_languages/2_translating-content/translating-content.png diff --git a/content/1_docs/1_guide/7_languages/3_translating-urls/guide.txt b/content/docs/1_guide/7_languages/3_translating-urls/guide.txt similarity index 100% rename from content/1_docs/1_guide/7_languages/3_translating-urls/guide.txt rename to content/docs/1_guide/7_languages/3_translating-urls/guide.txt diff --git a/content/1_docs/1_guide/7_languages/4_custom-language-variables/guide.txt b/content/docs/1_guide/7_languages/4_custom-language-variables/guide.txt similarity index 100% rename from content/1_docs/1_guide/7_languages/4_custom-language-variables/guide.txt rename to content/docs/1_guide/7_languages/4_custom-language-variables/guide.txt diff --git a/content/1_docs/1_guide/7_languages/5_switching-languages/guide.txt b/content/docs/1_guide/7_languages/5_switching-languages/guide.txt similarity index 100% rename from content/1_docs/1_guide/7_languages/5_switching-languages/guide.txt rename to content/docs/1_guide/7_languages/5_switching-languages/guide.txt diff --git a/content/1_docs/1_guide/7_languages/6_supporting-RTL-languages/guide.txt b/content/docs/1_guide/7_languages/6_supporting-RTL-languages/guide.txt similarity index 100% rename from content/1_docs/1_guide/7_languages/6_supporting-RTL-languages/guide.txt rename to content/docs/1_guide/7_languages/6_supporting-RTL-languages/guide.txt diff --git a/content/1_docs/1_guide/7_languages/7_slug-rules/guide.txt b/content/docs/1_guide/7_languages/7_slug-rules/guide.txt similarity index 100% rename from content/1_docs/1_guide/7_languages/7_slug-rules/guide.txt rename to content/docs/1_guide/7_languages/7_slug-rules/guide.txt diff --git a/content/home/features/2_i18n/globe.svg b/content/docs/1_guide/7_languages/globe.svg similarity index 100% rename from content/home/features/2_i18n/globe.svg rename to content/docs/1_guide/7_languages/globe.svg diff --git a/content/1_docs/1_guide/7_languages/guide.txt b/content/docs/1_guide/7_languages/guide.txt similarity index 100% rename from content/1_docs/1_guide/7_languages/guide.txt rename to content/docs/1_guide/7_languages/guide.txt diff --git a/content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-4200283b-4317-4afd-9296-5957742708b2.11.26.png b/content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-4200283b-4317-4afd-9296-5957742708b2.11.26.png similarity index 100% rename from content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-4200283b-4317-4afd-9296-5957742708b2.11.26.png rename to content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-4200283b-4317-4afd-9296-5957742708b2.11.26.png diff --git a/content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-84655a61-367f-4582-88fa-c233da6dcf9d.17.57.png b/content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-84655a61-367f-4582-88fa-c233da6dcf9d.17.57.png similarity index 100% rename from content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-84655a61-367f-4582-88fa-c233da6dcf9d.17.57.png rename to content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-84655a61-367f-4582-88fa-c233da6dcf9d.17.57.png diff --git a/content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-d9560f35-f678-41ad-93f1-53c56a45243f.17.53.png b/content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-d9560f35-f678-41ad-93f1-53c56a45243f.17.53.png similarity index 100% rename from content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-d9560f35-f678-41ad-93f1-53c56a45243f.17.53.png rename to content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-d9560f35-f678-41ad-93f1-53c56a45243f.17.53.png diff --git a/content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-e7c14819-442d-441a-bb9c-307cf2e8dca3.18.01.png b/content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-e7c14819-442d-441a-bb9c-307cf2e8dca3.18.01.png similarity index 100% rename from content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-e7c14819-442d-441a-bb9c-307cf2e8dca3.18.01.png rename to content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-e7c14819-442d-441a-bb9c-307cf2e8dca3.18.01.png diff --git a/content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fbb0b860-3a0c-42f4-86a8-54c1171aed1e.18.13.png b/content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fbb0b860-3a0c-42f4-86a8-54c1171aed1e.18.13.png similarity index 100% rename from content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fbb0b860-3a0c-42f4-86a8-54c1171aed1e.18.13.png rename to content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fbb0b860-3a0c-42f4-86a8-54c1171aed1e.18.13.png diff --git a/content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fc6a994f-2a7f-461b-a50e-f03df3a2f5c3.18.08.png b/content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fc6a994f-2a7f-461b-a50e-f03df3a2f5c3.18.08.png similarity index 100% rename from content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fc6a994f-2a7f-461b-a50e-f03df3a2f5c3.18.08.png rename to content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fc6a994f-2a7f-461b-a50e-f03df3a2f5c3.18.08.png diff --git a/content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fda17201-052f-4976-9416-cce3d023f1bf.18.05.png b/content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fda17201-052f-4976-9416-cce3d023f1bf.18.05.png similarity index 100% rename from content/1_docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fda17201-052f-4976-9416-cce3d023f1bf.18.05.png rename to content/docs/1_guide/8_users/1_managing-users/Bildschirmfoto2018-07-05um11-fda17201-052f-4976-9416-cce3d023f1bf.18.05.png diff --git a/content/1_docs/1_guide/8_users/1_managing-users/guide.txt b/content/docs/1_guide/8_users/1_managing-users/guide.txt similarity index 100% rename from content/1_docs/1_guide/8_users/1_managing-users/guide.txt rename to content/docs/1_guide/8_users/1_managing-users/guide.txt diff --git a/content/1_docs/1_guide/8_users/2_roles/guide.txt b/content/docs/1_guide/8_users/2_roles/guide.txt similarity index 100% rename from content/1_docs/1_guide/8_users/2_roles/guide.txt rename to content/docs/1_guide/8_users/2_roles/guide.txt diff --git a/content/1_docs/1_guide/8_users/3_permissions/guide.txt b/content/docs/1_guide/8_users/3_permissions/guide.txt similarity index 100% rename from content/1_docs/1_guide/8_users/3_permissions/guide.txt rename to content/docs/1_guide/8_users/3_permissions/guide.txt diff --git a/content/1_docs/1_guide/8_users/guide.txt b/content/docs/1_guide/8_users/guide.txt similarity index 100% rename from content/1_docs/1_guide/8_users/guide.txt rename to content/docs/1_guide/8_users/guide.txt diff --git a/content/1_docs/1_guide/8_users/users.svg b/content/docs/1_guide/8_users/users.svg similarity index 100% rename from content/1_docs/1_guide/8_users/users.svg rename to content/docs/1_guide/8_users/users.svg diff --git a/content/1_docs/1_guide/9_configuration/guide.txt b/content/docs/1_guide/9_configuration/guide.txt similarity index 100% rename from content/1_docs/1_guide/9_configuration/guide.txt rename to content/docs/1_guide/9_configuration/guide.txt diff --git a/content/1_docs/1_guide/9_configuration/preferences-rotate.svg b/content/docs/1_guide/9_configuration/preferences-rotate.svg similarity index 100% rename from content/1_docs/1_guide/9_configuration/preferences-rotate.svg rename to content/docs/1_guide/9_configuration/preferences-rotate.svg diff --git a/content/1_docs/1_guide/guides.txt b/content/docs/1_guide/guides.txt similarity index 84% rename from content/1_docs/1_guide/guides.txt rename to content/docs/1_guide/guides.txt index 9d7a0f1770..817f07bab3 100644 --- a/content/1_docs/1_guide/guides.txt +++ b/content/docs/1_guide/guides.txt @@ -6,30 +6,36 @@ Description: Get an overview of all topics covered by Kirby’s documentation. ---- +Thumbnail: + - + image: outline/book.svg + +---- + Structure: Get started: - quickstart - tour - troubleshooting -Get productive: +Basics: - content - templates - blueprints - languages - users -Get advanced: +Advanced: - configuration - authentication - routing - cache - emails - database -Get pro: +Pro: - virtual-pages - api - plugins -Get secure: +Security: - security - kirby-and-privacy diff --git a/content/1_docs/1_guide/sessions/link.txt b/content/docs/1_guide/sessions/link.txt similarity index 100% rename from content/1_docs/1_guide/sessions/link.txt rename to content/docs/1_guide/sessions/link.txt diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-almost-there.png b/content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-almost-there.png similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-almost-there.png rename to content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-almost-there.png diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-creating-preview-step-one.png b/content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-creating-preview-step-one.png similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-creating-preview-step-one.png rename to content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-creating-preview-step-one.png diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-drawer.png b/content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-drawer.png similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-drawer.png rename to content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-drawer.png diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-empty.png b/content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-empty.png similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-empty.png rename to content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-empty.png diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-final-states.png b/content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-final-states.png similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-final-states.png rename to content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-final-states.png diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-frontend.png b/content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-frontend.png similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-frontend.png rename to content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-frontend.png diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-panel-preview.png b/content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-panel-preview.png similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-panel-preview.png rename to content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-panel-preview.png diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-type.png b/content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-type.png similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-type.png rename to content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-type.png diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-with-audio-tag.png b/content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-with-audio-tag.png similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-with-audio-tag.png rename to content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-with-audio-tag.png diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-without-preview.png b/content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-without-preview.png similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/audio-block-without-preview.png rename to content/docs/2_cookbook/10_panel/0_custom-block-type/audio-block-without-preview.png diff --git a/content/docs/2_cookbook/10_panel/0_custom-block-type/cookbook-recipe.txt b/content/docs/2_cookbook/10_panel/0_custom-block-type/cookbook-recipe.txt new file mode 100644 index 0000000000..40162047cd --- /dev/null +++ b/content/docs/2_cookbook/10_panel/0_custom-block-type/cookbook-recipe.txt @@ -0,0 +1,897 @@ +Title: Creating a custom block type from scratch + +---- + + +Published: 2021-03-01 + +---- + +Description: A step-by-step guide to creating custom blocks with a preview using the example of an audio block with a poster and some additional settings. + +---- + +Thumbnail: audio-block-final-states.png + +---- + +Text: + +Kirby's (link: docs/reference/panel/fields/blocks text: blocks field) comes with quite a few (link: docs/reference/panel/blocks text: default block types) that are great for most purposes and can be customized to your needs. But you probably wouldn't be reading this if you wouldn't be striving for more, and this recipe will hopefully be a great first step into your bright future as a custom block type developer 😉. + +## Prerequisites + +- A Kirby (link: docs/guide/quickstart#download-and-installation text: Plainkit or Starterkit) for testing +- A code editor +- Basic understanding (link: docs/guide/plugins/plugin-basics text: how to create plugins in Kirby) +- For the single file approach, (link: https://parceljs.org/ text: Parcel) must be installed on your system, unless you use your own custom build process. But don't worry, we also show you how to build this block without such a build process (see link below). +- Probably a big pot of hot coffee and a cool head. We are going to dive deep. + +## Resources + +- (file: sample.mp3 text: A sample mp3 file) +- (file: mr-pod.jpg text: A sample podcast cover) + +## Useful links +- (link: docs/guide/plugins/plugin-basics#kirby-plugin-one-ring-to-rule-them-all text: Registering extensions) +- (link: docs/reference/plugins/extensions/blocks text: Block previews) +- (link: docs/cookbook/panel/to-bundle-or-not-to-bundle text: To bundle or not to bundle: differences of creating plugins with or without a build process) + + +## What we will be building + +(screenshot: audio-block-panel-preview.png caption: Preview of our amazing audio block in the Panel) + +We are going to use the example of an audio block type to show you how to create custom block types for the blocks field from scratch, complete with an inline editable preview for the Panel using a single file component with a build process. + +A block type plugin basically consists of the following files: + +- An `index.php` to register the plugin (required for all plugins) +- A block yaml file that defines the fields available for the block type (required) +- A block snippet that renders the block on the frontend (required) +- An `index.js` file to render a Panel preview (optional) +- A `.vue` single component file (optional, requires build process) +- A package.json file for the bundler (optional) + +After finishing this tutorial, you should have a solid understanding about block types that will enable you to start building your own, even if you will never ever need an audio block at all. + +## Final plugin folder structure + +When we will be finished, the resulting folder structure of our plugin will look like this. When you are unsure where to put what, you can come back to this overview. + +```filesystem +plugins/ + audio-block/ + blueprints/ + blocks/ + audio.yml + files/ + audio.yml + poster.yml + snippets/ + blocks/ + audio.php + src/ + components/ + Audio.vue + index.js + index.php + index.js (auto-generated file) + package.json +``` + +## Register a new plugin + +Let's start with the most important plugin file, the `index.php`, where we register the blueprints for the block, two file blueprints to restrict file uploads, and the snippet to render the audio block on the frontend. + +```php "/site/plugins/audio-block/index.php" + [ + 'blocks/audio' => __DIR__ . '/blueprints/blocks/audio.yml', + 'files/audio' => __DIR__ . '/blueprints/files/audio.yml', + 'files/poster' => __DIR__ . '/blueprints/files/poster.yml', + ], + 'snippets' => [ + 'blocks/audio' => __DIR__ . '/snippets/blocks/audio.php', + ], +]); +``` +## The block blueprint + +In the audio block blueprint, we define the fields for the block that will later show up in the drawer in the Panel. In addition to the files field we need for the audio file itself, we add some additional settings for the audio tag like the controls and the autoplay attributes. And to make it less boring and more enlightening, our block gets a poster image, headlines and a description. + +You can adapt this blueprint to your needs, particularly if you want to add track files for audio transcriptions to make your audio files more accessible. + +```yaml "/site/plugins/audio-block/blueprints/blocks/audio.yml" +name: Audio +icon: file-audio +tabs: + main: + label: Main + fields: + poster: + type: files + query: page.images.template('poster') + uploads: poster + multiple: false + width: 1/2 + source: + type: files + query: page.audio.template('audio') + uploads: audio + multiple: false + width: 1/2 + title: + type: text + placeholder: Title + subtitle: + type: text + placeholder: Subtitle + description: + type: writer + icon: text + inline: true + placeholder: Description + marks: + - bold + - italic + settings: + label: Settings + fields: + controls: + type: toggle + text: Show controls? + width: 1/2 + default: true + autoplay: + type: toggle + text: autoplay + width: 1/2 + default: false +``` + +In our blueprint, we create two tabs, one for the general stuff and a second one for the audio settings. This is just to show (off) that you can use tabs to separate your different settings. + +When this block is open, the drawer will look like this: + +(screenshot: audio-block-drawer.png) +## File blueprints + +Since we want to prevent users from uploading non-audio files in the `source` field, we need a (link: docs/reference/panel/blueprints/file text: file blueprint), in which we can restrict file uploads via the `accept` property. + +We keep this simple, but of course, you can add fields to allow users to add meta data for the audio files. + +```yaml "/site/plugins/audio-block/blueprints/files/audio.yml" +title: Audio + +accept: + extension: mp3 + +fields: + # some fields here if you want +``` + +And while we are at it, let's add the `poster.yml` blueprint to restrict the file types allowed for the poster field as well. We also want an `alt` field to fill the `alt` attribute. + +```yaml "/site/plugins/audio-block/blueprints/files/poster.yml" +title: Poster + +accept: + extension: jpg, jpeg, png, webp + +fields: + alt: + type: text +``` + +## Snippet for the frontend + +Inside the block snippet, you have access to the full `$block` (link: docs/reference/objects/blocktext: Block object) with all kinds of properties and methods, and of course to the fields we defined for the block in the block blueprint. + +```php "/site/plugins/audio-block/snippets/blocks/audio.php" +source()->toFile()): ?> +
+ poster()->toFile()): ?> +
+ crop(200, 200) ?> +
+ +
+

title()->html() ?>

+

subtitle()->html() ?>

+
+ description() ?> +
+ +
+
+ +``` + +In the first line, we check if we can convert the filename stored in the source field into a file object, so that the markup of the snippet is only rendered if there is an audio file. + +We then check if we have a poster file object, and if that is the case, we render a figure tag with the image. + +For the audio element's source tag, we need the file's URL and the mime type, which are available through the file object. + +We also check whether to show the controls, and if the audio should start auto-playing on load. + +In most cases, controls should be present to allow users to interact with the audio, and autoplay should be off. It's up to you whether you want to make these setting available to the user at all. If not, remove the corresponding fields from the audio block blueprint. Or add other (link: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio#attributes text: attributes) available for the audio element. + +We should probably also add some basic styling: + +```html + +``` + +For the sake of this tutorial, we put the styles within a style tag at the top of the `audio.php` block snippet. But you can also provide a sample CSS file with your block plugin. Users of your block type can then properly include those styles in their own frontend code. + +At this point, our new block is ready to be used in the Panel and can be rendered on the frontend. Time to give yourself a first pat on the shoulder. + +## Using the new block in the blocks field + +To use the new block type, for example in a page blueprint, let's add it to our blocks field. + +If you are using the Starterkit, open the file `/site/blueprints/pages/note.yml`, where we already have a blocks field. It currently looks like this: + +```yaml "/site/blueprints/pages/note.yml" +fields: + text: + type: blocks +``` + +To add our custom block, we need to list all fieldsets we want to use for this block: + +```yaml "/site/blueprints/pages/note.yml" +fields: + text: + type: blocks + fieldsets: + - heading + - text + - gallery + - audio + # more block types here if you want +``` + +The order we use here will determine the order in which these blocks will appear in the block list. + +If you use a Plainkit, add this blocks field definition in the `/site/blueprints/pages/default.yml` blueprint or create a new blueprint. + + +For more information how to list fieldsets, create groups of fieldsets etc., check out the (link: docs/reference/panel/fields/blocks text: blocks field docs). + + +Now head over to the Panel, fill in some data, and open the page on the frontend. It will look similar to this: + +(screenshot: audio-block-frontend.png) + +However, our block in the Panel currently looks like this: + +(screenshot: audio-block-without-preview.png) + +We can surely do better. In the next step, we are going to change this and create a slightly more pleasant preview with an audio tag. + +## Simple `index.js` + +We can start very basic with an `index.js` **next to the main `index.php` file**: + +```js "/site/plugins/audio-block/index.js" +panel.plugin("cookbook/audio-block", { + blocks: { + audio: { + template: ` +
+ Listen to Mr. Pod talk about stuff +
+ ` + } + } +}); +``` + +(screenshot: audio-block-creating-preview-step-one.png) + +Not really what we want to end up with, but easy, right? + +Let's replace this with an audio tag and the title from our block (we leave the other fields for later to prevent being too repetitive): + +```js "/site/plugins/audio-block/index.js" +panel.plugin("cookbook/audio-block", { + blocks: { + audio: { + template: ` +
+

{{ content.title }}

+ +
+ ` + } + } +}); +``` + +We have access to the fields through `content`, so we can get the title with `content.title`. The `content.source` files field returns an array of file objects, so we can fetch the first one with the index `0` and the URL from the `url` property. + +Now listen to this! We have a simple audio tag preview with a title (provided that we selected a file before). + +But hold on! If we tried to add an audio block now in the Panel, we will run into an error. Try it out. Why's that? Because we haven't made sure that we actually have a file. Let's change this with a computed method to pass to the `src` attribute: + +```js "/site/plugins/audio-block/index.js" +panel.plugin("cookbook/audio-block", { + blocks: { + audio: { + computed: { + source() { + return this.content.source[0] || {}; + } + }, + template: ` +
+
+

{{ content.title }}

+ +
+
No audio selected
+
+ ` + } + } +}); +``` + +The computed `source` method checks if the file exists and returns an empty object otherwise. In the template we can now use the `v-if`/`v-else` directive to render either the audio element or a message that no audio file was selected if the URL is missing in that object. + +(screenshot: audio-block-with-audio-tag.png) + +Theoretically, we could now go ahead and put all our methods and the complete template into this file. Additional styling could be applied by creating an `index.css` file for our plugin. + +But that gets a bit tedious for more complex block previews. We can make our lives a lot easier with single file components. + +Feel free to stop here and relax if your blocks don't require more than that. Or head over to our (link: docs/cookbook/panel/to-bundle-or-not-to-bundle text: To bundle or not to bundle: differences of creating plugins with or without a build process) recipe to learn how to create our complete example without a build process. + +## `index.js` with single file component + +Since we want to use a single file component in this example, let's move our current `index.js` file one level up into a new `src` folder. Our build process will then auto-generate the main `index.js` file from this file. + +We also need a `package.json` next to `index.php` with the following content: + +```js "/site/plugins/audio-block/package.json" +{ + "scripts": { + "dev": "parcel watch src/index.js --no-source-maps -d ./", + "build": "parcel build src/index.js --no-source-maps --experimental-scope-hoisting -d ./" + }, + "posthtml": { + "recognizeSelfClosing": true + } +} +``` +This file tells the (link: https://parceljs.org/ text: Parcel) bundler which files to compile and an output destination. Since our plugin setup is always the same in our documentation, it's the same file we also use in our other Panel related plugin recipes. + +If you haven't installed Parcel globally yet, you can do this by running the following command: + +``` +npm install -g parcel-bundler +``` + +The `package.json` file has two script commands, `dev` and `build`. The `dev` command runs a watcher that compiles the source files whenever we are making changes, the `build` command builds our production-ready file. + +Back to our `index.js`, where we import the yet to create `Audio.vue` component and assign it to the audio block: + +```js "/site/plugins/audio-block/src/index.js" +import Audio from './components/Audio.vue'; + +panel.plugin("cookbook/audio-block", { + blocks: { + audio: Audio + } +}); +``` + +From now on, all the stuff we had in the old `index.js` now moves into the component file. +## `Audio.vue` single file component + +Create an `Audio.vue` file in `/src/components`. Then let's start by recreating exactly what we had before: + +```html "/site/plugins/audio-block/src/components/Audio.vue" + + + +``` + +The only differences to our previous code is that we wrapped the HTML in a template tag, and export the JavaScript within script tags. + +### Compiling… + +To see the result of our endeavors, we compile the file. Open a terminal, `cd` into the plugin folder and run the command… + +``` +npm run dev +``` + +to start the watch process. + +If all went well, you will find a compiled `index.js` in the root of the audio-block plugin folder. In the Panel, everything should look exactly the same as before. + +## Refining + +Now for some refinements. After all, our poster is not there yet, nor have we made use of the other fields. +### A placeholder and the missing pieces + +As our first refinement step, we wrap the current HTML in a `k-block-figure` component to get a nice placeholder when there is no audio file selected yet. The exact same core component is also used for the image and video blocks. + +```html "/site/plugins/audio-block/src/components/Audio.vue" + +``` +(screenshot: audio-block-empty.png) + +We also add some missing pieces, i.e. the subtitle and the description. + +Note how we use the `v-html` directive to render the contents of the descriptions field, which is a writer field that contains HTML. If we would try to render it without this directive, all HTML tags would be shown as plain text. + + +`v-html` should only be used if you trust the HTML that's being entered. Our writer field already sanitizes the HTML so we are fine here. + + +### Adding the poster and some styling + +For the poster that is stored in the `poster` field, we take advantage of Kirby's `k-aspect-ratio` Vue component to display a square image. + +```html + + + +``` + +We use a hard-coded ratio and set the `cover` attribute to `true`, but this can of course be made configurable from the blueprint. + +We haven't defined the `posterUrl` method yet, which does the same as the `source` method for the audio. + +Here is the complete code for this step with some added styling: + +```html "/site/plugins/audio-block/src/components/Audio.vue" + + + + +``` + +It starts to look like what we anticipated at the beginning: + +(screenshot: audio-block-almost-there.png) +### Side quest: Getting the mime type through the API + +If you look closely, you will notice that we hard-coded the mime-type of the audio file all this time, because we don't have access to the mime type of the file through `content.source[0]`. In our example it doesn't really matter much because we limited the uploadable file types to `.mp3` files. But once we want to allow multiple files types or want to provide multiple file formats for the same audio file, we better find out how to get at the file object (who knows, maybe you need exactly that piece of information in one of your next custom blocks). + +Long story short, Kirby's API to the rescue. In this case, we need access to the endpoint `api/pages/:id/files/:filename`. + +To this purpose, let's fetch more information about the file in a watch method. + +```js +//... +data() { + return { + mime: null + }; +}, +watch: { + "source.link": { + handler(link) { + if (link) { + this.$api.get(link).then(file => { + this.mime = file.mime; + }); + } + }, + immediate: true + } +}, +// ... +``` + +Watch methods are a fantastic concept in Vue.js to react on changes in your component. In this case, we watch for any changes to the link key of our source object. Isn't it fantastic that we can even watch nested keys with the dot syntax? + +Whenever the source file changes, the handler method will run and fetch information about the file from the API with `this.$api.get(link)`. With `immediate: true` we can tell the watch method to be called for the first time when the component has been created. + +Once we get back the file from the API, we put the mime type into our new mime property, which we've defined in the component's data method. This will make it available in our template. + +New status of our code: + +```html "/site/plugins/audio-block/src/components/Audio.vue" + + + + + +``` + +Congratulations. Side quest completed! 👏 + +### Making the text fields editable + +Ok, that was a lot of stuff. But we are not ready yet. As promised in the intro, we want to make the headlines and the description editable. + +To do this, we will replace all text instances with `k-writer` components: + +So instead of the `h1` element + +```html +

{{content.title}}

+```` + +We use + +```html + +``` + +The writer component is a simple WYSIWYG editor for inline styles (bold, italic, etc.) With an enabled `inline` option, we will tell the editor to insert `
` instead of paragraphs for line breaks. With the `marks` option, we can activate or deactivate particular inline styles. We don't need them here. We could also use a simple input field instead, but the writer will adapt its size to the content and will also work better for the description field. + +Another speciality of a block preview component is the built-in `field` method. We can use it to access blueprint settings for fields in our drawer. This is super handy to get field properties for our WYSIWYG preview. In this case, we get the placeholders from the blueprint: `field('title').placeholder` + +If we repeat this procedure for every field, we end up with our final result: + +```html "/site/plugins/audio-block/src/components/Audio.vue" + + + + + +``` + +Note that we ignored the audio settings like controls and autoplay for the preview because they are not relevant here. If you want to change that, you should know enough by now to adapt all settings to your liking. + +You also might have noticed this line: + +```html +
+``` + +The `` component has a built-in handler to open the block drawer on double-click. This is cool, but it's not ideal for writer components. I.e. you might want to double-click to select some text. With `@dblclick.stop` we can prevent the double-click event from bubbling up. The drawer will not open when we double-click on one of the writers. + +You should definitely check out the docs for (link: https://vuejs.org/v2/guide/events.html text: Vue’s awesome event handling shortcuts) for more tricks like this. + + +## End result + +As a last step, we run the final build step with + +``` +npm run build +``` + +This will create the final `index.js` and `index.css` files that are now ready to be shipped. Your plugin is finished! + +In its different states the block now looks like this: + +(screenshot: audio-block-final-states.png) diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/mr-pod.jpg b/content/docs/2_cookbook/10_panel/0_custom-block-type/mr-pod.jpg similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/mr-pod.jpg rename to content/docs/2_cookbook/10_panel/0_custom-block-type/mr-pod.jpg diff --git a/content/1_docs/2_cookbook/10_panel/0_custom-block-type/sample.mp3 b/content/docs/2_cookbook/10_panel/0_custom-block-type/sample.mp3 similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_custom-block-type/sample.mp3 rename to content/docs/2_cookbook/10_panel/0_custom-block-type/sample.mp3 diff --git a/content/1_docs/2_cookbook/10_panel/0_customizing-panel/cookbook-recipe.txt b/content/docs/2_cookbook/10_panel/0_customizing-panel/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_customizing-panel/cookbook-recipe.txt rename to content/docs/2_cookbook/10_panel/0_customizing-panel/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/10_panel/0_to-bundle-or-not-to-bundle/cookbook-recipe.txt b/content/docs/2_cookbook/10_panel/0_to-bundle-or-not-to-bundle/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/10_panel/0_to-bundle-or-not-to-bundle/cookbook-recipe.txt rename to content/docs/2_cookbook/10_panel/0_to-bundle-or-not-to-bundle/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/10_panel/cookbook-category.txt b/content/docs/2_cookbook/10_panel/cookbook-category.txt similarity index 100% rename from content/1_docs/2_cookbook/10_panel/cookbook-category.txt rename to content/docs/2_cookbook/10_panel/cookbook-category.txt diff --git a/content/1_docs/2_cookbook/1_text/0_custom-fields/01.png b/content/docs/2_cookbook/1_text/0_custom-fields/01.png similarity index 100% rename from content/1_docs/2_cookbook/1_text/0_custom-fields/01.png rename to content/docs/2_cookbook/1_text/0_custom-fields/01.png diff --git a/content/1_docs/2_cookbook/1_text/0_custom-fields/02.png b/content/docs/2_cookbook/1_text/0_custom-fields/02.png similarity index 100% rename from content/1_docs/2_cookbook/1_text/0_custom-fields/02.png rename to content/docs/2_cookbook/1_text/0_custom-fields/02.png diff --git a/content/1_docs/2_cookbook/1_text/0_custom-fields/03.png b/content/docs/2_cookbook/1_text/0_custom-fields/03.png similarity index 100% rename from content/1_docs/2_cookbook/1_text/0_custom-fields/03.png rename to content/docs/2_cookbook/1_text/0_custom-fields/03.png diff --git a/content/1_docs/2_cookbook/1_text/0_custom-fields/04.png b/content/docs/2_cookbook/1_text/0_custom-fields/04.png similarity index 100% rename from content/1_docs/2_cookbook/1_text/0_custom-fields/04.png rename to content/docs/2_cookbook/1_text/0_custom-fields/04.png diff --git a/content/1_docs/2_cookbook/1_text/0_custom-fields/cookbook-recipe.txt b/content/docs/2_cookbook/1_text/0_custom-fields/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/1_text/0_custom-fields/cookbook-recipe.txt rename to content/docs/2_cookbook/1_text/0_custom-fields/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/1_text/0_dates/cookbook-recipe.txt b/content/docs/2_cookbook/1_text/0_dates/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/1_text/0_dates/cookbook-recipe.txt rename to content/docs/2_cookbook/1_text/0_dates/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/1_text/cookbook-category.txt b/content/docs/2_cookbook/1_text/cookbook-category.txt similarity index 100% rename from content/1_docs/2_cookbook/1_text/cookbook-category.txt rename to content/docs/2_cookbook/1_text/cookbook-category.txt diff --git a/content/1_docs/2_cookbook/2_content/0_filter-via-route/cookbook-recipe.txt b/content/docs/2_cookbook/2_content/0_filter-via-route/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/2_content/0_filter-via-route/cookbook-recipe.txt rename to content/docs/2_cookbook/2_content/0_filter-via-route/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/2_content/0_filtering-with-tags/cookbook-recipe.txt b/content/docs/2_cookbook/2_content/0_filtering-with-tags/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/2_content/0_filtering-with-tags/cookbook-recipe.txt rename to content/docs/2_cookbook/2_content/0_filtering-with-tags/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/2_content/0_filtering/cookbook-recipe.txt b/content/docs/2_cookbook/2_content/0_filtering/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/2_content/0_filtering/cookbook-recipe.txt rename to content/docs/2_cookbook/2_content/0_filtering/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/2_content/0_grouping-collections/cookbook-recipe.txt b/content/docs/2_cookbook/2_content/0_grouping-collections/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/2_content/0_grouping-collections/cookbook-recipe.txt rename to content/docs/2_cookbook/2_content/0_grouping-collections/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/2_content/0_random-content/cookbook-recipe.txt b/content/docs/2_cookbook/2_content/0_random-content/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/2_content/0_random-content/cookbook-recipe.txt rename to content/docs/2_cookbook/2_content/0_random-content/cookbook-recipe.txt diff --git a/content/docs/2_cookbook/2_content/0_related-articles/cookbook-recipe.txt b/content/docs/2_cookbook/2_content/0_related-articles/cookbook-recipe.txt new file mode 100644 index 0000000000..da32abf8d5 --- /dev/null +++ b/content/docs/2_cookbook/2_content/0_related-articles/cookbook-recipe.txt @@ -0,0 +1,77 @@ +Title: Related articles + +---- + +Description: Build relations between articles using YAML content and the pages field. + +---- + +Thumbnail: related.png + +---- + +Text: + +With **(glossary: yaml text: YAML) content** and the **pages field** you can easily link information on your site with other sources in Kirby. All examples below are based on the (link: docs/guide/installation#installation text: Starterkit). + +## In your content files + +Add a new field to any of your content files to which you'd like to add related pages: + +```kirbycontent "/content/2_notes/20180625_a-night-in-the-forest/note.txt" + Title: A night in the forest + ---- + Text: Some insightful text for the audience + ---- + Related: + + - notes/across-the-ocean + - notes/in-the-jungle-of-sumatra +``` + +You are free to name the field that contains the related pages however you like, as long as you take care of using the right variable in the template later. + +Add any number of related pages with the (glossary: yaml text: YAML) syntax. To link pages, store their URI (the URL without your domain) in the content file. Since the URI is unique, Kirby will always be able to find the right page, even if you change its content or its sorting number. You have to be careful, however, if you change the location of a page or its folder name. + +If you don't want to add and edit the entries manually in the content file, make sure to (link: #in-the-panel text: set up the Panel) accordingly. + +## In your templates + +Accessing those related posts in your templates could look like this: + +```php "/site/templates/note.php" +related()->toPages(); +if ($related->count() > 0): +?> +

Related

+ + +``` + +We use the field method [`->toPages()`](/docs/reference/templates/field-methods/to-pages) to convert the (glossary: yaml text: YAML) list of page ids from the field to a pages collection. After that we can iterate over the pages collection and use the familiar (link: docs/guide/templates/php-api text: Kirby PHP API). + + +## In the Panel + +If you use the (glossary: panel), you have to add the `related` field to your (glossary: blueprint text: blueprint). The **(link: docs/reference/panel/fields/pages text: pages field)** offers a great way to select one or more related articles. + + +```yaml "/site/blueprints/pages/note.yml" + related: + label: Related articles + type: pages + query: page.siblings(false) +``` + +We use the `query` option to display all sibling pages of the current page in the list. By passing `false` to the [`siblings()`](/docs/reference/objects/page/siblings) method, we exclude the current page from the list – we don't want the article itself to be a related article. (link: docs/guide/blueprints/query-language text: Learn more) about our query syntax. + +(screenshot: related.png) diff --git a/content/1_docs/2_cookbook/2_content/0_related-articles/related.png b/content/docs/2_cookbook/2_content/0_related-articles/related.png similarity index 100% rename from content/1_docs/2_cookbook/2_content/0_related-articles/related.png rename to content/docs/2_cookbook/2_content/0_related-articles/related.png diff --git a/content/1_docs/2_cookbook/2_content/0_search/cookbook-recipe.txt b/content/docs/2_cookbook/2_content/0_search/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/2_content/0_search/cookbook-recipe.txt rename to content/docs/2_cookbook/2_content/0_search/cookbook-recipe.txt diff --git a/content/docs/2_cookbook/2_content/0_sitemap/cookbook-recipe.txt b/content/docs/2_cookbook/2_content/0_sitemap/cookbook-recipe.txt new file mode 100644 index 0000000000..11c711fb01 --- /dev/null +++ b/content/docs/2_cookbook/2_content/0_sitemap/cookbook-recipe.txt @@ -0,0 +1,100 @@ +Title: Sitemap for search engines + +---- + +Published: 2018-11-25 + +---- + +Description: Automatically create a sitemap for search engines. + +---- + +Text: + +For basic search engine optimization it's good to have a sitemap.xml file, which contains machine-readable information about all the pages and the structure of your site. + +The syntax for such a `sitemap.xml` file is fairly simple. You can find all about it on . + +Because you probably don't want to generate that file by hand, you can create a snippet that indexes your entire site and generates a `sitemap.xml` for you in a few steps: + + +## Create the snippet with your XML + +Create a new snippet with the following content in `/site/snippets`: + +```php "/site/snippets/sitemap.php" +'; ?> + + + uri(), $ignore)) continue ?> + + url()) ?> + modified('c', 'date') ?> + isHomePage()) ? 1 : number_format(0.5 / $p->depth(), 1) ?> + + + +``` + +## Create new routes + +In your `config.php`, create these two new (glossary: route text: routes): + +```php "/site/config/config.php" + [ + [ + 'pattern' => 'sitemap.xml', + 'action' => function() { + $pages = site()->pages()->index(); + + // fetch the pages to ignore from the config settings, + // if nothing is set, we ignore the error page + $ignore = kirby()->option('sitemap.ignore', ['error']); + + $content = snippet('sitemap', compact('pages', 'ignore'), true); + + // return response with correct header type + return new Kirby\Cms\Response($content, 'application/xml'); + } + ], + [ + 'pattern' => 'sitemap', + 'action' => function() { + return go('sitemap.xml', 301); + } + ] + ] +]; +``` + +You can now visit the sitemap of your Kirby site by browsing `http://yourdomain.com/sitemap` or `http://yourdomain.com/sitemap.xml`. The second route redirects to the first. + + +## Excluding pages from your sitemap + +You can do that in your config. Here we call the option `sitemap.ignore`. + +```php "/site/config/config.php" +return [ + 'sitemap.ignore' => ['error'], +]; +``` + +## Automatic Priorities + +The sitemap (glossary: template text: template) will automatically try to create priorites for each page, by using the `->depth()` attribute. The depth attribute is a simple number, which indicates how deep the page is nested. Main pages have a depth of 1, subpages of main pages have a depth of 2, etc. + +The `home` page will automatically get a priority of 1. You can easily change priorities or remove them entirely if you prefer. + + +## Submitting your sitemap to a search engine + +To let your favorite search engines know about your brand-new sitemap, please read the instructions on [sitemap.org](http://www.sitemaps.org/protocol.html#informing). + +## Extending the basic example + +This is a very basic example. If you need something more complex, you can either use one of the (link: https://getkirby.com/plugins text: plugins provided by the community), or extend it yourself, for example, by fine-tuning the options for pages you want to ignore (e.g. filter by template), or adding images. diff --git a/content/1_docs/2_cookbook/2_content/0_sorting/cookbook-recipe.txt b/content/docs/2_cookbook/2_content/0_sorting/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/2_content/0_sorting/cookbook-recipe.txt rename to content/docs/2_cookbook/2_content/0_sorting/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/2_content/0_sorting/grouping-and-sorting.png b/content/docs/2_cookbook/2_content/0_sorting/grouping-and-sorting.png similarity index 100% rename from content/1_docs/2_cookbook/2_content/0_sorting/grouping-and-sorting.png rename to content/docs/2_cookbook/2_content/0_sorting/grouping-and-sorting.png diff --git a/content/1_docs/2_cookbook/2_content/0_structured-field-content/cookbook-recipe.txt b/content/docs/2_cookbook/2_content/0_structured-field-content/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/2_content/0_structured-field-content/cookbook-recipe.txt rename to content/docs/2_cookbook/2_content/0_structured-field-content/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/2_content/cookbook-category.txt b/content/docs/2_cookbook/2_content/cookbook-category.txt similarity index 100% rename from content/1_docs/2_cookbook/2_content/cookbook-category.txt rename to content/docs/2_cookbook/2_content/cookbook-category.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_ajax-load-more/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_ajax-load-more/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_ajax-load-more/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_ajax-load-more/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_ajax-load-more/load-more.png b/content/docs/2_cookbook/3_templating/0_ajax-load-more/load-more.png similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_ajax-load-more/load-more.png rename to content/docs/2_cookbook/3_templating/0_ajax-load-more/load-more.png diff --git a/content/1_docs/2_cookbook/3_templating/0_art-directed-blog-posts/01.png b/content/docs/2_cookbook/3_templating/0_art-directed-blog-posts/01.png similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_art-directed-blog-posts/01.png rename to content/docs/2_cookbook/3_templating/0_art-directed-blog-posts/01.png diff --git a/content/1_docs/2_cookbook/3_templating/0_art-directed-blog-posts/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_art-directed-blog-posts/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_art-directed-blog-posts/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_art-directed-blog-posts/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_authors/author-form.jpg b/content/docs/2_cookbook/3_templating/0_authors/author-form.jpg similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_authors/author-form.jpg rename to content/docs/2_cookbook/3_templating/0_authors/author-form.jpg diff --git a/content/1_docs/2_cookbook/3_templating/0_authors/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_authors/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_authors/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_authors/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_blueprints-in-frontend/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_blueprints-in-frontend/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_blueprints-in-frontend/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_blueprints-in-frontend/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_create-a-blog/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_create-a-blog/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_create-a-blog/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_create-a-blog/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_custom-post-types/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_custom-post-types/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_custom-post-types/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_custom-post-types/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_fetching-field-options/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_fetching-field-options/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_fetching-field-options/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_fetching-field-options/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_fine-tuning-the-cache/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_fine-tuning-the-cache/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_fine-tuning-the-cache/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_fine-tuning-the-cache/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_generating-json/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_generating-json/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_generating-json/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_generating-json/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_homepage-title/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_homepage-title/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_homepage-title/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_homepage-title/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_keep_your_code_dry/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_keep_your_code_dry/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_keep_your_code_dry/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_keep_your_code_dry/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_loops/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_loops/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_loops/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_loops/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_menu-builder/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_menu-builder/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_menu-builder/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_menu-builder/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_menu-builder/menu-builders.jpg b/content/docs/2_cookbook/3_templating/0_menu-builder/menu-builders.jpg similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_menu-builder/menu-builders.jpg rename to content/docs/2_cookbook/3_templating/0_menu-builder/menu-builders.jpg diff --git a/content/1_docs/2_cookbook/3_templating/0_menus/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_menus/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_menus/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_menus/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_one-pager/01.png b/content/docs/2_cookbook/3_templating/0_one-pager/01.png similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_one-pager/01.png rename to content/docs/2_cookbook/3_templating/0_one-pager/01.png diff --git a/content/1_docs/2_cookbook/3_templating/0_one-pager/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_one-pager/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_one-pager/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_one-pager/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_paginating-posts/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_paginating-posts/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_paginating-posts/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_paginating-posts/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_pagination/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_pagination/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_pagination/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_pagination/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_php-templates/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_php-templates/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_php-templates/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_php-templates/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_previous-next/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_previous-next/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_previous-next/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_previous-next/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_shared-controllers/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_shared-controllers/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_shared-controllers/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_shared-controllers/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_understanding-oop/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_understanding-oop/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_understanding-oop/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_understanding-oop/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_update-blocks-programmatically/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_update-blocks-programmatically/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_update-blocks-programmatically/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_update-blocks-programmatically/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/cookbook-recipe.txt b/content/docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/cookbook-recipe.txt rename to content/docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/gallery-overview.png b/content/docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/gallery-overview.png similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/gallery-overview.png rename to content/docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/gallery-overview.png diff --git a/content/1_docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/panel-form.png b/content/docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/panel-form.png similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/panel-form.png rename to content/docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/panel-form.png diff --git a/content/1_docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/panel-overview.png b/content/docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/panel-overview.png similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/panel-overview.png rename to content/docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/panel-overview.png diff --git a/content/1_docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/surfing-with-sharks.png b/content/docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/surfing-with-sharks.png similarity index 100% rename from content/1_docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/surfing-with-sharks.png rename to content/docs/2_cookbook/3_templating/0_virtual-pages-image-gallery/surfing-with-sharks.png diff --git a/content/1_docs/2_cookbook/3_templating/cookbook-category.txt b/content/docs/2_cookbook/3_templating/cookbook-category.txt similarity index 100% rename from content/1_docs/2_cookbook/3_templating/cookbook-category.txt rename to content/docs/2_cookbook/3_templating/cookbook-category.txt diff --git a/content/1_docs/2_cookbook/4_forms/0_basic-contact-form/cookbook-recipe.txt b/content/docs/2_cookbook/4_forms/0_basic-contact-form/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/4_forms/0_basic-contact-form/cookbook-recipe.txt rename to content/docs/2_cookbook/4_forms/0_basic-contact-form/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/4_forms/0_creating-pages-from-frontend/cookbook-recipe.txt b/content/docs/2_cookbook/4_forms/0_creating-pages-from-frontend/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/4_forms/0_creating-pages-from-frontend/cookbook-recipe.txt rename to content/docs/2_cookbook/4_forms/0_creating-pages-from-frontend/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/4_forms/0_creating-pages-from-frontend/eventkit.zip b/content/docs/2_cookbook/4_forms/0_creating-pages-from-frontend/eventkit.zip similarity index 100% rename from content/1_docs/2_cookbook/4_forms/0_creating-pages-from-frontend/eventkit.zip rename to content/docs/2_cookbook/4_forms/0_creating-pages-from-frontend/eventkit.zip diff --git a/content/1_docs/2_cookbook/4_forms/0_email-with-attachments/cookbook-recipe.txt b/content/docs/2_cookbook/4_forms/0_email-with-attachments/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/4_forms/0_email-with-attachments/cookbook-recipe.txt rename to content/docs/2_cookbook/4_forms/0_email-with-attachments/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/4_forms/0_email-with-attachments/jobkit.zip b/content/docs/2_cookbook/4_forms/0_email-with-attachments/jobkit.zip similarity index 100% rename from content/1_docs/2_cookbook/4_forms/0_email-with-attachments/jobkit.zip rename to content/docs/2_cookbook/4_forms/0_email-with-attachments/jobkit.zip diff --git a/content/1_docs/2_cookbook/4_forms/0_file-uploads/cookbook-recipe.txt b/content/docs/2_cookbook/4_forms/0_file-uploads/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/4_forms/0_file-uploads/cookbook-recipe.txt rename to content/docs/2_cookbook/4_forms/0_file-uploads/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/cookbook-recipe.txt b/content/docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/cookbook-recipe.txt rename to content/docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/mailhog-mail.png b/content/docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/mailhog-mail.png similarity index 100% rename from content/1_docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/mailhog-mail.png rename to content/docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/mailhog-mail.png diff --git a/content/1_docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/mailhog-ui.png b/content/docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/mailhog-ui.png similarity index 100% rename from content/1_docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/mailhog-ui.png rename to content/docs/2_cookbook/4_forms/0_using-mailhog-for-email-testing/mailhog-ui.png diff --git a/content/1_docs/2_cookbook/4_forms/cookbook-category.txt b/content/docs/2_cookbook/4_forms/cookbook-category.txt similarity index 100% rename from content/1_docs/2_cookbook/4_forms/cookbook-category.txt rename to content/docs/2_cookbook/4_forms/cookbook-category.txt diff --git a/content/1_docs/2_cookbook/5_i18n/0_filter-by-language/cookbook-recipe.txt b/content/docs/2_cookbook/5_i18n/0_filter-by-language/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/5_i18n/0_filter-by-language/cookbook-recipe.txt rename to content/docs/2_cookbook/5_i18n/0_filter-by-language/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/5_i18n/0_find-translations/cookbook-recipe.txt b/content/docs/2_cookbook/5_i18n/0_find-translations/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/5_i18n/0_find-translations/cookbook-recipe.txt rename to content/docs/2_cookbook/5_i18n/0_find-translations/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/5_i18n/0_import-export/cookbook-recipe.txt b/content/docs/2_cookbook/5_i18n/0_import-export/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/5_i18n/0_import-export/cookbook-recipe.txt rename to content/docs/2_cookbook/5_i18n/0_import-export/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/5_i18n/0_language-variables/cookbook-recipe.txt b/content/docs/2_cookbook/5_i18n/0_language-variables/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/5_i18n/0_language-variables/cookbook-recipe.txt rename to content/docs/2_cookbook/5_i18n/0_language-variables/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/5_i18n/0_using-variables-in-language-strings/cookbook-recipe.txt b/content/docs/2_cookbook/5_i18n/0_using-variables-in-language-strings/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/5_i18n/0_using-variables-in-language-strings/cookbook-recipe.txt rename to content/docs/2_cookbook/5_i18n/0_using-variables-in-language-strings/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/5_i18n/cookbook-category.txt b/content/docs/2_cookbook/5_i18n/cookbook-category.txt similarity index 100% rename from content/1_docs/2_cookbook/5_i18n/cookbook-category.txt rename to content/docs/2_cookbook/5_i18n/cookbook-category.txt diff --git a/content/1_docs/2_cookbook/6_security/0_access-restriction/cookbook-recipe.txt b/content/docs/2_cookbook/6_security/0_access-restriction/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/6_security/0_access-restriction/cookbook-recipe.txt rename to content/docs/2_cookbook/6_security/0_access-restriction/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/6_security/cookbook-category.txt b/content/docs/2_cookbook/6_security/cookbook-category.txt similarity index 100% rename from content/1_docs/2_cookbook/6_security/cookbook-category.txt rename to content/docs/2_cookbook/6_security/cookbook-category.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_ab-testing/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_ab-testing/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_ab-testing/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_ab-testing/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_columns-in-kirbytext/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_columns-in-kirbytext/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_columns-in-kirbytext/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_columns-in-kirbytext/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_content-file-cleanup/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_content-file-cleanup/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_content-file-cleanup/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_content-file-cleanup/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_extending-kirbytags/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_extending-kirbytags/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_extending-kirbytags/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_extending-kirbytags/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-field/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_first-panel-field/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-field/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_first-panel-field/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-1.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-1.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-1.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-1.jpg diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-2.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-2.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-2.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-2.jpg diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-3.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-3.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-3.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-3.jpg diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-4.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-4.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-4.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-4.jpg diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-5.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-5.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-5.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-5.jpg diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-6.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-6.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-6.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-6.jpg diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-7.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-7.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-7.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-7.jpg diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-8.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-8.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-field/doifield-8.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-field/doifield-8.jpg diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-section/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_first-panel-section/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-section/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_first-panel-section/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-section/custom-section.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-section/custom-section.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-section/custom-section.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-section/custom-section.jpg diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-view/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_first-panel-view/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-view/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_first-panel-view/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-view/empty-panel-view.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-view/empty-panel-view.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-view/empty-panel-view.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-view/empty-panel-view.jpg diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-view/movie-reviews-custom-view.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-view/movie-reviews-custom-view.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-view/movie-reviews-custom-view.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-view/movie-reviews-custom-view.jpg diff --git a/content/1_docs/2_cookbook/7_extensions/0_first-panel-view/panel-view-with-card.jpg b/content/docs/2_cookbook/7_extensions/0_first-panel-view/panel-view-with-card.jpg similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_first-panel-view/panel-view-with-card.jpg rename to content/docs/2_cookbook/7_extensions/0_first-panel-view/panel-view-with-card.jpg diff --git a/content/docs/2_cookbook/7_extensions/0_kirby-loves-cdn/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_kirby-loves-cdn/cookbook-recipe.txt new file mode 100644 index 0000000000..5ba8ec49e3 --- /dev/null +++ b/content/docs/2_cookbook/7_extensions/0_kirby-loves-cdn/cookbook-recipe.txt @@ -0,0 +1,296 @@ +Title: Kirby loves CDN + +---- + +Description: Set up custom components to deliver assets and files through a CDN. + +---- + +Published: 2021-01-05 + +---- + +Text: + +## Who is this recipe for? + +In this recipe we will look into using a CDN with Kirby to deliver static assets and files. This is particularly relevant for website owners who address a worldwide audience. + +## What is a CDN and why use it + +Usually, all your assets live on your own web server and are thus served from a single location. This is fine as long as your website visitors all come from the same region where your webserver is located. However, if your site is intended for an international audience, the latency caused by long distances between webserver and visitor will hurt your website's performance massively. + +A CDN––the acronym stands for Content Distribution Network––takes your assets and stores them on servers in different locations around the world. When a visitor requests your site, the CDN will locate the nearest available server and load all assets from there. This significantly reduces request times and your site will load faster no matter where your visitors come from. + +CDNs work with so-called Zones, either Push or Pull Zones. + +## Push Zones + +If you use a Push Zone, you upload all your assets via FTP or SSH to the CDN's servers and the CDN will spread them from there for you. This is great for static assets that don't change very often, or if you use a custom deploy script that automates the uploads for you when something changes. Once the Push Zone is created, you will get a public URL for your assets from the CDN, for example `https://mypushzone.mycdn.com/myfile.jpg`. + +Push Zones are often recommended or even required if you want to host files beyond a certain size. + +## Pull Zones + +A Pull Zone is the most common Zone type and easier to set up. With this method, the CDN automatically pulls content from your web server and caches it on the CDN's servers. Once the content is cached, visitor requests will be routed and delivered from the nearest possible server location. + +So for example if your logo is located at + +``` +https://yourdomain.com/assets/images/logo.png +``` + +it will be requested from your Pull Zone like this: + +``` +https://yourpullzone.yourcdn.com/assets/images/logo.png +``` + +The Pull Zone will fetch the logo on the first request and spread it across the network. + +In this recipe, we will look at using a Pull Zone approach with (link: https://www.keycdn.com/ text: KeyCDN), the CDN provider we also use on the Kirby website. However, this approach should also work similarly with other CDN providers. + +## Setting up your Pull Zone + +The first step is to create a Pull Zone in your CDN provider's account settings. For KeyCDN you can find the instructions in their documentation in the chapter (link: https://www.keycdn.com/support/create-a-pull-zone text: Create a Pull Zone). + +## Zone Alias + +Optionally, you can create a Zone Alias. Zone Aliases allow you to use your own custom CDN URL (e.g. `cdn.yourdomain.com`) instead of the KeyCDN URL. For this to work, you have to add the Zone Alias as CNAME record in your DNS. + +Head over to (link: https://www.keycdn.com/support/create-a-zone-alias text: Create a Zone Alias) if you want to do this and follow the instructions. + + +If your website uses TLS, set up a certificate first before you create a Zone Alias. + + +Once you have set up your Zone and an optional Zone Alias, you are ready to start working on the Kirby side of things. + +## CDN plugin + +On the Kirby side, we now have to make sure that the assets we want to serve from the CDN use the CDN's Zone URL instead of the ones linked to the website's domain, and this without us having to manually change each URL. We can achieve this with the (link: docs/reference/plugins/components/url text: `url` component extension), which will take care of rerouting the relevant paths. + +On a Kirby site there are typically two folders with files for which we would need to change the URL to point to a CDN: + +- assets +- media + + +If you use a different folder where you store your assets, you will have to change the path accordingly. + + +### Setting the CDN domain in `config.php` + +Let's start with configuring the options for the CDN plugin in `config.php` (if this file doesn't exist, create it in `/site/config`): + +```php "/site/config/config.php" + true, + 'cdn.domain' => 'https://yourpullzone.yourcdn.com' +]; +``` + +Here we set two options: With the `cdn` option we control if the plugin should route our assets through the plugin or not, so that we can easily disable it. With the `cdn.domain` option, we set the domain for the Pull Zone we created above. + +### The URL component + +Let's start with the (link: docs/reference/plugins/components/url text: URL component) for the static assets, leaving alone files from the media folder for the moment. + +```php "/site/plugins/cdn/index.php" + [ + 'url' => function ($kirby, $path, $options) { + if (option('cdn', false) !== false && Str::startsWith($path, 'assets')) { + return option('cdn.domain') . '/' . $path; + } + + $original = $kirby->nativeComponent('url'); + return $original($kirby, $path, $options); + }, + ] +]); +``` + +Without any limitations, the URL component would modify all Kirby URLs. Therefore, we first check if the `cdn` option is enabled, and if that's the case, we want limit the routes to URLs in the `/assets` path. We therefore check if the path matches the given regex pattern (i.e. if it begins with the `assets` bit): + +```php +Str::startsWith($path, 'assets') +``` +All other paths remain untouched. We use the original native `url` component for all other paths, retrieving it via `$kirby->nativeComponent()`. + +Almost there! But hold on: you will notice that we added the original path after the CDN domain. However, what if our assets are updated? How will the CDN know that it has to fetch a new file? Keep on reading! + +## Cache busting + +A problem when using CDNs is the lifespan of the assets on the network. When you upload a new `css` or `js` file, it may take some time until the new file is updated across the network and this could result in unwanted effects. + +This is where cache-busting is used to force the CDN to load the new version of a files once it has changed. The most common way of doing this is to add a version number or timestamp to the filename. There are different ways to achieve this. On the (link: https://getkirby.com text: getkirby.com) website, we do it within a plugin - you can take a look in the (link: https://github.com/getkirby/getkirby.com/tree/main/site/plugins/cdn/src/Cachebuster.php text: getkirby.com repo). If we put this plugin into the `/site/plugins` folder, we can then modify the code above like this: + +```php "/site/plugins/cdn/index.php" + [ + 'url' => function ($kirby, $path, $options) { + if (Str::startsWith($path, 'assets')) { + $path = Cachebuster::path($path); + + if (option('cdn', false) !== false) { + return option('cdn.domain') . '/' . $path; + } + } + + $original = $kirby->nativeComponent('url'); + return $original($kirby, $path, $options); + }, + ] +]); +``` + +The `Cachebuster::path($path)` method adds a hash to each asset, which will then look something like this: + +``` +https://yourzone.kxcdn.com/assets/css/index.e63bf9fd.css +``` + + +If you already use another cache busting plugin or your own solution, you will have to replace the `Cachebuster::path($path)` part in the code above with the corresponding method of your choice. + + +## Serving files + +Let's extend the plugin code in order to route the URLs to these files automatically through KeyCDN as well. + +For this purpose, we have to create the (link: docs/reference/plugins/components/file-version text: `file::version`) and (link: docs/reference/plugins/components/file-urls text: `file::url`) components, and we also need a helper method that we use in both components. Here is the complete code with annotations for better understanding: + + +To process images using KeyCDN, you have to enable this feature in your Pull Zone settings. Allow for some time for your zone to catch up with the new settings. Note that image processing comes at an additional cost. + + +```php "/site/plugins/cdn/index.php" +mediaUrl(); + } + + // set the path + $path = Url::path($file); + + // return final URL + return option('cdn.domain') . '/' . $path . $query; +} + +Kirby::plugin('author/cdn', [ + 'components' => [ + 'url' => function ($kirby, $path, $options, $original) { + + static $original; + + if (Str::startsWith($path, 'assets')) { + $path = Cachebuster::path($path); + + if (option('cdn', false) !== false) { + return option('cdn.domain') . '/' . $path; + } + } + + if ($original === null) { + $original = $kirby->nativeComponent('url'); + } + + return $original($kirby, $path, $options); + }, + 'file::version' => function (Kirby $kirby, File $file, array $options = []) { + + static $original; + + // if cdn option is enabled + if (option('cdn', false) !== false) { + $url = cdn($file, $options); + // return a new FileVersion object with the given settings + return new FileVersion([ + 'modifications' => $options, + 'original' => $file, + 'root' => $file->root(), + 'url' => $url, + ]); + } + + // if static $original is null, get the original component + if ($original === null) { + $original = $kirby->nativeComponent('file::version'); + } + + // and return it with the given options + return $original($kirby, $file, $options); + }, + 'file::url' => function (Kirby $kirby, File $file): string { + + static $original; + + // if the file type is an image + if ($file->type() === 'image') { + // call the cdn method + return cdn($file); + } + + // if static $original is null, get the original component + if ($original === null) { + $original = $kirby->nativeComponent('file::url'); + } + + // and return it with the given options + return $original($kirby, $file); + } + ] +]); +``` + + +If you have other files than images that you also want to route through the CDN, remove the if-statement around the `cdn()` function call in the `file::url` component. + + +## Image processing + +KeyCDN offers image processing via URL parameters. That means KeyCDN fetches the original file on first load and returns either the original (if we do not request a file version) or a modified version according to the parameters we pass along when requesting a thumb. + +With this plugin in place, you can now use (link: https://www.keycdn.com/support/image-processing text: all image processing features supported by KeyCDN), by passing those parameters to the `thumb()` method, which will give you a lot more options than Kirby's native processing. + +```php +image()->thumb(['width' => 300, 'negate' => true]) ?> + +… or … + +image()->thumb([ + 'width' => 300, + 'height' => 300, + 'crop' => true, + 'blur' => 2 +]) ?> +``` + +Using Kirby's shortcuts `crop()`, `resize()`, `bw()` etc. is also still possible. diff --git a/content/1_docs/2_cookbook/7_extensions/0_kirbytext-hooks/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_kirbytext-hooks/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_kirbytext-hooks/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_kirbytext-hooks/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_permission-tricks/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_permission-tricks/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_permission-tricks/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_permission-tricks/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_subpage-builder/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_subpage-builder/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_subpage-builder/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_subpage-builder/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_table-of-contents/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_table-of-contents/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_table-of-contents/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_table-of-contents/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/0_use-placeholders/cookbook-recipe.txt b/content/docs/2_cookbook/7_extensions/0_use-placeholders/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/0_use-placeholders/cookbook-recipe.txt rename to content/docs/2_cookbook/7_extensions/0_use-placeholders/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/7_extensions/cookbook-category.txt b/content/docs/2_cookbook/7_extensions/cookbook-category.txt similarity index 100% rename from content/1_docs/2_cookbook/7_extensions/cookbook-category.txt rename to content/docs/2_cookbook/7_extensions/cookbook-category.txt diff --git a/content/1_docs/2_cookbook/8_integrations/0_dropbox/cookbook-recipe.txt b/content/docs/2_cookbook/8_integrations/0_dropbox/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/8_integrations/0_dropbox/cookbook-recipe.txt rename to content/docs/2_cookbook/8_integrations/0_dropbox/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/8_integrations/0_indieauth/cookbook-recipe.txt b/content/docs/2_cookbook/8_integrations/0_indieauth/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/8_integrations/0_indieauth/cookbook-recipe.txt rename to content/docs/2_cookbook/8_integrations/0_indieauth/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/8_integrations/0_share-buttons/cookbook-recipe.txt b/content/docs/2_cookbook/8_integrations/0_share-buttons/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/8_integrations/0_share-buttons/cookbook-recipe.txt rename to content/docs/2_cookbook/8_integrations/0_share-buttons/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/8_integrations/cookbook-category.txt b/content/docs/2_cookbook/8_integrations/cookbook-category.txt similarity index 100% rename from content/1_docs/2_cookbook/8_integrations/cookbook-category.txt rename to content/docs/2_cookbook/8_integrations/cookbook-category.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_composer/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_composer/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_composer/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_composer/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_debugging-basics/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_debugging-basics/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_debugging-basics/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_debugging-basics/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_development-environment/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_development-environment/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_development-environment/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_development-environment/cookbook-recipe.txt diff --git a/content/docs/2_cookbook/9_setup/0_getkirby-com/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_getkirby-com/cookbook-recipe.txt new file mode 100644 index 0000000000..23d5325a3c --- /dev/null +++ b/content/docs/2_cookbook/9_setup/0_getkirby-com/cookbook-recipe.txt @@ -0,0 +1,292 @@ +Title: How we built getkirby.com + +---- + +Published: 2019-01-22 + +---- + +Description: Learn more about the hidden gems and secrets in our own website. + +---- + +Text: + +The Kirby website plays a very special role for us and has two main objectives: One is presenting Kirby and its features to the world and doing a good job to generate happy customers and hopefully some sales. The other is providing Kirby’s documentation––the part that has always been way more complex than the rest. + +(picture: home.jpg) + +In this article, I want to focus on all the hidden gems and secrets we built into this site to make our lives easier while maintaining the documentation and to give you better and more reliable docs. + +**** + +When we set out to create a new site for Kirby 3, we wanted to avoid repeating the mistakes we made with our old documentation that was built and maintained mainly by hand. That process was always error-prone and time-consuming. + +With the new Kirby version that comes with so many changes under the hood, we knew it would be too much effort to update everything manually. Fortunately, our new version has a very special feature we used to solve this… + +## Virtual pages + +While Kirby's main data source is still files and folders, you can now mix regular pages with content coming from a database, CSV file, API or anything else that PHP can parse. In our case, a huge part of our reference is generated directly from PHP reflections and other bits of magic. + +### Pages from PHP reflections + +"What are PHP reflections?" you might ask. PHP has (link: https://www.php.net/manual/en/book.reflection.php text: a built-in set of classes) that you can use to inspect your own code. If you want to know more details about a certain PHP class, for example, you can do the following: + +```php +$reflection = new ReflectionClass('MyClass'); + +foreach ($reflection->getMethods() as $method) { + var_dump($method->getName()); +} +``` + +Reflections have many handy little features such as getting the visibility of a method, a list of arguments, the return type and even access to the doc blocks in your code. + +To document our main classes (i.e. (link: docs/reference/objects/site text: $site), (link: docs/reference/objects/page text: $page), (link: docs/reference/objects/file text: $file)) and their methods, we use this feature inside a (link: docs/guide/templates/page-models text: page model) to create automatic subpages for each method. + +In our reference, we use regular pages to add each documented class: + +```filesystem +docs/ + reference/ + objects/ + file/ + class.txt + page/ + class.txt + site/ + class.txt +``` + +Each `class.txt` contains the full name of the class we want to document: + +```kirbycontent + Class: Kirby\Cms\Page + ---- +``` + +The class pages have their own page model. This page model overwrites the default children method to fetch subpages from the reflection. + +```php "/site/models/class.php" +class ClassPage extends Page +{ + + public function reflection() + { + return new ReflectionClass($this->class()->value()); + } + + public function children() + { + $methods = $this->reflection()->getMethods(); + $children = []; + + foreach ($methods as $method) { + $children[] = [ + 'slug' => Str::kebab($method->getName()), + 'model' => 'method', + 'template' => 'method', + 'parent' => $this, + ]; + } + + return Pages::factory($children, $this); + } + +} +``` + +Children are created as an array that we then pass to the `Pages::factory()` method. That's pretty much all you have to do to create virtual subpages that are not necessarily located in the file system. + +Those subpages are first-class citizens in Kirby and everything around them will work. You can filter or sort them, routing works out of the box, templates will work, etc. (link: docs/reference/objects/page/num text: Here's an example of such a virtual page). + +Here, we define that each subpage automatically gets a new `MethodPage` model. We use this model to fetch more information about each class method and to inject it into the template (arguments, method call, return type, etc.) You could nest this indefinitely if you want and combine it again with real pages in the file system. The possibilities are endless. + +We use the same technique for our (link: docs/reference/templates/helpers text: helpers), (link: docs/reference/system/validators text: validators), (link: docs/reference/templates/field-methods text: field methods) and (link: docs/reference text: more). + +### Pages from an SVG file + +Ok, it may sound weird, but you can actually create pages from an SVG icon sprite. As SVG is just XML, PHP can parse it. We wanted to document the icon set we use in the Panel to make it available for all plugin developers. That icon set is updated constantly with new icons and we wanted to reflect those changes in the docs without too much work. + +(screenshot: icons.jpg) + +To document our icon set, the reference has an icons page with an `icons.txt` + +```filesystem +docs/ + reference/ + icons/ + icons.txt +``` + +Like the `ClassPage` and `MethodPage` models there are also `IconsPage` and `IconPage` models. The `IconsPage` model fetches all icons from the sprite and the `IconPage` model injects additional information from the sprite into its template. + +Our icon sprite for the panel looks like this: +```xml + + + + + + + + +``` + +Here is the code for the `IconsPage` model: + +```php "/site/models/icons.php" + +class IconsPage extends Page +{ + + public function svg() + { + return F::read($this->kirby()->root('panel') . '/dist/img/icons.svg'); + } + + public function children() + { + $svg = new SimpleXMLElement($this->svg()); + $children = []; + + foreach ($svg->defs->children() as $symbol) { + $children[] = [ + 'slug' => str_replace('icon-', '', $symbol->attributes()->id), + 'template' => 'icon', + 'model' => 'icon', + 'num' => 0 + ]; + } + + return Pages::factory($children, $this)->sortBy('slug'); + } + +} +``` + +As you can see in the example above, the model takes the contents of the SVG directly from the panel dist files inside the kirby folder. So the icon documentation stays up to date as long as we keep our Kirby installation updated. Generating the subpages from the sprite is then a matter of parsing the SVG, looping through all symbols and passing the details to the `Pages::factory()`. + +### Automatic FTW + +Combining regular pages with such automated content generators has worked really great for us so far. Additionally, we can combine our auto-generated content with hand-written content to make it less technical and provide real-life examples, while making sure that tiny details are always correct. + +When things like arguments or return types are not correctly documented, we instantly know we need to fix this in our source code. That elevates our documentation to a real-time code quality tool. + +## Syntax highlighting + +Fabian spent a lot of time improving the syntax highlighter of our code examples. We use (link: https://prismjs.com/ text: prism.js) for the highlighting part and Fabian added quite a few enhancements to the Markdown parser (Parsedown) to implement more features for code blocks. + +We now have syntax highlighting for HTML, PHP, JS, CSS, JSON, YAML, and our own Kirby field syntax in text files. + +```kirbycontent + title: Hello world + ---- + text: Lorem ipsum … +``` + +Every code block has a copy button and we can inject the filename in a small toolbar above the example, showing you where to put the examples in your installations. + +```php "/site/templates/default.php" + + + + + +``` + +My favorite is the new filesystem block Fabian created. We used to document structures in the filesystem with screenshots, which was never user-friendly and hard to keep updated and consistent: + +```filesystem +content/ + projects/ + project-a/ + project.txt + example.jpg + download.pdf + code.js + styles.css + data.json +``` + +We can create those examples in our text files like this: + +``` +```filesystem +content/ + projects/ + project-a/ + project.txt + example.jpg + download.pdf + code.js + styles.css + data.json +``` + +The code detects folders and files automatically and adds icons that match the file type. I’m seriously in love with Fabian’s work here. + +## Our new glossary + +Some of you might have noticed that we have a new (link: docs/glossary text: glossary) in our docs menu. We wanted a simple page where newcomers can learn about the terms we use. A term like `blueprint` is confusing without further context. But a glossary is often ignored or not very helpful when you stumble upon such a term while reading the docs. That’s why we looked for a way to inject our short explanations from the glossary into any page without too much distraction. + +Fabian created a popup-bubble system that pulls in the description for a term as soon as we use the (`glossary: blueprint`) KirbyTag in our text. + +Here's an example: (glossary: blueprint) + +We still have to use these more often in our docs, but it's great to have such a tool at hand. Especially if it help to avoid detours in articles about other topics. + +## A new checkout + +Those of you who already purchased or upgraded a license met our new checkout powered by (link: http://paddle.com text: Paddle). After seven years with FastSpring, we decided to move forward and give Paddle a chance. Not an easy decision. FastSpring has been very reliable over all those years and their support was absolutely amazing. But we were never happy with the user experience of their checkout process. It always felt old and sluggish and we got many complaints from our customers. Paddle feels a lot closer to a modern checkout system like Stripe and we hope that it simplifies the process of buying licenses and makes it more enjoyable for you. + +## Our stack + +### Server + +Finally, a few words on our setup. We use a 4GB (link: https://www.linode.com/?r=64097ab6f175feee46523de8b645cb1cb45d15e0 text: Linode) VPS to run this site, just as we did for the old website. We use Nginx as our favorite server, PHP 7.2 with opcache enabled and APCU as our page cache engine. ((link: docs/guide/cache text: Kirby has a built-in APCU driver)) + +### KeyCDN +We host all our assets on (link: https://www.keycdn.com/ text: KeyCDN) with a tiny little KeyCDN plugin: + +```php + [ + 'url' => function ($kirby, $path, $options) { + $original = $kirby->nativeComponent('url'); + + if (preg_match('!assets!', $path)) { + $path = Cachebuster::path($path); + + if (option('keycdn', false) !== false) { + return option('keycdn.domain') . '/' . $path; + } + } + + return $original($kirby, $path, $options); + } + ] +]); +``` + +The plugin also takes care of optimizing images. Check out the (link: https://github.com/getkirby/getkirby.com/blob/main/site/plugins/cdn/index.php text: source code) if you are interested in learning more about it. + +### Algolia + +We still trust in (link: https://algolia.com text: Algolia) for our search. They have been great over the last years and we get a very powerful search with very little effort. We re-index our content whenever we push updates to the server. This way we can make sure that the search index is always up to date. + +### Deployment + +Whenever we push changes to our (link: https://github.com/getkirby/getkirby.com text: master branch on GitHub), (link: https://deployhq.com text: DeployHQ) picks those changes up and deploys them to our server. This workflow is the fastest for us as a team and we can all work remotely on different parts of the site and iterate quickly over issues. + +## Get involved + +We try to keep everything as tidy and complete as possible. If you find anything that's not correct or missing, please let us know: https://github.com/getkirby/getkirby.com/issues + +You can even fix issues yourself if you like. **We appreciate all pull requests!** + +## It's all there + +If you are looking for more details about the implementations mentioned above, feel free to dive into our code and content and check out how we built it: https://github.com/getkirby/getkirby.com diff --git a/content/1_docs/2_cookbook/9_setup/0_getkirby-com/home.jpg b/content/docs/2_cookbook/9_setup/0_getkirby-com/home.jpg similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_getkirby-com/home.jpg rename to content/docs/2_cookbook/9_setup/0_getkirby-com/home.jpg diff --git a/content/1_docs/2_cookbook/9_setup/0_getkirby-com/icons.jpg b/content/docs/2_cookbook/9_setup/0_getkirby-com/icons.jpg similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_getkirby-com/icons.jpg rename to content/docs/2_cookbook/9_setup/0_getkirby-com/icons.jpg diff --git a/content/1_docs/2_cookbook/9_setup/0_git/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_git/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_git/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_git/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/files-section-vs-files-field.png b/content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/files-section-vs-files-field.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/files-section-vs-files-field.png rename to content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/files-section-vs-files-field.png diff --git a/content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/from-blueprint-to-frontend.png b/content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/from-blueprint-to-frontend.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/from-blueprint-to-frontend.png rename to content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/from-blueprint-to-frontend.png diff --git a/content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/pages-section-vs-pages-field.png b/content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/pages-section-vs-pages-field.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/pages-section-vs-pages-field.png rename to content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/pages-section-vs-pages-field.png diff --git a/content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/panel-dashboard.png b/content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/panel-dashboard.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/panel-dashboard.png rename to content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/panel-dashboard.png diff --git a/content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/panel-form-fields.png b/content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/panel-form-fields.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/panel-form-fields.png rename to content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/panel-form-fields.png diff --git a/content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/showcase.png b/content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/showcase.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/showcase.png rename to content/docs/2_cookbook/9_setup/0_kirby-in-a-nutshell/showcase.png diff --git a/content/1_docs/2_cookbook/9_setup/0_migrate-files/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_migrate-files/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_migrate-files/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_migrate-files/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_migrate-plugins/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_migrate-plugins/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_migrate-plugins/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_migrate-plugins/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_migrate-site/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_migrate-site/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_migrate-site/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_migrate-site/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_migrate-users/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_migrate-users/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_migrate-users/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_migrate-users/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_monolithic-plugin-setup/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_monolithic-plugin-setup/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_monolithic-plugin-setup/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_monolithic-plugin-setup/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_multisite-variant/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_multisite-variant/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_multisite-variant/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_multisite-variant/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_multisite/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_multisite/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_multisite/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_multisite/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_page-on-own-domain/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_page-on-own-domain/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_page-on-own-domain/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_page-on-own-domain/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/breakpoints-tab.png b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/breakpoints-tab.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/breakpoints-tab.png rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/breakpoints-tab.png diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/breakpoints.png b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/breakpoints.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/breakpoints.png rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/breakpoints.png diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/callstack-tab.png b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/callstack-tab.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/callstack-tab.png rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/callstack-tab.png diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/debug-session.png b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/debug-session.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/debug-session.png rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/debug-session.png diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/debug-toolbar.png b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/debug-toolbar.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/debug-toolbar.png rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/debug-toolbar.png diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/empty-tag-variable.png b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/empty-tag-variable.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/empty-tag-variable.png rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/empty-tag-variable.png diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/filtered-notes.png b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/filtered-notes.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/filtered-notes.png rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/filtered-notes.png diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/notes-variable.png b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/notes-variable.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/notes-variable.png rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/notes-variable.png diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/run-tab.png b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/run-tab.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/run-tab.png rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/run-tab.png diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/tag-variable.png b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/tag-variable.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/tag-variable.png rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/tag-variable.png diff --git a/content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/uninitialized-variables.png b/content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/uninitialized-variables.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/uninitialized-variables.png rename to content/docs/2_cookbook/9_setup/0_php-debugging-with-xdebug/uninitialized-variables.png diff --git a/content/1_docs/2_cookbook/9_setup/0_plugin-workflow/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_plugin-workflow/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_plugin-workflow/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_plugin-workflow/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_plugin-workflow/plugin.gif b/content/docs/2_cookbook/9_setup/0_plugin-workflow/plugin.gif similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_plugin-workflow/plugin.gif rename to content/docs/2_cookbook/9_setup/0_plugin-workflow/plugin.gif diff --git a/content/1_docs/2_cookbook/9_setup/0_redirects/01.png b/content/docs/2_cookbook/9_setup/0_redirects/01.png similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_redirects/01.png rename to content/docs/2_cookbook/9_setup/0_redirects/01.png diff --git a/content/1_docs/2_cookbook/9_setup/0_redirects/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_redirects/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_redirects/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_redirects/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_selective-page-cache/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_selective-page-cache/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_selective-page-cache/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_selective-page-cache/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/0_trailing-slash/cookbook-recipe.txt b/content/docs/2_cookbook/9_setup/0_trailing-slash/cookbook-recipe.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/0_trailing-slash/cookbook-recipe.txt rename to content/docs/2_cookbook/9_setup/0_trailing-slash/cookbook-recipe.txt diff --git a/content/1_docs/2_cookbook/9_setup/cookbook-category.txt b/content/docs/2_cookbook/9_setup/cookbook-category.txt similarity index 100% rename from content/1_docs/2_cookbook/9_setup/cookbook-category.txt rename to content/docs/2_cookbook/9_setup/cookbook-category.txt diff --git a/content/1_docs/2_cookbook/cookbook.svg b/content/docs/2_cookbook/cookbook.svg similarity index 100% rename from content/1_docs/2_cookbook/cookbook.svg rename to content/docs/2_cookbook/cookbook.svg diff --git a/content/docs/2_cookbook/cookbook.txt b/content/docs/2_cookbook/cookbook.txt new file mode 100644 index 0000000000..a39bb91cae --- /dev/null +++ b/content/docs/2_cookbook/cookbook.txt @@ -0,0 +1,11 @@ +Title: Cookbook + +---- + +Description: Delicious recipes and solutions for common tasks. + +---- + +Thumbnail: + - + image: outline/bookmark.svg diff --git a/content/docs/2_cookbook/new/cookbook-category.txt b/content/docs/2_cookbook/new/cookbook-category.txt new file mode 100644 index 0000000000..a468de3e42 --- /dev/null +++ b/content/docs/2_cookbook/new/cookbook-category.txt @@ -0,0 +1 @@ +Title: New diff --git a/content/1_docs/3_reference/10_@/1_classes/reference-packages.txt b/content/docs/3_reference/10_@/1_classes/reference-packages.txt similarity index 100% rename from content/1_docs/3_reference/10_@/1_classes/reference-packages.txt rename to content/docs/3_reference/10_@/1_classes/reference-packages.txt diff --git a/content/docs/3_reference/10_@/2_aliases/reference-classaliases.txt b/content/docs/3_reference/10_@/2_aliases/reference-classaliases.txt new file mode 100644 index 0000000000..04a7d4d8f8 --- /dev/null +++ b/content/docs/3_reference/10_@/2_aliases/reference-classaliases.txt @@ -0,0 +1,5 @@ +Title: Aliases + +---- + +Excerpt: In Kirby, classes are separated in different namespaces such as `Kirby\Cms\` or `Kirby\Http\`. Aliases help to access specific classes without the need to mention their namespace. diff --git a/content/1_docs/3_reference/10_@/link.txt b/content/docs/3_reference/10_@/link.txt similarity index 100% rename from content/1_docs/3_reference/10_@/link.txt rename to content/docs/3_reference/10_@/link.txt diff --git a/content/1_docs/3_reference/1_text/0_kirbytags/0_date/reference-kirbytag.txt b/content/docs/3_reference/1_text/0_kirbytags/0_date/reference-kirbytag.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_kirbytags/0_date/reference-kirbytag.txt rename to content/docs/3_reference/1_text/0_kirbytags/0_date/reference-kirbytag.txt diff --git a/content/1_docs/3_reference/1_text/0_kirbytags/0_email/reference-kirbytag.txt b/content/docs/3_reference/1_text/0_kirbytags/0_email/reference-kirbytag.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_kirbytags/0_email/reference-kirbytag.txt rename to content/docs/3_reference/1_text/0_kirbytags/0_email/reference-kirbytag.txt diff --git a/content/1_docs/3_reference/1_text/0_kirbytags/0_file/reference-kirbytag.txt b/content/docs/3_reference/1_text/0_kirbytags/0_file/reference-kirbytag.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_kirbytags/0_file/reference-kirbytag.txt rename to content/docs/3_reference/1_text/0_kirbytags/0_file/reference-kirbytag.txt diff --git a/content/1_docs/3_reference/1_text/0_kirbytags/0_gist/reference-kirbytag.txt b/content/docs/3_reference/1_text/0_kirbytags/0_gist/reference-kirbytag.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_kirbytags/0_gist/reference-kirbytag.txt rename to content/docs/3_reference/1_text/0_kirbytags/0_gist/reference-kirbytag.txt diff --git a/content/1_docs/3_reference/1_text/0_kirbytags/0_image/reference-kirbytag.txt b/content/docs/3_reference/1_text/0_kirbytags/0_image/reference-kirbytag.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_kirbytags/0_image/reference-kirbytag.txt rename to content/docs/3_reference/1_text/0_kirbytags/0_image/reference-kirbytag.txt diff --git a/content/1_docs/3_reference/1_text/0_kirbytags/0_link/reference-kirbytag.txt b/content/docs/3_reference/1_text/0_kirbytags/0_link/reference-kirbytag.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_kirbytags/0_link/reference-kirbytag.txt rename to content/docs/3_reference/1_text/0_kirbytags/0_link/reference-kirbytag.txt diff --git a/content/1_docs/3_reference/1_text/0_kirbytags/0_tel/reference-kirbytag.txt b/content/docs/3_reference/1_text/0_kirbytags/0_tel/reference-kirbytag.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_kirbytags/0_tel/reference-kirbytag.txt rename to content/docs/3_reference/1_text/0_kirbytags/0_tel/reference-kirbytag.txt diff --git a/content/1_docs/3_reference/1_text/0_kirbytags/0_twitter/reference-kirbytag.txt b/content/docs/3_reference/1_text/0_kirbytags/0_twitter/reference-kirbytag.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_kirbytags/0_twitter/reference-kirbytag.txt rename to content/docs/3_reference/1_text/0_kirbytags/0_twitter/reference-kirbytag.txt diff --git a/content/1_docs/3_reference/1_text/0_kirbytags/0_video/reference-kirbytag.txt b/content/docs/3_reference/1_text/0_kirbytags/0_video/reference-kirbytag.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_kirbytags/0_video/reference-kirbytag.txt rename to content/docs/3_reference/1_text/0_kirbytags/0_video/reference-kirbytag.txt diff --git a/content/1_docs/3_reference/1_text/0_kirbytags/reference-kirbytags.txt b/content/docs/3_reference/1_text/0_kirbytags/reference-kirbytags.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_kirbytags/reference-kirbytags.txt rename to content/docs/3_reference/1_text/0_kirbytags/reference-kirbytags.txt diff --git a/content/1_docs/3_reference/1_text/0_markdown/0_bold/reference-article.txt b/content/docs/3_reference/1_text/0_markdown/0_bold/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_markdown/0_bold/reference-article.txt rename to content/docs/3_reference/1_text/0_markdown/0_bold/reference-article.txt diff --git a/content/1_docs/3_reference/1_text/0_markdown/0_breaks/reference-article.txt b/content/docs/3_reference/1_text/0_markdown/0_breaks/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_markdown/0_breaks/reference-article.txt rename to content/docs/3_reference/1_text/0_markdown/0_breaks/reference-article.txt diff --git a/content/1_docs/3_reference/1_text/0_markdown/0_code/reference-article.txt b/content/docs/3_reference/1_text/0_markdown/0_code/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_markdown/0_code/reference-article.txt rename to content/docs/3_reference/1_text/0_markdown/0_code/reference-article.txt diff --git a/content/1_docs/3_reference/1_text/0_markdown/0_emails/reference-article.txt b/content/docs/3_reference/1_text/0_markdown/0_emails/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_markdown/0_emails/reference-article.txt rename to content/docs/3_reference/1_text/0_markdown/0_emails/reference-article.txt diff --git a/content/1_docs/3_reference/1_text/0_markdown/0_headlines/reference-article.txt b/content/docs/3_reference/1_text/0_markdown/0_headlines/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_markdown/0_headlines/reference-article.txt rename to content/docs/3_reference/1_text/0_markdown/0_headlines/reference-article.txt diff --git a/content/1_docs/3_reference/1_text/0_markdown/0_horizontal-rules/reference-article.txt b/content/docs/3_reference/1_text/0_markdown/0_horizontal-rules/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_markdown/0_horizontal-rules/reference-article.txt rename to content/docs/3_reference/1_text/0_markdown/0_horizontal-rules/reference-article.txt diff --git a/content/1_docs/3_reference/1_text/0_markdown/0_italic/reference-article.txt b/content/docs/3_reference/1_text/0_markdown/0_italic/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_markdown/0_italic/reference-article.txt rename to content/docs/3_reference/1_text/0_markdown/0_italic/reference-article.txt diff --git a/content/1_docs/3_reference/1_text/0_markdown/0_links/reference-article.txt b/content/docs/3_reference/1_text/0_markdown/0_links/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_markdown/0_links/reference-article.txt rename to content/docs/3_reference/1_text/0_markdown/0_links/reference-article.txt diff --git a/content/1_docs/3_reference/1_text/0_markdown/0_lists/reference-article.txt b/content/docs/3_reference/1_text/0_markdown/0_lists/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_markdown/0_lists/reference-article.txt rename to content/docs/3_reference/1_text/0_markdown/0_lists/reference-article.txt diff --git a/content/1_docs/3_reference/1_text/0_markdown/0_quotes/reference-article.txt b/content/docs/3_reference/1_text/0_markdown/0_quotes/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_markdown/0_quotes/reference-article.txt rename to content/docs/3_reference/1_text/0_markdown/0_quotes/reference-article.txt diff --git a/content/1_docs/3_reference/1_text/0_markdown/reference-section.txt b/content/docs/3_reference/1_text/0_markdown/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/1_text/0_markdown/reference-section.txt rename to content/docs/3_reference/1_text/0_markdown/reference-section.txt diff --git a/content/1_docs/3_reference/1_text/link.txt b/content/docs/3_reference/1_text/link.txt similarity index 100% rename from content/1_docs/3_reference/1_text/link.txt rename to content/docs/3_reference/1_text/link.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_callback/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_callback/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_callback/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_callback/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_html/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_html/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_html/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_html/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_inline/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_inline/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_inline/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_inline/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_is-empty/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_is-empty/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_is-empty/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_is-empty/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_is-false/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_is-false/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_is-false/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_is-false/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_is-not-empty/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_is-not-empty/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_is-not-empty/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_is-not-empty/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_is-true/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_is-true/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_is-true/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_is-true/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_is-valid/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_is-valid/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_is-valid/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_is-valid/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_key/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_key/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_key/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_key/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_kirbytags/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_kirbytags/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_kirbytags/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_kirbytags/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_kirbytext/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_kirbytext/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_kirbytext/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_kirbytext/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_kirbytextinline/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_kirbytextinline/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_kirbytextinline/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_kirbytextinline/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_length/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_length/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_length/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_length/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_lower/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_lower/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_lower/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_lower/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_markdown/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_markdown/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_markdown/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_markdown/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_nl2br/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_nl2br/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_nl2br/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_nl2br/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_or/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_or/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_or/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_or/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_short/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_short/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_short/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_short/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_slug/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_slug/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_slug/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_slug/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_smartypants/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_smartypants/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_smartypants/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_smartypants/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_split/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_split/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_split/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_split/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-blocks/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-blocks/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-blocks/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-blocks/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-bool/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-bool/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-bool/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-bool/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-data/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-data/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-data/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-data/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-date/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-date/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-date/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-date/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-file/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-file/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-file/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-file/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-float/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-float/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-float/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-float/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-int/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-int/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-int/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-int/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-layouts/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-layouts/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-layouts/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-layouts/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-link/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-link/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-link/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-link/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-page/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-page/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-page/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-page/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-pages/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-pages/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-pages/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-pages/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-structure/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-structure/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-structure/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-structure/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-timestamp/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-timestamp/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-timestamp/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-timestamp/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-url/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-url/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-url/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-url/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_to-user/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_to-user/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_to-user/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_to-user/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_upper/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_upper/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_upper/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_upper/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_value/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_value/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_value/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_value/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_widont/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_widont/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_widont/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_widont/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_words/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_words/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_words/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_words/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_xml/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_xml/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_xml/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_xml/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/0_yaml/reference-fieldmethod.txt b/content/docs/3_reference/2_templates/0_field-methods/0_yaml/reference-fieldmethod.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/0_yaml/reference-fieldmethod.txt rename to content/docs/3_reference/2_templates/0_field-methods/0_yaml/reference-fieldmethod.txt diff --git a/content/1_docs/3_reference/2_templates/0_field-methods/reference-fieldmethods.txt b/content/docs/3_reference/2_templates/0_field-methods/reference-fieldmethods.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_field-methods/reference-fieldmethods.txt rename to content/docs/3_reference/2_templates/0_field-methods/reference-fieldmethods.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_asset/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_asset/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_asset/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_asset/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_attr/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_attr/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_attr/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_attr/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_collection/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_collection/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_collection/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_collection/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_csrf/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_csrf/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_csrf/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_csrf/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_css/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_css/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_css/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_css/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_deprecated/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_deprecated/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_deprecated/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_deprecated/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_dump/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_dump/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_dump/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_dump/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_e/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_e/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_e/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_e/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_esc/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_esc/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_esc/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_esc/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_get/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_get/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_get/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_get/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_gist/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_gist/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_gist/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_gist/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_go/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_go/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_go/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_go/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_h/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_h/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_h/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_h/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_html/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_html/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_html/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_html/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_image/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_image/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_image/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_image/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_invalid/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_invalid/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_invalid/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_invalid/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_js/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_js/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_js/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_js/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_kirby/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_kirby/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_kirby/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_kirby/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_kirbytag/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_kirbytag/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_kirbytag/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_kirbytag/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_kirbytags/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_kirbytags/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_kirbytags/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_kirbytags/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_kirbytext/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_kirbytext/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_kirbytext/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_kirbytext/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_kirbytextinline/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_kirbytextinline/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_kirbytextinline/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_kirbytextinline/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_load/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_load/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_load/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_load/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_markdown/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_markdown/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_markdown/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_markdown/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_option/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_option/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_option/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_option/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_page/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_page/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_page/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_page/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_pages/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_pages/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_pages/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_pages/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_param/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_param/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_param/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_param/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_params/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_params/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_params/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_params/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_r/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_r/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_r/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_r/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_site/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_site/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_site/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_site/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_size/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_size/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_size/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_size/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_smartypants/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_smartypants/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_smartypants/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_smartypants/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_snippet/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_snippet/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_snippet/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_snippet/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_svg/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_svg/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_svg/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_svg/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_t/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_t/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_t/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_t/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_tc/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_tc/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_tc/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_tc/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_tt/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_tt/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_tt/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_tt/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_twitter/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_twitter/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_twitter/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_twitter/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_u/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_u/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_u/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_u/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_url/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_url/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_url/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_url/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_video/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_video/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_video/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_video/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_vimeo/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_vimeo/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_vimeo/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_vimeo/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_widont/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_widont/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_widont/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_widont/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/0_youtube/reference-helper.txt b/content/docs/3_reference/2_templates/0_helpers/0_youtube/reference-helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/0_youtube/reference-helper.txt rename to content/docs/3_reference/2_templates/0_helpers/0_youtube/reference-helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/_email/helper.txt b/content/docs/3_reference/2_templates/0_helpers/_email/helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/_email/helper.txt rename to content/docs/3_reference/2_templates/0_helpers/_email/helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/_excerpt/helper.txt b/content/docs/3_reference/2_templates/0_helpers/_excerpt/helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/_excerpt/helper.txt rename to content/docs/3_reference/2_templates/0_helpers/_excerpt/helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/_structure/helper.txt b/content/docs/3_reference/2_templates/0_helpers/_structure/helper.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/_structure/helper.txt rename to content/docs/3_reference/2_templates/0_helpers/_structure/helper.txt diff --git a/content/1_docs/3_reference/2_templates/0_helpers/reference-helpers.txt b/content/docs/3_reference/2_templates/0_helpers/reference-helpers.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/0_helpers/reference-helpers.txt rename to content/docs/3_reference/2_templates/0_helpers/reference-helpers.txt diff --git a/content/1_docs/3_reference/2_templates/link.txt b/content/docs/3_reference/2_templates/link.txt similarity index 100% rename from content/1_docs/3_reference/2_templates/link.txt rename to content/docs/3_reference/2_templates/link.txt diff --git a/content/1_docs/3_reference/3_panel/1_blueprints/0_file/reference-article.txt b/content/docs/3_reference/3_panel/1_blueprints/0_file/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/1_blueprints/0_file/reference-article.txt rename to content/docs/3_reference/3_panel/1_blueprints/0_file/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/1_blueprints/0_page/reference-article.txt b/content/docs/3_reference/3_panel/1_blueprints/0_page/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/1_blueprints/0_page/reference-article.txt rename to content/docs/3_reference/3_panel/1_blueprints/0_page/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/1_blueprints/0_site/reference-article.txt b/content/docs/3_reference/3_panel/1_blueprints/0_site/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/1_blueprints/0_site/reference-article.txt rename to content/docs/3_reference/3_panel/1_blueprints/0_site/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/1_blueprints/0_user/reference-article.txt b/content/docs/3_reference/3_panel/1_blueprints/0_user/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/1_blueprints/0_user/reference-article.txt rename to content/docs/3_reference/3_panel/1_blueprints/0_user/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/1_blueprints/reference-section.txt b/content/docs/3_reference/3_panel/1_blueprints/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/1_blueprints/reference-section.txt rename to content/docs/3_reference/3_panel/1_blueprints/reference-section.txt diff --git a/content/1_docs/3_reference/3_panel/2_presets/0_files/files-empty.png b/content/docs/3_reference/3_panel/2_presets/0_files/files-empty.png similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/0_files/files-empty.png rename to content/docs/3_reference/3_panel/2_presets/0_files/files-empty.png diff --git a/content/1_docs/3_reference/3_panel/2_presets/0_files/files-filled.png b/content/docs/3_reference/3_panel/2_presets/0_files/files-filled.png similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/0_files/files-filled.png rename to content/docs/3_reference/3_panel/2_presets/0_files/files-filled.png diff --git a/content/1_docs/3_reference/3_panel/2_presets/0_files/reference-article.txt b/content/docs/3_reference/3_panel/2_presets/0_files/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/0_files/reference-article.txt rename to content/docs/3_reference/3_panel/2_presets/0_files/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/2_presets/0_page/page-empty.png b/content/docs/3_reference/3_panel/2_presets/0_page/page-empty.png similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/0_page/page-empty.png rename to content/docs/3_reference/3_panel/2_presets/0_page/page-empty.png diff --git a/content/1_docs/3_reference/3_panel/2_presets/0_page/page-filled.png b/content/docs/3_reference/3_panel/2_presets/0_page/page-filled.png similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/0_page/page-filled.png rename to content/docs/3_reference/3_panel/2_presets/0_page/page-filled.png diff --git a/content/1_docs/3_reference/3_panel/2_presets/0_page/page-setup.png b/content/docs/3_reference/3_panel/2_presets/0_page/page-setup.png similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/0_page/page-setup.png rename to content/docs/3_reference/3_panel/2_presets/0_page/page-setup.png diff --git a/content/1_docs/3_reference/3_panel/2_presets/0_page/reference-article.txt b/content/docs/3_reference/3_panel/2_presets/0_page/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/0_page/reference-article.txt rename to content/docs/3_reference/3_panel/2_presets/0_page/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/2_presets/0_pages/pages-blog.png b/content/docs/3_reference/3_panel/2_presets/0_pages/pages-blog.png similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/0_pages/pages-blog.png rename to content/docs/3_reference/3_panel/2_presets/0_pages/pages-blog.png diff --git a/content/1_docs/3_reference/3_panel/2_presets/0_pages/pages-empty.png b/content/docs/3_reference/3_panel/2_presets/0_pages/pages-empty.png similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/0_pages/pages-empty.png rename to content/docs/3_reference/3_panel/2_presets/0_pages/pages-empty.png diff --git a/content/1_docs/3_reference/3_panel/2_presets/0_pages/pages-filled.png b/content/docs/3_reference/3_panel/2_presets/0_pages/pages-filled.png similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/0_pages/pages-filled.png rename to content/docs/3_reference/3_panel/2_presets/0_pages/pages-filled.png diff --git a/content/1_docs/3_reference/3_panel/2_presets/0_pages/reference-article.txt b/content/docs/3_reference/3_panel/2_presets/0_pages/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/0_pages/reference-article.txt rename to content/docs/3_reference/3_panel/2_presets/0_pages/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/2_presets/reference-section.txt b/content/docs/3_reference/3_panel/2_presets/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/2_presets/reference-section.txt rename to content/docs/3_reference/3_panel/2_presets/reference-section.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/blocks.png b/content/docs/3_reference/3_panel/3_fields/0_blocks/blocks.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/blocks.png rename to content/docs/3_reference/3_panel/3_fields/0_blocks/blocks.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/closed-groups.png b/content/docs/3_reference/3_panel/3_fields/0_blocks/closed-groups.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/closed-groups.png rename to content/docs/3_reference/3_panel/3_fields/0_blocks/closed-groups.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/custom-id.png b/content/docs/3_reference/3_panel/3_fields/0_blocks/custom-id.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/custom-id.png rename to content/docs/3_reference/3_panel/3_fields/0_blocks/custom-id.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/custom-preview.png b/content/docs/3_reference/3_panel/3_fields/0_blocks/custom-preview.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/custom-preview.png rename to content/docs/3_reference/3_panel/3_fields/0_blocks/custom-preview.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/editing.png b/content/docs/3_reference/3_panel/3_fields/0_blocks/editing.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/editing.png rename to content/docs/3_reference/3_panel/3_fields/0_blocks/editing.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/groups.png b/content/docs/3_reference/3_panel/3_fields/0_blocks/groups.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/groups.png rename to content/docs/3_reference/3_panel/3_fields/0_blocks/groups.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/preview.gif b/content/docs/3_reference/3_panel/3_fields/0_blocks/preview.gif similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/preview.gif rename to content/docs/3_reference/3_panel/3_fields/0_blocks/preview.gif diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/preview.png b/content/docs/3_reference/3_panel/3_fields/0_blocks/preview.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/preview.png rename to content/docs/3_reference/3_panel/3_fields/0_blocks/preview.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_blocks/reference-article.txt similarity index 95% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_blocks/reference-article.txt index b8df38730d..79c0bb0ed6 100644 --- a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/reference-article.txt +++ b/content/docs/3_reference/3_panel/3_fields/0_blocks/reference-article.txt @@ -302,7 +302,7 @@ To render the HTML for your custom block type in the frontend, create a snippet You can turn your custom blocks into highly visual, interactive representations with a custom block preview plugin. -(image: custom-preview.png class: screenshot link: docs/reference/plugins/extensions/blocks) +(screenshot: custom-preview.png link: docs/reference/plugins/extensions/blocks) **(link: docs/reference/plugins/extensions/blocks text: Read our plugin guide on how to create such previews.)** diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/single-sorted.png b/content/docs/3_reference/3_panel/3_fields/0_blocks/single-sorted.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/single-sorted.png rename to content/docs/3_reference/3_panel/3_fields/0_blocks/single-sorted.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/single.png b/content/docs/3_reference/3_panel/3_fields/0_blocks/single.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/single.png rename to content/docs/3_reference/3_panel/3_fields/0_blocks/single.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_blocks/tabs.png b/content/docs/3_reference/3_panel/3_fields/0_blocks/tabs.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_blocks/tabs.png rename to content/docs/3_reference/3_panel/3_fields/0_blocks/tabs.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_checkboxes/checkboxes.png b/content/docs/3_reference/3_panel/3_fields/0_checkboxes/checkboxes.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_checkboxes/checkboxes.png rename to content/docs/3_reference/3_panel/3_fields/0_checkboxes/checkboxes.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_checkboxes/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_checkboxes/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_checkboxes/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_checkboxes/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_date/date.png b/content/docs/3_reference/3_panel/3_fields/0_date/date.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_date/date.png rename to content/docs/3_reference/3_panel/3_fields/0_date/date.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_date/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_date/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_date/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_date/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_email/email.png b/content/docs/3_reference/3_panel/3_fields/0_email/email.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_email/email.png rename to content/docs/3_reference/3_panel/3_fields/0_email/email.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_email/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_email/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_email/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_email/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_files/files.png b/content/docs/3_reference/3_panel/3_fields/0_files/files.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_files/files.png rename to content/docs/3_reference/3_panel/3_fields/0_files/files.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_files/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_files/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_files/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_files/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_gap/gap-field.png b/content/docs/3_reference/3_panel/3_fields/0_gap/gap-field.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_gap/gap-field.png rename to content/docs/3_reference/3_panel/3_fields/0_gap/gap-field.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_gap/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_gap/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_gap/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_gap/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_headline/headline.png b/content/docs/3_reference/3_panel/3_fields/0_headline/headline.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_headline/headline.png rename to content/docs/3_reference/3_panel/3_fields/0_headline/headline.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_headline/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_headline/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_headline/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_headline/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_hidden/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_hidden/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_hidden/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_hidden/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_info/info-negative.png b/content/docs/3_reference/3_panel/3_fields/0_info/info-negative.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_info/info-negative.png rename to content/docs/3_reference/3_panel/3_fields/0_info/info-negative.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_info/info.png b/content/docs/3_reference/3_panel/3_fields/0_info/info.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_info/info.png rename to content/docs/3_reference/3_panel/3_fields/0_info/info.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_info/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_info/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_info/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_info/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_layout/layout-settings.png b/content/docs/3_reference/3_panel/3_fields/0_layout/layout-settings.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_layout/layout-settings.png rename to content/docs/3_reference/3_panel/3_fields/0_layout/layout-settings.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_layout/layout.png b/content/docs/3_reference/3_panel/3_fields/0_layout/layout.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_layout/layout.png rename to content/docs/3_reference/3_panel/3_fields/0_layout/layout.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_layout/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_layout/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_layout/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_layout/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_layout/selector.png b/content/docs/3_reference/3_panel/3_fields/0_layout/selector.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_layout/selector.png rename to content/docs/3_reference/3_panel/3_fields/0_layout/selector.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_line/line.png b/content/docs/3_reference/3_panel/3_fields/0_line/line.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_line/line.png rename to content/docs/3_reference/3_panel/3_fields/0_line/line.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_line/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_line/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_line/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_line/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_list/list.png b/content/docs/3_reference/3_panel/3_fields/0_list/list.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_list/list.png rename to content/docs/3_reference/3_panel/3_fields/0_list/list.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_list/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_list/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_list/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_list/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_multiselect/multiselect.png b/content/docs/3_reference/3_panel/3_fields/0_multiselect/multiselect.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_multiselect/multiselect.png rename to content/docs/3_reference/3_panel/3_fields/0_multiselect/multiselect.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_multiselect/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_multiselect/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_multiselect/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_multiselect/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_number/number.png b/content/docs/3_reference/3_panel/3_fields/0_number/number.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_number/number.png rename to content/docs/3_reference/3_panel/3_fields/0_number/number.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_number/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_number/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_number/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_number/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_pages/pages.png b/content/docs/3_reference/3_panel/3_fields/0_pages/pages.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_pages/pages.png rename to content/docs/3_reference/3_panel/3_fields/0_pages/pages.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_pages/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_pages/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_pages/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_pages/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_radio/radio.png b/content/docs/3_reference/3_panel/3_fields/0_radio/radio.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_radio/radio.png rename to content/docs/3_reference/3_panel/3_fields/0_radio/radio.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_radio/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_radio/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_radio/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_radio/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_range/range.png b/content/docs/3_reference/3_panel/3_fields/0_range/range.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_range/range.png rename to content/docs/3_reference/3_panel/3_fields/0_range/range.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_range/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_range/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_range/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_range/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_select/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_select/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_select/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_select/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_select/select.png b/content/docs/3_reference/3_panel/3_fields/0_select/select.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_select/select.png rename to content/docs/3_reference/3_panel/3_fields/0_select/select.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_structure/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_structure/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_structure/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_structure/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_structure/structure.png b/content/docs/3_reference/3_panel/3_fields/0_structure/structure.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_structure/structure.png rename to content/docs/3_reference/3_panel/3_fields/0_structure/structure.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_tags/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_tags/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_tags/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_tags/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_tags/tags-list-layout.png b/content/docs/3_reference/3_panel/3_fields/0_tags/tags-list-layout.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_tags/tags-list-layout.png rename to content/docs/3_reference/3_panel/3_fields/0_tags/tags-list-layout.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_tags/tags.png b/content/docs/3_reference/3_panel/3_fields/0_tags/tags.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_tags/tags.png rename to content/docs/3_reference/3_panel/3_fields/0_tags/tags.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_tel/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_tel/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_tel/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_tel/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_tel/tel.png b/content/docs/3_reference/3_panel/3_fields/0_tel/tel.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_tel/tel.png rename to content/docs/3_reference/3_panel/3_fields/0_tel/tel.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_text/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_text/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_text/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_text/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_text/text.png b/content/docs/3_reference/3_panel/3_fields/0_text/text.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_text/text.png rename to content/docs/3_reference/3_panel/3_fields/0_text/text.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_textarea/file-selector.png b/content/docs/3_reference/3_panel/3_fields/0_textarea/file-selector.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_textarea/file-selector.png rename to content/docs/3_reference/3_panel/3_fields/0_textarea/file-selector.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_textarea/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_textarea/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_textarea/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_textarea/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_textarea/textarea.png b/content/docs/3_reference/3_panel/3_fields/0_textarea/textarea.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_textarea/textarea.png rename to content/docs/3_reference/3_panel/3_fields/0_textarea/textarea.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_time/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_time/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_time/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_time/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_time/time.png b/content/docs/3_reference/3_panel/3_fields/0_time/time.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_time/time.png rename to content/docs/3_reference/3_panel/3_fields/0_time/time.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_toggle/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_toggle/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_toggle/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_toggle/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_toggle/toggle.png b/content/docs/3_reference/3_panel/3_fields/0_toggle/toggle.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_toggle/toggle.png rename to content/docs/3_reference/3_panel/3_fields/0_toggle/toggle.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_url/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_url/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_url/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_url/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_url/url.png b/content/docs/3_reference/3_panel/3_fields/0_url/url.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_url/url.png rename to content/docs/3_reference/3_panel/3_fields/0_url/url.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_users/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_users/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_users/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_users/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_users/users.png b/content/docs/3_reference/3_panel/3_fields/0_users/users.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_users/users.png rename to content/docs/3_reference/3_panel/3_fields/0_users/users.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_writer/reference-article.txt b/content/docs/3_reference/3_panel/3_fields/0_writer/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_writer/reference-article.txt rename to content/docs/3_reference/3_panel/3_fields/0_writer/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/3_fields/0_writer/writer.png b/content/docs/3_reference/3_panel/3_fields/0_writer/writer.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/0_writer/writer.png rename to content/docs/3_reference/3_panel/3_fields/0_writer/writer.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/panel-form-fields.png b/content/docs/3_reference/3_panel/3_fields/panel-form-fields.png similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/panel-form-fields.png rename to content/docs/3_reference/3_panel/3_fields/panel-form-fields.png diff --git a/content/1_docs/3_reference/3_panel/3_fields/reference-section.txt b/content/docs/3_reference/3_panel/3_fields/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/3_fields/reference-section.txt rename to content/docs/3_reference/3_panel/3_fields/reference-section.txt diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_fields/fields-in-columns.png b/content/docs/3_reference/3_panel/4_sections/0_fields/fields-in-columns.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_fields/fields-in-columns.png rename to content/docs/3_reference/3_panel/4_sections/0_fields/fields-in-columns.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_fields/fields-in-tabs-1.png b/content/docs/3_reference/3_panel/4_sections/0_fields/fields-in-tabs-1.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_fields/fields-in-tabs-1.png rename to content/docs/3_reference/3_panel/4_sections/0_fields/fields-in-tabs-1.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_fields/fields-in-tabs-2.png b/content/docs/3_reference/3_panel/4_sections/0_fields/fields-in-tabs-2.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_fields/fields-in-tabs-2.png rename to content/docs/3_reference/3_panel/4_sections/0_fields/fields-in-tabs-2.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_fields/fields.png b/content/docs/3_reference/3_panel/4_sections/0_fields/fields.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_fields/fields.png rename to content/docs/3_reference/3_panel/4_sections/0_fields/fields.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_fields/reference-panelsection.txt b/content/docs/3_reference/3_panel/4_sections/0_fields/reference-panelsection.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_fields/reference-panelsection.txt rename to content/docs/3_reference/3_panel/4_sections/0_fields/reference-panelsection.txt diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/16by9.png b/content/docs/3_reference/3_panel/4_sections/0_files/16by9.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/16by9.png rename to content/docs/3_reference/3_panel/4_sections/0_files/16by9.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/1by1.png b/content/docs/3_reference/3_panel/4_sections/0_files/1by1.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/1by1.png rename to content/docs/3_reference/3_panel/4_sections/0_files/1by1.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/2by3.png b/content/docs/3_reference/3_panel/4_sections/0_files/2by3.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/2by3.png rename to content/docs/3_reference/3_panel/4_sections/0_files/2by3.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/3by2.png b/content/docs/3_reference/3_panel/4_sections/0_files/3by2.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/3by2.png rename to content/docs/3_reference/3_panel/4_sections/0_files/3by2.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/add.png b/content/docs/3_reference/3_panel/4_sections/0_files/add.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/add.png rename to content/docs/3_reference/3_panel/4_sections/0_files/add.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/black.png b/content/docs/3_reference/3_panel/4_sections/0_files/black.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/black.png rename to content/docs/3_reference/3_panel/4_sections/0_files/black.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/cards.png b/content/docs/3_reference/3_panel/4_sections/0_files/cards.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/cards.png rename to content/docs/3_reference/3_panel/4_sections/0_files/cards.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/cover.png b/content/docs/3_reference/3_panel/4_sections/0_files/cover.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/cover.png rename to content/docs/3_reference/3_panel/4_sections/0_files/cover.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/files.png b/content/docs/3_reference/3_panel/4_sections/0_files/files.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/files.png rename to content/docs/3_reference/3_panel/4_sections/0_files/files.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/list.png b/content/docs/3_reference/3_panel/4_sections/0_files/list.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/list.png rename to content/docs/3_reference/3_panel/4_sections/0_files/list.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/no-cover.png b/content/docs/3_reference/3_panel/4_sections/0_files/no-cover.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/no-cover.png rename to content/docs/3_reference/3_panel/4_sections/0_files/no-cover.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/pages.png b/content/docs/3_reference/3_panel/4_sections/0_files/pages.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/pages.png rename to content/docs/3_reference/3_panel/4_sections/0_files/pages.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/pattern.png b/content/docs/3_reference/3_panel/4_sections/0_files/pattern.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/pattern.png rename to content/docs/3_reference/3_panel/4_sections/0_files/pattern.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/reference-panelsection.txt b/content/docs/3_reference/3_panel/4_sections/0_files/reference-panelsection.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/reference-panelsection.txt rename to content/docs/3_reference/3_panel/4_sections/0_files/reference-panelsection.txt diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_files/white.png b/content/docs/3_reference/3_panel/4_sections/0_files/white.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_files/white.png rename to content/docs/3_reference/3_panel/4_sections/0_files/white.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_info/info.png b/content/docs/3_reference/3_panel/4_sections/0_info/info.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_info/info.png rename to content/docs/3_reference/3_panel/4_sections/0_info/info.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_info/negative.png b/content/docs/3_reference/3_panel/4_sections/0_info/negative.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_info/negative.png rename to content/docs/3_reference/3_panel/4_sections/0_info/negative.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_info/positive.png b/content/docs/3_reference/3_panel/4_sections/0_info/positive.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_info/positive.png rename to content/docs/3_reference/3_panel/4_sections/0_info/positive.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_info/reference-panelsection.txt b/content/docs/3_reference/3_panel/4_sections/0_info/reference-panelsection.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_info/reference-panelsection.txt rename to content/docs/3_reference/3_panel/4_sections/0_info/reference-panelsection.txt diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/16by9.png b/content/docs/3_reference/3_panel/4_sections/0_pages/16by9.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/16by9.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/16by9.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/1by1.png b/content/docs/3_reference/3_panel/4_sections/0_pages/1by1.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/1by1.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/1by1.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/2by3.png b/content/docs/3_reference/3_panel/4_sections/0_pages/2by3.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/2by3.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/2by3.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/3by2.png b/content/docs/3_reference/3_panel/4_sections/0_pages/3by2.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/3by2.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/3by2.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/add.png b/content/docs/3_reference/3_panel/4_sections/0_pages/add.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/add.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/add.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/black.png b/content/docs/3_reference/3_panel/4_sections/0_pages/black.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/black.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/black.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/cards.png b/content/docs/3_reference/3_panel/4_sections/0_pages/cards.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/cards.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/cards.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/cover.png b/content/docs/3_reference/3_panel/4_sections/0_pages/cover.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/cover.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/cover.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/list.png b/content/docs/3_reference/3_panel/4_sections/0_pages/list.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/list.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/list.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/no-cover.png b/content/docs/3_reference/3_panel/4_sections/0_pages/no-cover.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/no-cover.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/no-cover.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/pages.png b/content/docs/3_reference/3_panel/4_sections/0_pages/pages.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/pages.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/pages.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/pattern.png b/content/docs/3_reference/3_panel/4_sections/0_pages/pattern.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/pattern.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/pattern.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/reference-panelsection.txt b/content/docs/3_reference/3_panel/4_sections/0_pages/reference-panelsection.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/reference-panelsection.txt rename to content/docs/3_reference/3_panel/4_sections/0_pages/reference-panelsection.txt diff --git a/content/1_docs/3_reference/3_panel/4_sections/0_pages/white.png b/content/docs/3_reference/3_panel/4_sections/0_pages/white.png similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/0_pages/white.png rename to content/docs/3_reference/3_panel/4_sections/0_pages/white.png diff --git a/content/1_docs/3_reference/3_panel/4_sections/reference-panelsections.txt b/content/docs/3_reference/3_panel/4_sections/reference-panelsections.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/4_sections/reference-panelsections.txt rename to content/docs/3_reference/3_panel/4_sections/reference-panelsections.txt diff --git a/content/1_docs/3_reference/3_panel/5_blocks/1_code/code.png b/content/docs/3_reference/3_panel/5_blocks/1_code/code.png similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/1_code/code.png rename to content/docs/3_reference/3_panel/5_blocks/1_code/code.png diff --git a/content/1_docs/3_reference/3_panel/5_blocks/1_code/reference-block.txt b/content/docs/3_reference/3_panel/5_blocks/1_code/reference-block.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/1_code/reference-block.txt rename to content/docs/3_reference/3_panel/5_blocks/1_code/reference-block.txt diff --git a/content/1_docs/3_reference/3_panel/5_blocks/2_gallery/gallery.png b/content/docs/3_reference/3_panel/5_blocks/2_gallery/gallery.png similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/2_gallery/gallery.png rename to content/docs/3_reference/3_panel/5_blocks/2_gallery/gallery.png diff --git a/content/1_docs/3_reference/3_panel/5_blocks/2_gallery/reference-block.txt b/content/docs/3_reference/3_panel/5_blocks/2_gallery/reference-block.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/2_gallery/reference-block.txt rename to content/docs/3_reference/3_panel/5_blocks/2_gallery/reference-block.txt diff --git a/content/1_docs/3_reference/3_panel/5_blocks/3_heading/heading.png b/content/docs/3_reference/3_panel/5_blocks/3_heading/heading.png similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/3_heading/heading.png rename to content/docs/3_reference/3_panel/5_blocks/3_heading/heading.png diff --git a/content/1_docs/3_reference/3_panel/5_blocks/3_heading/reference-block.txt b/content/docs/3_reference/3_panel/5_blocks/3_heading/reference-block.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/3_heading/reference-block.txt rename to content/docs/3_reference/3_panel/5_blocks/3_heading/reference-block.txt diff --git a/content/1_docs/3_reference/3_panel/5_blocks/4_image/image.png b/content/docs/3_reference/3_panel/5_blocks/4_image/image.png similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/4_image/image.png rename to content/docs/3_reference/3_panel/5_blocks/4_image/image.png diff --git a/content/1_docs/3_reference/3_panel/5_blocks/4_image/reference-block.txt b/content/docs/3_reference/3_panel/5_blocks/4_image/reference-block.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/4_image/reference-block.txt rename to content/docs/3_reference/3_panel/5_blocks/4_image/reference-block.txt diff --git a/content/1_docs/3_reference/3_panel/5_blocks/5_list/list.png b/content/docs/3_reference/3_panel/5_blocks/5_list/list.png similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/5_list/list.png rename to content/docs/3_reference/3_panel/5_blocks/5_list/list.png diff --git a/content/1_docs/3_reference/3_panel/5_blocks/5_list/reference-block.txt b/content/docs/3_reference/3_panel/5_blocks/5_list/reference-block.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/5_list/reference-block.txt rename to content/docs/3_reference/3_panel/5_blocks/5_list/reference-block.txt diff --git a/content/1_docs/3_reference/3_panel/5_blocks/6_markdown/markdown.png b/content/docs/3_reference/3_panel/5_blocks/6_markdown/markdown.png similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/6_markdown/markdown.png rename to content/docs/3_reference/3_panel/5_blocks/6_markdown/markdown.png diff --git a/content/1_docs/3_reference/3_panel/5_blocks/6_markdown/reference-block.txt b/content/docs/3_reference/3_panel/5_blocks/6_markdown/reference-block.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/6_markdown/reference-block.txt rename to content/docs/3_reference/3_panel/5_blocks/6_markdown/reference-block.txt diff --git a/content/1_docs/3_reference/3_panel/5_blocks/7_quote/quote.png b/content/docs/3_reference/3_panel/5_blocks/7_quote/quote.png similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/7_quote/quote.png rename to content/docs/3_reference/3_panel/5_blocks/7_quote/quote.png diff --git a/content/1_docs/3_reference/3_panel/5_blocks/7_quote/reference-block.txt b/content/docs/3_reference/3_panel/5_blocks/7_quote/reference-block.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/7_quote/reference-block.txt rename to content/docs/3_reference/3_panel/5_blocks/7_quote/reference-block.txt diff --git a/content/1_docs/3_reference/3_panel/5_blocks/8_text/reference-block.txt b/content/docs/3_reference/3_panel/5_blocks/8_text/reference-block.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/8_text/reference-block.txt rename to content/docs/3_reference/3_panel/5_blocks/8_text/reference-block.txt diff --git a/content/1_docs/3_reference/3_panel/5_blocks/8_text/text.png b/content/docs/3_reference/3_panel/5_blocks/8_text/text.png similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/8_text/text.png rename to content/docs/3_reference/3_panel/5_blocks/8_text/text.png diff --git a/content/1_docs/3_reference/3_panel/5_blocks/9_video/reference-block.txt b/content/docs/3_reference/3_panel/5_blocks/9_video/reference-block.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/9_video/reference-block.txt rename to content/docs/3_reference/3_panel/5_blocks/9_video/reference-block.txt diff --git a/content/1_docs/3_reference/3_panel/5_blocks/9_video/video.png b/content/docs/3_reference/3_panel/5_blocks/9_video/video.png similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/9_video/video.png rename to content/docs/3_reference/3_panel/5_blocks/9_video/video.png diff --git a/content/1_docs/3_reference/3_panel/5_blocks/reference-section.txt b/content/docs/3_reference/3_panel/5_blocks/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/5_blocks/reference-section.txt rename to content/docs/3_reference/3_panel/5_blocks/reference-section.txt diff --git a/content/1_docs/3_reference/3_panel/6_icons/0_attachment/reference-icon.txt b/content/docs/3_reference/3_panel/6_icons/0_attachment/reference-icon.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/6_icons/0_attachment/reference-icon.txt rename to content/docs/3_reference/3_panel/6_icons/0_attachment/reference-icon.txt diff --git a/content/1_docs/3_reference/3_panel/6_icons/reference-icons.txt b/content/docs/3_reference/3_panel/6_icons/reference-icons.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/6_icons/reference-icons.txt rename to content/docs/3_reference/3_panel/6_icons/reference-icons.txt diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_blog/article.png b/content/docs/3_reference/3_panel/7_samples/0_blog/article.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_blog/article.png rename to content/docs/3_reference/3_panel/7_samples/0_blog/article.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_blog/blog.png b/content/docs/3_reference/3_panel/7_samples/0_blog/blog.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_blog/blog.png rename to content/docs/3_reference/3_panel/7_samples/0_blog/blog.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_blog/reference-article.txt b/content/docs/3_reference/3_panel/7_samples/0_blog/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_blog/reference-article.txt rename to content/docs/3_reference/3_panel/7_samples/0_blog/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_events/event.png b/content/docs/3_reference/3_panel/7_samples/0_events/event.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_events/event.png rename to content/docs/3_reference/3_panel/7_samples/0_events/event.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_events/events.png b/content/docs/3_reference/3_panel/7_samples/0_events/events.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_events/events.png rename to content/docs/3_reference/3_panel/7_samples/0_events/events.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_events/reference-article.txt b/content/docs/3_reference/3_panel/7_samples/0_events/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_events/reference-article.txt rename to content/docs/3_reference/3_panel/7_samples/0_events/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_file/cover.png b/content/docs/3_reference/3_panel/7_samples/0_file/cover.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_file/cover.png rename to content/docs/3_reference/3_panel/7_samples/0_file/cover.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_file/default.png b/content/docs/3_reference/3_panel/7_samples/0_file/default.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_file/default.png rename to content/docs/3_reference/3_panel/7_samples/0_file/default.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_file/image.png b/content/docs/3_reference/3_panel/7_samples/0_file/image.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_file/image.png rename to content/docs/3_reference/3_panel/7_samples/0_file/image.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_file/reference-article.txt b/content/docs/3_reference/3_panel/7_samples/0_file/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_file/reference-article.txt rename to content/docs/3_reference/3_panel/7_samples/0_file/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_menu/menu.png b/content/docs/3_reference/3_panel/7_samples/0_menu/menu.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_menu/menu.png rename to content/docs/3_reference/3_panel/7_samples/0_menu/menu.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_menu/reference-article.txt b/content/docs/3_reference/3_panel/7_samples/0_menu/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_menu/reference-article.txt rename to content/docs/3_reference/3_panel/7_samples/0_menu/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_one-pager/headline.png b/content/docs/3_reference/3_panel/7_samples/0_one-pager/headline.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_one-pager/headline.png rename to content/docs/3_reference/3_panel/7_samples/0_one-pager/headline.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_one-pager/hero-files.png b/content/docs/3_reference/3_panel/7_samples/0_one-pager/hero-files.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_one-pager/hero-files.png rename to content/docs/3_reference/3_panel/7_samples/0_one-pager/hero-files.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_one-pager/hero.png b/content/docs/3_reference/3_panel/7_samples/0_one-pager/hero.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_one-pager/hero.png rename to content/docs/3_reference/3_panel/7_samples/0_one-pager/hero.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_one-pager/one-page.png b/content/docs/3_reference/3_panel/7_samples/0_one-pager/one-page.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_one-pager/one-page.png rename to content/docs/3_reference/3_panel/7_samples/0_one-pager/one-page.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_one-pager/reference-article.txt b/content/docs/3_reference/3_panel/7_samples/0_one-pager/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_one-pager/reference-article.txt rename to content/docs/3_reference/3_panel/7_samples/0_one-pager/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_one-pager/text.png b/content/docs/3_reference/3_panel/7_samples/0_one-pager/text.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_one-pager/text.png rename to content/docs/3_reference/3_panel/7_samples/0_one-pager/text.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_one-pager/video.png b/content/docs/3_reference/3_panel/7_samples/0_one-pager/video.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_one-pager/video.png rename to content/docs/3_reference/3_panel/7_samples/0_one-pager/video.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_portfolio/project.png b/content/docs/3_reference/3_panel/7_samples/0_portfolio/project.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_portfolio/project.png rename to content/docs/3_reference/3_panel/7_samples/0_portfolio/project.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_portfolio/projects.png b/content/docs/3_reference/3_panel/7_samples/0_portfolio/projects.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_portfolio/projects.png rename to content/docs/3_reference/3_panel/7_samples/0_portfolio/projects.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_portfolio/reference-article.txt b/content/docs/3_reference/3_panel/7_samples/0_portfolio/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_portfolio/reference-article.txt rename to content/docs/3_reference/3_panel/7_samples/0_portfolio/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_shop/product.png b/content/docs/3_reference/3_panel/7_samples/0_shop/product.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_shop/product.png rename to content/docs/3_reference/3_panel/7_samples/0_shop/product.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_shop/reference-article.txt b/content/docs/3_reference/3_panel/7_samples/0_shop/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_shop/reference-article.txt rename to content/docs/3_reference/3_panel/7_samples/0_shop/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_shop/shop.png b/content/docs/3_reference/3_panel/7_samples/0_shop/shop.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_shop/shop.png rename to content/docs/3_reference/3_panel/7_samples/0_shop/shop.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_team/default.png b/content/docs/3_reference/3_panel/7_samples/0_team/default.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_team/default.png rename to content/docs/3_reference/3_panel/7_samples/0_team/default.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_team/reference-article.txt b/content/docs/3_reference/3_panel/7_samples/0_team/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_team/reference-article.txt rename to content/docs/3_reference/3_panel/7_samples/0_team/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_team/team-member.png b/content/docs/3_reference/3_panel/7_samples/0_team/team-member.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_team/team-member.png rename to content/docs/3_reference/3_panel/7_samples/0_team/team-member.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_team/team.png b/content/docs/3_reference/3_panel/7_samples/0_team/team.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_team/team.png rename to content/docs/3_reference/3_panel/7_samples/0_team/team.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_user/contact.png b/content/docs/3_reference/3_panel/7_samples/0_user/contact.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_user/contact.png rename to content/docs/3_reference/3_panel/7_samples/0_user/contact.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_user/files.png b/content/docs/3_reference/3_panel/7_samples/0_user/files.png similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_user/files.png rename to content/docs/3_reference/3_panel/7_samples/0_user/files.png diff --git a/content/1_docs/3_reference/3_panel/7_samples/0_user/reference-article.txt b/content/docs/3_reference/3_panel/7_samples/0_user/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/0_user/reference-article.txt rename to content/docs/3_reference/3_panel/7_samples/0_user/reference-article.txt diff --git a/content/1_docs/3_reference/3_panel/7_samples/reference-section.txt b/content/docs/3_reference/3_panel/7_samples/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/7_samples/reference-section.txt rename to content/docs/3_reference/3_panel/7_samples/reference-section.txt diff --git a/content/1_docs/3_reference/3_panel/link.txt b/content/docs/3_reference/3_panel/link.txt similarity index 100% rename from content/1_docs/3_reference/3_panel/link.txt rename to content/docs/3_reference/3_panel/link.txt diff --git a/content/docs/3_reference/4_objects/0_asset/reference-class.txt b/content/docs/3_reference/4_objects/0_asset/reference-class.txt new file mode 100644 index 0000000000..e373581388 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_asset/reference-class.txt @@ -0,0 +1,35 @@ +Title: $asset + +---- + +Class: Kirby\Cms\Asset + +---- +Since: 3.0.2 + +---- +Text: + +## Details + +You can create a new Asset object via the `asset()` helper or via the class constructor: + +### Via the helper + +```php +$asset = asset('assets/images/logo.svg'); +``` + +### Via the constructor + +```php +$asset = new Asset('assets/images/logo.svg'); +``` + +With the object defined, you can then start calling the class's methods: + +```php +if ($asset->exists()) { + echo $asset->width(); +} +``` \ No newline at end of file diff --git a/content/docs/3_reference/4_objects/0_blocks/reference-class.txt b/content/docs/3_reference/4_objects/0_blocks/reference-class.txt new file mode 100644 index 0000000000..104460a039 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_blocks/reference-class.txt @@ -0,0 +1,19 @@ +Title: $blocks + +---- + +Class: Kirby\Cms\Blocks + +---- + +Since: 3.5.0 + +---- + +Text: + +## What are blocks? + +When you want to work with the content of a Blocks field, you would use the `toBlocks` field method to convert it to a Blocks collection. The Blocks collection makes it easy to render the entire set of blocks or loop through blocks and create individual HTML for them. + +(docs: blocks/blocks) diff --git a/content/1_docs/3_reference/4_objects/0_file/0_blur/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_blur/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_blur/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_blur/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_bw/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_bw/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_bw/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_bw/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_change-name/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_change-name/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_change-name/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_change-name/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_file/0_create/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_create/reference-classmethod.txt new file mode 100644 index 0000000000..394c362737 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_file/0_create/reference-classmethod.txt @@ -0,0 +1,23 @@ +Auth: files.create + +---- + +Properties: $props + +---- + +Text: + +## Example + +```php +$file = File::create([ + 'source' => kirby()->root('assets').'/images/some-image.jpg', + 'parent' => page('photography')->children()->listed()->first(), + 'filename' => 'new-image.jpg', + 'template' => 'cover', + 'content' => [ + 'caption' => 'A nice view from above', + ] +]); +``` diff --git a/content/1_docs/3_reference/4_objects/0_file/0_crop/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_crop/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_crop/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_crop/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_delete/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_delete/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_delete/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_delete/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_extension/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_extension/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_extension/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_extension/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_file/0_factory/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_factory/reference-classmethod.txt new file mode 100644 index 0000000000..083f1cbf42 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_file/0_factory/reference-classmethod.txt @@ -0,0 +1 @@ +Properties: $props \ No newline at end of file diff --git a/content/1_docs/3_reference/4_objects/0_file/0_filename/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_filename/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_filename/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_filename/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_files/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_files/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_files/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_files/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_has-next/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_has-next/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_has-next/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_has-next/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_has-prev/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_has-prev/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_has-prev/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_has-prev/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_kirby/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_kirby/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_kirby/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_kirby/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_meta/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_meta/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_meta/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_meta/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_mime/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_mime/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_mime/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_mime/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_modified/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_modified/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_modified/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_modified/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_next/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_next/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_next/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_next/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_prev/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_prev/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_prev/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_prev/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_rename/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_rename/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_rename/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_rename/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_replace/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_replace/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_replace/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_replace/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_resize/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_resize/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_resize/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_resize/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_root/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_root/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_root/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_root/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_siblings/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_siblings/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_siblings/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_siblings/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_site/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_site/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_site/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_site/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_srcset/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_srcset/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_srcset/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_srcset/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_thumb/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_thumb/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_thumb/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_thumb/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_to-array/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_to-array/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_to-array/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_to-array/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_type/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_type/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_type/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_type/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_update/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_update/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_update/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_update/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_file/0_url/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_file/0_url/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_file/0_url/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_file/0_url/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_file/reference-class.txt b/content/docs/3_reference/4_objects/0_file/reference-class.txt new file mode 100644 index 0000000000..bf2e90dcd5 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_file/reference-class.txt @@ -0,0 +1,54 @@ +Title: $file + +---- + +Class: Kirby\Cms\File + +---- + +Proxies: Kirby\Image\Image + +---- + +Text: + +You can extend this set of methods with (link: docs/reference/plugins/extensions/file-methods text: custom file methods). + +## How to get a `$file` object + +You can get a `$file` object to use with these methods by fetching it from the `$site`, a `$page` or a `$user` object. + +### Site file +```php +files()->first()): ?> + + +``` + +### Page file +```php +files()->first()): ?> + + +``` + +### User file +```php +files()->first()): ?> + + +``` + + +Note how we use an if statement here to check if we have a file object before we call the `url()` method to prevent errors in case the page doesn't have any files. Never forget to do this in your own code. + + +## Examples + +### Resizing a file + +```php +image('myimage.jpg')): ?> + + +``` diff --git a/content/1_docs/3_reference/4_objects/0_files/0_count/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_count/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_count/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_count/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_filter-by/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_filter-by/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_filter-by/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_filter-by/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_filter/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_filter/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_filter/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_filter/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_find-by-id/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_find-by-id/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_find-by-id/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_find-by-id/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_find-by/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_find-by/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_find-by/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_find-by/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_find/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_find/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_find/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_find/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_first/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_first/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_first/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_first/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_flip/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_flip/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_flip/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_flip/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_get/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_get/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_get/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_get/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_group-by/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_group-by/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_group-by/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_group-by/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_group/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_group/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_group/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_group/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_has/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_has/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_has/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_has/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_intersection/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_intersection/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_intersection/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_intersection/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_intersects/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_intersects/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_intersects/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_intersects/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_keys/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_keys/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_keys/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_keys/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_last/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_last/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_last/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_last/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_limit/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_limit/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_limit/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_limit/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_not/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_not/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_not/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_not/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_nth/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_nth/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_nth/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_nth/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_offset/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_offset/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_offset/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_offset/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_paginate/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_paginate/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_paginate/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_paginate/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_pagination/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_pagination/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_pagination/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_pagination/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_pluck/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_pluck/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_pluck/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_pluck/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_shuffle/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_shuffle/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_shuffle/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_shuffle/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_slice/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_slice/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_slice/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_slice/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_files/0_sort-by/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_files/0_sort-by/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_files/0_sort-by/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_files/0_sort-by/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_files/reference-class.txt b/content/docs/3_reference/4_objects/0_files/reference-class.txt new file mode 100644 index 0000000000..f47dd21abc --- /dev/null +++ b/content/docs/3_reference/4_objects/0_files/reference-class.txt @@ -0,0 +1,69 @@ +Title: $files + +---- + +Class: Kirby\Cms\Files + +---- + +Text: + +You can extend this set of methods with (link: docs/reference/plugins/extensions/files-methods text: custom files methods). + +## How to get a `$files` object + +Before you can use the methods of the `$files` class, you need a `$files` object. To get a files object, you fetch the files you need from the `$site`, `$page` or `$user` object: + + +Note that the default sorting order of files is according to their order in the file system. To sort files by their manual sorting order, you can use `$files->sortBy('sort')`, where `sort` is the field that stores the sorting number if you manually sort files in the Panel. + + +### Site files + +```php +$files = $site->files(); +``` + +### Page files + +```php +$files = $page->files(); +``` + +### User files + +```php +$files = $user->files(); +``` + +## Examples: + +With the `$files` object defined, you can now do all sorts of things: + +### Filter files + +```php +$filteredFiles = $files->filterBy('template', 'cover'); +``` + +### Group files + +```php +$groupedFiles = $files->groupBy('template'); +``` + +### Get the first file of the collection + + +```php +$firstFile = $files->first(); +``` + +### Only get three files + +```php +$files = $files->limit(3); +``` + + + diff --git a/content/1_docs/3_reference/4_objects/0_kirby/0_clone/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_kirby/0_clone/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_kirby/0_clone/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_kirby/0_clone/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_kirby/0_collection/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_kirby/0_collection/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_kirby/0_collection/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_kirby/0_collection/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_kirby/0_collections/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_kirby/0_collections/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_kirby/0_collections/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_kirby/0_collections/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_kirby/0_email/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_kirby/0_email/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_kirby/0_email/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_kirby/0_email/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_kirby/0_impersonate/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_kirby/0_impersonate/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_kirby/0_impersonate/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_kirby/0_impersonate/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_kirby/0_nonce/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_kirby/0_nonce/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_kirby/0_nonce/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_kirby/0_nonce/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_kirby/reference-class.txt b/content/docs/3_reference/4_objects/0_kirby/reference-class.txt new file mode 100644 index 0000000000..0decd6197d --- /dev/null +++ b/content/docs/3_reference/4_objects/0_kirby/reference-class.txt @@ -0,0 +1,24 @@ +Title: $kirby + +---- + +Name: Kirby + +---- + +Class: Kirby\Cms\App + +---- + +Text: + +## How to fetch the `$kirby` object + +The `$kirby` class is accessible in Kirby's templates/snippets etc. through the `$kirby` variable. + +In any situation, you can define a `$kirby` object using the `kirby()` helper: + +```php +$kirby = kirby(); +```` + diff --git a/content/1_docs/3_reference/4_objects/0_language/0_code/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_language/0_code/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_language/0_code/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_language/0_code/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_language/0_locale/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_language/0_locale/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_language/0_locale/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_language/0_locale/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_language/0_name/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_language/0_name/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_language/0_name/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_language/0_name/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_language/0_url/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_language/0_url/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_language/0_url/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_language/0_url/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_language/reference-class.txt b/content/docs/3_reference/4_objects/0_language/reference-class.txt new file mode 100644 index 0000000000..2e2d308aac --- /dev/null +++ b/content/docs/3_reference/4_objects/0_language/reference-class.txt @@ -0,0 +1,57 @@ +Title: $language + +---- + +Class: Kirby\Cms\Language + +---- + +Text: + +## Details + +To have access to the methods of the `$language` object, you need to get a language object first: + +### Default language + +```php +$language = $kirby->defaultLanguage(); +``` + +### The current language + +```php +$language = $kirby->language(); +``` + +### Any particular language + +```php +$language = $kirby->language('fr'); +``` + +## Examples + +With the object in place, you can use it like this: + +### Get the language code + +```php +echo $language->code(); +``` + +### Get the language name + +```php +echo $language->name(); +``` + +### Get the available translations + +```php +dump($language->translations()); +``` + + + + diff --git a/content/docs/3_reference/4_objects/0_languages/reference-class.txt b/content/docs/3_reference/4_objects/0_languages/reference-class.txt new file mode 100644 index 0000000000..aaf66f3952 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_languages/reference-class.txt @@ -0,0 +1,45 @@ +Title: $languages + +---- + +Class: Kirby\Cms\Languages + +---- + +Text: + +## Details + +To use the methods of the `$languages` class, you need a `$languages` object, which you get can like this: + +```php +$languages = $kirby->languages(); +``` + +With the object in place, you can now use it like this: + +## Examples + +### Find a language by code + +```php +$language = $languages->find('de'); +``` + + +### Get the number of languages + +```php +$numberOfLanguage = $languages->count(); +``` + +### Sort languages by name + +```php +$sortedLanguages = $languages->sortBy('name', 'desc'); +---- + +Excerpt: + +The `$languages` object gives you a collection of all the languages that have been defined for your Kirby installation. The methods of this class allow you to filter, find, group, search the languages collection. + diff --git a/content/docs/3_reference/4_objects/0_layouts/reference-class.txt b/content/docs/3_reference/4_objects/0_layouts/reference-class.txt new file mode 100644 index 0000000000..48c58b89a6 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_layouts/reference-class.txt @@ -0,0 +1,15 @@ +Title: $layouts + +---- + +Class: Kirby\Cms\Layouts + +---- + +Since: 3.5.0 + +---- + +Text: + +(docs: layouts/to-layouts) diff --git a/content/1_docs/3_reference/4_objects/0_page/0_audio/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_audio/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_audio/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_audio/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_change-slug/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_change-slug/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_change-slug/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_change-slug/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_change-status/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_change-status/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_change-status/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_change-status/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_change-template/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_change-template/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_change-template/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_change-template/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_change-title/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_change-title/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_change-title/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_change-title/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_children/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_children/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_children/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_children/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_code/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_code/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_code/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_code/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_create-child/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_create-child/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_create-child/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_create-child/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_page/0_create-file/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_create-file/reference-classmethod.txt new file mode 100644 index 0000000000..4a46b8a96b --- /dev/null +++ b/content/docs/3_reference/4_objects/0_page/0_create-file/reference-classmethod.txt @@ -0,0 +1,5 @@ +Auth: files.create + +---- + +Properties: $props|Kirby\Cms\File \ No newline at end of file diff --git a/content/docs/3_reference/4_objects/0_page/0_create/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_create/reference-classmethod.txt new file mode 100644 index 0000000000..7b1e189daf --- /dev/null +++ b/content/docs/3_reference/4_objects/0_page/0_create/reference-classmethod.txt @@ -0,0 +1,22 @@ +Auth: pages.create + +---- + +Properties: $props + +---- + +Text: + +## Example + +```php +$page = Page::create([ + 'slug' => 'a-new-article', + 'template' => 'article', + 'content' => [ + 'title' => 'A new article', + 'author' => 'Homer Simpson' + ] +]); +``` diff --git a/content/1_docs/3_reference/4_objects/0_page/0_decrement/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_decrement/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_decrement/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_decrement/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_delete/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_delete/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_delete/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_delete/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_depth/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_depth/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_depth/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_depth/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_dirname/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_dirname/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_dirname/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_dirname/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_diruri/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_diruri/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_diruri/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_diruri/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_documents/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_documents/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_documents/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_documents/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_page/0_factory/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_factory/reference-classmethod.txt new file mode 100644 index 0000000000..6d3e83f7a8 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_page/0_factory/reference-classmethod.txt @@ -0,0 +1 @@ +Properties: $props diff --git a/content/1_docs/3_reference/4_objects/0_page/0_file/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_file/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_file/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_file/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_files/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_files/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_files/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_files/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_find/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_find/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_find/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_find/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_go/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_go/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_go/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_go/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_grand-children/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_grand-children/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_grand-children/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_grand-children/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-audio/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-audio/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-audio/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-audio/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-children/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-children/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-children/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-children/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-code/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-code/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-code/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-code/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-documents/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-documents/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-documents/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-documents/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-files/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-files/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-files/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-files/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-images/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-images/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-images/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-images/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-listed-children/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-listed-children/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-listed-children/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-listed-children/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-next-listed/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-next-listed/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-next-listed/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-next-listed/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-next-unlisted/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-next-unlisted/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-next-unlisted/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-next-unlisted/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-next/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-next/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-next/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-next/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-prev-listed/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-prev-listed/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-prev-listed/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-prev-listed/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-prev-unlisted/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-prev-unlisted/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-prev-unlisted/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-prev-unlisted/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-prev/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-prev/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-prev/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-prev/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-unlisted-children/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-unlisted-children/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-unlisted-children/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-unlisted-children/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_has-videos/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_has-videos/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_has-videos/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_has-videos/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_id/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_id/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_id/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_id/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_image/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_image/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_image/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_image/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_images/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_images/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_images/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_images/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_increment/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_increment/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_increment/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_increment/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_index/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_index/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_index/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_index/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_intended-template/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_intended-template/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_intended-template/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_intended-template/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_inventory/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_inventory/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_inventory/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_inventory/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_is-active/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_is-active/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_is-active/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_is-active/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_is-ancestor-of/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_is-ancestor-of/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_is-ancestor-of/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_is-ancestor-of/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_is-child-of/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_is-child-of/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_is-child-of/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_is-child-of/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_is-descendant-of-active/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_is-descendant-of-active/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_is-descendant-of-active/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_is-descendant-of-active/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_is-descendant-of/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_is-descendant-of/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_is-descendant-of/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_is-descendant-of/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_is-error-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_is-error-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_is-error-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_is-error-page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_is-home-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_is-home-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_is-home-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_is-home-page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_is-open/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_is-open/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_is-open/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_is-open/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_is-unlisted/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_is-unlisted/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_is-unlisted/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_is-unlisted/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_modified/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_modified/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_modified/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_modified/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_next-listed/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_next-listed/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_next-listed/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_next-listed/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_next-unlisted/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_next-unlisted/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_next-unlisted/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_next-unlisted/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_next/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_next/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_next/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_next/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_num/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_num/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_num/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_num/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_parent/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_parent/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_parent/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_parent/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_parents/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_parents/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_parents/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_parents/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_prev-listed/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_prev-listed/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_prev-listed/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_prev-listed/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_prev-unlisted/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_prev-unlisted/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_prev-unlisted/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_prev-unlisted/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_prev/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_prev/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_prev/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_prev/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_root/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_root/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_root/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_root/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_search/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_search/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_search/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_search/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_siblings/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_siblings/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_siblings/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_siblings/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_slug/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_slug/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_slug/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_slug/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_sort/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_sort/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_sort/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_sort/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_template/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_template/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_template/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_template/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_title/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_title/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_title/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_title/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_to-array/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_to-array/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_to-array/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_to-array/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_uid/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_uid/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_uid/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_uid/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_update/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_update/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_update/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_update/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_uri/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_uri/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_uri/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_uri/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_url/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_url/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_url/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_url/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_page/0_videos/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_page/0_videos/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_page/0_videos/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_page/0_videos/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_page/reference-class.txt b/content/docs/3_reference/4_objects/0_page/reference-class.txt new file mode 100644 index 0000000000..69a35e1526 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_page/reference-class.txt @@ -0,0 +1,84 @@ +Title: $page + +---- + +Class: Kirby\Cms\Page + +---- + +Text: + +You can extend this set of methods with (link: docs/reference/plugins/extensions/page-methods text: custom page methods) or in a (link: docs/reference/plugins/extensions/page-models text: page model). + +## How to fetch the `$page` object + +The `$page` class is available in Kirby's templates/snippets etc. through the `$page` variable that - unless otherwise defined – always refers to the current page. However, you can also define a `$page` object by calling a specific page using the [`page()` helper](/docs/reference/templates/helpers/page): + +```php +$page = page('somepage'); +``` + +Or getting it from a collection of pages + +```php +$page = $pages->first(); +``` + + +When getting a specific page via the [`page()` helper](/docs/reference/templates/helpers/page) or when trying to create a page object from field values stored in content, always verify that you have a page object before you call any of the Page methods. + + +## Content fields + +The `$page` class offers a magic caller for your (link: docs/guide/content/fields text: content fields). Instead of getting them via e.g. + +```php +$page->content()->get('your_field') +``` + +you can use the shorthand + +```php +$page->your_field() +``` + + +You can not use the shorthand for fields with names that conflict with the default methods of the `$page` class (see above) or used by custom page methods. + + + +## Examples + +With the `$page` object defined, you can start using the methods of the class: + +### Get a field of the page + +```php +title() ?> +``` + +### Get the children of the page + +```php +children() ?> +``` + +### Get all images of the page + +```php +images() ?> +``` + +### Check if the page is active + +```php +isActive(), 'active') ?> +``` + +### Check if the page has draft children + +```php +if ($page->hasDrafts()) { + echo "This page still has some children that haven't been published yet"; +} +``` diff --git a/content/docs/3_reference/4_objects/0_pages/0___construct/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0___construct/reference-classmethod.txt new file mode 100644 index 0000000000..eeba507eb5 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_pages/0___construct/reference-classmethod.txt @@ -0,0 +1 @@ +Properties: $objects|Kirby\Cms\Page|page \ No newline at end of file diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_add/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_add/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_add/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_add/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_append/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_append/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_append/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_append/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_children/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_children/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_children/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_children/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_count/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_count/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_count/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_count/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_files/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_files/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_files/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_files/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_filter-by/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_filter-by/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_filter-by/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_filter-by/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_filter/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_filter/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_filter/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_filter/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_find-by-uri/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_find-by-uri/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_find-by-uri/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_find-by-uri/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_find-by/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_find-by/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_find-by/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_find-by/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_find-open/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_find-open/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_find-open/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_find-open/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_find/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_find/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_find/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_find/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_first/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_first/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_first/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_first/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_flip/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_flip/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_flip/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_flip/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_get/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_get/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_get/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_get/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_group-by/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_group-by/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_group-by/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_group-by/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_group/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_group/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_group/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_group/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_has/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_has/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_has/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_has/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_index/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_index/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_index/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_index/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_intersection/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_intersection/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_intersection/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_intersection/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_intersects/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_intersects/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_intersects/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_intersects/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_keys/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_keys/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_keys/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_keys/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_last/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_last/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_last/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_last/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_limit/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_limit/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_limit/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_limit/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_map/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_map/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_map/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_map/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_merge/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_merge/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_merge/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_merge/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_not-template/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_not-template/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_not-template/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_not-template/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_not/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_not/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_not/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_not/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_nth/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_nth/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_nth/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_nth/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_offset/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_offset/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_offset/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_offset/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_paginate/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_paginate/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_paginate/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_paginate/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_pagination/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_pagination/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_pagination/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_pagination/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_pluck/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_pluck/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_pluck/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_pluck/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_prepend/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_prepend/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_prepend/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_prepend/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_search/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_search/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_search/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_search/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_shuffle/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_shuffle/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_shuffle/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_shuffle/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_slice/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_slice/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_slice/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_slice/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_sort-by/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_sort-by/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_sort-by/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_sort-by/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_unlisted/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_unlisted/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_unlisted/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_unlisted/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pages/0_when/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pages/0_when/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pages/0_when/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pages/0_when/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_pages/reference-class.txt b/content/docs/3_reference/4_objects/0_pages/reference-class.txt new file mode 100644 index 0000000000..5c5c3e5f26 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_pages/reference-class.txt @@ -0,0 +1,71 @@ +Title: $pages + +---- + +Class: Kirby\Cms\Pages + +---- + +Text: + +You can extend this set of methods with (link: docs/reference/plugins/extensions/pages-methods text: custom pages methods). + +## How to get a `$pages` object + +The `$pages` variable is available by default in templates and snippets and refers to a collection of all first level pages. In addition to that, you can define a `$pages` object in various ways: + +### Children of a page +```php +$pages = $page->children(); +``` + +### All pages of the site +```php +$pages = $site->index(); +``` + +### A custom combination of pages +```php +// find specific pages in the site +$pages = $site->find('blog', 'projects', 'contact'); + +// find specific subpages +$pages = $page->find('article-a', 'article-b'); +``` + +## Examples + +With the `$pages` object in place, we can start using the methods of this class to do many different things: + +### Filter the collection by any criterium + +```php +$articles = $pages->filterBy('date', '>', time()); +``` + +### Get only listed pages + +```php +$articles = $pages->listed() +``` +### Get all files of all the pages in the collection + +```php +$files = $pages->files(); +``` + +### Get the first/last page + +```php +$firstPage = $pages->first(); +$lastPage = $pages->last(); +``` + + +### Sort pages + +```php +$sorted = $pages->sortBy(function ($page) { + return $page->date()->toDate(); +}, 'desc'); +``` diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_first-page-url/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_first-page-url/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_first-page-url/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_first-page-url/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_first-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_first-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_first-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_first-page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_has-next-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_has-next-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_has-next-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_has-next-page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_has-pages/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_has-pages/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_has-pages/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_has-pages/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_has-prev-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_has-prev-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_has-prev-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_has-prev-page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_is-first-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_is-first-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_is-first-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_is-first-page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_is-last-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_is-last-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_is-last-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_is-last-page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_last-page-url/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_last-page-url/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_last-page-url/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_last-page-url/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_last-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_last-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_last-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_last-page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_limit/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_limit/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_limit/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_limit/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_next-page-url/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_next-page-url/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_next-page-url/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_next-page-url/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_next-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_next-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_next-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_next-page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_page-url/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_page-url/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_page-url/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_page-url/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_pages/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_pages/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_pages/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_pages/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_prev-page-url/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_prev-page-url/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_prev-page-url/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_prev-page-url/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_pagination/0_prev-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_pagination/0_prev-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_pagination/0_prev-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_pagination/0_prev-page/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_pagination/reference-class.txt b/content/docs/3_reference/4_objects/0_pagination/reference-class.txt new file mode 100644 index 0000000000..8957f52a3d --- /dev/null +++ b/content/docs/3_reference/4_objects/0_pagination/reference-class.txt @@ -0,0 +1,40 @@ +Title: $pagination + +---- + +Class: Kirby\Cms\Pagination + +---- + +Text: + +## How to create a `$pagination` object + +To create a `$pagination` object, you have to paginate a collection of pages and then call the `pagination()` method: + +```php +$articles = page('blog')->children()->listed()->paginate(5); +$pagination = $articles->pagination(); +``` +This will give us 5 articles per pagination page. + +## Example + +With the object in place, we can now use the methods to create our pagination navigation + +```php +hasPages()): ?> + + +``` + diff --git a/content/docs/3_reference/4_objects/0_request/reference-class.txt b/content/docs/3_reference/4_objects/0_request/reference-class.txt new file mode 100644 index 0000000000..046d8d7933 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_request/reference-class.txt @@ -0,0 +1,41 @@ +Title: $request + +---- + +Class: Kirby\Http\Request + +---- + +Text: + +## How to get a `$request` object + +The `$request` object is available via the `$kirby` object: + +```php +$request = $kirby->request(); +``` + +## Examples + +With the object in place, you have access to all the methods listed above. + +### Get a specific variable from the query string + +```php +$filter = $request->query()->filter(); +``` + +### Get the Params object + +The `$params` object contains all URL parameters + +```php +$params = $request->params(); +``` + +### Get the request method + +```php +$method = $request->method(); +``` diff --git a/content/docs/3_reference/4_objects/0_session/reference-class.txt b/content/docs/3_reference/4_objects/0_session/reference-class.txt new file mode 100644 index 0000000000..67f512e6e8 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_session/reference-class.txt @@ -0,0 +1,21 @@ +Title: $session + +---- + +Name: Session + +---- + +Class: Kirby\Session\SessionData + +---- + +Text: + +## How to get the `$session` object + +The `$session` object is available via the `$kirby` object: + +```php +$session = $kirby->session(); +``` diff --git a/content/1_docs/3_reference/4_objects/0_site/0_audio/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_audio/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_audio/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_audio/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_breadcrumb/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_breadcrumb/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_breadcrumb/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_breadcrumb/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_change-title/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_change-title/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_change-title/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_change-title/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_children/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_children/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_children/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_children/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_code/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_code/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_code/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_code/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_site/0_create-file/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_create-file/reference-classmethod.txt new file mode 100644 index 0000000000..4a46b8a96b --- /dev/null +++ b/content/docs/3_reference/4_objects/0_site/0_create-file/reference-classmethod.txt @@ -0,0 +1,5 @@ +Auth: files.create + +---- + +Properties: $props|Kirby\Cms\File \ No newline at end of file diff --git a/content/1_docs/3_reference/4_objects/0_site/0_documents/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_documents/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_documents/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_documents/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_error-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_error-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_error-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_error-page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_file/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_file/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_file/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_file/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_files/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_files/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_files/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_files/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_find/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_find/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_find/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_find/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_grand-children/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_grand-children/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_grand-children/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_grand-children/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_has-audio/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_has-audio/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_has-audio/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_has-audio/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_has-code/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_has-code/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_has-code/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_has-code/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_has-documents/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_has-documents/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_has-documents/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_has-documents/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_has-files/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_has-files/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_has-files/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_has-files/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_has-images/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_has-images/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_has-images/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_has-images/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_has-invisible-children/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_has-invisible-children/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_has-invisible-children/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_has-invisible-children/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_has-videos/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_has-videos/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_has-videos/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_has-videos/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_has-visible-children/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_has-visible-children/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_has-visible-children/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_has-visible-children/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_home-page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_home-page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_home-page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_home-page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_id/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_id/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_id/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_id/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_image/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_image/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_image/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_image/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_images/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_images/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_images/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_images/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_index/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_index/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_index/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_index/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_modified/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_modified/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_modified/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_modified/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_page/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_page/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_page/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_page/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_pages/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_pages/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_pages/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_pages/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_search/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_search/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_search/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_search/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_update/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_update/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_update/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_update/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_url/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_url/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_url/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_url/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_videos/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_videos/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_videos/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_videos/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_visit/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_visit/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_visit/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_visit/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_site/0_was-modified-after/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_site/0_was-modified-after/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_site/0_was-modified-after/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_site/0_was-modified-after/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_site/reference-class.txt b/content/docs/3_reference/4_objects/0_site/reference-class.txt new file mode 100644 index 0000000000..cce0730026 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_site/reference-class.txt @@ -0,0 +1,57 @@ +Title: $site + +---- + +Class: Kirby\Cms\Site + +---- + +Text: + +## How to access the `$site` object + +The `$site` variable is automatically available in your templates and snippets. + +To access the `$site` object in extensions, you have to define it first: + +```php +// via the kirby object +$site = $kirby->site(); + +// using the `site()` helper +$site = site(); +``` + +## Examples + +### Get the site title + +```php +echo $site->title(); +``` + +### Get any custom field of the site + +```php +echo $site->description(); +``` + +### Get the files stored in the content folder + +```php +$siteFiles = $site->files(); +``` + +### Get all the pages of the site + +```php +$pageIndex = $site->index(); +``` + +### Get the URL of the site + +```php +$url = $site->url(); +``` + + diff --git a/content/1_docs/3_reference/4_objects/0_user/0_avatar/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_avatar/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_avatar/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_avatar/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_change-email/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_change-email/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_change-email/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_change-email/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_change-language/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_change-language/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_change-language/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_change-language/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_change-name/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_change-name/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_change-name/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_change-name/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_change-password/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_change-password/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_change-password/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_change-password/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_change-role/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_change-role/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_change-role/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_change-role/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_user/0_create-file/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_create-file/reference-classmethod.txt new file mode 100644 index 0000000000..4a46b8a96b --- /dev/null +++ b/content/docs/3_reference/4_objects/0_user/0_create-file/reference-classmethod.txt @@ -0,0 +1,5 @@ +Auth: files.create + +---- + +Properties: $props|Kirby\Cms\File \ No newline at end of file diff --git a/content/docs/3_reference/4_objects/0_user/0_create/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_create/reference-classmethod.txt new file mode 100644 index 0000000000..e0740973c7 --- /dev/null +++ b/content/docs/3_reference/4_objects/0_user/0_create/reference-classmethod.txt @@ -0,0 +1,25 @@ +Auth: users.create + +---- + +Properties: $props + +---- + +Text: + +## Example + +```php +$newUser = User::create([ + 'email' => 'bastian@getkirby.com', + 'name' => 'Bastian', + 'role' => 'admin', + 'language' => 'en', + 'password' => 'topSecret', + 'content' => [ + 'twitter' => '@getkirby', + 'position' => 'founder' + ] +]); +``` diff --git a/content/1_docs/3_reference/4_objects/0_user/0_delete/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_delete/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_delete/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_delete/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_email/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_email/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_email/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_email/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_exists/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_exists/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_exists/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_exists/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_is/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_is/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_is/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_is/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_login-passwordless/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_login-passwordless/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_login-passwordless/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_login-passwordless/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_login/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_login/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_login/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_login/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_logout/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_logout/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_logout/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_logout/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_update/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_update/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_update/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_update/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_user/0_username/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_user/0_username/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_user/0_username/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_user/0_username/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_user/reference-class.txt b/content/docs/3_reference/4_objects/0_user/reference-class.txt new file mode 100644 index 0000000000..36af0c8c3d --- /dev/null +++ b/content/docs/3_reference/4_objects/0_user/reference-class.txt @@ -0,0 +1,74 @@ +Title: $user + +---- + +Class: Kirby\Cms\User + +---- + +Text: + +## How to create a `$user` object + +Before you can call the methods of the User class, you need a `$user` object. + +The `$user` object is available via the `$kirby` object: + +### The current user + +```php +$user = $kirby->user(); +``` + +### A specific user by user id or email address +```php +$user = $kirby->user('you@yourdomain.com'); +``` + +### The first user of the users collection +```php +$user = $kirby->users()->first(); +``` + + +Before calling any of the methods of the User class, verify that you have a valid User object. + + + +## Examples + +With the `$user` object in place, you can use the methods of the user class to get information about the user or modify the user object. + +### Check if the user is an admin + +```php +if ($user->isAdmin()) { + echo "Hey, great, you can do anything you like!" +} +``` + +### Convert user object to array + +```php +$userData = $user->toArray(); +``` + +### Change the user name programmatically + +```php +$user->changeName('new-name'); +``` + +### Fetch all files belonging to the user object + +```php +$userFiles = $user->files(); +``` + + +To keep the examples short, we don't [check if the (user) object exists](docs/cookbook/templating/php-templates#and-one-last-trick) in the examples above. In your code, you should always do that. + + + + + diff --git a/content/1_docs/3_reference/4_objects/0_users/0_create/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_users/0_create/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_users/0_create/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_users/0_create/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_users/0_current/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_users/0_current/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_users/0_current/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_users/0_current/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_users/0_filter-by/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_users/0_filter-by/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_users/0_filter-by/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_users/0_filter-by/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_users/0_has/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_users/0_has/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_users/0_has/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_users/0_has/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_users/0_intersection/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_users/0_intersection/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_users/0_intersection/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_users/0_intersection/reference-classmethod.txt diff --git a/content/1_docs/3_reference/4_objects/0_users/0_intersects/reference-classmethod.txt b/content/docs/3_reference/4_objects/0_users/0_intersects/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/0_users/0_intersects/reference-classmethod.txt rename to content/docs/3_reference/4_objects/0_users/0_intersects/reference-classmethod.txt diff --git a/content/docs/3_reference/4_objects/0_users/reference-class.txt b/content/docs/3_reference/4_objects/0_users/reference-class.txt new file mode 100644 index 0000000000..abc71d076d --- /dev/null +++ b/content/docs/3_reference/4_objects/0_users/reference-class.txt @@ -0,0 +1,44 @@ +Title: $users + +---- + +Class: Kirby\Cms\Users + +---- + +Text: + +## How to get a `$users` object + +The users object is available via the `$kirby` object: + +```php +$users = $kirby->users(); +``` + +This will return a collection of all users of the site. + +## Examples + +With the `$users` object in place, you can now use all the methods of the class, for example: + +### Get all admin users + +```php +$admins = $users->filterBy('isAdmin'); +``` + +### Fetch all values of a user field into an array + +```php +$userEmails = $users->pluck('email'); +``` +This will return an array with all the email adresses of all users. + +### Sort users + +```php +$sorted = $users->sortBy('role'); +``` + + diff --git a/content/1_docs/3_reference/4_objects/link.txt b/content/docs/3_reference/4_objects/link.txt similarity index 100% rename from content/1_docs/3_reference/4_objects/link.txt rename to content/docs/3_reference/4_objects/link.txt diff --git a/content/1_docs/3_reference/5_router/0_patterns/0_all/reference-article.txt b/content/docs/3_reference/5_router/0_patterns/0_all/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_patterns/0_all/reference-article.txt rename to content/docs/3_reference/5_router/0_patterns/0_all/reference-article.txt diff --git a/content/1_docs/3_reference/5_router/0_patterns/0_alpha/reference-article.txt b/content/docs/3_reference/5_router/0_patterns/0_alpha/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_patterns/0_alpha/reference-article.txt rename to content/docs/3_reference/5_router/0_patterns/0_alpha/reference-article.txt diff --git a/content/1_docs/3_reference/5_router/0_patterns/0_alphanum/reference-article.txt b/content/docs/3_reference/5_router/0_patterns/0_alphanum/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_patterns/0_alphanum/reference-article.txt rename to content/docs/3_reference/5_router/0_patterns/0_alphanum/reference-article.txt diff --git a/content/1_docs/3_reference/5_router/0_patterns/0_any/reference-article.txt b/content/docs/3_reference/5_router/0_patterns/0_any/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_patterns/0_any/reference-article.txt rename to content/docs/3_reference/5_router/0_patterns/0_any/reference-article.txt diff --git a/content/1_docs/3_reference/5_router/0_patterns/0_num/reference-article.txt b/content/docs/3_reference/5_router/0_patterns/0_num/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_patterns/0_num/reference-article.txt rename to content/docs/3_reference/5_router/0_patterns/0_num/reference-article.txt diff --git a/content/1_docs/3_reference/5_router/0_patterns/reference-section.txt b/content/docs/3_reference/5_router/0_patterns/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_patterns/reference-section.txt rename to content/docs/3_reference/5_router/0_patterns/reference-section.txt diff --git a/content/1_docs/3_reference/5_router/0_responses/0_array/reference-article.txt b/content/docs/3_reference/5_router/0_responses/0_array/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_responses/0_array/reference-article.txt rename to content/docs/3_reference/5_router/0_responses/0_array/reference-article.txt diff --git a/content/1_docs/3_reference/5_router/0_responses/0_empty/reference-article.txt b/content/docs/3_reference/5_router/0_responses/0_empty/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_responses/0_empty/reference-article.txt rename to content/docs/3_reference/5_router/0_responses/0_empty/reference-article.txt diff --git a/content/1_docs/3_reference/5_router/0_responses/0_exception/reference-article.txt b/content/docs/3_reference/5_router/0_responses/0_exception/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_responses/0_exception/reference-article.txt rename to content/docs/3_reference/5_router/0_responses/0_exception/reference-article.txt diff --git a/content/1_docs/3_reference/5_router/0_responses/0_page/reference-article.txt b/content/docs/3_reference/5_router/0_responses/0_page/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_responses/0_page/reference-article.txt rename to content/docs/3_reference/5_router/0_responses/0_page/reference-article.txt diff --git a/content/1_docs/3_reference/5_router/0_responses/0_response/reference-article.txt b/content/docs/3_reference/5_router/0_responses/0_response/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_responses/0_response/reference-article.txt rename to content/docs/3_reference/5_router/0_responses/0_response/reference-article.txt diff --git a/content/1_docs/3_reference/5_router/0_responses/0_string/reference-article.txt b/content/docs/3_reference/5_router/0_responses/0_string/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_responses/0_string/reference-article.txt rename to content/docs/3_reference/5_router/0_responses/0_string/reference-article.txt diff --git a/content/1_docs/3_reference/5_router/0_responses/reference-section.txt b/content/docs/3_reference/5_router/0_responses/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/5_router/0_responses/reference-section.txt rename to content/docs/3_reference/5_router/0_responses/reference-section.txt diff --git a/content/1_docs/3_reference/5_router/link.txt b/content/docs/3_reference/5_router/link.txt similarity index 100% rename from content/1_docs/3_reference/5_router/link.txt rename to content/docs/3_reference/5_router/link.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_api/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_api/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_api/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_api/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_auth/2fa.png b/content/docs/3_reference/6_system/1_options/0_auth/2fa.png similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_auth/2fa.png rename to content/docs/3_reference/6_system/1_options/0_auth/2fa.png diff --git a/content/1_docs/3_reference/6_system/1_options/0_auth/email-and-password.png b/content/docs/3_reference/6_system/1_options/0_auth/email-and-password.png similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_auth/email-and-password.png rename to content/docs/3_reference/6_system/1_options/0_auth/email-and-password.png diff --git a/content/1_docs/3_reference/6_system/1_options/0_auth/login.png b/content/docs/3_reference/6_system/1_options/0_auth/login.png similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_auth/login.png rename to content/docs/3_reference/6_system/1_options/0_auth/login.png diff --git a/content/1_docs/3_reference/6_system/1_options/0_auth/password-reset.png b/content/docs/3_reference/6_system/1_options/0_auth/password-reset.png similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_auth/password-reset.png rename to content/docs/3_reference/6_system/1_options/0_auth/password-reset.png diff --git a/content/1_docs/3_reference/6_system/1_options/0_auth/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_auth/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_auth/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_auth/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_cache/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_cache/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_cache/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_cache/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_content/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_content/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_content/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_content/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_date/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_date/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_date/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_date/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_debug/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_debug/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_debug/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_debug/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_email/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_email/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_email/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_email/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_error/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_error/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_error/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_error/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_fatal/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_fatal/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_fatal/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_fatal/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_home/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_home/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_home/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_home/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_hooks/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_hooks/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_hooks/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_hooks/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_kirbytext/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_kirbytext/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_kirbytext/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_kirbytext/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_languages/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_languages/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_languages/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_languages/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_locale/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_locale/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_locale/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_locale/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_markdown/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_markdown/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_markdown/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_markdown/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_panel/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_panel/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_panel/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_panel/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_ready/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_ready/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_ready/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_ready/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_remote/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_remote/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_remote/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_remote/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_routes/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_routes/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_routes/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_routes/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_servers/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_servers/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_servers/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_servers/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_session/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_session/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_session/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_session/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_slugs/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_slugs/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_slugs/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_slugs/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_smartypants/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_smartypants/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_smartypants/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_smartypants/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_thumbs/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_thumbs/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_thumbs/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_thumbs/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_url/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_url/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_url/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_url/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/0_whoops/reference-article.txt b/content/docs/3_reference/6_system/1_options/0_whoops/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/0_whoops/reference-article.txt rename to content/docs/3_reference/6_system/1_options/0_whoops/reference-article.txt diff --git a/content/1_docs/3_reference/6_system/1_options/reference-section.txt b/content/docs/3_reference/6_system/1_options/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/6_system/1_options/reference-section.txt rename to content/docs/3_reference/6_system/1_options/reference-section.txt diff --git a/content/1_docs/3_reference/6_system/2_urls/0_assets/reference-url.txt b/content/docs/3_reference/6_system/2_urls/0_assets/reference-url.txt similarity index 100% rename from content/1_docs/3_reference/6_system/2_urls/0_assets/reference-url.txt rename to content/docs/3_reference/6_system/2_urls/0_assets/reference-url.txt diff --git a/content/1_docs/3_reference/6_system/2_urls/0_index/reference-url.txt b/content/docs/3_reference/6_system/2_urls/0_index/reference-url.txt similarity index 100% rename from content/1_docs/3_reference/6_system/2_urls/0_index/reference-url.txt rename to content/docs/3_reference/6_system/2_urls/0_index/reference-url.txt diff --git a/content/1_docs/3_reference/6_system/2_urls/0_media/reference-url.txt b/content/docs/3_reference/6_system/2_urls/0_media/reference-url.txt similarity index 100% rename from content/1_docs/3_reference/6_system/2_urls/0_media/reference-url.txt rename to content/docs/3_reference/6_system/2_urls/0_media/reference-url.txt diff --git a/content/1_docs/3_reference/6_system/2_urls/reference-urls.txt b/content/docs/3_reference/6_system/2_urls/reference-urls.txt similarity index 100% rename from content/1_docs/3_reference/6_system/2_urls/reference-urls.txt rename to content/docs/3_reference/6_system/2_urls/reference-urls.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_accounts/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_accounts/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_accounts/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_accounts/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_assets/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_assets/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_assets/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_assets/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_blueprints/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_blueprints/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_blueprints/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_blueprints/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_cache/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_cache/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_cache/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_cache/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_collections/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_collections/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_collections/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_collections/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_config/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_config/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_config/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_config/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_content/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_content/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_content/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_content/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_controllers/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_controllers/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_controllers/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_controllers/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_index/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_index/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_index/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_index/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_kirby/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_kirby/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_kirby/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_kirby/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_logs/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_logs/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_logs/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_logs/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_media/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_media/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_media/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_media/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_models/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_models/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_models/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_models/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_plugins/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_plugins/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_plugins/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_plugins/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_roles/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_roles/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_roles/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_roles/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_sessions/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_sessions/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_sessions/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_sessions/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_site/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_site/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_site/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_site/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_snippets/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_snippets/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_snippets/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_snippets/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/0_templates/reference-root.txt b/content/docs/3_reference/6_system/3_roots/0_templates/reference-root.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/0_templates/reference-root.txt rename to content/docs/3_reference/6_system/3_roots/0_templates/reference-root.txt diff --git a/content/1_docs/3_reference/6_system/3_roots/reference-roots.txt b/content/docs/3_reference/6_system/3_roots/reference-roots.txt similarity index 100% rename from content/1_docs/3_reference/6_system/3_roots/reference-roots.txt rename to content/docs/3_reference/6_system/3_roots/reference-roots.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_alpha/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_alpha/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_alpha/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_alpha/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_alphanum/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_alphanum/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_alphanum/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_alphanum/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_between/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_between/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_between/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_between/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_date/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_date/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_date/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_date/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_different/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_different/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_different/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_different/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_email/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_email/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_email/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_email/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_filename/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_filename/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_filename/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_filename/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_in/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_in/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_in/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_in/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_integer/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_integer/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_integer/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_integer/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_ip/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_ip/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_ip/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_ip/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_match/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_match/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_match/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_match/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_max-length/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_max-length/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_max-length/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_max-length/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_max-words/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_max-words/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_max-words/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_max-words/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_max/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_max/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_max/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_max/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_min-length/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_min-length/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_min-length/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_min-length/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_min-words/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_min-words/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_min-words/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_min-words/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_min/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_min/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_min/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_min/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_not-in/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_not-in/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_not-in/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_not-in/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_num/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_num/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_num/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_num/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_same/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_same/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_same/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_same/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_size/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_size/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_size/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_size/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/0_url/reference-validator.txt b/content/docs/3_reference/6_system/4_validators/0_url/reference-validator.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/0_url/reference-validator.txt rename to content/docs/3_reference/6_system/4_validators/0_url/reference-validator.txt diff --git a/content/1_docs/3_reference/6_system/4_validators/reference-validators.txt b/content/docs/3_reference/6_system/4_validators/reference-validators.txt similarity index 100% rename from content/1_docs/3_reference/6_system/4_validators/reference-validators.txt rename to content/docs/3_reference/6_system/4_validators/reference-validators.txt diff --git a/content/1_docs/3_reference/6_system/link.txt b/content/docs/3_reference/6_system/link.txt similarity index 100% rename from content/1_docs/3_reference/6_system/link.txt rename to content/docs/3_reference/6_system/link.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_api/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_api/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_api/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_api/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_auth-challenges/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_auth-challenges/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_auth-challenges/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_auth-challenges/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_blocks/custom-preview.png b/content/docs/3_reference/7_plugins/1_extensions/0_blocks/custom-preview.png similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_blocks/custom-preview.png rename to content/docs/3_reference/7_plugins/1_extensions/0_blocks/custom-preview.png diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_blocks/editing.png b/content/docs/3_reference/7_plugins/1_extensions/0_blocks/editing.png similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_blocks/editing.png rename to content/docs/3_reference/7_plugins/1_extensions/0_blocks/editing.png diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_blocks/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_blocks/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_blocks/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_blocks/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_blocks/wysiwyg.gif b/content/docs/3_reference/7_plugins/1_extensions/0_blocks/wysiwyg.gif similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_blocks/wysiwyg.gif rename to content/docs/3_reference/7_plugins/1_extensions/0_blocks/wysiwyg.gif diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_blueprints/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_blueprints/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_blueprints/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_blueprints/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_cache-drivers/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_cache-drivers/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_cache-drivers/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_cache-drivers/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_collection-filters/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_collection-filters/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_collection-filters/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_collection-filters/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_collection-methods/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_collection-methods/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_collection-methods/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_collection-methods/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_collections/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_collections/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_collections/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_collections/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_controllers/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_controllers/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_controllers/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_controllers/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_core-components/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_core-components/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_core-components/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_core-components/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_created/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_created/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_created/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_created/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_field-methods/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_field-methods/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_field-methods/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_field-methods/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_field-previews/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_field-previews/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_field-previews/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_field-previews/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_field-previews/structure.png b/content/docs/3_reference/7_plugins/1_extensions/0_field-previews/structure.png similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_field-previews/structure.png rename to content/docs/3_reference/7_plugins/1_extensions/0_field-previews/structure.png diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_fields/field.png b/content/docs/3_reference/7_plugins/1_extensions/0_fields/field.png similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_fields/field.png rename to content/docs/3_reference/7_plugins/1_extensions/0_fields/field.png diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_fields/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_fields/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_fields/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_fields/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_file-methods/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_file-methods/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_file-methods/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_file-methods/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_files-methods/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_files-methods/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_files-methods/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_files-methods/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_hooks/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_hooks/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_hooks/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_hooks/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_icons/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_icons/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_icons/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_icons/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_kirbytags/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_kirbytags/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_kirbytags/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_kirbytags/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_options/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_options/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_options/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_options/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_page-methods/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_page-methods/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_page-methods/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_page-methods/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_page-models/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_page-models/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_page-models/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_page-models/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_pages-methods/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_pages-methods/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_pages-methods/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_pages-methods/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_pages/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_pages/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_pages/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_pages/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_panel-login/login-form.png b/content/docs/3_reference/7_plugins/1_extensions/0_panel-login/login-form.png similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_panel-login/login-form.png rename to content/docs/3_reference/7_plugins/1_extensions/0_panel-login/login-form.png diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_panel-login/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_panel-login/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_panel-login/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_panel-login/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_panel-views/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_panel-views/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_panel-views/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_panel-views/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_permissions/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_permissions/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_permissions/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_permissions/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_routes/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_routes/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_routes/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_routes/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_sections/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_sections/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_sections/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_sections/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_site-methods/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_site-methods/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_site-methods/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_site-methods/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_snippets/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_snippets/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_snippets/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_snippets/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_templates/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_templates/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_templates/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_templates/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_translations/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_translations/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_translations/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_translations/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_user-methods/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_user-methods/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_user-methods/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_user-methods/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_user-models/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_user-models/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_user-models/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_user-models/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_users-methods/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_users-methods/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_users-methods/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_users-methods/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/0_validators/reference-extension.txt b/content/docs/3_reference/7_plugins/1_extensions/0_validators/reference-extension.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/0_validators/reference-extension.txt rename to content/docs/3_reference/7_plugins/1_extensions/0_validators/reference-extension.txt diff --git a/content/1_docs/3_reference/7_plugins/1_extensions/reference-extensions.txt b/content/docs/3_reference/7_plugins/1_extensions/reference-extensions.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/1_extensions/reference-extensions.txt rename to content/docs/3_reference/7_plugins/1_extensions/reference-extensions.txt diff --git a/content/1_docs/3_reference/7_plugins/2_hooks/0_kirbytags-after/reference-hook.txt b/content/docs/3_reference/7_plugins/2_hooks/0_kirbytags-after/reference-hook.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/2_hooks/0_kirbytags-after/reference-hook.txt rename to content/docs/3_reference/7_plugins/2_hooks/0_kirbytags-after/reference-hook.txt diff --git a/content/1_docs/3_reference/7_plugins/2_hooks/0_kirbytags-before/reference-hook.txt b/content/docs/3_reference/7_plugins/2_hooks/0_kirbytags-before/reference-hook.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/2_hooks/0_kirbytags-before/reference-hook.txt rename to content/docs/3_reference/7_plugins/2_hooks/0_kirbytags-before/reference-hook.txt diff --git a/content/1_docs/3_reference/7_plugins/2_hooks/0_kirbytext-after/reference-hook.txt b/content/docs/3_reference/7_plugins/2_hooks/0_kirbytext-after/reference-hook.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/2_hooks/0_kirbytext-after/reference-hook.txt rename to content/docs/3_reference/7_plugins/2_hooks/0_kirbytext-after/reference-hook.txt diff --git a/content/1_docs/3_reference/7_plugins/2_hooks/0_kirbytext-before/reference-hook.txt b/content/docs/3_reference/7_plugins/2_hooks/0_kirbytext-before/reference-hook.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/2_hooks/0_kirbytext-before/reference-hook.txt rename to content/docs/3_reference/7_plugins/2_hooks/0_kirbytext-before/reference-hook.txt diff --git a/content/1_docs/3_reference/7_plugins/2_hooks/0_page-update-after/reference-hook.txt b/content/docs/3_reference/7_plugins/2_hooks/0_page-update-after/reference-hook.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/2_hooks/0_page-update-after/reference-hook.txt rename to content/docs/3_reference/7_plugins/2_hooks/0_page-update-after/reference-hook.txt diff --git a/content/1_docs/3_reference/7_plugins/2_hooks/0_page-update-before/reference-hook.txt b/content/docs/3_reference/7_plugins/2_hooks/0_page-update-before/reference-hook.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/2_hooks/0_page-update-before/reference-hook.txt rename to content/docs/3_reference/7_plugins/2_hooks/0_page-update-before/reference-hook.txt diff --git a/content/1_docs/3_reference/7_plugins/2_hooks/0_route-after/reference-hook.txt b/content/docs/3_reference/7_plugins/2_hooks/0_route-after/reference-hook.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/2_hooks/0_route-after/reference-hook.txt rename to content/docs/3_reference/7_plugins/2_hooks/0_route-after/reference-hook.txt diff --git a/content/1_docs/3_reference/7_plugins/2_hooks/0_route-before/reference-hook.txt b/content/docs/3_reference/7_plugins/2_hooks/0_route-before/reference-hook.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/2_hooks/0_route-before/reference-hook.txt rename to content/docs/3_reference/7_plugins/2_hooks/0_route-before/reference-hook.txt diff --git a/content/1_docs/3_reference/7_plugins/2_hooks/0_system-loadplugins-after/reference-hook.txt b/content/docs/3_reference/7_plugins/2_hooks/0_system-loadplugins-after/reference-hook.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/2_hooks/0_system-loadplugins-after/reference-hook.txt rename to content/docs/3_reference/7_plugins/2_hooks/0_system-loadplugins-after/reference-hook.txt diff --git a/content/1_docs/3_reference/7_plugins/2_hooks/hooks.csv b/content/docs/3_reference/7_plugins/2_hooks/hooks.csv similarity index 100% rename from content/1_docs/3_reference/7_plugins/2_hooks/hooks.csv rename to content/docs/3_reference/7_plugins/2_hooks/hooks.csv diff --git a/content/1_docs/3_reference/7_plugins/2_hooks/reference-hooks.txt b/content/docs/3_reference/7_plugins/2_hooks/reference-hooks.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/2_hooks/reference-hooks.txt rename to content/docs/3_reference/7_plugins/2_hooks/reference-hooks.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_css/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_css/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_css/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_css/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_dump/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_dump/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_dump/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_dump/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_file-urls/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_file-urls/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_file-urls/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_file-urls/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_file-version/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_file-version/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_file-version/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_file-version/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_js/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_js/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_js/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_js/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_markdown/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_markdown/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_markdown/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_markdown/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_search/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_search/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_search/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_search/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_smartypants/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_smartypants/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_smartypants/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_smartypants/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_snippet/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_snippet/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_snippet/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_snippet/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_template/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_template/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_template/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_template/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_thumb/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_thumb/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_thumb/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_thumb/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/0_url/reference-component.txt b/content/docs/3_reference/7_plugins/3_components/0_url/reference-component.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/0_url/reference-component.txt rename to content/docs/3_reference/7_plugins/3_components/0_url/reference-component.txt diff --git a/content/1_docs/3_reference/7_plugins/3_components/reference-section.txt b/content/docs/3_reference/7_plugins/3_components/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/3_components/reference-section.txt rename to content/docs/3_reference/7_plugins/3_components/reference-section.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_autocomplete/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_autocomplete/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_autocomplete/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_autocomplete/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_bar/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_bar/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_bar/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_bar/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_box/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_box/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_box/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_box/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_button-group/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_button-group/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_button-group/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_button-group/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_button/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_button/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_button/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_button/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_calendar/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_calendar/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_calendar/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_calendar/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_card/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_card/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_card/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_card/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_cards/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_cards/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_cards/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_cards/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_checkbox-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_checkbox-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_checkbox-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_checkbox-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_checkboxes-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_checkboxes-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_checkboxes-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_checkboxes-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_checkboxes-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_checkboxes-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_checkboxes-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_checkboxes-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_collection/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_collection/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_collection/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_collection/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_column/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_column/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_column/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_column/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_counter/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_counter/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_counter/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_counter/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_date-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_date-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_date-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_date-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_date-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_date-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_date-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_date-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_date-time-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_date-time-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_date-time-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_date-time-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_dialog/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_dialog/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_dialog/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_dialog/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_draggable/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_draggable/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_draggable/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_draggable/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_dropdown/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_dropdown/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_dropdown/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_dropdown/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_dropzone/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_dropzone/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_dropzone/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_dropzone/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_email-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_email-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_email-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_email-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_email-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_email-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_email-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_email-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_empty/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_empty/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_empty/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_empty/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_fieldset/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_fieldset/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_fieldset/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_fieldset/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_files-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_files-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_files-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_files-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_form/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_form/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_form/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_form/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_grid/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_grid/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_grid/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_grid/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_header/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_header/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_header/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_header/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_headline-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_headline-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_headline-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_headline-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_headline/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_headline/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_headline/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_headline/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_icon/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_icon/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_icon/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_icon/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_image/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_image/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_image/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_image/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_info-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_info-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_info-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_info-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_line-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_line-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_line-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_line-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_link/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_link/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_link/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_link/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_list-item/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_list-item/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_list-item/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_list-item/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_list/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_list/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_list/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_list/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_number-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_number-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_number-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_number-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_number-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_number-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_number-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_number-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_pagination/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_pagination/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_pagination/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_pagination/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_password-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_password-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_password-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_password-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_progress/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_progress/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_progress/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_progress/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_radio-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_radio-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_radio-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_radio-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_radio-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_radio-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_radio-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_radio-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_range-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_range-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_range-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_range-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_range-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_range-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_range-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_range-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_select-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_select-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_select-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_select-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_select-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_select-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_select-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_select-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_structure-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_structure-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_structure-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_structure-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_tag/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_tag/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_tag/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_tag/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_tags-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_tags-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_tags-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_tags-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_tags-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_tags-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_tags-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_tags-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_tel-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_tel-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_tel-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_tel-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_tel-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_tel-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_tel-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_tel-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_text-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_text-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_text-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_text-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_text-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_text-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_text-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_text-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_text/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_text/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_text/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_text/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_textarea-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_textarea-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_textarea-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_textarea-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_textarea-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_textarea-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_textarea-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_textarea-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_time-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_time-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_time-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_time-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_time-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_time-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_time-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_time-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_toggle-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_toggle-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_toggle-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_toggle-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_toggle-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_toggle-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_toggle-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_toggle-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_upload/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_upload/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_upload/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_upload/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_url-field/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_url-field/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_url-field/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_url-field/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_url-input/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_url-input/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_url-input/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_url-input/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/0_view/reference-ui.txt b/content/docs/3_reference/7_plugins/4_ui/0_view/reference-ui.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/0_view/reference-ui.txt rename to content/docs/3_reference/7_plugins/4_ui/0_view/reference-ui.txt diff --git a/content/1_docs/3_reference/7_plugins/4_ui/reference-section.txt b/content/docs/3_reference/7_plugins/4_ui/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/4_ui/reference-section.txt rename to content/docs/3_reference/7_plugins/4_ui/reference-section.txt diff --git a/content/1_docs/3_reference/7_plugins/5_internals/0_helpers/reference-article.txt b/content/docs/3_reference/7_plugins/5_internals/0_helpers/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/5_internals/0_helpers/reference-article.txt rename to content/docs/3_reference/7_plugins/5_internals/0_helpers/reference-article.txt diff --git a/content/1_docs/3_reference/7_plugins/5_internals/0_libraries/reference-article.txt b/content/docs/3_reference/7_plugins/5_internals/0_libraries/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/5_internals/0_libraries/reference-article.txt rename to content/docs/3_reference/7_plugins/5_internals/0_libraries/reference-article.txt diff --git a/content/1_docs/3_reference/7_plugins/5_internals/0_store-content/reference-article.txt b/content/docs/3_reference/7_plugins/5_internals/0_store-content/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/5_internals/0_store-content/reference-article.txt rename to content/docs/3_reference/7_plugins/5_internals/0_store-content/reference-article.txt diff --git a/content/1_docs/3_reference/7_plugins/5_internals/0_store-notification/reference-article.txt b/content/docs/3_reference/7_plugins/5_internals/0_store-notification/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/5_internals/0_store-notification/reference-article.txt rename to content/docs/3_reference/7_plugins/5_internals/0_store-notification/reference-article.txt diff --git a/content/1_docs/3_reference/7_plugins/5_internals/0_uploads/error.png b/content/docs/3_reference/7_plugins/5_internals/0_uploads/error.png similarity index 100% rename from content/1_docs/3_reference/7_plugins/5_internals/0_uploads/error.png rename to content/docs/3_reference/7_plugins/5_internals/0_uploads/error.png diff --git a/content/1_docs/3_reference/7_plugins/5_internals/0_uploads/reference-article.txt b/content/docs/3_reference/7_plugins/5_internals/0_uploads/reference-article.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/5_internals/0_uploads/reference-article.txt rename to content/docs/3_reference/7_plugins/5_internals/0_uploads/reference-article.txt diff --git a/content/1_docs/3_reference/7_plugins/5_internals/reference-section.txt b/content/docs/3_reference/7_plugins/5_internals/reference-section.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/5_internals/reference-section.txt rename to content/docs/3_reference/7_plugins/5_internals/reference-section.txt diff --git a/content/1_docs/3_reference/7_plugins/link.txt b/content/docs/3_reference/7_plugins/link.txt similarity index 100% rename from content/1_docs/3_reference/7_plugins/link.txt rename to content/docs/3_reference/7_plugins/link.txt diff --git a/content/1_docs/3_reference/8_api/0_auth/0_login/reference-endpoint.txt b/content/docs/3_reference/8_api/0_auth/0_login/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_auth/0_login/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_auth/0_login/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_auth/0_logout/reference-endpoint.txt b/content/docs/3_reference/8_api/0_auth/0_logout/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_auth/0_logout/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_auth/0_logout/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_auth/0_user/reference-endpoint.txt b/content/docs/3_reference/8_api/0_auth/0_user/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_auth/0_user/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_auth/0_user/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_auth/reference-endpoints.txt b/content/docs/3_reference/8_api/0_auth/reference-endpoints.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_auth/reference-endpoints.txt rename to content/docs/3_reference/8_api/0_auth/reference-endpoints.txt diff --git a/content/1_docs/3_reference/8_api/0_languages/1_list/reference-endpoint.txt b/content/docs/3_reference/8_api/0_languages/1_list/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_languages/1_list/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_languages/1_list/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_languages/2_create/reference-endpoint.txt b/content/docs/3_reference/8_api/0_languages/2_create/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_languages/2_create/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_languages/2_create/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_languages/3_get/reference-endpoint.txt b/content/docs/3_reference/8_api/0_languages/3_get/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_languages/3_get/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_languages/3_get/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_languages/4_update/reference-endpoint.txt b/content/docs/3_reference/8_api/0_languages/4_update/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_languages/4_update/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_languages/4_update/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_languages/5_delete/reference-endpoint.txt b/content/docs/3_reference/8_api/0_languages/5_delete/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_languages/5_delete/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_languages/5_delete/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_languages/reference-endpoints.txt b/content/docs/3_reference/8_api/0_languages/reference-endpoints.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_languages/reference-endpoints.txt rename to content/docs/3_reference/8_api/0_languages/reference-endpoints.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/10_files-get/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/10_files-get/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/10_files-get/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/10_files-get/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/11_files-search/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/11_files-search/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/11_files-search/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/11_files-search/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/11_files-section/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/11_files-section/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/11_files-section/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/11_files-section/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/12_files-update/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/12_files-update/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/12_files-update/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/12_files-update/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/13_files-change-name/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/13_files-change-name/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/13_files-change-name/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/13_files-change-name/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/14_files-delete/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/14_files-delete/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/14_files-delete/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/14_files-delete/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/15_change-slug/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/15_change-slug/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/15_change-slug/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/15_change-slug/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/16_change-status/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/16_change-status/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/16_change-status/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/16_change-status/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/17_change-template/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/17_change-template/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/17_change-template/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/17_change-template/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/18_change-title/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/18_change-title/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/18_change-title/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/18_change-title/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/1_get/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/1_get/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/1_get/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/1_get/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/2_update/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/2_update/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/2_update/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/2_update/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/3_delete/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/3_delete/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/3_delete/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/3_delete/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/4_children-list/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/4_children-list/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/4_children-list/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/4_children-list/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/4_children-search/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/4_children-search/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/4_children-search/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/4_children-search/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/5_children-create/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/5_children-create/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/5_children-create/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/5_children-create/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/6_children-blueprints/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/6_children-blueprints/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/6_children-blueprints/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/6_children-blueprints/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/7_files-list/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/7_files-list/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/7_files-list/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/7_files-list/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/8_files-create/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/8_files-create/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/8_files-create/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/8_files-create/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/9_files-sort/reference-endpoint.txt b/content/docs/3_reference/8_api/0_pages/9_files-sort/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/9_files-sort/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_pages/9_files-sort/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_pages/reference-endpoints.txt b/content/docs/3_reference/8_api/0_pages/reference-endpoints.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_pages/reference-endpoints.txt rename to content/docs/3_reference/8_api/0_pages/reference-endpoints.txt diff --git a/content/1_docs/3_reference/8_api/0_roles/1_list/reference-endpoint.txt b/content/docs/3_reference/8_api/0_roles/1_list/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_roles/1_list/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_roles/1_list/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_roles/2_get/reference-endpoint.txt b/content/docs/3_reference/8_api/0_roles/2_get/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_roles/2_get/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_roles/2_get/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_roles/reference-endpoints.txt b/content/docs/3_reference/8_api/0_roles/reference-endpoints.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_roles/reference-endpoints.txt rename to content/docs/3_reference/8_api/0_roles/reference-endpoints.txt diff --git a/content/1_docs/3_reference/8_api/0_site/10_files-update/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/10_files-update/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/10_files-update/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/10_files-update/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/11_files-delete/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/11_files-delete/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/11_files-delete/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/11_files-delete/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/12_files-change-name/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/12_files-change-name/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/12_files-change-name/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/12_files-change-name/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/13_files-section/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/13_files-section/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/13_files-section/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/13_files-section/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/14_section/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/14_section/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/14_section/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/14_section/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/15_change-title/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/15_change-title/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/15_change-title/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/15_change-title/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/1_get/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/1_get/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/1_get/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/1_get/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/2_update/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/2_update/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/2_update/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/2_update/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/3_children-list/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/3_children-list/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/3_children-list/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/3_children-list/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/4_children-create/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/4_children-create/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/4_children-create/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/4_children-create/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/4_search/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/4_search/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/4_search/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/4_search/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/5_children-blueprints/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/5_children-blueprints/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/5_children-blueprints/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/5_children-blueprints/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/6_files-list/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/6_files-list/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/6_files-list/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/6_files-list/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/7_files-create/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/7_files-create/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/7_files-create/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/7_files-create/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/8_files-sort/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/8_files-sort/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/8_files-sort/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/8_files-sort/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/9_files-get/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/9_files-get/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/9_files-get/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/9_files-get/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/9_files-search/reference-endpoint.txt b/content/docs/3_reference/8_api/0_site/9_files-search/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/9_files-search/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_site/9_files-search/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_site/reference-endpoints.txt b/content/docs/3_reference/8_api/0_site/reference-endpoints.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_site/reference-endpoints.txt rename to content/docs/3_reference/8_api/0_site/reference-endpoints.txt diff --git a/content/1_docs/3_reference/8_api/0_system/1_get/reference-endpoint.txt b/content/docs/3_reference/8_api/0_system/1_get/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_system/1_get/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_system/1_get/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_system/2_install/reference-endpoint.txt b/content/docs/3_reference/8_api/0_system/2_install/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_system/2_install/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_system/2_install/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_system/3_register/reference-endpoint.txt b/content/docs/3_reference/8_api/0_system/3_register/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_system/3_register/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_system/3_register/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_system/reference-endpoints.txt b/content/docs/3_reference/8_api/0_system/reference-endpoints.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_system/reference-endpoints.txt rename to content/docs/3_reference/8_api/0_system/reference-endpoints.txt diff --git a/content/1_docs/3_reference/8_api/0_translations/1_list/reference-endpoint.txt b/content/docs/3_reference/8_api/0_translations/1_list/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_translations/1_list/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_translations/1_list/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_translations/2_get/reference-endpoint.txt b/content/docs/3_reference/8_api/0_translations/2_get/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_translations/2_get/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_translations/2_get/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_translations/reference-endpoints.txt b/content/docs/3_reference/8_api/0_translations/reference-endpoints.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_translations/reference-endpoints.txt rename to content/docs/3_reference/8_api/0_translations/reference-endpoints.txt diff --git a/content/1_docs/3_reference/8_api/0_users/10_files-get/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/10_files-get/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/10_files-get/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/10_files-get/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/11_files-update/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/11_files-update/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/11_files-update/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/11_files-update/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/12_files-delete/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/12_files-delete/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/12_files-delete/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/12_files-delete/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/13_files-change-name/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/13_files-change-name/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/13_files-change-name/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/13_files-change-name/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/14_files-section/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/14_files-section/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/14_files-section/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/14_files-section/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/15_change-language/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/15_change-language/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/15_change-language/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/15_change-language/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/16_change-name/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/16_change-name/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/16_change-name/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/16_change-name/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/17_change-password/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/17_change-password/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/17_change-password/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/17_change-password/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/18_change-role/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/18_change-role/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/18_change-role/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/18_change-role/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/19_section/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/19_section/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/19_section/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/19_section/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/1_list/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/1_list/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/1_list/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/1_list/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/2_create/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/2_create/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/2_create/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/2_create/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/3_get/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/3_get/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/3_get/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/3_get/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/4_search/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/4_search/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/4_search/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/4_search/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/4_update/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/4_update/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/4_update/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/4_update/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/5_delete/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/5_delete/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/5_delete/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/5_delete/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/6_change-email/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/6_change-email/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/6_change-email/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/6_change-email/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/7_files-list/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/7_files-list/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/7_files-list/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/7_files-list/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/8_files-create/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/8_files-create/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/8_files-create/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/8_files-create/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/9_files-search/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/9_files-search/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/9_files-search/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/9_files-search/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/9_files-sort/reference-endpoint.txt b/content/docs/3_reference/8_api/0_users/9_files-sort/reference-endpoint.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/9_files-sort/reference-endpoint.txt rename to content/docs/3_reference/8_api/0_users/9_files-sort/reference-endpoint.txt diff --git a/content/1_docs/3_reference/8_api/0_users/reference-endpoints.txt b/content/docs/3_reference/8_api/0_users/reference-endpoints.txt similarity index 100% rename from content/1_docs/3_reference/8_api/0_users/reference-endpoints.txt rename to content/docs/3_reference/8_api/0_users/reference-endpoints.txt diff --git a/content/1_docs/3_reference/8_api/link.txt b/content/docs/3_reference/8_api/link.txt similarity index 100% rename from content/1_docs/3_reference/8_api/link.txt rename to content/docs/3_reference/8_api/link.txt diff --git a/content/1_docs/3_reference/9_tools/0_a/reference-class.txt b/content/docs/3_reference/9_tools/0_a/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_a/reference-class.txt rename to content/docs/3_reference/9_tools/0_a/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_cookie/reference-class.txt b/content/docs/3_reference/9_tools/0_cookie/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_cookie/reference-class.txt rename to content/docs/3_reference/9_tools/0_cookie/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_data/reference-class.txt b/content/docs/3_reference/9_tools/0_data/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_data/reference-class.txt rename to content/docs/3_reference/9_tools/0_data/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_dir/reference-class.txt b/content/docs/3_reference/9_tools/0_dir/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_dir/reference-class.txt rename to content/docs/3_reference/9_tools/0_dir/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_escape/reference-class.txt b/content/docs/3_reference/9_tools/0_escape/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_escape/reference-class.txt rename to content/docs/3_reference/9_tools/0_escape/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_f/reference-class.txt b/content/docs/3_reference/9_tools/0_f/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_f/reference-class.txt rename to content/docs/3_reference/9_tools/0_f/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_header/reference-class.txt b/content/docs/3_reference/9_tools/0_header/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_header/reference-class.txt rename to content/docs/3_reference/9_tools/0_header/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_html/0_tag/reference-classmethod.txt b/content/docs/3_reference/9_tools/0_html/0_tag/reference-classmethod.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_html/0_tag/reference-classmethod.txt rename to content/docs/3_reference/9_tools/0_html/0_tag/reference-classmethod.txt diff --git a/content/1_docs/3_reference/9_tools/0_html/reference-class.txt b/content/docs/3_reference/9_tools/0_html/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_html/reference-class.txt rename to content/docs/3_reference/9_tools/0_html/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_i18n/reference-class.txt b/content/docs/3_reference/9_tools/0_i18n/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_i18n/reference-class.txt rename to content/docs/3_reference/9_tools/0_i18n/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_mime/reference-class.txt b/content/docs/3_reference/9_tools/0_mime/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_mime/reference-class.txt rename to content/docs/3_reference/9_tools/0_mime/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_query/reference-class.txt b/content/docs/3_reference/9_tools/0_query/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_query/reference-class.txt rename to content/docs/3_reference/9_tools/0_query/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_server/reference-class.txt b/content/docs/3_reference/9_tools/0_server/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_server/reference-class.txt rename to content/docs/3_reference/9_tools/0_server/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_str/reference-class.txt b/content/docs/3_reference/9_tools/0_str/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_str/reference-class.txt rename to content/docs/3_reference/9_tools/0_str/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_tpl/reference-class.txt b/content/docs/3_reference/9_tools/0_tpl/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_tpl/reference-class.txt rename to content/docs/3_reference/9_tools/0_tpl/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_url/reference-class.txt b/content/docs/3_reference/9_tools/0_url/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_url/reference-class.txt rename to content/docs/3_reference/9_tools/0_url/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_v/reference-class.txt b/content/docs/3_reference/9_tools/0_v/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_v/reference-class.txt rename to content/docs/3_reference/9_tools/0_v/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/0_xml/reference-class.txt b/content/docs/3_reference/9_tools/0_xml/reference-class.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/0_xml/reference-class.txt rename to content/docs/3_reference/9_tools/0_xml/reference-class.txt diff --git a/content/1_docs/3_reference/9_tools/link.txt b/content/docs/3_reference/9_tools/link.txt similarity index 100% rename from content/1_docs/3_reference/9_tools/link.txt rename to content/docs/3_reference/9_tools/link.txt diff --git a/content/1_docs/3_reference/menu-square.svg b/content/docs/3_reference/menu-square.svg similarity index 100% rename from content/1_docs/3_reference/menu-square.svg rename to content/docs/3_reference/menu-square.svg diff --git a/content/docs/3_reference/reference.txt b/content/docs/3_reference/reference.txt new file mode 100644 index 0000000000..fdb58e5a24 --- /dev/null +++ b/content/docs/3_reference/reference.txt @@ -0,0 +1,19 @@ +Title: Reference + +---- + +Description: The Reference provides a quick but detailed reference to pretty much any aspect of Kirby. + +---- + +Excerpt: + +The Reference provides a quick but detailed reference to pretty much any aspect of Kirby. + +---- + +Changefreq: daily + +---- + +Priority: 0.9 diff --git a/content/1_docs/2_screencasts/link.txt b/content/docs/4_screencasts/link.txt similarity index 100% rename from content/1_docs/2_screencasts/link.txt rename to content/docs/4_screencasts/link.txt diff --git a/content/1_docs/5_glossary/api/glossary-entry.txt b/content/docs/5_glossary/api/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/api/glossary-entry.txt rename to content/docs/5_glossary/api/glossary-entry.txt diff --git a/content/1_docs/5_glossary/blueprint/glossary-entry.txt b/content/docs/5_glossary/blueprint/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/blueprint/glossary-entry.txt rename to content/docs/5_glossary/blueprint/glossary-entry.txt diff --git a/content/1_docs/5_glossary/collection/glossary-entry.txt b/content/docs/5_glossary/collection/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/collection/glossary-entry.txt rename to content/docs/5_glossary/collection/glossary-entry.txt diff --git a/content/1_docs/5_glossary/component/glossary-entry.txt b/content/docs/5_glossary/component/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/component/glossary-entry.txt rename to content/docs/5_glossary/component/glossary-entry.txt diff --git a/content/docs/5_glossary/content-representation/glossary-entry.txt b/content/docs/5_glossary/content-representation/glossary-entry.txt new file mode 100644 index 0000000000..e0c715c92c --- /dev/null +++ b/content/docs/5_glossary/content-representation/glossary-entry.txt @@ -0,0 +1,9 @@ +Title: Content representation + +---- +Entry: + +Content Representations allow you to output your content in different formats, e.g. JSON for your frontend JS library of choice or to use Kirby as an API for other tools, an automatic RSS feed representation of your blog or a plain text representation of your résumé. +---- + +Link: docs/guide/templates/content-representations diff --git a/content/docs/5_glossary/content/glossary-entry.txt b/content/docs/5_glossary/content/glossary-entry.txt new file mode 100644 index 0000000000..49ad166803 --- /dev/null +++ b/content/docs/5_glossary/content/glossary-entry.txt @@ -0,0 +1,9 @@ +Title: Content + +---- +Entry: + +Content can refer either to the content folder or to anything within the content folder: text files, media files or metadata files. + +---- +Link: docs/guide/content/introduction diff --git a/content/docs/5_glossary/controller/glossary-entry.txt b/content/docs/5_glossary/controller/glossary-entry.txt new file mode 100644 index 0000000000..6d5e413f6a --- /dev/null +++ b/content/docs/5_glossary/controller/glossary-entry.txt @@ -0,0 +1,9 @@ +Title: Controller + +---- +Entry: + +A PHP file that contains the logic for a specific page template. Controllers are stored in `/site/controllers`. +---- + +Link: docs/guide/templates/controllers diff --git a/content/1_docs/5_glossary/document-root/glossary-entry.txt b/content/docs/5_glossary/document-root/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/document-root/glossary-entry.txt rename to content/docs/5_glossary/document-root/glossary-entry.txt diff --git a/content/1_docs/5_glossary/field-method/glossary-entry.txt b/content/docs/5_glossary/field-method/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/field-method/glossary-entry.txt rename to content/docs/5_glossary/field-method/glossary-entry.txt diff --git a/content/docs/5_glossary/field/glossary-entry.txt b/content/docs/5_glossary/field/glossary-entry.txt new file mode 100644 index 0000000000..fd999e266c --- /dev/null +++ b/content/docs/5_glossary/field/glossary-entry.txt @@ -0,0 +1,9 @@ +Title: Field + +---- +Entry: + +The smallest content unit in a Kirby content file, comparable to a column header in a database. Fields can have different field types that are defined in a blueprint file. + +---- +Link: docs/reference/panel/fields diff --git a/content/1_docs/5_glossary/glossary.txt b/content/docs/5_glossary/glossary.txt similarity index 100% rename from content/1_docs/5_glossary/glossary.txt rename to content/docs/5_glossary/glossary.txt diff --git a/content/1_docs/5_glossary/kirbytag/glossary-entry.txt b/content/docs/5_glossary/kirbytag/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/kirbytag/glossary-entry.txt rename to content/docs/5_glossary/kirbytag/glossary-entry.txt diff --git a/content/1_docs/5_glossary/kirbytext/glossary-entry.txt b/content/docs/5_glossary/kirbytext/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/kirbytext/glossary-entry.txt rename to content/docs/5_glossary/kirbytext/glossary-entry.txt diff --git a/content/1_docs/5_glossary/library.svg b/content/docs/5_glossary/library.svg similarity index 100% rename from content/1_docs/5_glossary/library.svg rename to content/docs/5_glossary/library.svg diff --git a/content/docs/5_glossary/markdown/glossary-entry.txt b/content/docs/5_glossary/markdown/glossary-entry.txt new file mode 100644 index 0000000000..2d25bd8f77 --- /dev/null +++ b/content/docs/5_glossary/markdown/glossary-entry.txt @@ -0,0 +1,9 @@ +Title: Markdown + +---- +Entry: + +A markup language that uses plain text formatting syntax and can be converted to HTML and other formats. Created by John Gruber in 2004. + +---- +Link: docs/guide/content/text-formatting#markdown diff --git a/content/1_docs/5_glossary/model/glossary-entry.txt b/content/docs/5_glossary/model/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/model/glossary-entry.txt rename to content/docs/5_glossary/model/glossary-entry.txt diff --git a/content/1_docs/5_glossary/page/glossary-entry.txt b/content/docs/5_glossary/page/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/page/glossary-entry.txt rename to content/docs/5_glossary/page/glossary-entry.txt diff --git a/content/1_docs/5_glossary/panel/glossary-entry.txt b/content/docs/5_glossary/panel/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/panel/glossary-entry.txt rename to content/docs/5_glossary/panel/glossary-entry.txt diff --git a/content/1_docs/5_glossary/preset/glossary-entry.txt b/content/docs/5_glossary/preset/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/preset/glossary-entry.txt rename to content/docs/5_glossary/preset/glossary-entry.txt diff --git a/content/docs/5_glossary/route/glossary-entry.txt b/content/docs/5_glossary/route/glossary-entry.txt new file mode 100644 index 0000000000..7fcc5c99c5 --- /dev/null +++ b/content/docs/5_glossary/route/glossary-entry.txt @@ -0,0 +1,10 @@ +Title: Route + +---- +Entry: + +A route is a URL pattern that when called executes a defined action, for example to return a particular page, create a new page, read data from a file etc. + +---- + +Link: docs/guide/routing diff --git a/content/docs/5_glossary/section/glossary-entry.txt b/content/docs/5_glossary/section/glossary-entry.txt new file mode 100644 index 0000000000..3e0573a7f6 --- /dev/null +++ b/content/docs/5_glossary/section/glossary-entry.txt @@ -0,0 +1,10 @@ +Title: Section + +---- + +Entry: + +Sections are used in blueprints to organize content or to display information. Kirby comes with four built-in section types but you can create your own in a plugin. + +---- +Link: docs/guide/blueprints/layout diff --git a/content/1_docs/5_glossary/site/glossary-entry.txt b/content/docs/5_glossary/site/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/site/glossary-entry.txt rename to content/docs/5_glossary/site/glossary-entry.txt diff --git a/content/1_docs/5_glossary/smartypants/glossary-entry.txt b/content/docs/5_glossary/smartypants/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/smartypants/glossary-entry.txt rename to content/docs/5_glossary/smartypants/glossary-entry.txt diff --git a/content/1_docs/5_glossary/snippet/glossary-entry.txt b/content/docs/5_glossary/snippet/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/snippet/glossary-entry.txt rename to content/docs/5_glossary/snippet/glossary-entry.txt diff --git a/content/1_docs/5_glossary/starterkit/glossary-entry.txt b/content/docs/5_glossary/starterkit/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/starterkit/glossary-entry.txt rename to content/docs/5_glossary/starterkit/glossary-entry.txt diff --git a/content/1_docs/5_glossary/template/glossary-entry.txt b/content/docs/5_glossary/template/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/template/glossary-entry.txt rename to content/docs/5_glossary/template/glossary-entry.txt diff --git a/content/1_docs/5_glossary/vue/glossary-entry.txt b/content/docs/5_glossary/vue/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/vue/glossary-entry.txt rename to content/docs/5_glossary/vue/glossary-entry.txt diff --git a/content/1_docs/5_glossary/whoops/glossary-entry.txt b/content/docs/5_glossary/whoops/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/whoops/glossary-entry.txt rename to content/docs/5_glossary/whoops/glossary-entry.txt diff --git a/content/1_docs/5_glossary/yaml/glossary-entry.txt b/content/docs/5_glossary/yaml/glossary-entry.txt similarity index 100% rename from content/1_docs/5_glossary/yaml/glossary-entry.txt rename to content/docs/5_glossary/yaml/glossary-entry.txt diff --git a/content/docs/archive/archive.txt b/content/docs/archive/archive.txt new file mode 100644 index 0000000000..25ef40adb1 --- /dev/null +++ b/content/docs/archive/archive.txt @@ -0,0 +1,5 @@ +Title: Versions + +---- + +Description: Docs for older versions of Kirby. diff --git a/content/1_docs/6_archive/v1/legacy.txt b/content/docs/archive/v1/legacy.txt similarity index 100% rename from content/1_docs/6_archive/v1/legacy.txt rename to content/docs/archive/v1/legacy.txt diff --git a/content/1_docs/6_archive/v1/v1.png b/content/docs/archive/v1/v1.png similarity index 100% rename from content/1_docs/6_archive/v1/v1.png rename to content/docs/archive/v1/v1.png diff --git a/content/1_docs/6_archive/v2/legacy.txt b/content/docs/archive/v2/legacy.txt similarity index 100% rename from content/1_docs/6_archive/v2/legacy.txt rename to content/docs/archive/v2/legacy.txt diff --git a/content/1_docs/6_archive/v2/v2.png b/content/docs/archive/v2/v2.png similarity index 100% rename from content/1_docs/6_archive/v2/v2.png rename to content/docs/archive/v2/v2.png diff --git a/content/1_docs/link.txt b/content/docs/link.txt similarity index 100% rename from content/1_docs/link.txt rename to content/docs/link.txt diff --git a/content/error/error.txt b/content/error/error.txt index 6d1850d94b..3a867ac8d6 100644 --- a/content/error/error.txt +++ b/content/error/error.txt @@ -1,5 +1,5 @@ -Title: Oh no! 😕 +Title: Oh no! ---- -Intro: The page could not be found +Intro: The page could not be found 😕 diff --git a/content/features/1_developers/features-for-developers.txt b/content/features/1_developers/features-for-developers.txt new file mode 100644 index 0000000000..ad5764082c --- /dev/null +++ b/content/features/1_developers/features-for-developers.txt @@ -0,0 +1,177 @@ +Title: For developers +---- +For: Developers +---- +Description: A powerful platform: Kirby is built with flexibility and extensibility in mind +---- +Thumbnail: + - + lead: The CMS built + image: outline/console.svg +---- +Benefits: + +- Battle-tested flat-file foundation +- Reliable tech stack +- Versatile templating +- Headless or not – you decide +- Powerful plugin platform +- Extensive docs & great community +- Built with security in mind + +---- +Filesystem: + +```filesystem +content/ + 1_photography/ + 1_animals/ + 2_trees/ + 3_sky/ + 4_oceans/ + album.txt + attention-sharks.jpg + island-from-above.jpg + jellyfish.jpg + nasty-rocks.jpg + smashed-by-waves.jpg + photography.txt + 2_notes/ + 20190731_in-the-jungle-of-sumatra/ + 20190905_through-the-desert/ + 20190926_himalaya-and-back/ + 20191005_chasing-waterfalls/ + 20191031_exploring-the-universe/ + notes.txt + 3_about/ + about.txt + home/ + home.txt + error/ + error.txt + site.txt +``` + +---- +phpTemplate: + +```php "PHP Template" + + +
+

title() ?>

+
+ resize(800, 600) ?> +
+
+ text()->kirbytext() ?> +
+ +
+ + +``` + +---- +twigTemplate: + +```php "Twig Template" +{% extends 'layout.twig' %} + +{% block content %} +
+

{{ page.title }}

+
+ {{ cover.resize(800, 600) }} +
+
+ {{ page.text.kirbytext | raw }} +
+ +
+{% endblock %} +``` + +---- +Api: + +```yaml "/api/pages/notes/children" +{ + "code": 200, + "data": [ + { + "id": "notes/across-the-ocean", + "num": 20180421, + "title": "Across the ocean", + "url": "/notes/across-the-ocean" + }, + { + "id": "notes/a-night-in-the-forest", + "num": 20180625, + "title": "A night in the forest", + "url": "/notes/a-night-in-the-forest" + }, + { + "id": "notes/in-the-jungle-of-sumatra", + "num": 20180731, + "title": "In the jungle of Sumatra", + "url": "/notes/in-the-jungle-of-sumatra" + }, + ], + "pagination": { + "page": 1, + "total": 22, + "offset": 0, + "limit": 3 + }, + "status": "ok", +} +``` + +---- +Users: + +```php +if ($user = $kirby->user()) { + echo 'Welcome, ' . $user->name(); + // your community starts here +} +``` + +---- +Caching: + +```php +return [ + 'cache' => [ + 'pages' => [ + 'active' => true, + 'type' => 'memcached' + ] + ] +]; +``` +---- + +Assets: + +```php +$image->srcset( + '1x' => [ + 'width' => 512, + 'height' => 512, + 'crop' => 'center' + ], + '2x' => [ + 'width' => 1024 + ] +]); +``` diff --git a/content/features/1_developers/github.svg b/content/features/1_developers/github.svg new file mode 100644 index 0000000000..c817b57fd6 --- /dev/null +++ b/content/features/1_developers/github.svg @@ -0,0 +1 @@ + diff --git a/content/features/1_developers/html5.svg b/content/features/1_developers/html5.svg new file mode 100644 index 0000000000..40f237407c --- /dev/null +++ b/content/features/1_developers/html5.svg @@ -0,0 +1 @@ + diff --git a/content/features/1_developers/matomo.jpg b/content/features/1_developers/matomo.jpg new file mode 100644 index 0000000000..383d5c9696 Binary files /dev/null and b/content/features/1_developers/matomo.jpg differ diff --git a/content/features/1_developers/php.svg b/content/features/1_developers/php.svg new file mode 100644 index 0000000000..43f2ba51bb --- /dev/null +++ b/content/features/1_developers/php.svg @@ -0,0 +1 @@ + diff --git a/content/features/1_developers/vue.svg b/content/features/1_developers/vue.svg new file mode 100644 index 0000000000..89cb0f142d --- /dev/null +++ b/content/features/1_developers/vue.svg @@ -0,0 +1 @@ + diff --git a/content/features/2_designers/albums.png b/content/features/2_designers/albums.png new file mode 100755 index 0000000000..3a9fa2066a Binary files /dev/null and b/content/features/2_designers/albums.png differ diff --git a/content/features/2_designers/author.png b/content/features/2_designers/author.png new file mode 100755 index 0000000000..42f20839f3 Binary files /dev/null and b/content/features/2_designers/author.png differ diff --git a/content/features/2_designers/browser.svg b/content/features/2_designers/browser.svg new file mode 100644 index 0000000000..d864ad4c3b --- /dev/null +++ b/content/features/2_designers/browser.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/features/2_designers/bulb.svg b/content/features/2_designers/bulb.svg new file mode 100644 index 0000000000..0104e61521 --- /dev/null +++ b/content/features/2_designers/bulb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/features/2_designers/code.svg b/content/features/2_designers/code.svg new file mode 100644 index 0000000000..65ff036e80 --- /dev/null +++ b/content/features/2_designers/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/features/2_designers/dishes.png b/content/features/2_designers/dishes.png new file mode 100755 index 0000000000..58a5058771 Binary files /dev/null and b/content/features/2_designers/dishes.png differ diff --git a/content/features/2_designers/features-for-designers.txt b/content/features/2_designers/features-for-designers.txt new file mode 100644 index 0000000000..bd5ae75b27 --- /dev/null +++ b/content/features/2_designers/features-for-designers.txt @@ -0,0 +1,18 @@ +Title: For designers +---- +For: Designers +---- +Description: Staying out of your way: Kirby provides timeless simplicity in design and code +---- +Benefits: + +- Design without compromises +- Clear separation between design and content +- A fully customizable admin interface +- A fantastic prototyping companion + +---- +Thumbnail: + - + lead: The CMS built + image: bulb.svg diff --git a/content/features/2_designers/files-and-folders.png b/content/features/2_designers/files-and-folders.png new file mode 100644 index 0000000000..034c1bb6a4 Binary files /dev/null and b/content/features/2_designers/files-and-folders.png differ diff --git a/content/features/2_designers/images.png b/content/features/2_designers/images.png new file mode 100755 index 0000000000..2d08434916 Binary files /dev/null and b/content/features/2_designers/images.png differ diff --git a/content/features/2_designers/list.png b/content/features/2_designers/list.png new file mode 100755 index 0000000000..b19ec5774a Binary files /dev/null and b/content/features/2_designers/list.png differ diff --git a/content/features/2_designers/paper.svg b/content/features/2_designers/paper.svg new file mode 100644 index 0000000000..6265aa6a66 --- /dev/null +++ b/content/features/2_designers/paper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/features/2_designers/pen.svg b/content/features/2_designers/pen.svg new file mode 100644 index 0000000000..3b7e5e20d5 --- /dev/null +++ b/content/features/2_designers/pen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/features/2_designers/phone.svg b/content/features/2_designers/phone.svg new file mode 100644 index 0000000000..103eccc16c --- /dev/null +++ b/content/features/2_designers/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/features/2_designers/prototype.svg b/content/features/2_designers/prototype.svg new file mode 100644 index 0000000000..13fe836aa2 --- /dev/null +++ b/content/features/2_designers/prototype.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/features/2_designers/research.svg b/content/features/2_designers/research.svg new file mode 100644 index 0000000000..083682cca2 --- /dev/null +++ b/content/features/2_designers/research.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/features/2_designers/screen.svg b/content/features/2_designers/screen.svg new file mode 100644 index 0000000000..0a0be8b878 --- /dev/null +++ b/content/features/2_designers/screen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/features/2_designers/structure.png b/content/features/2_designers/structure.png new file mode 100644 index 0000000000..9ed094310b Binary files /dev/null and b/content/features/2_designers/structure.png differ diff --git a/content/features/3_creators/article.jpg b/content/features/3_creators/article.jpg new file mode 100755 index 0000000000..bd0c16df79 Binary files /dev/null and b/content/features/3_creators/article.jpg differ diff --git a/content/features/3_creators/article.jpg.txt b/content/features/3_creators/article.jpg.txt new file mode 100644 index 0000000000..1395d1bcc8 --- /dev/null +++ b/content/features/3_creators/article.jpg.txt @@ -0,0 +1,5 @@ +Template: content-type +---- +Caption: Article +---- +Text: Kirby offers a perfect, distraction-free writing interface for your articles with the brand-new blocks field. diff --git a/content/features/3_creators/assets.png b/content/features/3_creators/assets.png new file mode 100755 index 0000000000..62ce8808f1 Binary files /dev/null and b/content/features/3_creators/assets.png differ diff --git a/content/features/3_creators/blocks.png b/content/features/3_creators/blocks.png new file mode 100755 index 0000000000..4178bbb2e4 Binary files /dev/null and b/content/features/3_creators/blocks.png differ diff --git a/content/features/3_creators/blog.jpg b/content/features/3_creators/blog.jpg new file mode 100755 index 0000000000..1275fdd622 Binary files /dev/null and b/content/features/3_creators/blog.jpg differ diff --git a/content/features/3_creators/blog.jpg.txt b/content/features/3_creators/blog.jpg.txt new file mode 100644 index 0000000000..ff74a85dc6 --- /dev/null +++ b/content/features/3_creators/blog.jpg.txt @@ -0,0 +1,5 @@ +Template: content-type +---- +Caption: Blog +---- +Text: Display drafts, unreviewed and published articles in a side-by-side view for your blog. diff --git a/content/features/3_creators/bulb.svg b/content/features/3_creators/bulb.svg new file mode 100644 index 0000000000..179645209f --- /dev/null +++ b/content/features/3_creators/bulb.svg @@ -0,0 +1 @@ + diff --git a/content/features/3_creators/company.jpg b/content/features/3_creators/company.jpg new file mode 100755 index 0000000000..01735c57f9 Binary files /dev/null and b/content/features/3_creators/company.jpg differ diff --git a/content/features/3_creators/company.jpg.txt b/content/features/3_creators/company.jpg.txt new file mode 100644 index 0000000000..ef4828f41d --- /dev/null +++ b/content/features/3_creators/company.jpg.txt @@ -0,0 +1,5 @@ +Template: content-type +---- +Caption: Company +---- +Text: Set up the dashboard for your company. Give editors quick access to the most important data. diff --git a/content/features/3_creators/features-for-creators.txt b/content/features/3_creators/features-for-creators.txt new file mode 100644 index 0000000000..1e88b06418 --- /dev/null +++ b/content/features/3_creators/features-for-creators.txt @@ -0,0 +1,18 @@ +Title: For content creators +---- +For: Creators +---- +Description: Perfect for content curation: Kirby makes you feel at home without endless workshops +---- +Benefits: + +- Custom-tailored interface +- Flexible content types +- Intuitive editing features +- Built-in internationalization support +- Secure collaboration +---- +Thumbnail: + - + lead: The CMS built + image: outline/panel.svg diff --git a/content/features/3_creators/languages.png b/content/features/3_creators/languages.png new file mode 100755 index 0000000000..27a57eaa15 Binary files /dev/null and b/content/features/3_creators/languages.png differ diff --git a/content/features/3_creators/layouts.png b/content/features/3_creators/layouts.png new file mode 100755 index 0000000000..aca8c7c785 Binary files /dev/null and b/content/features/3_creators/layouts.png differ diff --git a/content/features/3_creators/microsite.jpg b/content/features/3_creators/microsite.jpg new file mode 100755 index 0000000000..99513639d0 Binary files /dev/null and b/content/features/3_creators/microsite.jpg differ diff --git a/content/features/3_creators/microsite.jpg.txt b/content/features/3_creators/microsite.jpg.txt new file mode 100644 index 0000000000..f1303701e5 --- /dev/null +++ b/content/features/3_creators/microsite.jpg.txt @@ -0,0 +1,5 @@ +Template: content-type +---- +Caption: Microsite +---- +Text: Use Kirby's brand-new layout field to create complex modular microsites and page layouts. diff --git a/content/features/3_creators/project.jpg b/content/features/3_creators/project.jpg new file mode 100755 index 0000000000..1066bd13f7 Binary files /dev/null and b/content/features/3_creators/project.jpg differ diff --git a/content/features/3_creators/project.jpg.txt b/content/features/3_creators/project.jpg.txt new file mode 100644 index 0000000000..14f0ffb078 --- /dev/null +++ b/content/features/3_creators/project.jpg.txt @@ -0,0 +1,5 @@ +Template: content-type +---- +Caption: Project +---- +Text: Put your projects in the limelight. Create galleries, download lists, custom attributes, art-directed project templates and more. diff --git a/content/features/3_creators/restaurant.jpg b/content/features/3_creators/restaurant.jpg new file mode 100755 index 0000000000..3f7cce014f Binary files /dev/null and b/content/features/3_creators/restaurant.jpg differ diff --git a/content/features/3_creators/restaurant.jpg.txt b/content/features/3_creators/restaurant.jpg.txt new file mode 100644 index 0000000000..fed82afd41 --- /dev/null +++ b/content/features/3_creators/restaurant.jpg.txt @@ -0,0 +1,5 @@ +Template: content-type +---- +Caption: Restaurant +---- +Text: Kirby provides the perfect interface for your restaurant. Edit your menu, change opening-hours and upload images of your dishes and interior. diff --git a/content/features/3_creators/search.jpg b/content/features/3_creators/search.jpg new file mode 100755 index 0000000000..dd7c044da1 Binary files /dev/null and b/content/features/3_creators/search.jpg differ diff --git a/content/features/3_creators/shop.png b/content/features/3_creators/shop.png new file mode 100755 index 0000000000..0b5d62e9a4 Binary files /dev/null and b/content/features/3_creators/shop.png differ diff --git a/content/features/3_creators/shop.png.txt b/content/features/3_creators/shop.png.txt new file mode 100644 index 0000000000..74ae051774 --- /dev/null +++ b/content/features/3_creators/shop.png.txt @@ -0,0 +1,5 @@ +Template: content-type +---- +Caption: Shop +---- +Text: You want to get more out of your products? Use Kirby as your CMS and connect it with a shop system like Etsy, Shopify or Snipcart. diff --git a/content/features/3_creators/team.png b/content/features/3_creators/team.png new file mode 100755 index 0000000000..434f9c6dba Binary files /dev/null and b/content/features/3_creators/team.png differ diff --git a/content/features/3_creators/team.png.txt b/content/features/3_creators/team.png.txt new file mode 100644 index 0000000000..24aeb33b7f --- /dev/null +++ b/content/features/3_creators/team.png.txt @@ -0,0 +1,5 @@ +Template: content-type +---- +Caption: Team +---- +Text: Introduce your team to the world on your site. Or keep an internal directory of your company with private information for each member. Everything’s possible. diff --git a/content/features/3_creators/translations.png b/content/features/3_creators/translations.png new file mode 100755 index 0000000000..ae6738c871 Binary files /dev/null and b/content/features/3_creators/translations.png differ diff --git a/content/features/3_creators/workflow.png b/content/features/3_creators/workflow.png new file mode 100755 index 0000000000..ecb729a136 Binary files /dev/null and b/content/features/3_creators/workflow.png differ diff --git a/content/home/dashboard.jpg b/content/features/4_clients/company.jpg similarity index 100% rename from content/home/dashboard.jpg rename to content/features/4_clients/company.jpg diff --git a/content/features/4_clients/desktop.svg b/content/features/4_clients/desktop.svg new file mode 100644 index 0000000000..6dadc60480 --- /dev/null +++ b/content/features/4_clients/desktop.svg @@ -0,0 +1 @@ + diff --git a/content/features/4_clients/desktop.svg.txt b/content/features/4_clients/desktop.svg.txt new file mode 100644 index 0000000000..848f8498bc --- /dev/null +++ b/content/features/4_clients/desktop.svg.txt @@ -0,0 +1,3 @@ +Title: Desktop +---- +Sort: 1 diff --git a/content/features/4_clients/features-for-clients.txt b/content/features/4_clients/features-for-clients.txt new file mode 100644 index 0000000000..eeeb63d75c --- /dev/null +++ b/content/features/4_clients/features-for-clients.txt @@ -0,0 +1,19 @@ +Title: For clients & agencies +---- +For: Clients +---- +Description: From specialized to high-traffic: Kirby scales to match the popularity of any project +---- +Thumbnail: + - + lead: The CMS built + image: outline/thumb.svg +---- +Benefits: + +- Easy onboarding +- Unrivalled performance +- Secure and GDPR compliant +- Backed by professional support +- Run by a sustainable business since 2012 +- Trusted by 40k+ clients world-wide diff --git a/content/features/4_clients/microservice.svg b/content/features/4_clients/microservice.svg new file mode 100644 index 0000000000..966b24431e --- /dev/null +++ b/content/features/4_clients/microservice.svg @@ -0,0 +1 @@ + diff --git a/content/features/4_clients/microservice.svg.txt b/content/features/4_clients/microservice.svg.txt new file mode 100644 index 0000000000..b4638b038f --- /dev/null +++ b/content/features/4_clients/microservice.svg.txt @@ -0,0 +1,3 @@ +Title: Microservices +---- +Sort: 5 diff --git a/content/features/4_clients/mobile.svg b/content/features/4_clients/mobile.svg new file mode 100644 index 0000000000..03c06c4fab --- /dev/null +++ b/content/features/4_clients/mobile.svg @@ -0,0 +1 @@ + diff --git a/content/features/4_clients/mobile.svg.txt b/content/features/4_clients/mobile.svg.txt new file mode 100644 index 0000000000..add2486a5c --- /dev/null +++ b/content/features/4_clients/mobile.svg.txt @@ -0,0 +1,3 @@ +Title: Mobile +---- +Sort: 2 diff --git a/content/features/4_clients/print.svg b/content/features/4_clients/print.svg new file mode 100644 index 0000000000..06f23de065 --- /dev/null +++ b/content/features/4_clients/print.svg @@ -0,0 +1 @@ + diff --git a/content/features/4_clients/print.svg.txt b/content/features/4_clients/print.svg.txt new file mode 100644 index 0000000000..f75d715f63 --- /dev/null +++ b/content/features/4_clients/print.svg.txt @@ -0,0 +1,3 @@ +Title: Print +---- +Sort: 3 diff --git a/content/features/4_clients/smarthome.svg b/content/features/4_clients/smarthome.svg new file mode 100644 index 0000000000..d0a9e83076 --- /dev/null +++ b/content/features/4_clients/smarthome.svg @@ -0,0 +1 @@ + diff --git a/content/features/4_clients/smarthome.svg.txt b/content/features/4_clients/smarthome.svg.txt new file mode 100644 index 0000000000..06c7e52a7f --- /dev/null +++ b/content/features/4_clients/smarthome.svg.txt @@ -0,0 +1,3 @@ +Title: Smarthome +---- +Sort: 7 diff --git a/content/features/4_clients/tv.svg b/content/features/4_clients/tv.svg new file mode 100644 index 0000000000..de201e669f --- /dev/null +++ b/content/features/4_clients/tv.svg @@ -0,0 +1 @@ + diff --git a/content/features/4_clients/tv.svg.txt b/content/features/4_clients/tv.svg.txt new file mode 100644 index 0000000000..ce5cdd066c --- /dev/null +++ b/content/features/4_clients/tv.svg.txt @@ -0,0 +1,3 @@ +Title: TV +---- +Sort: 6 diff --git a/content/features/4_clients/wearable.svg b/content/features/4_clients/wearable.svg new file mode 100644 index 0000000000..20a202dec7 --- /dev/null +++ b/content/features/4_clients/wearable.svg @@ -0,0 +1 @@ + diff --git a/content/features/4_clients/wearable.svg.txt b/content/features/4_clients/wearable.svg.txt new file mode 100644 index 0000000000..d6be426c8c --- /dev/null +++ b/content/features/4_clients/wearable.svg.txt @@ -0,0 +1,3 @@ +Title: Wearable +---- +Sort: 4 diff --git a/content/features/4_clients/your-medium.svg b/content/features/4_clients/your-medium.svg new file mode 100644 index 0000000000..179645209f --- /dev/null +++ b/content/features/4_clients/your-medium.svg @@ -0,0 +1 @@ + diff --git a/content/features/4_clients/your-medium.svg.txt b/content/features/4_clients/your-medium.svg.txt new file mode 100644 index 0000000000..01ebaed875 --- /dev/null +++ b/content/features/4_clients/your-medium.svg.txt @@ -0,0 +1,3 @@ +Title: Your medium +---- +Sort: 8 diff --git a/content/features/blocks.jpg b/content/features/blocks.jpg deleted file mode 100644 index c3a2f973ba..0000000000 Binary files a/content/features/blocks.jpg and /dev/null differ diff --git a/content/features/blueprints.png b/content/features/blueprints.png deleted file mode 100755 index 8da216634d..0000000000 Binary files a/content/features/blueprints.png and /dev/null differ diff --git a/content/features/features.txt b/content/features/features.txt deleted file mode 100644 index cdec0cc7e3..0000000000 --- a/content/features/features.txt +++ /dev/null @@ -1,172 +0,0 @@ -Title: Features - ----- - -Intro: - -Kirby is packed with features that help you build high-end projects – faster, more efficient, and more enjoyable. - ----- - -Filesystem: - -```filesystem -content/ - 1_photography/ - 1_animals/ - 2_trees/ - 3_sky/ - 4_oceans/ - album.txt - attention-sharks.jpg - island-from-above.jpg - jellyfish.jpg - nasty-rocks.jpg - smashed-by-waves.jpg - photography.txt - 2_notes/ - 20190731_in-the-jungle-of-sumatra/ - 20190905_through-the-desert/ - 20190926_himalaya-and-back/ - 20191005_chasing-waterfalls/ - 20191031_exploring-the-universe/ - notes.txt - 3_about/ - about.txt - home/ - home.txt - error/ - error.txt - site.txt -``` - ----- - -Templates: - -```php - - -
-

title() ?>

-
- resize(800, 600) ?> -
-
- text()->kirbytext() ?> -
- -
- - -``` - ----- -Twig: - -```html "/site/templates/article.twig" -{% extends 'layout.twig' %} - -
-

{{ page.title }}

-
- {{ cover.resize(800, 600) }} -
-
- {{ page.text.kirbytext }} -
- -
-``` ----- -Api: - -```yaml "/api/pages/notes/children" -{ - "code": 200, - "data": [ - { - "id": "notes/across-the-ocean", - "num": 20180421, - "title": "Across the ocean", - "url": "/notes/across-the-ocean" - }, - { - "id": "notes/a-night-in-the-forest", - "num": 20180625, - "title": "A night in the forest", - "url": "/notes/a-night-in-the-forest" - }, - { - "id": "notes/in-the-jungle-of-sumatra", - "num": 20180731, - "title": "In the jungle of Sumatra", - "url": "/notes/in-the-jungle-of-sumatra" - }, - ], - "pagination": { - "page": 1, - "total": 22, - "offset": 0, - "limit": 3 - }, - "status": "ok", -} -``` - ----- - -Media: - -```php -$page - ->images() - ->template('gallery') - ->first() - ->srcset( - '1x' => [ - 'width' => 512, - 'height' => 512, - 'crop' => 'center' - ], - '2x' => [ - 'width' => 1024, - 'height' => 1024, - 'crop' => 'center' - ] - ]); -``` - ----- - -Users: - -```php -if ($user = $kirby->user()) { - echo 'Welcome, ' . $user->name(); - - snippet('community', ['role' => $user->role()]); - snippet('logout'); -} -``` ----- - -Bp: - -```yml -title: Shop -sections: - products: - type: pages - layout: cards - template: product - info: "{{ page.price }} €" -``` diff --git a/content/features/languages.png b/content/features/languages.png deleted file mode 100755 index 83d90bd207..0000000000 Binary files a/content/features/languages.png and /dev/null differ diff --git a/content/features/link.txt b/content/features/link.txt new file mode 100644 index 0000000000..512fe09095 --- /dev/null +++ b/content/features/link.txt @@ -0,0 +1,5 @@ +Title: Features + +---- + +Link: home diff --git a/content/features/locator.jpg b/content/features/locator.jpg deleted file mode 100755 index d7a6413d86..0000000000 Binary files a/content/features/locator.jpg and /dev/null differ diff --git a/content/features/matomo.jpg b/content/features/matomo.jpg deleted file mode 100755 index 973da826ae..0000000000 Binary files a/content/features/matomo.jpg and /dev/null differ diff --git a/content/features/metadata.jpg b/content/features/metadata.jpg deleted file mode 100755 index 0009b593b7..0000000000 Binary files a/content/features/metadata.jpg and /dev/null differ diff --git a/content/features/pagetable.jpg b/content/features/pagetable.jpg deleted file mode 100755 index b855eafb20..0000000000 Binary files a/content/features/pagetable.jpg and /dev/null differ diff --git a/content/features/retour.jpg b/content/features/retour.jpg deleted file mode 100755 index 967730567f..0000000000 Binary files a/content/features/retour.jpg and /dev/null differ diff --git a/content/features/search.jpg b/content/features/search.jpg deleted file mode 100644 index 0f82ed9437..0000000000 Binary files a/content/features/search.jpg and /dev/null differ diff --git a/content/features/status.png b/content/features/status.png deleted file mode 100755 index 113dcbef3e..0000000000 Binary files a/content/features/status.png and /dev/null differ diff --git a/content/features/translations.jpg b/content/features/translations.jpg deleted file mode 100755 index f564a0435c..0000000000 Binary files a/content/features/translations.jpg and /dev/null differ diff --git a/content/features/users.jpg b/content/features/users.jpg deleted file mode 100755 index 3687e6cc65..0000000000 Binary files a/content/features/users.jpg and /dev/null differ diff --git a/content/home/1_company/agency.jpg b/content/home/1_company/agency.jpg new file mode 100644 index 0000000000..8ab1043493 Binary files /dev/null and b/content/home/1_company/agency.jpg differ diff --git a/content/home/1_company/home-story.txt b/content/home/1_company/home-story.txt new file mode 100644 index 0000000000..3840374686 --- /dev/null +++ b/content/home/1_company/home-story.txt @@ -0,0 +1,74 @@ +Title: Your company + +---- + +Filesystem: + +```filesystem +content/ + 1_projects/ + creatious-labs/ + creatious-labs.jpg + project.txt + 2_team/ + 3_clients/ + home/ + site.txt +``` + +---- + +Filename: site.txt + +---- + +Filecontent: + +Title: H&C + +−--- + +Twitter: @h-and-c + +−--- + +Instagram: @h-and-c + +---- + +Browser: agency.kirby + +---- + +PhoneTitle: H&C + +---- + +PhoneSubtitle: Digital Agency + +---- + +PhoneImage: agency.jpg + +---- + +Api: + +```yaml +{ + "site": { + "title": "H&C", + "twitter": "@h-and-c", + "instagram": "@h-and-c" + }, + "projects": [ + ... + ], + "team": [ + ... + ], + "clients": [ + ... + ] +} +``` diff --git a/content/home/1_company/panel.jpg b/content/home/1_company/panel.jpg new file mode 100755 index 0000000000..01735c57f9 Binary files /dev/null and b/content/home/1_company/panel.jpg differ diff --git a/content/home/1_company/project-a.jpg b/content/home/1_company/project-a.jpg new file mode 100644 index 0000000000..f813293fa9 Binary files /dev/null and b/content/home/1_company/project-a.jpg differ diff --git a/content/home/1_company/project-b.jpg b/content/home/1_company/project-b.jpg new file mode 100644 index 0000000000..2ad1cb4994 Binary files /dev/null and b/content/home/1_company/project-b.jpg differ diff --git a/content/home/1_company/project-c.jpg b/content/home/1_company/project-c.jpg new file mode 100644 index 0000000000..4177502f87 Binary files /dev/null and b/content/home/1_company/project-c.jpg differ diff --git a/content/home/2_products/home-story.txt b/content/home/2_products/home-story.txt new file mode 100644 index 0000000000..f1e22e966b --- /dev/null +++ b/content/home/2_products/home-story.txt @@ -0,0 +1,66 @@ +Title: Your products + +---- + +Filesystem: + +```filesystem +content/ + products/ + terms-conditions.pdf + products.txt + salt-pepper/ + product.txt + salt-pepper.jpg +``` + +---- + +Filename: product.txt + +---- + +Filecontent: + +Title: Salt & Pepper + +−--- + +Price: 59.00 + +−--- + +Shipping: DHL, UPS … + +---- + +Browser: shop.kirby/products/salt-pepper + +---- + +PhoneTitle: Salt & Pepper + +---- + +PhoneSubtitle: Add to cart → + +---- + +PhoneImage: salt-and-pepper.jpg + +---- + +Api: + +```yaml +{ + "id": "products/salt-pepper", + "num": 0, + "status": "listed", + "content": { + "title": "Salt & Pepper", + "price": "59.00", + "Shipping": "DHL, UPS …" + } +} +``` diff --git a/content/home/2_products/panel.png b/content/home/2_products/panel.png new file mode 100755 index 0000000000..0b5d62e9a4 Binary files /dev/null and b/content/home/2_products/panel.png differ diff --git a/content/home/2_products/salt-and-pepper.jpg b/content/home/2_products/salt-and-pepper.jpg new file mode 100644 index 0000000000..91f48986de Binary files /dev/null and b/content/home/2_products/salt-and-pepper.jpg differ diff --git a/content/home/3_magazine/dark-forest.jpg b/content/home/3_magazine/dark-forest.jpg new file mode 100644 index 0000000000..932bdb5f7a Binary files /dev/null and b/content/home/3_magazine/dark-forest.jpg differ diff --git a/content/home/3_magazine/dark-forest.jpg.txt b/content/home/3_magazine/dark-forest.jpg.txt new file mode 100644 index 0000000000..117d3561b3 --- /dev/null +++ b/content/home/3_magazine/dark-forest.jpg.txt @@ -0,0 +1,5 @@ +Title: Exploring the universe +---- +Date: 2021-01-31 +---- +Template: article diff --git a/content/home/3_magazine/forest.jpg b/content/home/3_magazine/forest.jpg new file mode 100644 index 0000000000..009d6e26ff Binary files /dev/null and b/content/home/3_magazine/forest.jpg differ diff --git a/content/home/3_magazine/forest.jpg.txt b/content/home/3_magazine/forest.jpg.txt new file mode 100644 index 0000000000..606fed928f --- /dev/null +++ b/content/home/3_magazine/forest.jpg.txt @@ -0,0 +1,5 @@ +Title: A night in the forest +---- +Date: 2020-12-12 +---- +Template: article diff --git a/content/home/3_magazine/home-story.txt b/content/home/3_magazine/home-story.txt new file mode 100644 index 0000000000..9b463909da --- /dev/null +++ b/content/home/3_magazine/home-story.txt @@ -0,0 +1,77 @@ +Title: Your magazine + +---- + +Filesystem: + +```filesystem +content/ + articles/ + _drafts/ + around-the-world/ + article.txt + 20210131_exploring-the-universe/ + article.txt + dark-forest.jpg +``` + +---- + +Filename: article.txt + +---- + +Filecontent: + +Title: Exploring the universe + +−--- + +Subheading: The edge of nowhere + +−--- + +Cover: dark-forest.jpg + +−--- + +---- + +Browser: magazine.kirby/articles + +---- + +PhoneTitle: Around the world + +---- + +PhoneSubtitle: In 90 ways + +---- + +PhoneImage: waterfall.jpg + +---- + +Api: + +```yaml +[ + { + "id": "articles/exploring-the-universe", + "content": { + "title": "Exploring the universe", + "subheading": "The edge of nowhere", + "date": "2021-01-31" + } + }, + { + "id": "articles/in-the-jungle", + "content": { + "title": "In the jungle of Sumatra", + "subheading": "It’s green and moist", + "date": "2021-01-15" + } + } +] +``` diff --git a/content/home/3_magazine/ocean.jpg b/content/home/3_magazine/ocean.jpg new file mode 100644 index 0000000000..ee3c21cceb Binary files /dev/null and b/content/home/3_magazine/ocean.jpg differ diff --git a/content/home/3_magazine/ocean.jpg.txt b/content/home/3_magazine/ocean.jpg.txt new file mode 100644 index 0000000000..f130d234fa --- /dev/null +++ b/content/home/3_magazine/ocean.jpg.txt @@ -0,0 +1,5 @@ +Title: Across the ocean +---- +Date: 2020-11-11 +---- +Template: article diff --git a/content/home/3_magazine/panel.jpg b/content/home/3_magazine/panel.jpg new file mode 100755 index 0000000000..1275fdd622 Binary files /dev/null and b/content/home/3_magazine/panel.jpg differ diff --git a/content/home/3_magazine/waterfall.jpg b/content/home/3_magazine/waterfall.jpg new file mode 100644 index 0000000000..607207468e Binary files /dev/null and b/content/home/3_magazine/waterfall.jpg differ diff --git a/content/home/4_writing/dark-forest.jpg b/content/home/4_writing/dark-forest.jpg new file mode 100644 index 0000000000..932bdb5f7a Binary files /dev/null and b/content/home/4_writing/dark-forest.jpg differ diff --git a/content/home/4_writing/home-story.txt b/content/home/4_writing/home-story.txt new file mode 100644 index 0000000000..3f60370f97 --- /dev/null +++ b/content/home/4_writing/home-story.txt @@ -0,0 +1,79 @@ +Title: Your writing + +---- + +Filesystem: + +```filesystem +content/ + blog/ + exploring-the-universe/ + post.txt + dark-forest.jpg + milkyway.jpg + stars.mp4 +``` + +---- + +Filename: post.txt + +---- + +Filecontent: + +Title: Exploring the universe + +−--- + +Subheading: The edge of nowhere + +−--- + +Date: 2021-04-12 + +−--- + +Author: demo@devi.to + +−--- + +Tags: universe, sky + +−--- + +Text: Far far away … + +---- + +Browser: yoursite.kirby/blog/exploring-the-universe + +---- + +PhoneTitle: Exploring the universe + +---- + +PhoneSubtitle: The edge of nowhere + +---- + +PhoneImage: dark-forest.jpg + +---- + +Api: + +```yaml +{ + "id": "blog/exploring-the-universe", + "content": { + "title": "Exploring the universe", + "subheading": "The edge of nowhere", + "date": "2021-04-12", + "author": "demo@devi.to", + "tags": "universe, sky", + "text": "Far far away …" + } +} +``` diff --git a/content/home/4_writing/panel.jpg b/content/home/4_writing/panel.jpg new file mode 100755 index 0000000000..bd0c16df79 Binary files /dev/null and b/content/home/4_writing/panel.jpg differ diff --git a/content/home/5_projects/home-story.txt b/content/home/5_projects/home-story.txt new file mode 100644 index 0000000000..0a709a9e48 --- /dev/null +++ b/content/home/5_projects/home-story.txt @@ -0,0 +1,76 @@ +Title: Your projects + +---- + +Filesystem: + +```filesystem +content/ + projects/ + creatious-labs/ + cover.jpg + project.txt +``` + +---- + +Filename: project.txt + +---- + +Filecontent: + +Title: Creatious labs + +−--- + +Category: Product design + +−--- + +Client: beauty-box + +−--- + +Link: https://creatious.co + +−--- + +Cover: creatious-labs-cover.jpg + +−--- + +Text: Lorem ipsum dolor … + +---- + +Browser: company.kirby/projects/creatious-labs + +---- + +PhoneTitle: Creatious labs + +---- + +PhoneSubtitle: Product design + +---- + +PhoneImage: project-a.jpg + +---- + +Api: + +```yaml +{ + "id": "projects/creatious-labs", + "num": 2, + "status": "listed", + "content": { + "title": "Creatious labs", + "category": "Product design", + "text": "Lorem ipsum dolor …" + } +} +``` diff --git a/content/home/5_projects/panel.jpg b/content/home/5_projects/panel.jpg new file mode 100755 index 0000000000..1066bd13f7 Binary files /dev/null and b/content/home/5_projects/panel.jpg differ diff --git a/content/home/5_projects/project-a.jpg b/content/home/5_projects/project-a.jpg new file mode 100644 index 0000000000..5f64685e22 Binary files /dev/null and b/content/home/5_projects/project-a.jpg differ diff --git a/content/home/5_projects/project-b.jpg b/content/home/5_projects/project-b.jpg new file mode 100644 index 0000000000..f8b111a4c1 Binary files /dev/null and b/content/home/5_projects/project-b.jpg differ diff --git a/content/home/5_projects/project-c.jpg b/content/home/5_projects/project-c.jpg new file mode 100644 index 0000000000..3603e352eb Binary files /dev/null and b/content/home/5_projects/project-c.jpg differ diff --git a/content/home/5_projects/project-d.jpg b/content/home/5_projects/project-d.jpg new file mode 100644 index 0000000000..d4df1e81eb Binary files /dev/null and b/content/home/5_projects/project-d.jpg differ diff --git a/content/home/5_projects/project-e.jpg b/content/home/5_projects/project-e.jpg new file mode 100644 index 0000000000..6abb6d07ff Binary files /dev/null and b/content/home/5_projects/project-e.jpg differ diff --git a/content/home/6_microsite/home-story.txt b/content/home/6_microsite/home-story.txt new file mode 100644 index 0000000000..52f71ad259 --- /dev/null +++ b/content/home/6_microsite/home-story.txt @@ -0,0 +1,83 @@ +Title: Your microsite + +---- + +Filesystem: + +```filesystem +content/ + home/ + home.txt +``` + +---- + +Filename: project.txt + +---- + +Filecontent: + +Title: The App + +−--- + +Layout: ... + +---- + +Browser: the.app.kirby + +---- + +PhoneTitle: Our app + +---- + +PhoneSubtitle: It’s good – promised! + +---- + +PhoneImage: micro-1.jpg + + +---- + +Api: + +```yaml +{ + columns: [ + { + width: "1/1", + blocks: [ + { + type: "heading", + content: { + text: "Our app is quite good", + level: "h1" + } + } + ] + }, + { + width: "1/3", + blocks: [ + { + type: "text", + content: { + text: "It can do all of this …", + } + }, + { + type: "image", + content: { + src: "https://the.app.kirby/medium/.../app.jpg", + } + } + ] + }, + ... + ] +} +``` diff --git a/content/home/6_microsite/micro-1.jpg b/content/home/6_microsite/micro-1.jpg new file mode 100644 index 0000000000..5466e9985b Binary files /dev/null and b/content/home/6_microsite/micro-1.jpg differ diff --git a/content/home/6_microsite/micro-2.jpg b/content/home/6_microsite/micro-2.jpg new file mode 100644 index 0000000000..f5029863cd Binary files /dev/null and b/content/home/6_microsite/micro-2.jpg differ diff --git a/content/home/6_microsite/micro-3.jpg b/content/home/6_microsite/micro-3.jpg new file mode 100644 index 0000000000..cfaddbb9e8 Binary files /dev/null and b/content/home/6_microsite/micro-3.jpg differ diff --git a/content/home/6_microsite/panel.jpg b/content/home/6_microsite/panel.jpg new file mode 100755 index 0000000000..99513639d0 Binary files /dev/null and b/content/home/6_microsite/panel.jpg differ diff --git a/content/home/article.jpg b/content/home/article.jpg deleted file mode 100644 index aff3491dc7..0000000000 Binary files a/content/home/article.jpg and /dev/null differ diff --git a/content/home/article.jpg.txt b/content/home/article.jpg.txt deleted file mode 100644 index 88cb43f60b..0000000000 --- a/content/home/article.jpg.txt +++ /dev/null @@ -1,5 +0,0 @@ -Caption: Article - ----- - -Description: Set up the perfect, distraction-free writing interface for your articles with our brand new blocks field. diff --git a/content/home/blog.jpg b/content/home/blog.jpg deleted file mode 100644 index a0595c682f..0000000000 Binary files a/content/home/blog.jpg and /dev/null differ diff --git a/content/home/blog.jpg.txt b/content/home/blog.jpg.txt deleted file mode 100644 index c3cd9977c4..0000000000 --- a/content/home/blog.jpg.txt +++ /dev/null @@ -1,5 +0,0 @@ -Caption: Blog - ----- - -Description: Show drafts, unreviewed and published articles in a side-by-side view for your blog. \ No newline at end of file diff --git a/content/home/chameleon.jpg b/content/home/chameleon.jpg deleted file mode 100755 index a3c01828d4..0000000000 Binary files a/content/home/chameleon.jpg and /dev/null differ diff --git a/content/home/chameleon.jpg.txt b/content/home/chameleon.jpg.txt deleted file mode 100644 index e199a1e4e2..0000000000 --- a/content/home/chameleon.jpg.txt +++ /dev/null @@ -1 +0,0 @@ -Alt: A cute chameleon on a branch diff --git a/content/clients/0_harvard/client.txt b/content/home/clients/0_harvard/client.txt similarity index 100% rename from content/clients/0_harvard/client.txt rename to content/home/clients/0_harvard/client.txt diff --git a/content/home/clients/0_harvard/harvard.svg b/content/home/clients/0_harvard/harvard.svg new file mode 100644 index 0000000000..d877d31b32 --- /dev/null +++ b/content/home/clients/0_harvard/harvard.svg @@ -0,0 +1 @@ + diff --git a/content/clients/0_joyent/client.txt b/content/home/clients/0_joyent/client.txt similarity index 100% rename from content/clients/0_joyent/client.txt rename to content/home/clients/0_joyent/client.txt diff --git a/content/home/clients/0_joyent/joyent.svg b/content/home/clients/0_joyent/joyent.svg new file mode 100644 index 0000000000..8c37fc0e28 --- /dev/null +++ b/content/home/clients/0_joyent/joyent.svg @@ -0,0 +1 @@ + diff --git a/content/clients/0_mercedes/client.txt b/content/home/clients/0_mercedes/client.txt similarity index 100% rename from content/clients/0_mercedes/client.txt rename to content/home/clients/0_mercedes/client.txt diff --git a/content/home/clients/0_mercedes/mercedes.svg b/content/home/clients/0_mercedes/mercedes.svg new file mode 100644 index 0000000000..125859c911 --- /dev/null +++ b/content/home/clients/0_mercedes/mercedes.svg @@ -0,0 +1 @@ + diff --git a/content/clients/0_nyt/client.txt b/content/home/clients/0_nyt/client.txt similarity index 100% rename from content/clients/0_nyt/client.txt rename to content/home/clients/0_nyt/client.txt diff --git a/content/home/clients/0_nyt/nyt.svg b/content/home/clients/0_nyt/nyt.svg new file mode 100644 index 0000000000..0f2e9fdeae --- /dev/null +++ b/content/home/clients/0_nyt/nyt.svg @@ -0,0 +1 @@ + diff --git a/content/clients/0_philips/client.txt b/content/home/clients/0_philips/client.txt similarity index 100% rename from content/clients/0_philips/client.txt rename to content/home/clients/0_philips/client.txt diff --git a/content/home/clients/0_philips/philips.svg b/content/home/clients/0_philips/philips.svg new file mode 100644 index 0000000000..24de679d75 --- /dev/null +++ b/content/home/clients/0_philips/philips.svg @@ -0,0 +1 @@ + diff --git a/content/clients/0_smashingmagazine/client.txt b/content/home/clients/0_smashingmagazine/client.txt similarity index 100% rename from content/clients/0_smashingmagazine/client.txt rename to content/home/clients/0_smashingmagazine/client.txt diff --git a/content/home/clients/0_smashingmagazine/smashingmagazine.svg b/content/home/clients/0_smashingmagazine/smashingmagazine.svg new file mode 100644 index 0000000000..27be73fdac --- /dev/null +++ b/content/home/clients/0_smashingmagazine/smashingmagazine.svg @@ -0,0 +1 @@ + diff --git a/content/home/components.jpg b/content/home/components.jpg deleted file mode 100755 index 72b2a49c38..0000000000 Binary files a/content/home/components.jpg and /dev/null differ diff --git a/content/home/components.jpg.txt b/content/home/components.jpg.txt deleted file mode 100644 index 632a6190c4..0000000000 --- a/content/home/components.jpg.txt +++ /dev/null @@ -1 +0,0 @@ -Alt: Interface elements for Kirby’s control panel diff --git a/content/home/dashboard.jpg.txt b/content/home/dashboard.jpg.txt deleted file mode 100644 index a8bb70bb86..0000000000 --- a/content/home/dashboard.jpg.txt +++ /dev/null @@ -1,5 +0,0 @@ -Caption: Dashboard - ----- - -Description: Set up the dashboard to fit each site perfectly. Give editors quick access to the most important data. diff --git a/content/home/features/1_content/feature.txt b/content/home/features/1_content/feature.txt deleted file mode 100644 index 4ced09abde..0000000000 --- a/content/home/features/1_content/feature.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Any content you like - ----- - -Text: Organize content your way. Every page type or data entry can have the completely unique data structure that your project demands. diff --git a/content/home/features/2_i18n/feature.txt b/content/home/features/2_i18n/feature.txt deleted file mode 100644 index b4e1079db4..0000000000 --- a/content/home/features/2_i18n/feature.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Internationalization - ----- - -Text: Multi-language support is baked right into the core, so you don’t depend on plugins or frameworks to translate your site. diff --git a/content/home/features/3_assets/feature.txt b/content/home/features/3_assets/feature.txt deleted file mode 100644 index 9383009af6..0000000000 --- a/content/home/features/3_assets/feature.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Asset management - ----- - -Text: Kirby stores media files in the same folder as the page content, not in a giant media library. Never lose track of pictures or other items again. - - diff --git a/content/home/features/3_assets/img-stack.svg b/content/home/features/3_assets/img-stack.svg deleted file mode 100644 index 263832a801..0000000000 --- a/content/home/features/3_assets/img-stack.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/home/features/4_text/caps-small.svg b/content/home/features/4_text/caps-small.svg deleted file mode 100644 index 90396619b9..0000000000 --- a/content/home/features/4_text/caps-small.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/home/features/4_text/feature.txt b/content/home/features/4_text/feature.txt deleted file mode 100644 index 5ddae0cfaa..0000000000 --- a/content/home/features/4_text/feature.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Markdown & KirbyText - ----- - -Text: Enjoy a fast and effective editing experience with Markdown. KirbyText extends Markdown and makes it even easier to add links, images, videos and more to your text. diff --git a/content/home/features/5_api/feature.txt b/content/home/features/5_api/feature.txt deleted file mode 100644 index e250668f05..0000000000 --- a/content/home/features/5_api/feature.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Built-in REST API - ----- - -Text: Use Kirby as a **headless CMS** with the full power of the Panel in the background. This makes Kirby the perfect companion for your SPAs or mobile applications. diff --git a/content/home/features/6_git/feature.txt b/content/home/features/6_git/feature.txt deleted file mode 100644 index 51d1156271..0000000000 --- a/content/home/features/6_git/feature.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Version control - ----- - -Text: As Kirby is a file-based CMS, you can version control all content with Git or any other VCS. Deployments, backups and synchronization of multiple stages are a breeze. diff --git a/content/home/features/7_data-sources/feature.txt b/content/home/features/7_data-sources/feature.txt deleted file mode 100644 index aaa1a38f21..0000000000 --- a/content/home/features/7_data-sources/feature.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Bring your own data sources - ----- - -Text: While files and folders are Kirby’s primary data source, you can generate pages from databases, REST APIs or even Excel sheets if that’s your thing. diff --git a/content/home/features/8_publishing-workflows/feature.txt b/content/home/features/8_publishing-workflows/feature.txt deleted file mode 100644 index 6a42b5d794..0000000000 --- a/content/home/features/8_publishing-workflows/feature.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Custom publishing workflows - ----- - -Text: Customizable page states give you maximum control over your workflow, from drafts over unreviewed to published pages. Choose what you need and start creating. diff --git a/content/home/features/8_publishing-workflows/send.svg b/content/home/features/8_publishing-workflows/send.svg deleted file mode 100644 index b6b9fe734c..0000000000 --- a/content/home/features/8_publishing-workflows/send.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/home/features/9_vue/feature.txt b/content/home/features/9_vue/feature.txt deleted file mode 100644 index 42dba3b135..0000000000 --- a/content/home/features/9_vue/feature.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Vue UI Kit - ----- - -Text: Kirby’s Panel is powered by Vue. Use the full power of Vue or our Vue UI component kit to make the admin interface truly yours. diff --git a/content/home/hero.jpg b/content/home/hero.jpg deleted file mode 100644 index c9fafbb3d8..0000000000 Binary files a/content/home/hero.jpg and /dev/null differ diff --git a/content/home/hero.jpg.txt b/content/home/hero.jpg.txt deleted file mode 100644 index f88115321e..0000000000 --- a/content/home/hero.jpg.txt +++ /dev/null @@ -1 +0,0 @@ -Alt: Screenshot of Kirby’s control panel diff --git a/content/home/home.txt b/content/home/home.txt index d474381942..4862aa05b9 100644 --- a/content/home/home.txt +++ b/content/home/home.txt @@ -1,42 +1,11 @@ -Title: Kirby - The file-based content management system ----- -Filesystem: - -```filesystem -content/ - photography/ - oceans/ - album.txt - ocean.jpg - photography.txt - contact/ - contact.txt - home/ - home.txt - error/ - error.txt - site.txt -``` +Title: Kirby - The CMS that adapts to any project ---- -Templates: -```php -
-

title() ?>

-
- resize(800, 600) ?> -
-
- text()->kirbytext() ?> -
- -
-``` +Thumbnail: + - + lead: The CMS that adapts to you + title: Kirby ---- @@ -44,4 +13,4 @@ Priority: 1.0 ---- -Changefreq: weekly \ No newline at end of file +Changefreq: weekly diff --git a/content/home/interface-1.jpg b/content/home/interface-1.jpg deleted file mode 100755 index e0a3f14491..0000000000 Binary files a/content/home/interface-1.jpg and /dev/null differ diff --git a/content/home/interface-2.jpg b/content/home/interface-2.jpg deleted file mode 100755 index 38b18e4e0a..0000000000 Binary files a/content/home/interface-2.jpg and /dev/null differ diff --git a/content/home/interface-3.jpg b/content/home/interface-3.jpg deleted file mode 100755 index c2d9902587..0000000000 Binary files a/content/home/interface-3.jpg and /dev/null differ diff --git a/content/home/interface-4.jpg b/content/home/interface-4.jpg deleted file mode 100755 index 2fce8f511f..0000000000 Binary files a/content/home/interface-4.jpg and /dev/null differ diff --git a/content/home/interface-5.jpg b/content/home/interface-5.jpg deleted file mode 100755 index 811e543c0d..0000000000 Binary files a/content/home/interface-5.jpg and /dev/null differ diff --git a/content/home/matomo.jpg b/content/home/matomo.jpg deleted file mode 100755 index 973da826ae..0000000000 Binary files a/content/home/matomo.jpg and /dev/null differ diff --git a/content/home/matomo.jpg.txt b/content/home/matomo.jpg.txt deleted file mode 100644 index 55ea22a7dd..0000000000 --- a/content/home/matomo.jpg.txt +++ /dev/null @@ -1 +0,0 @@ -Alt: Screenshot of the Matomo plugin by Sylvain Julé diff --git a/content/home/microsite.jpg b/content/home/microsite.jpg deleted file mode 100644 index 6832108a1b..0000000000 Binary files a/content/home/microsite.jpg and /dev/null differ diff --git a/content/home/microsite.jpg.txt b/content/home/microsite.jpg.txt deleted file mode 100644 index 49c33c2e95..0000000000 --- a/content/home/microsite.jpg.txt +++ /dev/null @@ -1,5 +0,0 @@ -Caption: Microsite - ----- - -Description: Use Kirby's brand-new layout field to create complex modular microsites and page layouts. diff --git a/content/home/php.svg b/content/home/php.svg new file mode 100644 index 0000000000..43f2ba51bb --- /dev/null +++ b/content/home/php.svg @@ -0,0 +1 @@ + diff --git a/content/home/product.jpg b/content/home/product.jpg deleted file mode 100644 index 5ad250a5ce..0000000000 Binary files a/content/home/product.jpg and /dev/null differ diff --git a/content/home/product.jpg.txt b/content/home/product.jpg.txt deleted file mode 100644 index 54cee6f93b..0000000000 --- a/content/home/product.jpg.txt +++ /dev/null @@ -1,5 +0,0 @@ -Caption: Product - ----- - -Description: Kirby is the perfect starting point for your shop. Create the perfect editing interface for your product attributes. diff --git a/content/home/project.jpg b/content/home/project.jpg deleted file mode 100644 index bafa45721f..0000000000 Binary files a/content/home/project.jpg and /dev/null differ diff --git a/content/home/project.jpg.txt b/content/home/project.jpg.txt deleted file mode 100644 index 6395169395..0000000000 --- a/content/home/project.jpg.txt +++ /dev/null @@ -1,5 +0,0 @@ -Caption: Project - ----- - -Description: Create visually stunning interfaces for projects with galleries and custom meta data. diff --git a/content/home/restaurant/browser.png b/content/home/restaurant/browser.png new file mode 100644 index 0000000000..19b40ca9a8 Binary files /dev/null and b/content/home/restaurant/browser.png differ diff --git a/content/home/restaurant/home-story.txt b/content/home/restaurant/home-story.txt new file mode 100644 index 0000000000..03c4e9e811 --- /dev/null +++ b/content/home/restaurant/home-story.txt @@ -0,0 +1,58 @@ +Title: Your restaurant + +---- + +Filesystem: + +```filesystem +content/ + restaurant/ + restaurant-cover.jpg + restaurant-3.jpg + restaurant-2.jpg + restaurant-1.jpg + restaurant.txt +``` + +---- + +Filename: restaurant.txt + +---- + +Filecontent: + +Title: Tastybites + +−--- + +OpeningHours: Monday – Friday … + +−--- + +Phone: +49 1234 5678 + +−--- + +Email: tasty@bit.es + +---- + +Browser: tastybites.food + +---- + +Api: + +```yaml +{ + "id": "projects/creatious-labs", + "num": 2, + "status": "listed", + "content": { + "title": "Creatious labs", + "category": "Product design", + "text": "Lorem ipsum dolor …" + } +} +``` diff --git a/content/home/restaurant/panel.jpg b/content/home/restaurant/panel.jpg new file mode 100755 index 0000000000..3f7cce014f Binary files /dev/null and b/content/home/restaurant/panel.jpg differ diff --git a/content/home/restaurant/restaurant-2.jpg b/content/home/restaurant/restaurant-2.jpg new file mode 100644 index 0000000000..08d48dbc4c Binary files /dev/null and b/content/home/restaurant/restaurant-2.jpg differ diff --git a/content/home/restaurant/restaurant-cover.jpg b/content/home/restaurant/restaurant-cover.jpg new file mode 100644 index 0000000000..a18a16b839 Binary files /dev/null and b/content/home/restaurant/restaurant-cover.jpg differ diff --git a/content/home/vue.svg b/content/home/vue.svg new file mode 100644 index 0000000000..89cb0f142d --- /dev/null +++ b/content/home/vue.svg @@ -0,0 +1 @@ + diff --git a/content/konf/3st.jpg b/content/konf/3st.jpg deleted file mode 100644 index 91c23fa4af..0000000000 Binary files a/content/konf/3st.jpg and /dev/null differ diff --git a/content/konf/3st.svg b/content/konf/3st.svg deleted file mode 100644 index 965819c9cc..0000000000 --- a/content/konf/3st.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/konf/agency-1.jpg b/content/konf/agency-1.jpg deleted file mode 100644 index 14482078d7..0000000000 Binary files a/content/konf/agency-1.jpg and /dev/null differ diff --git a/content/konf/agency-2.jpg b/content/konf/agency-2.jpg deleted file mode 100644 index 17ac31c13b..0000000000 Binary files a/content/konf/agency-2.jpg and /dev/null differ diff --git a/content/konf/agency-3.jpg b/content/konf/agency-3.jpg deleted file mode 100644 index ef988b8f54..0000000000 Binary files a/content/konf/agency-3.jpg and /dev/null differ diff --git a/content/konf/beyondtellerrand.svg b/content/konf/beyondtellerrand.svg deleted file mode 100644 index 61ce793419..0000000000 --- a/content/konf/beyondtellerrand.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/konf/cancellation/konf-page.txt b/content/konf/cancellation/konf-page.txt deleted file mode 100644 index 1b72f4a472..0000000000 --- a/content/konf/cancellation/konf-page.txt +++ /dev/null @@ -1,49 +0,0 @@ -title: Kirby Konf ----- -text: - - - -This morning, we had to make the toughest decision in our team so far. **We decided to cancel Kirby Konf** - -The conference would have taken place on March 21st, 2020. The warm-up event on Friday 20th is cancelled as well. - -This breaks my heart. I was really looking forward to this first Kirby conference for months and the excitement in our community was incredibly motivating. We were so close to finally meet in real life for the first time. - -But the situation in Germany and around the world has changed drastically in the last days and will very likely get worse in the next days and weeks. It also changed our perspective on the risk for the event and the risk that the event poses. - -Germany is following the development in Italy very closley with a delay of roughly 10 days. This means that we will likely be having around (link: https://projekte.sueddeutsche.de/artikel/wissen/coronavirus-die-wucht-der-grossen-zahl-e575082/ text: 4500 cases by the end of March). - -The majority of attendees would still not be in direct danger. Most of you are not in the risk group. But one of our speakers had to cancel this morning because he actually is. - -With the fast and exponential spreading of the virus, we read a lot more about the importance of slowing down the curve and thus protect our health system and those who are seriously threatened. - -Even with a small event, we don’t want to help make the situation worse and increase the risk for our attendees and for others. - -As much as I would love to see it differently, Kirby Konf is not an essential event that has to take place at all costs at this time. Health always takes priority! **We will try again once the situation has settled down!** - -We hope you understand that we cannot hang out with you and pretend it’s all fine and have fun together at this point. - -*** - -Tickets: of course we will reimburse the paid-for-tickets. Please, get in contact: - -Train tickets: The Deutsche Bahn offers (link: https://www.deutschebahn.com/de/presse/pressestart_zentrales_uebersicht/Coronavirus-DB-umfassend-vorbereitet-4974568 text: free ticket cancellations) for those who are affected by a cancelled conference. - -You have to send an email at with your ticket, the reason for the cancellation and a link to the official cancellation notice by us (this page) They told us on the hotline that you need to be patient though. - -Lufthansa is offering a similar program and we really hope other airlines do that as well. - -Please, let us know if we can help you with anything else around the cancellation! - -*** - -We are so sorry - but at the same time we think it is important that everyone lives up to their responsibilities in these days. -This is ours. - -– The Kirby team diff --git a/content/konf/code-of-conduct/konf-page.txt b/content/konf/code-of-conduct/konf-page.txt deleted file mode 100644 index a20b4f6f36..0000000000 --- a/content/konf/code-of-conduct/konf-page.txt +++ /dev/null @@ -1,32 +0,0 @@ -title: Kirby Konf – Code of Conduct ----- -text: - -## Overview - -We will enforce this code throughout the duration of the conference, including but not limited to sessions, parties, fringe events, Slack channels, Twitter, and other online communities. We expect cooperation from all participants to help ensure a safe environment for everybody. - -We are dedicated to providing a harassment-free experience for everyone, regardless of gender, gender identity and expression, age, sexual orientation, disability, physical appearance, body size, race, ethnicity, religion (or lack thereof), or technology choices. We do not tolerate harassment of event participants (including but not limited to attendees, speakers, sponsors, and staff members) in any form. Sexual language and imagery is not appropriate for any event venue, including sessions, parties, fringe events, Slack channels, Twitter and other online media. Event participants violating these rules may be sanctioned or expelled from all events without a refund at the discretion of the event organisers. - -## Our Policy - -Harassment includes offensive verbal comments related to gender, gender identity and expression, age, sexual orientation, disability, physical appearance, body size, race, ethnicity, religion, technology choices, sexual images in public spaces, deliberate intimidation, stalking, following, unwanted photography or recording, sustained disruption of talks or other events, inappropriate physical contact, and unwelcome sexual attention. - -Participants asked to stop any harassing behavior are expected to comply immediately. - -Sponsors are also subject to the anti-harassment policy. In particular, sponsors should not use sexualised images, activities, or other material. Staff should not use sexualised clothing/uniforms/costumes, or otherwise create a sexualised environment. - -If a participant engages in harassing behavior, the event organisers may take any action they deem appropriate, including warning the offender or expulsion from all events with no refund. - -## Need help? - -If you are being harassed, notice that someone else is being harassed, or have any other concerns, please contact a member of event staff immediately. If you would feel more comfortable speaking to a specific person, please contact our designated Code of Conduct staff members noted below. We understand that some people will be more comfortable discussing such sensitive issues via written communication instead of face-to-face, so please feel free to get in touch via e-mail or send us a direct message on Twitter: - -## CoC contact routes -Email: -Twitter: (twitter: getkirby) (public DMs open) -In person: alert Bastian, Sonja, Lukas, or Nico - -We will be happy to help participants contact local law enforcement, provide escorts, or otherwise assist those experiencing harassment to feel safe for the duration of the conference. We value your attendance. - -We expect participants to follow these rules at the conference venue and conference-related social events. diff --git a/content/konf/keycdn.svg b/content/konf/keycdn.svg deleted file mode 100644 index 1c2fef8f32..0000000000 --- a/content/konf/keycdn.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/content/konf/link.txt b/content/konf/link.txt deleted file mode 100644 index 6addd7408d..0000000000 --- a/content/konf/link.txt +++ /dev/null @@ -1,3 +0,0 @@ -Title: Kirby Konf 2020 ----- -Link: konf/cancellation diff --git a/content/konf/mainz.jpg b/content/konf/mainz.jpg deleted file mode 100644 index 89ab3deede..0000000000 Binary files a/content/konf/mainz.jpg and /dev/null differ diff --git a/content/konf/terms/konf-page.txt b/content/konf/terms/konf-page.txt deleted file mode 100644 index 652b418973..0000000000 --- a/content/konf/terms/konf-page.txt +++ /dev/null @@ -1,27 +0,0 @@ -title: Kirby Konf – Terms of Service ----- -text: - -## Refunds -Paid registrations are non-refundable once purchased. Cancellations of your travel and/or hotel reservations are your own responsibility. Please notice, that if you can't attend for any reason you are responsible to cancel your room and flights. - -## Transferring your Ticket -We know that things can happen, which lead to the fact that you can't attend. We cannot refund paid tickets. But we can transfer them to another person. Please let us know in advance if you cannot attend or if you want to transfer your ticket. - -## Cancellation - -We can change the date of the event or cancel the event due to low numbers of registrations. If the event is cancelled any registered attendee with a paid ticket gets back the full entrance fee. Further claims against us are not possible. - -## Prices - -All prices mentioned on this website are including German VAT of 19%. All conference tickets also include the booking fee. The ticket price for the conference does **not** cover any travel or accommodation. - -## Accessibility - -Please contact us, if you want to attend at workshops or the conference and have any special requirements such as access for wheelchairs. We will do our very best to accommodate you. - -## Photos, Videos and Quotes - -We take photos and videos at our events. It may happen that we shoot videos and photos on which you will be included. With your registration you grant us the right to use such material taken over the days. Quotes given on interviews, twitter or on our feedback forms maybe used for future event marketing. Fully credited wherever possible of course. If you don't want a photo on which you are recognizable to be online, please let us know and we take it offline. - -If you want to take photos, we are happy that you want to share them with the other attendees and publish them. Let us know where to find them and we gonna tell the other attendees about it. The official hashtag to be used is #kirbykonf. Video and sound recording of any session, talk, presentation or workshop at the whole event is **NOT permitted** unless permission is given by the organiser of the event. diff --git a/content/konf/uberspace.svg b/content/konf/uberspace.svg deleted file mode 100644 index f2446cc671..0000000000 --- a/content/konf/uberspace.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/kosmos/20170520_11/kosmos-issue.txt b/content/kosmos/20170520_11/kosmos-issue.txt index 5fdf30edbd..2790192de5 100644 --- a/content/kosmos/20170520_11/kosmos-issue.txt +++ b/content/kosmos/20170520_11/kosmos-issue.txt @@ -67,9 +67,7 @@ Sam Nabi's E-Commerce solution [Shopkit](https://shopkit.samnabi.com) is now ava (picture: shopkit.jpg) -(…columns) - -(columns…) +++++ ## Images Field The [Images field](https://github.com/medienbaecker/kirby-images) lets you drag&drop multiple images into a field, reorder them easily and even move images between multiple instances of its kind (beta). Made by Thomas Günther. @@ -78,9 +76,7 @@ The [Images field](https://github.com/medienbaecker/kirby-images) lets you drag& (picture: kirby-images.jpg) -(…columns) - -(columns…) +++++ ## Preview Field The [Preview](https://github.com/texnixe/kirby-preview) field shows a preview of a selected page in an iframe to allow users to copy and paste content into fields of a new page. Special preview templates can be defined (beta). @@ -113,9 +109,7 @@ Blog, Project, Personal [Variations](http://kc.konstantin.fr/variations-theme/) One-Pager -(…columns) - -(columns…) +++++ ## Sorting & grouping Sorting and grouping of content collections is an everyday developer's task. This brand new [cookbook recipe](https://getkirby.com/docs/cookbook/sorting-and-grouping) walks you through several use cases and how to solve them using Kirby's powerful API methods. @@ -124,8 +118,7 @@ Sorting and grouping of content collections is an everyday developer's task. Thi (picture: sorting-and-grouping.jpg) -(…columns) -(columns…) +++++ (picture: habita.jpg) ++++ diff --git a/content/kosmos/20170619_12/kosmos-issue.txt b/content/kosmos/20170619_12/kosmos-issue.txt index cba1ea486b..ca5ca357ba 100644 --- a/content/kosmos/20170619_12/kosmos-issue.txt +++ b/content/kosmos/20170619_12/kosmos-issue.txt @@ -61,9 +61,7 @@ Designer at Microsoft ### Case Study: Interface Lovers [Interface Lovers](https://interfacelovers.com) is an "online magazine for creative professionals". Read about how and why they use Kirby to power their website in our [latest case study](https://getkirby.com/blog/interface-lovers). -(…columns) - -(columns…) +++++ ### Cookbook: RelMeAuth @@ -73,9 +71,7 @@ RelMeAuth is a [proposed web standard ](http://microformats.org/wiki/RelMeAuth) (picture: kirby-cookbook.jpg) -(…columns) - -(columns…) +++++ (picture: decoupled-kirby.jpg) diff --git a/content/kosmos/20170808_13/kosmos-issue.txt b/content/kosmos/20170808_13/kosmos-issue.txt index 827f50d055..6889902552 100644 --- a/content/kosmos/20170808_13/kosmos-issue.txt +++ b/content/kosmos/20170808_13/kosmos-issue.txt @@ -75,9 +75,7 @@ Event location ### Ma Petite Entreprise As the French name of [this theme created by Constantin Joly](https://cj-lab.fr/themes/mpe/) suggests, it targets small businesses like a Restaurant, Tattoo Studio or Architect. Features filters, categories, galleries and some customizations. -(…columns) - -(columns…) +++++ ### Velox [Velox ](http://themes.vlady.cc/velox/)is a universal, multi-purpose theme by Vladimir Yordanov. Like the [Kirby Starterkit](https://getkirby.com/try), it features a blog, project section and some static pages. Built using the [Bulma CSS framework](http://bulma.io). diff --git a/content/kosmos/20171025_16/kosmos-issue.txt b/content/kosmos/20171025_16/kosmos-issue.txt index d4822fd7c7..09e93f43a5 100644 --- a/content/kosmos/20171025_16/kosmos-issue.txt +++ b/content/kosmos/20171025_16/kosmos-issue.txt @@ -78,9 +78,7 @@ Symmetric is a nice multi-purpose theme by Constantin Holy. [Alpha](http://t.starck.io/alpha/) Alpha is a minimalistic blog theme created by Christopher Boutillé. -(…columns) - -(columns…) +++++ (picture: uime-theme.jpg) @@ -93,9 +91,7 @@ UI-ME is a customizable multi-purpose theme created by Constantin Joly. [Kollide](http://themes.yordanoff.net/kollide/) Kollide is a very feature-rich Portfolio Theme created by Joro Yordanov. -(…columns) - -(columns…) +++++ ## Kirby Tutorials Julian Oster shares his new [workflow with Kirby and Git](https://jlnostr.de/blog/better-workflow-with-kirby-and-git) with us. @@ -104,9 +100,7 @@ Julian Oster shares his new [workflow with Kirby and Git](https://jlnostr.de/blo (picture: kirby-workflow-with-git.jpg) -(…columns) - -(columns…) +++++ ## Javascript [Draggable](https://shopify.github.io/draggable/) is a lightweight, open source JavaScript drag & drop library. The website itself is an beautiful, playful demo of its capabilities. @@ -115,9 +109,7 @@ Julian Oster shares his new [workflow with Kirby and Git](https://jlnostr.de/blo (picture: draggable.jpg) -(…columns) - -(columns…) +++++ ## Performance I diff --git a/content/kosmos/20180805_25/kosmos-issue.txt b/content/kosmos/20180805_25/kosmos-issue.txt index 8cc9ec011c..899b7d5da8 100644 --- a/content/kosmos/20180805_25/kosmos-issue.txt +++ b/content/kosmos/20180805_25/kosmos-issue.txt @@ -31,7 +31,7 @@ We are hitting a big Kirby 3 milestone today with the first private single-langu - [Mockmodule](https://github.com/plusForta/mockmodule) is a plugin for all Kirby users who use both the Modules and the Patterns plugins. It allows you to add static content for modules in the pattern lab (free). -- The [Kirby TOC plugin](https://github.com/jenstornell/kirby-toc) is an enhancement of the [TOC plugin](https://github.com/getkirby/getkirby.com/tree/master/site/plugins/toc) you probably know from the https://getkirby.com website with support for multiple heading levels (free). +- The [Kirby TOC plugin](https://github.com/jenstornell/kirby-toc) is an enhancement of the TOC plugin you probably know from the https://getkirby.com website with support for multiple heading levels (free). Always test third party plugins thoroughly before using them in production! diff --git a/content/kosmos/20181016_27/kosmos-issue.txt b/content/kosmos/20181016_27/kosmos-issue.txt index 8991c67c08..3f7f383726 100644 --- a/content/kosmos/20181016_27/kosmos-issue.txt +++ b/content/kosmos/20181016_27/kosmos-issue.txt @@ -45,9 +45,7 @@ Brewery [SVGeez](https://svgeez.com) Free SVG resources for your projects and at the same time a website made with Kirby. -(…columns) - -(columns…) +++++ [The Whale](https://thewhale.cc), a new project by Gilles Vauvarin, not only brings you weekly news but is also one of the first few projects out in the wild built on [Kirby 3](https://getkirby.com/next) beta. diff --git a/content/kosmos/20200214_43/kosmos-issue.txt b/content/kosmos/20200214_43/kosmos-issue.txt index ba21a27ad5..17a211d6fe 100644 --- a/content/kosmos/20200214_43/kosmos-issue.txt +++ b/content/kosmos/20200214_43/kosmos-issue.txt @@ -40,9 +40,7 @@ Be it a huge complex company website with thousands of pages or your personal po Bauhaus is one of the largest DIY store chains in Europe. [Richtig gut](https://richtiggut.de/) is a spin-off of their main website with instructions and inspiration around house and garden. -(…columns) - -(columns…) +++++ [OBS Studio](https://obsproject.com) is a free and open-source cross-platform streaming and recording software. The website is available in 16 languages built with (link: docs/guide/languages/introduction text: Kirby's multi-language feature). diff --git a/content/kosmos/20200605_46/kosmos-issue.txt b/content/kosmos/20200605_46/kosmos-issue.txt index bf352420b0..2bf795ddb7 100644 --- a/content/kosmos/20200605_46/kosmos-issue.txt +++ b/content/kosmos/20200605_46/kosmos-issue.txt @@ -79,9 +79,7 @@ Convert and transform WordPress WXR RSS export files into a new Kirby 3 site wit [Themes for Kirby](https://themesforkirby.com/) is a collection of currently six themes for Kirby. Single theme or bulk pricing available. -(…columns) - -(columns…) +++++ (screenshot: kosmos-46-theme-512.jpg) diff --git a/content/kosmos/20210115_52/kosmos-issue.txt b/content/kosmos/20210115_52/kosmos-issue.txt index 1816b4a3a3..a696d6204a 100644 --- a/content/kosmos/20210115_52/kosmos-issue.txt +++ b/content/kosmos/20210115_52/kosmos-issue.txt @@ -34,7 +34,7 @@ Websites created with Kirby out in the wild are always a great source of inspira On Tuesday, we published the Kirby 3.5.1 release candidate. Help us test it before the final release next Tuesday. [Kirby 3.5.1](https://github.com/getkirby/kirby/releases/tag/3.5.1-rc.1) comes with a lot of enhancements, fixes and some new features: -New blocks navigation in the blocks drawerExtendable settings in the Layout fieldSupport for blocks in field queries +New blocks navigation in the blocks drawerExtendable settings in the Layout fieldSupport for blocks in field queries ## (Re)watch the Kirby 3.5 show @@ -100,4 +100,4 @@ Christian Heilmann shows how to use browser dev tools to [find potential accessi [LinkAce](https://www.linkace.org/) is a self-hosted bookmark archive to store and organize links of your favorite websites. -> We can’t talk about making green websites. Instead, we need to think in terms of harm reduction (link: https://thoughtbot.com/blog/so-you-wanna-create-an-eco-friendly-website text: ( Eric Bailey)) \ No newline at end of file +> We can’t talk about making green websites. Instead, we need to think in terms of harm reduction (link: https://thoughtbot.com/blog/so-you-wanna-create-an-eco-friendly-website text: ( Eric Bailey)) diff --git a/content/kosmos/20210212_53/kosmos-issue.txt b/content/kosmos/20210212_53/kosmos-issue.txt index 6f656d5b0d..931b4b636b 100644 --- a/content/kosmos/20210212_53/kosmos-issue.txt +++ b/content/kosmos/20210212_53/kosmos-issue.txt @@ -92,8 +92,8 @@ Not buying the latest gadget is arguably the best way to reduce e-waste in the f Maybe I'm a little obsessed with dark patterns recently. But they keep haunting me around the web. At least Amazon is now [facing legal challenges for their 6-page Prime member cancellation trickery](https://www.bbc.com/news/technology-55637140). More about dark patterns: -- [Dark Patterns](https://www.darkpatterns.org/) -- [Losing faith in UX](https://creativegood.com/blog/21/losing-faith-in-ux.html) +- [Dark Patterns](https://www.darkpatterns.org/) +- [Losing faith in UX](https://creativegood.com/blog/21/losing-faith-in-ux.html) - [We Value Your Privacy (At About $0.50) – Dark Patterns in UI Copy](https://prototypr.io/post/we-value-your-privacy-at-about-0-50-dark-patterns-in-ui-copy/) Handy: If you replace `github` with [`github1s`](https://github.com/conwnet/github1s) in a GitHub URL, you can read GitHub code with VS Code and easily navigate between files and folders. diff --git a/content/kosmos/20210312_54/kosmos-issue.txt b/content/kosmos/20210312_54/kosmos-issue.txt index 5d2bc835e9..3ea5a24418 100644 --- a/content/kosmos/20210312_54/kosmos-issue.txt +++ b/content/kosmos/20210312_54/kosmos-issue.txt @@ -48,9 +48,7 @@ And it seems that Vite.js is the new cool kid on the block, since with the [Kirb [MetaKnight](https://getkirby.com/plugins/diesdasdigital/metaknight) is a powerful search-engine-optimization (SEO) plugin for Kirby. Jonathan Muth from diesdas.digital [gives some insights about the background of this plugin](https://medium.com/diesdas-direct/metaknight-win-every-seo-fight-2cf272d23a8f). -(…columns) - -(columns…) +++++ With the [Code Editor](https://github.com/sylvainjule/kirby-code-editor) field you get code highlighting, optional line numbers, tabs or spaces for intentation and support for various languages in the Panel. diff --git a/content/kosmos/kosmos.txt b/content/kosmos/kosmos.txt index 98705c3e64..7a31bffade 100644 --- a/content/kosmos/kosmos.txt +++ b/content/kosmos/kosmos.txt @@ -12,6 +12,12 @@ We publish a monthly newsletter with hand-picked news about plugins, themes, new ---- +Thumbnail: + - + lead: Newsletter + +---- + Changefreq: monthly ---- diff --git a/content/love/0_and-atelier/and-atelier.png b/content/love/0_and-atelier/and-atelier.png new file mode 100644 index 0000000000..f125969225 Binary files /dev/null and b/content/love/0_and-atelier/and-atelier.png differ diff --git a/content/love/0_and-atelier/link.txt b/content/love/0_and-atelier/link.txt new file mode 100644 index 0000000000..8be3739695 --- /dev/null +++ b/content/love/0_and-atelier/link.txt @@ -0,0 +1,5 @@ +Title: and atelier +---- + +Link: https://and-atelier.com/ + diff --git a/content/love/0_andreasgursky/andreasgursky.png b/content/love/0_andreasgursky/andreasgursky.png new file mode 100644 index 0000000000..2096866bec Binary files /dev/null and b/content/love/0_andreasgursky/andreasgursky.png differ diff --git a/content/love/0_andreasgursky/case.txt b/content/love/0_andreasgursky/link.txt similarity index 100% rename from content/love/0_andreasgursky/case.txt rename to content/love/0_andreasgursky/link.txt diff --git a/content/love/0_andreasgursky/website.jpg b/content/love/0_andreasgursky/website.jpg deleted file mode 100644 index 17522fbfc6..0000000000 Binary files a/content/love/0_andreasgursky/website.jpg and /dev/null differ diff --git a/content/love/0_axel-scheffler/axel-scheffler.png b/content/love/0_axel-scheffler/axel-scheffler.png new file mode 100644 index 0000000000..3d8ac72006 Binary files /dev/null and b/content/love/0_axel-scheffler/axel-scheffler.png differ diff --git a/content/love/0_axel-scheffler/case.txt b/content/love/0_axel-scheffler/link.txt similarity index 100% rename from content/love/0_axel-scheffler/case.txt rename to content/love/0_axel-scheffler/link.txt diff --git a/content/love/0_axel-scheffler/website.jpg b/content/love/0_axel-scheffler/website.jpg deleted file mode 100644 index 5090c1036b..0000000000 Binary files a/content/love/0_axel-scheffler/website.jpg and /dev/null differ diff --git a/content/love/0_berlin-by-food/berlin-by-food.png b/content/love/0_berlin-by-food/berlin-by-food.png new file mode 100644 index 0000000000..a04abdb8d7 Binary files /dev/null and b/content/love/0_berlin-by-food/berlin-by-food.png differ diff --git a/content/love/0_berlin-by-food/berlinbyfood.jpg b/content/love/0_berlin-by-food/berlinbyfood.jpg deleted file mode 100644 index 24784aeccf..0000000000 Binary files a/content/love/0_berlin-by-food/berlinbyfood.jpg and /dev/null differ diff --git a/content/love/0_berlin-by-food/case.txt b/content/love/0_berlin-by-food/link.txt similarity index 100% rename from content/love/0_berlin-by-food/case.txt rename to content/love/0_berlin-by-food/link.txt diff --git a/content/love/0_berlin-in-bewegung/berlin-in-bewegung.de.jpg b/content/love/0_berlin-in-bewegung/berlin-in-bewegung.de.jpg deleted file mode 100644 index 171644696f..0000000000 Binary files a/content/love/0_berlin-in-bewegung/berlin-in-bewegung.de.jpg and /dev/null differ diff --git a/content/love/0_berlin-in-bewegung/berlin-in-bewegung.png b/content/love/0_berlin-in-bewegung/berlin-in-bewegung.png new file mode 100644 index 0000000000..ae640b7821 Binary files /dev/null and b/content/love/0_berlin-in-bewegung/berlin-in-bewegung.png differ diff --git a/content/love/0_berlin-in-bewegung/case.txt b/content/love/0_berlin-in-bewegung/link.txt similarity index 100% rename from content/love/0_berlin-in-bewegung/case.txt rename to content/love/0_berlin-in-bewegung/link.txt diff --git a/content/love/0_beyond-tellerrand/beyond-tellerrand.png b/content/love/0_beyond-tellerrand/beyond-tellerrand.png new file mode 100644 index 0000000000..dface7d588 Binary files /dev/null and b/content/love/0_beyond-tellerrand/beyond-tellerrand.png differ diff --git a/content/love/0_beyond-tellerrand/case.txt b/content/love/0_beyond-tellerrand/link.txt similarity index 100% rename from content/love/0_beyond-tellerrand/case.txt rename to content/love/0_beyond-tellerrand/link.txt diff --git a/content/love/0_beyond-tellerrand/website.jpg b/content/love/0_beyond-tellerrand/website.jpg deleted file mode 100644 index 07005c885e..0000000000 Binary files a/content/love/0_beyond-tellerrand/website.jpg and /dev/null differ diff --git a/content/love/0_branchplant/branchplant.png b/content/love/0_branchplant/branchplant.png new file mode 100644 index 0000000000..a7d0cc1f38 Binary files /dev/null and b/content/love/0_branchplant/branchplant.png differ diff --git a/content/love/0_branchplant/case.txt b/content/love/0_branchplant/link.txt similarity index 100% rename from content/love/0_branchplant/case.txt rename to content/love/0_branchplant/link.txt diff --git a/content/love/0_branchplant/website.jpg b/content/love/0_branchplant/website.jpg deleted file mode 100644 index b5b1be2c18..0000000000 Binary files a/content/love/0_branchplant/website.jpg and /dev/null differ diff --git a/content/love/0_brendan-dawes/brendan-dawes.png b/content/love/0_brendan-dawes/brendan-dawes.png new file mode 100644 index 0000000000..8c59d07abb Binary files /dev/null and b/content/love/0_brendan-dawes/brendan-dawes.png differ diff --git a/content/love/0_brendan-dawes/case.txt b/content/love/0_brendan-dawes/link.txt similarity index 100% rename from content/love/0_brendan-dawes/case.txt rename to content/love/0_brendan-dawes/link.txt diff --git a/content/love/0_brendan-dawes/website.jpg b/content/love/0_brendan-dawes/website.jpg deleted file mode 100644 index ee5135447f..0000000000 Binary files a/content/love/0_brendan-dawes/website.jpg and /dev/null differ diff --git a/content/love/0_chevalvert/chevalvert.fr.jpg b/content/love/0_chevalvert/chevalvert.fr.jpg deleted file mode 100644 index 1374c0fdad..0000000000 Binary files a/content/love/0_chevalvert/chevalvert.fr.jpg and /dev/null differ diff --git a/content/love/0_chevalvert/chevalvert.png b/content/love/0_chevalvert/chevalvert.png new file mode 100644 index 0000000000..6e540f4162 Binary files /dev/null and b/content/love/0_chevalvert/chevalvert.png differ diff --git a/content/love/0_chevalvert/case.txt b/content/love/0_chevalvert/link.txt similarity index 100% rename from content/love/0_chevalvert/case.txt rename to content/love/0_chevalvert/link.txt diff --git a/content/love/0_colly/colly.com.jpg b/content/love/0_colly/colly.com.jpg deleted file mode 100644 index 77276129ba..0000000000 Binary files a/content/love/0_colly/colly.com.jpg and /dev/null differ diff --git a/content/love/0_colly/colly.png b/content/love/0_colly/colly.png new file mode 100644 index 0000000000..6cb00dc0b5 Binary files /dev/null and b/content/love/0_colly/colly.png differ diff --git a/content/love/0_colly/case.txt b/content/love/0_colly/link.txt similarity index 100% rename from content/love/0_colly/case.txt rename to content/love/0_colly/link.txt diff --git a/content/love/0_cyrus-ghanai/cyrus-ghanai.png b/content/love/0_cyrus-ghanai/cyrus-ghanai.png new file mode 100644 index 0000000000..fdb98011b1 Binary files /dev/null and b/content/love/0_cyrus-ghanai/cyrus-ghanai.png differ diff --git a/content/love/0_cyrus-ghanai/case.txt b/content/love/0_cyrus-ghanai/link.txt similarity index 100% rename from content/love/0_cyrus-ghanai/case.txt rename to content/love/0_cyrus-ghanai/link.txt diff --git a/content/love/0_cyrus-ghanai/website.jpg b/content/love/0_cyrus-ghanai/website.jpg deleted file mode 100644 index f1cf948a03..0000000000 Binary files a/content/love/0_cyrus-ghanai/website.jpg and /dev/null differ diff --git a/content/love/0_demo/case.txt b/content/love/0_demo/case.txt deleted file mode 100644 index eb54b913e6..0000000000 --- a/content/love/0_demo/case.txt +++ /dev/null @@ -1,6 +0,0 @@ -Title: Demo Festival - ----- - -Link: https://demofestival.com/ - diff --git a/content/love/0_demo/demofestival.com.jpg b/content/love/0_demo/demofestival.com.jpg deleted file mode 100644 index cdef0a5178..0000000000 Binary files a/content/love/0_demo/demofestival.com.jpg and /dev/null differ diff --git a/content/love/0_deutsche-und-japaner/deutsche-und-japaner.png b/content/love/0_deutsche-und-japaner/deutsche-und-japaner.png new file mode 100644 index 0000000000..6bde550416 Binary files /dev/null and b/content/love/0_deutsche-und-japaner/deutsche-und-japaner.png differ diff --git a/content/love/0_deutsche-und-japaner/case.txt b/content/love/0_deutsche-und-japaner/link.txt similarity index 100% rename from content/love/0_deutsche-und-japaner/case.txt rename to content/love/0_deutsche-und-japaner/link.txt diff --git a/content/love/0_deutsche-und-japaner/website.jpg b/content/love/0_deutsche-und-japaner/website.jpg deleted file mode 100644 index caf1e6d807..0000000000 Binary files a/content/love/0_deutsche-und-japaner/website.jpg and /dev/null differ diff --git a/content/love/0_editions-sarbacane/editions-sarbacane.com.jpg b/content/love/0_editions-sarbacane/editions-sarbacane.com.jpg deleted file mode 100644 index fb3d0aba01..0000000000 Binary files a/content/love/0_editions-sarbacane/editions-sarbacane.com.jpg and /dev/null differ diff --git a/content/love/0_editions-sarbacane/editions-sarbacane.png b/content/love/0_editions-sarbacane/editions-sarbacane.png new file mode 100644 index 0000000000..d8c4f086ba Binary files /dev/null and b/content/love/0_editions-sarbacane/editions-sarbacane.png differ diff --git a/content/love/0_editions-sarbacane/case.txt b/content/love/0_editions-sarbacane/link.txt similarity index 100% rename from content/love/0_editions-sarbacane/case.txt rename to content/love/0_editions-sarbacane/link.txt diff --git a/content/love/0_embarque/embarque.png b/content/love/0_embarque/embarque.png new file mode 100644 index 0000000000..d082d30164 Binary files /dev/null and b/content/love/0_embarque/embarque.png differ diff --git a/content/love/0_embarque/link.txt b/content/love/0_embarque/link.txt new file mode 100644 index 0000000000..46e0b3733c --- /dev/null +++ b/content/love/0_embarque/link.txt @@ -0,0 +1,5 @@ +Title: Embargue +---- + +Link: https://metiersmaritimes.com/ + diff --git a/content/love/0_eurowings/eurowings.png b/content/love/0_eurowings/eurowings.png new file mode 100644 index 0000000000..ec64487709 Binary files /dev/null and b/content/love/0_eurowings/eurowings.png differ diff --git a/content/love/0_eurowings/case.txt b/content/love/0_eurowings/link.txt similarity index 100% rename from content/love/0_eurowings/case.txt rename to content/love/0_eurowings/link.txt diff --git a/content/love/0_eurowings/website.jpg b/content/love/0_eurowings/website.jpg deleted file mode 100644 index 9d06670223..0000000000 Binary files a/content/love/0_eurowings/website.jpg and /dev/null differ diff --git a/content/love/0_fairclimatefund/fairclimatefund.png b/content/love/0_fairclimatefund/fairclimatefund.png new file mode 100644 index 0000000000..9d243fc849 Binary files /dev/null and b/content/love/0_fairclimatefund/fairclimatefund.png differ diff --git a/content/love/0_fairclimatefund/case.txt b/content/love/0_fairclimatefund/link.txt similarity index 100% rename from content/love/0_fairclimatefund/case.txt rename to content/love/0_fairclimatefund/link.txt diff --git a/content/love/0_fairclimatefund/website.jpg b/content/love/0_fairclimatefund/website.jpg deleted file mode 100644 index bb7f00b385..0000000000 Binary files a/content/love/0_fairclimatefund/website.jpg and /dev/null differ diff --git a/content/love/0_frank-schaetzing/frank-schaetzing.png b/content/love/0_frank-schaetzing/frank-schaetzing.png new file mode 100644 index 0000000000..3b22d0055a Binary files /dev/null and b/content/love/0_frank-schaetzing/frank-schaetzing.png differ diff --git a/content/love/0_frank-schaetzing/case.txt b/content/love/0_frank-schaetzing/link.txt similarity index 100% rename from content/love/0_frank-schaetzing/case.txt rename to content/love/0_frank-schaetzing/link.txt diff --git a/content/love/0_frank-schaetzing/website.jpg b/content/love/0_frank-schaetzing/website.jpg deleted file mode 100644 index e327828473..0000000000 Binary files a/content/love/0_frank-schaetzing/website.jpg and /dev/null differ diff --git a/content/love/0_fridays-for-future-at/fridays-for-future-at.png b/content/love/0_fridays-for-future-at/fridays-for-future-at.png new file mode 100644 index 0000000000..abc11d76fe Binary files /dev/null and b/content/love/0_fridays-for-future-at/fridays-for-future-at.png differ diff --git a/content/love/0_fridays-for-future-at/case.txt b/content/love/0_fridays-for-future-at/link.txt similarity index 100% rename from content/love/0_fridays-for-future-at/case.txt rename to content/love/0_fridays-for-future-at/link.txt diff --git a/content/love/0_fridays-for-future-at/website.jpg b/content/love/0_fridays-for-future-at/website.jpg deleted file mode 100644 index c3c7cd380b..0000000000 Binary files a/content/love/0_fridays-for-future-at/website.jpg and /dev/null differ diff --git a/content/love/0_geissbuehler/geissbuehler.png b/content/love/0_geissbuehler/geissbuehler.png new file mode 100644 index 0000000000..2e784a52dc Binary files /dev/null and b/content/love/0_geissbuehler/geissbuehler.png differ diff --git a/content/love/0_geissbuehler/link.txt b/content/love/0_geissbuehler/link.txt new file mode 100644 index 0000000000..d2dcd6574b --- /dev/null +++ b/content/love/0_geissbuehler/link.txt @@ -0,0 +1,6 @@ +Title: Studio Geissbühler + +---- + +Link: https://www.geissbuehler.net/ + diff --git a/content/love/0_glyphsapp/glyphsapp.png b/content/love/0_glyphsapp/glyphsapp.png new file mode 100644 index 0000000000..9a6e272e93 Binary files /dev/null and b/content/love/0_glyphsapp/glyphsapp.png differ diff --git a/content/love/0_glyphsapp/case.txt b/content/love/0_glyphsapp/link.txt similarity index 100% rename from content/love/0_glyphsapp/case.txt rename to content/love/0_glyphsapp/link.txt diff --git a/content/love/0_glyphsapp/website.jpg b/content/love/0_glyphsapp/website.jpg deleted file mode 100644 index bbb80854dd..0000000000 Binary files a/content/love/0_glyphsapp/website.jpg and /dev/null differ diff --git a/content/love/0_goodguysbrew/goodguysbrew.png b/content/love/0_goodguysbrew/goodguysbrew.png new file mode 100644 index 0000000000..8e2b2c4dec Binary files /dev/null and b/content/love/0_goodguysbrew/goodguysbrew.png differ diff --git a/content/love/0_goodguysbrew/case.txt b/content/love/0_goodguysbrew/link.txt similarity index 100% rename from content/love/0_goodguysbrew/case.txt rename to content/love/0_goodguysbrew/link.txt diff --git a/content/love/0_goodguysbrew/website.jpg b/content/love/0_goodguysbrew/website.jpg deleted file mode 100644 index 99de3eeff2..0000000000 Binary files a/content/love/0_goodguysbrew/website.jpg and /dev/null differ diff --git a/content/love/0_habita/habita.png b/content/love/0_habita/habita.png new file mode 100644 index 0000000000..f43e24cff6 Binary files /dev/null and b/content/love/0_habita/habita.png differ diff --git a/content/love/0_habita/link.txt b/content/love/0_habita/link.txt new file mode 100644 index 0000000000..7250e15e1e --- /dev/null +++ b/content/love/0_habita/link.txt @@ -0,0 +1,14 @@ +Title: Habita + +---- + +Cover: 4.jpg + +---- + + +Link: http://habita.com.tr/en + +---- + +Intro: Habita is an open and transparent coworking hub based in Istanbul, Turkey. Because a new kind of space needed a new kind of site, Habita built theirs on Kirby, putting its rich API and flexible templating system at the service of a bold, information-rich design. Designer L Daniel Swakman walks us through the nuts and bolts of this project. diff --git a/content/love/0_haema/haema.png b/content/love/0_haema/haema.png new file mode 100644 index 0000000000..fbfdd74fb8 Binary files /dev/null and b/content/love/0_haema/haema.png differ diff --git a/content/love/0_haema/link.txt b/content/love/0_haema/link.txt new file mode 100644 index 0000000000..bbc9526a0e --- /dev/null +++ b/content/love/0_haema/link.txt @@ -0,0 +1,5 @@ +Title: HaeMa +---- + +Link: https://www.haema-labor.de/ + diff --git a/content/love/0_hannahvonhuebbenet/hannahvonhuebbenet.png b/content/love/0_hannahvonhuebbenet/hannahvonhuebbenet.png new file mode 100644 index 0000000000..8eb2ebedb7 Binary files /dev/null and b/content/love/0_hannahvonhuebbenet/hannahvonhuebbenet.png differ diff --git a/content/love/0_hannahvonhuebbenet/case.txt b/content/love/0_hannahvonhuebbenet/link.txt similarity index 100% rename from content/love/0_hannahvonhuebbenet/case.txt rename to content/love/0_hannahvonhuebbenet/link.txt diff --git a/content/love/0_hannahvonhuebbenet/website.jpg b/content/love/0_hannahvonhuebbenet/website.jpg deleted file mode 100644 index 77d8f74faf..0000000000 Binary files a/content/love/0_hannahvonhuebbenet/website.jpg and /dev/null differ diff --git a/content/love/0_hcmap/hcmap.png b/content/love/0_hcmap/hcmap.png new file mode 100644 index 0000000000..236f46eae5 Binary files /dev/null and b/content/love/0_hcmap/hcmap.png differ diff --git a/content/love/0_hcmap/link.txt b/content/love/0_hcmap/link.txt new file mode 100644 index 0000000000..ec0d592ec8 --- /dev/null +++ b/content/love/0_hcmap/link.txt @@ -0,0 +1,6 @@ +Title: HC Map + +---- + +Link: https://hcmap.net/ + diff --git a/content/love/0_helllicht/helllicht.com.jpg b/content/love/0_helllicht/helllicht.com.jpg deleted file mode 100644 index 0e59661ff1..0000000000 Binary files a/content/love/0_helllicht/helllicht.com.jpg and /dev/null differ diff --git a/content/love/0_helllicht/helllicht.png b/content/love/0_helllicht/helllicht.png new file mode 100644 index 0000000000..f4e4e89bd8 Binary files /dev/null and b/content/love/0_helllicht/helllicht.png differ diff --git a/content/love/0_helllicht/case.txt b/content/love/0_helllicht/link.txt similarity index 100% rename from content/love/0_helllicht/case.txt rename to content/love/0_helllicht/link.txt diff --git a/content/love/0_herbert/herbert.png b/content/love/0_herbert/herbert.png new file mode 100644 index 0000000000..d588a96436 Binary files /dev/null and b/content/love/0_herbert/herbert.png differ diff --git a/content/love/0_herbert/link.txt b/content/love/0_herbert/link.txt new file mode 100644 index 0000000000..1983e7cf5f --- /dev/null +++ b/content/love/0_herbert/link.txt @@ -0,0 +1,5 @@ +Title: Herbert.gd +---- + +Link: https://herbert.gd/ + diff --git a/content/love/0_hicksdesign/hicksdesign.png b/content/love/0_hicksdesign/hicksdesign.png new file mode 100644 index 0000000000..1c98649fce Binary files /dev/null and b/content/love/0_hicksdesign/hicksdesign.png differ diff --git a/content/love/0_hicksdesign/link.txt b/content/love/0_hicksdesign/link.txt new file mode 100644 index 0000000000..289a67cc38 --- /dev/null +++ b/content/love/0_hicksdesign/link.txt @@ -0,0 +1,5 @@ +Title: Jon Hicks +---- + +Link: https://hicks.design/ + diff --git a/content/love/0_human-interface/human-interface.png b/content/love/0_human-interface/human-interface.png new file mode 100644 index 0000000000..1484539f2b Binary files /dev/null and b/content/love/0_human-interface/human-interface.png differ diff --git a/content/love/0_human-interface/link.txt b/content/love/0_human-interface/link.txt new file mode 100644 index 0000000000..7d8ea77bfa --- /dev/null +++ b/content/love/0_human-interface/link.txt @@ -0,0 +1,5 @@ +Title: Human Interface +---- + +Link: https://human-interface.de/en + diff --git a/content/love/0_id-up/id-up.png b/content/love/0_id-up/id-up.png new file mode 100644 index 0000000000..e2d92a5748 Binary files /dev/null and b/content/love/0_id-up/id-up.png differ diff --git a/content/love/0_id-up/link.txt b/content/love/0_id-up/link.txt new file mode 100644 index 0000000000..2bb8d6c3bb --- /dev/null +++ b/content/love/0_id-up/link.txt @@ -0,0 +1,5 @@ +Title: id up +---- + +Link: http://id-up.org/ + diff --git a/content/love/0_indiecon-festival/case.txt b/content/love/0_indiecon-festival/case.txt deleted file mode 100644 index 703059e80e..0000000000 --- a/content/love/0_indiecon-festival/case.txt +++ /dev/null @@ -1,6 +0,0 @@ -Title: Indiecon Festival - ----- - -Link: http://indiecon-festival.com/ - diff --git a/content/love/0_indiecon-festival/indiecon-festival.com.jpg b/content/love/0_indiecon-festival/indiecon-festival.com.jpg deleted file mode 100644 index 8f36465eb3..0000000000 Binary files a/content/love/0_indiecon-festival/indiecon-festival.com.jpg and /dev/null differ diff --git a/content/love/0_inflight-vr/inflight-vr.png b/content/love/0_inflight-vr/inflight-vr.png new file mode 100644 index 0000000000..c16616c903 Binary files /dev/null and b/content/love/0_inflight-vr/inflight-vr.png differ diff --git a/content/love/0_inflight-vr/link.txt b/content/love/0_inflight-vr/link.txt new file mode 100644 index 0000000000..c2c84e1615 --- /dev/null +++ b/content/love/0_inflight-vr/link.txt @@ -0,0 +1,6 @@ +Title: Inflight VR + +---- + +Link: https://inflight-vr.com/ + diff --git a/content/love/0_interface-lovers/case.txt b/content/love/0_interface-lovers/case.txt deleted file mode 100644 index 259317e28b..0000000000 --- a/content/love/0_interface-lovers/case.txt +++ /dev/null @@ -1,6 +0,0 @@ -Title: Interface Lovers - ----- - -Link: https://interfacelovers.com - diff --git a/content/love/0_interface-lovers/link.txt b/content/love/0_interface-lovers/link.txt new file mode 100644 index 0000000000..6d5b5924ea --- /dev/null +++ b/content/love/0_interface-lovers/link.txt @@ -0,0 +1,6 @@ +Title: Lovers Magazine + +---- + +Link: https://www.loversmagazine.com/ + diff --git a/content/love/0_interface-lovers/loversmagazine.png b/content/love/0_interface-lovers/loversmagazine.png new file mode 100644 index 0000000000..906e9a503a Binary files /dev/null and b/content/love/0_interface-lovers/loversmagazine.png differ diff --git a/content/love/0_interface-lovers/website.jpg b/content/love/0_interface-lovers/website.jpg deleted file mode 100644 index 667af72e80..0000000000 Binary files a/content/love/0_interface-lovers/website.jpg and /dev/null differ diff --git a/content/love/0_jessica-hische/case.txt b/content/love/0_jessica-hische/case.txt deleted file mode 100644 index d8bd3748c5..0000000000 --- a/content/love/0_jessica-hische/case.txt +++ /dev/null @@ -1,6 +0,0 @@ -Title: Jessica Hische - ----- - -Link: http://jessicahische.is - diff --git a/content/love/0_jessica-hische/jessica-hische.png b/content/love/0_jessica-hische/jessica-hische.png new file mode 100644 index 0000000000..78384d195c Binary files /dev/null and b/content/love/0_jessica-hische/jessica-hische.png differ diff --git a/content/love/0_jessica-hische/link.txt b/content/love/0_jessica-hische/link.txt new file mode 100644 index 0000000000..c603c7b9fa --- /dev/null +++ b/content/love/0_jessica-hische/link.txt @@ -0,0 +1,9 @@ +Title: Jessica Hische + +---- + +Link: http://jessicahische.is + +---- + +Case: true diff --git a/content/love/0_jessica-hische/website.jpg b/content/love/0_jessica-hische/website.jpg deleted file mode 100644 index 83151d5639..0000000000 Binary files a/content/love/0_jessica-hische/website.jpg and /dev/null differ diff --git a/content/love/0_jolinmasson/jolinmasson.com.jpg b/content/love/0_jolinmasson/jolinmasson.com.jpg deleted file mode 100644 index d5bc4cd65a..0000000000 Binary files a/content/love/0_jolinmasson/jolinmasson.com.jpg and /dev/null differ diff --git a/content/love/0_jolinmasson/jolinmasson.png b/content/love/0_jolinmasson/jolinmasson.png new file mode 100644 index 0000000000..c8c02f99d1 Binary files /dev/null and b/content/love/0_jolinmasson/jolinmasson.png differ diff --git a/content/love/0_jolinmasson/case.txt b/content/love/0_jolinmasson/link.txt similarity index 100% rename from content/love/0_jolinmasson/case.txt rename to content/love/0_jolinmasson/link.txt diff --git a/content/love/0_katapult-magazin/katapult-magazin.png b/content/love/0_katapult-magazin/katapult-magazin.png new file mode 100644 index 0000000000..12c9900f86 Binary files /dev/null and b/content/love/0_katapult-magazin/katapult-magazin.png differ diff --git a/content/love/0_katapult-magazin/link.txt b/content/love/0_katapult-magazin/link.txt new file mode 100644 index 0000000000..62a8e654cc --- /dev/null +++ b/content/love/0_katapult-magazin/link.txt @@ -0,0 +1,6 @@ +Title: Katapult Magazin + +---- + +Link: https://katapult-magazin.de + diff --git a/content/love/0_leonienovotny/leonienovotny.png b/content/love/0_leonienovotny/leonienovotny.png new file mode 100644 index 0000000000..2ca04dedc3 Binary files /dev/null and b/content/love/0_leonienovotny/leonienovotny.png differ diff --git a/content/love/0_leonienovotny/link.txt b/content/love/0_leonienovotny/link.txt new file mode 100644 index 0000000000..6c58b949cb --- /dev/null +++ b/content/love/0_leonienovotny/link.txt @@ -0,0 +1,6 @@ +Title: Leonie Novotny + +---- + +Link: http://leonienovotny.com/ + diff --git a/content/love/0_levon-biss/levon-biss.png b/content/love/0_levon-biss/levon-biss.png new file mode 100644 index 0000000000..575785f6e1 Binary files /dev/null and b/content/love/0_levon-biss/levon-biss.png differ diff --git a/content/love/0_levon-biss/levonbiss.com.jpg b/content/love/0_levon-biss/levonbiss.com.jpg deleted file mode 100644 index 132e8f5f0e..0000000000 Binary files a/content/love/0_levon-biss/levonbiss.com.jpg and /dev/null differ diff --git a/content/love/0_levon-biss/case.txt b/content/love/0_levon-biss/link.txt similarity index 100% rename from content/love/0_levon-biss/case.txt rename to content/love/0_levon-biss/link.txt diff --git a/content/love/0_litmuc/case.txt b/content/love/0_litmuc/case.txt deleted file mode 100644 index 58e40fa012..0000000000 --- a/content/love/0_litmuc/case.txt +++ /dev/null @@ -1,6 +0,0 @@ -Title: Literaturfest München - ----- - -Link: https://www.literaturfest-muenchen.de/ - diff --git a/content/love/0_litmuc/literaturfest-muenchen.de.jpg b/content/love/0_litmuc/literaturfest-muenchen.de.jpg deleted file mode 100644 index 2d3ba3175f..0000000000 Binary files a/content/love/0_litmuc/literaturfest-muenchen.de.jpg and /dev/null differ diff --git a/content/love/0_luzerner-sinfonieorchester/case.txt b/content/love/0_luzerner-sinfonieorchester/case.txt deleted file mode 100644 index 46079553e2..0000000000 --- a/content/love/0_luzerner-sinfonieorchester/case.txt +++ /dev/null @@ -1,6 +0,0 @@ -Title: Luzerner Sinfonieorchester - ----- - -Link: https://www.sinfonieorchester.ch - diff --git a/content/love/0_luzerner-sinfonieorchester/website.jpg b/content/love/0_luzerner-sinfonieorchester/website.jpg deleted file mode 100644 index c8904c2b7d..0000000000 Binary files a/content/love/0_luzerner-sinfonieorchester/website.jpg and /dev/null differ diff --git a/content/love/0_m10/link.txt b/content/love/0_m10/link.txt new file mode 100644 index 0000000000..3280646756 --- /dev/null +++ b/content/love/0_m10/link.txt @@ -0,0 +1,5 @@ +Title: m10 +---- + +Link: https://m10.io/ + diff --git a/content/love/0_m10/m10.png b/content/love/0_m10/m10.png new file mode 100644 index 0000000000..eccfd4c4c1 Binary files /dev/null and b/content/love/0_m10/m10.png differ diff --git a/content/love/0_matthiasoertel/case.txt b/content/love/0_matthiasoertel/link.txt similarity index 100% rename from content/love/0_matthiasoertel/case.txt rename to content/love/0_matthiasoertel/link.txt diff --git a/content/love/0_matthiasoertel/matthiasoertel.de.jpg b/content/love/0_matthiasoertel/matthiasoertel.de.jpg deleted file mode 100644 index 7cd5fcfa55..0000000000 Binary files a/content/love/0_matthiasoertel/matthiasoertel.de.jpg and /dev/null differ diff --git a/content/love/0_matthiasoertel/matthiasoertel.png b/content/love/0_matthiasoertel/matthiasoertel.png new file mode 100644 index 0000000000..6c83206ac2 Binary files /dev/null and b/content/love/0_matthiasoertel/matthiasoertel.png differ diff --git a/content/love/0_minimalissimo/case.txt b/content/love/0_minimalissimo/link.txt similarity index 100% rename from content/love/0_minimalissimo/case.txt rename to content/love/0_minimalissimo/link.txt diff --git a/content/love/0_minimalissimo/minimalissimo.png b/content/love/0_minimalissimo/minimalissimo.png new file mode 100644 index 0000000000..85e89a597d Binary files /dev/null and b/content/love/0_minimalissimo/minimalissimo.png differ diff --git a/content/love/0_minimalissimo/minimalissimo.shop.jpg b/content/love/0_minimalissimo/minimalissimo.shop.jpg deleted file mode 100644 index e46267176d..0000000000 Binary files a/content/love/0_minimalissimo/minimalissimo.shop.jpg and /dev/null differ diff --git a/content/love/0_monkey-47/case.txt b/content/love/0_monkey-47/link.txt similarity index 100% rename from content/love/0_monkey-47/case.txt rename to content/love/0_monkey-47/link.txt diff --git a/content/love/0_monkey-47/monkey-47.png b/content/love/0_monkey-47/monkey-47.png new file mode 100644 index 0000000000..33bd7985f5 Binary files /dev/null and b/content/love/0_monkey-47/monkey-47.png differ diff --git a/content/love/0_monkey-47/website.jpg b/content/love/0_monkey-47/website.jpg deleted file mode 100644 index 70fe6d2046..0000000000 Binary files a/content/love/0_monkey-47/website.jpg and /dev/null differ diff --git a/content/love/0_naconf/case.txt b/content/love/0_naconf/case.txt deleted file mode 100644 index cd43b860ce..0000000000 --- a/content/love/0_naconf/case.txt +++ /dev/null @@ -1,6 +0,0 @@ -Title: New Adventures Conference - ----- - -Link: https://newadventuresconf.com/ - diff --git a/content/love/0_naconf/newadventuresconf.com.jpg b/content/love/0_naconf/newadventuresconf.com.jpg deleted file mode 100644 index f012e4f8c1..0000000000 Binary files a/content/love/0_naconf/newadventuresconf.com.jpg and /dev/null differ diff --git a/content/love/0_nadine-rossa/link.txt b/content/love/0_nadine-rossa/link.txt new file mode 100644 index 0000000000..b90c8c164c --- /dev/null +++ b/content/love/0_nadine-rossa/link.txt @@ -0,0 +1,5 @@ +Title: Nadine Roßa +---- + +Link: https://nadine-rossa.de/ + diff --git a/content/love/0_nadine-rossa/nadine-rossa.png b/content/love/0_nadine-rossa/nadine-rossa.png new file mode 100644 index 0000000000..bf36db9e8c Binary files /dev/null and b/content/love/0_nadine-rossa/nadine-rossa.png differ diff --git a/content/love/0_natucate/case.txt b/content/love/0_natucate/link.txt similarity index 100% rename from content/love/0_natucate/case.txt rename to content/love/0_natucate/link.txt diff --git a/content/love/0_natucate/natucate.com.jpg b/content/love/0_natucate/natucate.com.jpg deleted file mode 100644 index 9a2fc44f1f..0000000000 Binary files a/content/love/0_natucate/natucate.com.jpg and /dev/null differ diff --git a/content/love/0_natucate/natucate.png b/content/love/0_natucate/natucate.png new file mode 100644 index 0000000000..edfdbd3b7b Binary files /dev/null and b/content/love/0_natucate/natucate.png differ diff --git a/content/love/0_normanposselt/case.txt b/content/love/0_normanposselt/link.txt similarity index 100% rename from content/love/0_normanposselt/case.txt rename to content/love/0_normanposselt/link.txt diff --git a/content/love/0_normanposselt/normanposselt.png b/content/love/0_normanposselt/normanposselt.png new file mode 100644 index 0000000000..3beec4b6bc Binary files /dev/null and b/content/love/0_normanposselt/normanposselt.png differ diff --git a/content/love/0_normanposselt/website.jpg b/content/love/0_normanposselt/website.jpg deleted file mode 100644 index 31c7c7b8ef..0000000000 Binary files a/content/love/0_normanposselt/website.jpg and /dev/null differ diff --git a/content/love/0_obsproject/link.txt b/content/love/0_obsproject/link.txt new file mode 100644 index 0000000000..c40e579040 --- /dev/null +++ b/content/love/0_obsproject/link.txt @@ -0,0 +1,5 @@ +Title: OBS Studio +---- + +Link: https://obsproject.com/ + diff --git a/content/love/0_obsproject/obsproject.png b/content/love/0_obsproject/obsproject.png new file mode 100644 index 0000000000..00672c2fbb Binary files /dev/null and b/content/love/0_obsproject/obsproject.png differ diff --git a/content/love/0_ofenbau-voppichler/case.txt b/content/love/0_ofenbau-voppichler/case.txt deleted file mode 100644 index b7a3ca72f6..0000000000 --- a/content/love/0_ofenbau-voppichler/case.txt +++ /dev/null @@ -1,6 +0,0 @@ -Title: Ofenbau Voppichler - ----- - -Link: https://www.ofenbau-voppichler.at - diff --git a/content/love/0_ofenbau-voppichler/ofenbau-voppichler.at.jpg b/content/love/0_ofenbau-voppichler/ofenbau-voppichler.at.jpg deleted file mode 100644 index c037c1bfa0..0000000000 Binary files a/content/love/0_ofenbau-voppichler/ofenbau-voppichler.at.jpg and /dev/null differ diff --git a/content/love/0_offscreen/case.txt b/content/love/0_offscreen/link.txt similarity index 100% rename from content/love/0_offscreen/case.txt rename to content/love/0_offscreen/link.txt diff --git a/content/love/0_offscreen/offscreen.png b/content/love/0_offscreen/offscreen.png new file mode 100644 index 0000000000..4f98319c8e Binary files /dev/null and b/content/love/0_offscreen/offscreen.png differ diff --git a/content/love/0_offscreen/website.jpg b/content/love/0_offscreen/website.jpg deleted file mode 100644 index ab216708a1..0000000000 Binary files a/content/love/0_offscreen/website.jpg and /dev/null differ diff --git a/content/love/0_palast-orchster/case.txt b/content/love/0_palast-orchester/link.txt similarity index 100% rename from content/love/0_palast-orchster/case.txt rename to content/love/0_palast-orchester/link.txt diff --git a/content/love/0_palast-orchester/palast-orchester.png b/content/love/0_palast-orchester/palast-orchester.png new file mode 100644 index 0000000000..5990824abf Binary files /dev/null and b/content/love/0_palast-orchester/palast-orchester.png differ diff --git a/content/love/0_palast-orchster/website.jpg b/content/love/0_palast-orchster/website.jpg deleted file mode 100644 index 23b5aed9b4..0000000000 Binary files a/content/love/0_palast-orchster/website.jpg and /dev/null differ diff --git a/content/love/0_radio-garden/case.txt b/content/love/0_radio-garden/link.txt similarity index 100% rename from content/love/0_radio-garden/case.txt rename to content/love/0_radio-garden/link.txt diff --git a/content/love/0_richtiggut/link.txt b/content/love/0_richtiggut/link.txt new file mode 100644 index 0000000000..bc01990977 --- /dev/null +++ b/content/love/0_richtiggut/link.txt @@ -0,0 +1,5 @@ +Title: Bauhaus / Richtig gut +---- + +Link: https://richtiggut.bauhaus.info/ + diff --git a/content/love/0_richtiggut/richtiggut.png b/content/love/0_richtiggut/richtiggut.png new file mode 100644 index 0000000000..3e47b3ee54 Binary files /dev/null and b/content/love/0_richtiggut/richtiggut.png differ diff --git a/content/love/0_risd/case.txt b/content/love/0_risd/link.txt similarity index 100% rename from content/love/0_risd/case.txt rename to content/love/0_risd/link.txt diff --git a/content/love/0_risd/risd.gd.jpg b/content/love/0_risd/risd.gd.jpg deleted file mode 100644 index 8097169ca8..0000000000 Binary files a/content/love/0_risd/risd.gd.jpg and /dev/null differ diff --git a/content/love/0_risd/risd.png b/content/love/0_risd/risd.png new file mode 100644 index 0000000000..99a77de8bd Binary files /dev/null and b/content/love/0_risd/risd.png differ diff --git a/content/love/0_schneiders-landbrauerei/link.txt b/content/love/0_schneiders-landbrauerei/link.txt new file mode 100644 index 0000000000..579400c2fa --- /dev/null +++ b/content/love/0_schneiders-landbrauerei/link.txt @@ -0,0 +1,6 @@ +Title: Schneiders Landbrauerei + +---- + +Link: https://www.schneiders-landbrauerei.de/ + diff --git a/content/love/0_schneiders-landbrauerei/schneiders-landbrauerei.png b/content/love/0_schneiders-landbrauerei/schneiders-landbrauerei.png new file mode 100644 index 0000000000..6ee4318157 Binary files /dev/null and b/content/love/0_schneiders-landbrauerei/schneiders-landbrauerei.png differ diff --git a/content/love/0_sean-purdy/case.txt b/content/love/0_sean-purdy/link.txt similarity index 100% rename from content/love/0_sean-purdy/case.txt rename to content/love/0_sean-purdy/link.txt diff --git a/content/love/0_sean-purdy/sean-purdy.png b/content/love/0_sean-purdy/sean-purdy.png new file mode 100644 index 0000000000..864fa35b48 Binary files /dev/null and b/content/love/0_sean-purdy/sean-purdy.png differ diff --git a/content/love/0_sean-purdy/website.jpg b/content/love/0_sean-purdy/website.jpg deleted file mode 100644 index 32f8c3b337..0000000000 Binary files a/content/love/0_sean-purdy/website.jpg and /dev/null differ diff --git a/content/love/0_soundtrackyourbrand/case.txt b/content/love/0_soundtrackyourbrand/link.txt similarity index 100% rename from content/love/0_soundtrackyourbrand/case.txt rename to content/love/0_soundtrackyourbrand/link.txt diff --git a/content/love/0_soundtrackyourbrand/soundtrackyourbrand.png b/content/love/0_soundtrackyourbrand/soundtrackyourbrand.png new file mode 100644 index 0000000000..eb52741ddf Binary files /dev/null and b/content/love/0_soundtrackyourbrand/soundtrackyourbrand.png differ diff --git a/content/love/0_soundtrackyourbrand/website.jpg b/content/love/0_soundtrackyourbrand/website.jpg deleted file mode 100644 index 18469ba760..0000000000 Binary files a/content/love/0_soundtrackyourbrand/website.jpg and /dev/null differ diff --git a/content/love/0_strassenfeger/case.txt b/content/love/0_strassenfeger/link.txt similarity index 100% rename from content/love/0_strassenfeger/case.txt rename to content/love/0_strassenfeger/link.txt diff --git a/content/love/0_strassenfeger/strassenfeger.jpg b/content/love/0_strassenfeger/strassenfeger.jpg deleted file mode 100644 index 06d999c8c0..0000000000 Binary files a/content/love/0_strassenfeger/strassenfeger.jpg and /dev/null differ diff --git a/content/love/0_strassenfeger/strassenfeger.png b/content/love/0_strassenfeger/strassenfeger.png new file mode 100644 index 0000000000..fa7ae8511a Binary files /dev/null and b/content/love/0_strassenfeger/strassenfeger.png differ diff --git a/content/love/0_stratoautomation/case.txt b/content/love/0_stratoautomation/link.txt similarity index 100% rename from content/love/0_stratoautomation/case.txt rename to content/love/0_stratoautomation/link.txt diff --git a/content/love/0_stratoautomation/stratoautomation.com.jpg b/content/love/0_stratoautomation/stratoautomation.com.jpg deleted file mode 100644 index 79d09be4fb..0000000000 Binary files a/content/love/0_stratoautomation/stratoautomation.com.jpg and /dev/null differ diff --git a/content/love/0_stratoautomation/stratoautomation.png b/content/love/0_stratoautomation/stratoautomation.png new file mode 100644 index 0000000000..5e830c0398 Binary files /dev/null and b/content/love/0_stratoautomation/stratoautomation.png differ diff --git a/content/love/0_studioraven/case.txt b/content/love/0_studioraven/link.txt similarity index 100% rename from content/love/0_studioraven/case.txt rename to content/love/0_studioraven/link.txt diff --git a/content/love/0_studioraven/studioraven.be.jpg b/content/love/0_studioraven/studioraven.be.jpg deleted file mode 100644 index 7b2c79f06c..0000000000 Binary files a/content/love/0_studioraven/studioraven.be.jpg and /dev/null differ diff --git a/content/love/0_studioraven/studioraven.png b/content/love/0_studioraven/studioraven.png new file mode 100644 index 0000000000..bbdb66f161 Binary files /dev/null and b/content/love/0_studioraven/studioraven.png differ diff --git a/content/love/0_talkingshorts/link.txt b/content/love/0_talkingshorts/link.txt new file mode 100644 index 0000000000..c8844cf985 --- /dev/null +++ b/content/love/0_talkingshorts/link.txt @@ -0,0 +1,5 @@ +Title: Talking Shorts +---- + +Link: https://talkingshorts.com/ + diff --git a/content/love/0_talkingshorts/talkingshorts.png b/content/love/0_talkingshorts/talkingshorts.png new file mode 100644 index 0000000000..d4e8b58e5b Binary files /dev/null and b/content/love/0_talkingshorts/talkingshorts.png differ diff --git a/content/love/0_teteenlair/case.txt b/content/love/0_teteenlair/link.txt similarity index 100% rename from content/love/0_teteenlair/case.txt rename to content/love/0_teteenlair/link.txt diff --git a/content/love/0_teteenlair/teteenlair.jpg b/content/love/0_teteenlair/teteenlair.jpg deleted file mode 100644 index 97869db5df..0000000000 Binary files a/content/love/0_teteenlair/teteenlair.jpg and /dev/null differ diff --git a/content/love/0_teteenlair/teteenlair.png b/content/love/0_teteenlair/teteenlair.png new file mode 100644 index 0000000000..e671fee299 Binary files /dev/null and b/content/love/0_teteenlair/teteenlair.png differ diff --git a/content/love/0_timothyachumba/case.txt b/content/love/0_timothyachumba/link.txt similarity index 100% rename from content/love/0_timothyachumba/case.txt rename to content/love/0_timothyachumba/link.txt diff --git a/content/love/0_timothyachumba/timothyachumba.png b/content/love/0_timothyachumba/timothyachumba.png new file mode 100644 index 0000000000..151a53bc5a Binary files /dev/null and b/content/love/0_timothyachumba/timothyachumba.png differ diff --git a/content/love/0_timothyachumba/website.png b/content/love/0_timothyachumba/website.png deleted file mode 100644 index df44d38758..0000000000 Binary files a/content/love/0_timothyachumba/website.png and /dev/null differ diff --git a/content/love/0_tower/case.txt b/content/love/0_tower/case.txt deleted file mode 100644 index 9968fe4ea2..0000000000 --- a/content/love/0_tower/case.txt +++ /dev/null @@ -1,6 +0,0 @@ -Title: Tower - ----- - -Link: https://git-tower.com - diff --git a/content/love/0_tower/link.txt b/content/love/0_tower/link.txt new file mode 100644 index 0000000000..db3869dc7a --- /dev/null +++ b/content/love/0_tower/link.txt @@ -0,0 +1,28 @@ +Title: Tower + +---- + +Cover: website.jpg + +---- + +Case: true + +---- + +Link: https://www.git-tower.com/ + +---- + +Color: #b4c2ca +---- + +Intro: Fournova is a Germany-based software company. Their Git client Tower is loved by more than 100.000 developers and designers world-wide. + +They trust Kirby to run their main website and documentation for many years. + +---- +Thumbnail: + - + title: "Case study: Tower" + image: app.png diff --git a/content/love/0_tower/tower.png b/content/love/0_tower/tower.png new file mode 100644 index 0000000000..c44118b327 Binary files /dev/null and b/content/love/0_tower/tower.png differ diff --git a/content/love/0_tower/website.jpg b/content/love/0_tower/website.jpg deleted file mode 100644 index 490cf67b90..0000000000 Binary files a/content/love/0_tower/website.jpg and /dev/null differ diff --git a/content/love/0_transitalliance/case.txt b/content/love/0_transitalliance/case.txt deleted file mode 100644 index 1f6e6fe954..0000000000 --- a/content/love/0_transitalliance/case.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Transit Alliance ----- - -Link: https://transitalliance.miami/campaigns/transit-audit - diff --git a/content/love/0_transitalliance/website.jpg b/content/love/0_transitalliance/website.jpg deleted file mode 100644 index f14ab086e5..0000000000 Binary files a/content/love/0_transitalliance/website.jpg and /dev/null differ diff --git a/content/love/0_trustfractal/case.txt b/content/love/0_trustfractal/case.txt deleted file mode 100644 index dbd1377f88..0000000000 --- a/content/love/0_trustfractal/case.txt +++ /dev/null @@ -1,6 +0,0 @@ -Title: Fractal - ----- - -Link: https://www.trustfractal.com/ - diff --git a/content/love/0_trustfractal/trustfractal.com.jpg b/content/love/0_trustfractal/trustfractal.com.jpg deleted file mode 100644 index 36decc154f..0000000000 Binary files a/content/love/0_trustfractal/trustfractal.com.jpg and /dev/null differ diff --git a/content/love/0_typefacts/case.txt b/content/love/0_typefacts/link.txt similarity index 100% rename from content/love/0_typefacts/case.txt rename to content/love/0_typefacts/link.txt diff --git a/content/love/0_typefacts/typefacts.png b/content/love/0_typefacts/typefacts.png new file mode 100644 index 0000000000..d6c4b1a3b2 Binary files /dev/null and b/content/love/0_typefacts/typefacts.png differ diff --git a/content/love/0_typefacts/website.jpg b/content/love/0_typefacts/website.jpg deleted file mode 100644 index 0328e5560f..0000000000 Binary files a/content/love/0_typefacts/website.jpg and /dev/null differ diff --git a/content/love/0_vega-studio/case.txt b/content/love/0_vega-studio/link.txt similarity index 100% rename from content/love/0_vega-studio/case.txt rename to content/love/0_vega-studio/link.txt diff --git a/content/love/0_vega-studio/vega-studio.png b/content/love/0_vega-studio/vega-studio.png new file mode 100644 index 0000000000..2b10efc448 Binary files /dev/null and b/content/love/0_vega-studio/vega-studio.png differ diff --git a/content/love/0_vega-studio/vega.studio.jpg b/content/love/0_vega-studio/vega.studio.jpg deleted file mode 100644 index c52130c302..0000000000 Binary files a/content/love/0_vega-studio/vega.studio.jpg and /dev/null differ diff --git a/content/love/0_visuellekultur/link.txt b/content/love/0_visuellekultur/link.txt new file mode 100644 index 0000000000..2d46e0c91b --- /dev/null +++ b/content/love/0_visuellekultur/link.txt @@ -0,0 +1,5 @@ +Title: Visuelle Kultur +---- + +Link: https://visuellekultur.udk-berlin.de/ + diff --git a/content/love/0_visuellekultur/visuellekultur.png b/content/love/0_visuellekultur/visuellekultur.png new file mode 100644 index 0000000000..83694dac73 Binary files /dev/null and b/content/love/0_visuellekultur/visuellekultur.png differ diff --git a/content/love/0_vitamin2/case.txt b/content/love/0_vitamin2/link.txt similarity index 100% rename from content/love/0_vitamin2/case.txt rename to content/love/0_vitamin2/link.txt diff --git a/content/love/0_vitamin2/vitamin2.png b/content/love/0_vitamin2/vitamin2.png new file mode 100644 index 0000000000..90acd7b251 Binary files /dev/null and b/content/love/0_vitamin2/vitamin2.png differ diff --git a/content/love/0_vitamin2/website.jpg b/content/love/0_vitamin2/website.jpg deleted file mode 100644 index 30d3a99f76..0000000000 Binary files a/content/love/0_vitamin2/website.jpg and /dev/null differ diff --git a/content/love/0_wunschbrunnen/case.txt b/content/love/0_wunschbrunnen/link.txt similarity index 100% rename from content/love/0_wunschbrunnen/case.txt rename to content/love/0_wunschbrunnen/link.txt diff --git a/content/love/0_wunschbrunnen/wunschbrunnen.org.jpg b/content/love/0_wunschbrunnen/wunschbrunnen.org.jpg deleted file mode 100644 index 4c0dd5656e..0000000000 Binary files a/content/love/0_wunschbrunnen/wunschbrunnen.org.jpg and /dev/null differ diff --git a/content/love/0_wunschbrunnen/wunschbrunnen.png b/content/love/0_wunschbrunnen/wunschbrunnen.png new file mode 100644 index 0000000000..2b1a660890 Binary files /dev/null and b/content/love/0_wunschbrunnen/wunschbrunnen.png differ diff --git a/content/love/cases.txt b/content/love/cases.txt index c4c780b250..c6c3cb7a63 100644 --- a/content/love/cases.txt +++ b/content/love/cases.txt @@ -2,7 +2,7 @@ Title: Made with Kirby ---- -Description: Kirby is used by thousands of companies and creators world-wide. This is a small selection of fantastic websites, built with Kirby. +Description: Kirby is used by thousands of companies and creators world-wide. Check out this selection of fantastic websites, built with Kirby. ---- @@ -11,9 +11,3 @@ Priority: 0.8 ---- Changefreq: daily - ----- - -Intro: - -Kirby is used by thousands of companies and creators world-wide. This is a small selection of fantastic websites, built with Kirby. diff --git a/content/plugins/gearsdigital/reporter/plugin.txt b/content/plugins/gearsdigital/reporter/plugin.txt index b16d17dcce..aafdc37d0e 100644 --- a/content/plugins/gearsdigital/reporter/plugin.txt +++ b/content/plugins/gearsdigital/reporter/plugin.txt @@ -10,4 +10,4 @@ Category: panel ---- -Description: Report issues to Github and Gitlab with ease – directly from the panel! +Description: Report issues to GitHub and GitLab with ease – directly from the panel! diff --git a/content/plugins/omz13/badges/plugin.txt b/content/plugins/omz13/badges/plugin.txt index 8fa3ed974b..acc044380f 100644 --- a/content/plugins/omz13/badges/plugin.txt +++ b/content/plugins/omz13/badges/plugin.txt @@ -10,7 +10,6 @@ Category: integrations ---- -Description: Add Github-style badges to your site with the (badge: …) Kirbytag +Description: Add GitHub-style badges to your site with the (badge: …) Kirbytag ---- - diff --git a/content/plugins/plugins.txt b/content/plugins/plugins.txt index 4c2857e987..f6937f234f 100644 --- a/content/plugins/plugins.txt +++ b/content/plugins/plugins.txt @@ -6,6 +6,12 @@ Description: Extend the possibilities of your Kirby installation with plugins fr ---- +Thumbnail: + - + image: outline/3d.svg + +---- + Changefreq: daily ---- diff --git a/content/releases/3-0/release.txt b/content/releases/3-0/release.txt index 1a2d59f06f..6e6bb72026 100644 --- a/content/releases/3-0/release.txt +++ b/content/releases/3-0/release.txt @@ -24,7 +24,7 @@ Kirby 3 comes with a beautiful new control Panel built on top of (link: https:// ### Sections & Tabs -Our brand new section system lifts blueprints to a completely different level. You become the interface designer and decide for each type of page which features you need and how to arrange them. +Our brand-new section system lifts blueprints to a completely different level. You become the interface designer and decide for each type of page which features you need and how to arrange them. (picture: blueprint.png) @@ -130,7 +130,7 @@ With Kirby 3, you can make use of our page cache or add custom caching of your o This introduction could go on forever. We recommend you just give it a try and play around with all the new features yourself. -The best starting point is our brand new (link: try text: Starterkit): +The best starting point is our brand-new (link: try text: Starterkit): (screenshot: starterkit.jpg) diff --git a/content/releases/3-5/release-35.txt b/content/releases/3-5/release-35.txt index 0d9bacbcd7..8a07ef0822 100644 --- a/content/releases/3-5/release-35.txt +++ b/content/releases/3-5/release-35.txt @@ -99,14 +99,14 @@ We stick to the following versioning pattern: Traditionally, we combine patch and minor releases though and never really need the fourth versioning level. -#### Required PHP Version +##### Required PHP Version -With this release **we drop support for PHP 7.2**, which has reached end of life. But we also introduce support for the brand new stable version of **PHP 8.0**, which has been released on December 1st. +With this release **we drop support for PHP 7.2**, which has reached end of life. But we also introduce support for the brand-new stable version of **PHP 8.0**, which has been released on December 1st. -#### Date field `format` option +##### Date field `format` option 3.5.0 is dropping the `format` option of the date field. This is a breaking change which we will (link: https://github.com/getkirby/kirby/issues/3026 text: reverse in 3.5.1). -#### `accept` option for file blueprints +##### `accept` option for file blueprints If no custom `accept` restrictions are defined in the file blueprint, Kirby will now limit the accepted uploads to the types `image`, `document`, `archive`, `audio` and `video` by default. This protects your sites against unexpected uploads like code files that could be used to attack the server or the visitor's browsers. @@ -115,7 +115,7 @@ You can customize the accepted file types in the (link: docs/reference/panel/blu ---- Deprecated: -#### Removed methods +##### Removed methods The following methods have been marked as deprecated since Kirby 3.0.0 and are now removed. @@ -141,7 +141,7 @@ Removed | Use instead `$pages->invisible()` | `$pages->unlisted()` `$pages->visible()` | `$pages->listed()` -#### Deprecated methods +##### Deprecated methods Deprecated methods will be removed in a future version. Please update your code accordingly. diff --git a/content/security/security.txt b/content/security/security.txt index 07f941f5bd..d72b79ed3b 100644 --- a/content/security/security.txt +++ b/content/security/security.txt @@ -36,22 +36,23 @@ Supported: - version: {{ latest }} status: latest - description: ✅ Latest Kirby release, actively supported - + description: Latest Kirby release, actively supported + supported: true - version: >={{ no-vulnerabilities }} status: no-vulnerabilities - description: ✅ No known vulnerabilities - + description: No known vulnerabilities + supported: true - version: 2.* status: end-of-life - description: ❌ Not supported (end of life) since January 1, 2021 - + description: Not supported (end of life) since January 1, 2021 + supported: false - version: 1.* status: end-of-life - description: ❌ Not supported (end of life) since February 1, 2016 + description: Not supported (end of life) since February 1, 2016 + supported: false ---- diff --git a/content/site.txt b/content/site.txt index 0b5ca42e19..92a373c9c8 100644 --- a/content/site.txt +++ b/content/site.txt @@ -1,8 +1,8 @@ -Title: Kirby +Title: Kirby CMS ---- -Description: Kirby is the content management system that adapts to your projects like no other. +Description: Kirby is the content management system that adapts to any project. Made for developers, designers, creators and clients. ---- @@ -18,4 +18,4 @@ Twittercard: summary_large_image ---- -Thumbnail: opengraph.jpg \ No newline at end of file +OgImage: opengraph.jpg \ No newline at end of file diff --git a/content/snippets/conditional-fields/code.txt b/content/snippets/conditional-fields/code.txt deleted file mode 100644 index b618b180f0..0000000000 --- a/content/snippets/conditional-fields/code.txt +++ /dev/null @@ -1,20 +0,0 @@ -Title: Conditional Fields ----- -Text: - -```yaml -fields: - category: - label: Category - type: select - options: - a: A - b: B - c: C - other: Other … - other: - label: Enter your category - type: text - when: - category: other -``` diff --git a/content/snippets/conditional-fields/conditional-fields.png b/content/snippets/conditional-fields/conditional-fields.png deleted file mode 100644 index bd51816ecd..0000000000 Binary files a/content/snippets/conditional-fields/conditional-fields.png and /dev/null differ diff --git a/content/snippets/kirbytext-inline/code.txt b/content/snippets/kirbytext-inline/code.txt deleted file mode 100644 index c88fa7e31e..0000000000 --- a/content/snippets/kirbytext-inline/code.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: Inline KirbyText ----- -Text: - -```php -

- intro()->kirbyTextInline() ?> -

-``` diff --git a/content/snippets/kirbytext-inline/kirbytext-inline.png b/content/snippets/kirbytext-inline/kirbytext-inline.png deleted file mode 100644 index 8b3d1af1a2..0000000000 Binary files a/content/snippets/kirbytext-inline/kirbytext-inline.png and /dev/null differ diff --git a/content/snippets/next-route/code.txt b/content/snippets/next-route/code.txt deleted file mode 100644 index 738d30d3bf..0000000000 --- a/content/snippets/next-route/code.txt +++ /dev/null @@ -1,20 +0,0 @@ -Title: Next route ----- -Text: - -```php -return [ - 'routes' => [ - [ - 'pattern' => '(:any)', - 'action' => function ($slug) { - if ($page = page('blog/' . $slug)) { - return $page; - } - - $this->next(); - } - ] - ] -]; -``` diff --git a/content/snippets/next-route/next-route.png b/content/snippets/next-route/next-route.png deleted file mode 100644 index 251d5f9a7b..0000000000 Binary files a/content/snippets/next-route/next-route.png and /dev/null differ diff --git a/content/snippets/section-help/code.txt b/content/snippets/section-help/code.txt deleted file mode 100644 index 6eb8779903..0000000000 --- a/content/snippets/section-help/code.txt +++ /dev/null @@ -1,13 +0,0 @@ -Title: Section Help ----- -Text: - -```yaml -sections: - gallery: - headline: Gallery - type: files - help: > - Images should have a ratio - of about 3/2 to look best -``` diff --git a/content/snippets/section-help/section-help.png b/content/snippets/section-help/section-help.png deleted file mode 100644 index c4b5df4f51..0000000000 Binary files a/content/snippets/section-help/section-help.png and /dev/null differ diff --git a/content/snippets/srcset/code.txt b/content/snippets/srcset/code.txt deleted file mode 100644 index fad6284243..0000000000 --- a/content/snippets/srcset/code.txt +++ /dev/null @@ -1,10 +0,0 @@ -Title: Code ----- -Text: - -```php -<?= $image->alt() ?> -``` diff --git a/content/snippets/srcset/srcset.png b/content/snippets/srcset/srcset.png deleted file mode 100644 index 1cf127cc53..0000000000 Binary files a/content/snippets/srcset/srcset.png and /dev/null differ diff --git a/content/snippets/textarea-uploads/code.txt b/content/snippets/textarea-uploads/code.txt deleted file mode 100644 index 378660a28a..0000000000 --- a/content/snippets/textarea-uploads/code.txt +++ /dev/null @@ -1,17 +0,0 @@ -Title: Textarea Uploads ----- -Text: - -```yaml -fields: - text: - label: Text - type: textarea - files: - parent: site.find("assets").template("image") - image: - cover: true - uploads: - parent: site.find("assets") - template: image -``` diff --git a/content/snippets/textarea-uploads/textarea-uploads.png b/content/snippets/textarea-uploads/textarea-uploads.png deleted file mode 100644 index ba311390a8..0000000000 Binary files a/content/snippets/textarea-uploads/textarea-uploads.png and /dev/null differ diff --git a/content/snippets/thumb-presets-definition/code.txt b/content/snippets/thumb-presets-definition/code.txt deleted file mode 100644 index e0b9095fd5..0000000000 --- a/content/snippets/thumb-presets-definition/code.txt +++ /dev/null @@ -1,26 +0,0 @@ -Title: Thumb Presets Definition ----- -Text: - -```php - [ - 'presets' => [ - 'default' => [ - 'width' => 1024, - 'quality' => 80 - ], - 'banner' => [ - 'width' => 1024, - 'height' => 342 - 'crop' => true - ], - 'blurred' => [ - 'blur' => true - ] - ] - ] -]; -``` diff --git a/content/snippets/thumb-presets-definition/thumb-presets-definition.png b/content/snippets/thumb-presets-definition/thumb-presets-definition.png deleted file mode 100644 index ac625f09b1..0000000000 Binary files a/content/snippets/thumb-presets-definition/thumb-presets-definition.png and /dev/null differ diff --git a/content/snippets/thumb-presets-usage/code.txt b/content/snippets/thumb-presets-usage/code.txt deleted file mode 100644 index b9e1f006b7..0000000000 --- a/content/snippets/thumb-presets-usage/code.txt +++ /dev/null @@ -1,10 +0,0 @@ -Title: Thumb Presets Usage ----- -Text: - -```php - -``` diff --git a/content/snippets/thumb-presets-usage/thumb-presets-usage.png b/content/snippets/thumb-presets-usage/thumb-presets-usage.png deleted file mode 100644 index acd6d3ba04..0000000000 Binary files a/content/snippets/thumb-presets-usage/thumb-presets-usage.png and /dev/null differ diff --git a/content/styleguide/example.png b/content/styleguide/example.png deleted file mode 100644 index e202eb8798..0000000000 Binary files a/content/styleguide/example.png and /dev/null differ diff --git a/content/styleguide/panel-desktop.png b/content/styleguide/panel-desktop.png deleted file mode 100644 index 92146574dc..0000000000 Binary files a/content/styleguide/panel-desktop.png and /dev/null differ diff --git a/content/styleguide/panel-mobile.png b/content/styleguide/panel-mobile.png deleted file mode 100644 index 43d8160a3c..0000000000 Binary files a/content/styleguide/panel-mobile.png and /dev/null differ diff --git a/content/styleguide/panel-tablet.png b/content/styleguide/panel-tablet.png deleted file mode 100644 index 29dff641c6..0000000000 Binary files a/content/styleguide/panel-tablet.png and /dev/null differ diff --git a/content/styleguide/screenshot.png b/content/styleguide/screenshot.png deleted file mode 100644 index 9d3274cd8f..0000000000 Binary files a/content/styleguide/screenshot.png and /dev/null differ diff --git a/content/styleguide/styleguide.txt b/content/styleguide/styleguide.txt deleted file mode 100644 index 8a7f655dfa..0000000000 --- a/content/styleguide/styleguide.txt +++ /dev/null @@ -1,286 +0,0 @@ -Title: Content styleguide - ----- - -Description: Information on how to contribute to the Kirby website. - ----- - -Priority: 0.5 - ----- - -Intro: - -This page contains our guidelines for writing content and the custom Markdown extensions we use. If you want to make any proposals for updates or submit new Cookbook articles, please read this first. - ----- - -Text: - -## Wording & Style - -Kirby’s docs are written in *American English*, so its orthographic rules apply to all content on the site, including text shown in images. Screenshots, code and other examples should always stick with English as well to keep the documentation as accessible as possible to all of our users. - -We try to use language that is as simple as possible to make it easier to understand for non-native speakers. - -Always use full sentences (except in lists). - -### Use of names - -We use a lot of names and terms on the site. Usage of those names should be consistent. We follow this set of rules: - -- Everything that is a "trademark" of some sorts is written like intended by the author. - `Composer`, `GitHub`, `HTTP Basic auth`, `JavaScript`, `Markdown`, `MySQL`, `SmartyPants`, `SQLite`, `Vue`, `YouTube`, `Whoops` -- Our own names are written like this: - `Kirby`, `Panel`, `KirbyTag`, `KirbyTags`, `KirbyText`, `Starterkit`, `Plainkit`, `Pluginkit` -- Acronyms are always written like they are commonly used (typically all-caps). - `API`, `CSS`, `HTTP`, `JS`, `REST`, `SQL`, `URL`, `YAML` -- Everything that is not a trademark/name or acronym is lowercased (if not at the beginning of a sentence). This also applies to terms that have a "special" meaning in Kirby, but are not listed above. - `template`, `snippet`, `blueprint`, `field method`, … - - -## Formatting & Structure - -We use (glossary: kirbytext) to write the content on our website. On top of that, we also use some custom Markdown extensions that help us with formatting the content in our docs and elsewhere on the site. - -Use native Markown features over HTML or KirbyTags wherever possible and avoid inline CSS at all cost. This ensures the portability of our content for future updates and is often more readable than any complex markup like HTML or KirbyTags. This guide assumes that you are already familiar with basic Markdown formatting. If not, please refer to our (link: docs/guide/content/text-formatting text: text formatting guide) first, to learn how text formatting works in Kirby. - -### Inline styling - -Use *italics* and **bold** formatting to draw attention to single words or parts of sentences. You can also put "quotes" around words where appropriate. Every value that represents a file name, path or variable, should be displayed as inline code, e.g. `/site/config/config.php` and `$page` to clearly separate it from the rest of the text. As inline code is set in a monospace font, this also makes it easier for the reader to identify single letters within that particular phrase, which is especially important for variable names and code examples. - -In general, you should use text formatting sparingly to prevent the text from becoming too cluttered. Every deviation from the regular typography will add noise to the page, but not necessarily make it easier to understand the content. A well-structured page with subheaders usually does not need very much additional formatting (except for inline code, depending on the subject). - -**TL;DR:** Use formatting only, where it adds any benefit to the reader. - -### Datatypes in inline-code - -Our custom Markdown extension automatically handles highlighting of atomic datatypes and classes available in PHP. In addition to that, Kirby’s built-in classes will get highlighting applied and linked to their respective entry in the (link: docs/reference text: reference). The latter only works, if the class name contains the fully-qualified name including namespace (i.e. contains at least one backslash `\` character). If the content of the `` element starts with an uppercase letter, and the class exists in the current environment, it is highlighted, but not linked. All class names must be specified case-sensitive. If that also fails, the highlighter assumes given inline code is not a datatype or class name. You can also specify multiple types, by separating them with a pipe `|` character. Any inline code, that does not solely consist of alphanumeric characters, underscores `_` and backslashes `\` is considered to be not a datatype. - -```markdown -Use a string `string` or `int` as parameter. - -The `Kirby\Cms\Page` class is the heart of Kirby. - -Return value: `Kirby\Cms\Page|null` - -``` - -Available datatypes: `string`, `int`, `float`, `bool`, `object`, `array`, `null`, `mixed` - -Class examples: `Kirby\Cms\Page`, `Kirby\Toolkit\Str` - -Multiple data types: `Kirby\Cms\Page|null`, `string|bool` - -### Headlines - -Use headlines generously to structure your content, this especially holds true for long pages with long text content. Do not use **H1** headlines, as these are reserved for the page title. You can use anything from **H2** and below. If the page template contains a table of contents at the top, each **H2** will be listed there to provide a quick overview of the page contents. Everything from **H3** and below is not included in the TOC. Use (link: docs/reference/text/markdown/headlines text: Markdown syntax) to mark up headers. - -Headlines should never end with a colon: - -```markdown -## Don't do this: - -## Do this instead -``` - -## Code Examples - -Code examples, that are part of a sentence, should be marked up as `inline code`, whereas longer or multiline code examples should always be written as code blocks. These do not only get syntax-highlighting, but also offer a button to copy their contents to the clipboard, which is quite handy. - -Use the *fenced code block style* (```) and always specify the language of the code (e.g. ```php), so the syntax highlighter can properly colorize it. If your example represents the contents of a specific file or needs to have a title, you should add a title to the codeblock by adding it after the language definition surrounded by double quotes (e.g. ```php "/site/config/config.php"): - -

-```php "/site/snippets/hero.php"
-<figure class="hero">
-  ...
-</figure>
-…
-```
-
- -### Common programming languages - -The examples shown below list all programming languages supported by the syntax highlighter: - -```plaintext "Plain text" -Code blocks are very useful for developers and other people who look at code or other things that are written in plain text. As you can see, it uses a fixed-width font. -``` - -```javascript "JavaScript" -const gallery = document.querySelector('.js-gallery'); -``` - -```php "PHP" -$gallery = new Gallery('My Gallery', ['imagesPerRow' => 5]); -``` - -```html "HTML" - -``` - -```scss "SCSS" -$color: #ff0000; -.gallery-error { - color: $color; -} -``` - -```css "CSS" -.gallery-error { - color: #ff0000; -} -``` - -```yaml "YAML" -gallery: - imagesPerRow: 5 - images: - - image1.jpg - - image2.jpg -``` - -```bash "Bash" -npm run gallery-server -``` - -```markdown "Markdown" -# Headline - -The **gallery server** is an *awesome* server. - -- It’s very very fast, pages usually only take between 5.0 and 15.0 seconds to load! -- We still support PHP 4! - -## Installation - -1. Make sure that your PC runs Windows Vista or Windows ME. Windows 7 and 10 are not stable yet. -2. Download a copy of Winamp and your favourite theme, so you can listen to your own music while browsing the photo gallery. - -``` - -### Kirby-specific file types - -Our content files follow simple schema for storing variables in a human-readable format. Examples of content files (located in the `/content` directory of your Kirby installation by default) can be highlighted by specifying `kirbycontent` as the code language. As our content is stored in a content file itself, you need to add 2 spaces of indentation for all content in the block, to prevent the content parsing any separators in your example (`----` in an otherwise empty line). The indentation is automatically removed when the content is displayed. - -```kirbycontent "Kirby Content" - Title: My Gallery Page - - ---- - - Text: This page contains my awesome gallery. -``` - -Always use uppercase field names. - -For highlighting content itself, specify `kirbytext` as the code block’s language. KirbyText examples also get highlighting for Markdown formatting. If you need to include KirbyTags into a code sample, you have to escape the opening bracket of each tag `(` by substituting it with `(` to prevent the parser from interpreting that particular tag. - -```kirbytext "KirbyText" - This is an example of (glossary: kirbytext) with **benefits**. -``` - -## Custom KirbyTags - -### (glossary: …) - -The glossary KirbyTag inserts a tooltip, that gives quick access to the corresponding (link: docs/glossary text: glossary) article. This is especially useful for new users who read the introductionary articles of the docs, but also for advanced users who want to dig deeper into Kirby’s internals. Use, wherever you feel that the explanation of a particular term might be beneficial to the reader. Repeated terms on a single parge should not be given a glossary tag on every occurence. - -The example below uses glossary entry’s title as text: - -```kirbytext -(glossary: kirbytext) -``` - -You can also add a custom text (useful for adding the tooltip to conjugated words): - -```kirbytext -The (glossary: Panel text: Panel’s) interface has been completely re-designed for Kirby 3. -``` - -#### Example - -You can find more information about the (glossary: panel) in our docs. - -### (screenshot: …) - -Inserts a screenshot. It shares all attributes with the (image: …) KirbyTag, but has a drop-shadow to make screenshots with a light background stand out more from the background. Ideally, screenshots should be taken at 2× resolution (also known as HiDPI or retina resolution) to ensure that screenshots appear crisp on all devices. - -```kirbytext -(screenshot: ui.png) -``` - -If you don’t want a screenshot to span the whole width of the text colum, consider to add the `width` attribute for setting a maximum width for the image. - -```kirbytext -(screenshot: ui.png width: 600) -``` - -#### Example - -(screenshot: screenshot.png width: 704) - -## File structures - -If you want to visualize the contents of a directory, use our *filesystem* Markdown extension for generating a nice infographic of the file structure. The filesystem component is used by inserting a fenced code block and setting `filesystem` as the code language. Directories are marked by a slash `/` the the end of the line, files just use their full file name including the extension. Use 2 spaces of indentation to nest files and folders. The *filesystem* component will add the corresponding icons to every folder and file for most common file extensions. For indicating omissioned files and folders, use `...` or `…`, the corresponding item is displayed without an icon. - -
-```filesystem
-assets/
-  css/
-    styles.css
-  fonts/
-    robotron.woff2
-  …
-  images/
-    logo.svg
-    background.jpg
-  js/
-    main.js
-kirby/
-site/
-  templates/
-    default.php
-```
- -#### Example - -```filesystem -assets/ - css/ - styles.css - fonts/ - robotron.woff2 - … - images/ - logo.svg - background.jpg - js/ - main.js -kirby/ -site/ - templates/ - default.php -``` - -## Info & Warning boxes - -If an article or section requires the user to pay specific attention to certain requirements, pitfalls or to provide further information on a subject, you can add **info** and **warning** boxes to separate these pieces of information both visually and semantically from the regular text. Use the <info> and <warning> HTML-style tags to mark up these blocks. Markdown is supported inside, so you can use all features of Markdown and even Kirbytags to style the content of these boxes. The parser transforms these tags into the corresponding HTML structure. - -
<info>
-You need to setup a **local development environment** for installing Kirby. There are a ton of options availale, each of them comes with its individual benefits and pitfalls.
-</info>
-
-<warning>
-Before updating your Kirby installation, always create a fresh backup first.
-</warning>
- -#### Example - - -You need to setup a **local development environment** to run Kirby. There’s a ton of options availale, whereas each of them comes them with its individual benefits and downsides. - - - -Before updating your Kirby installation, always create a backup before changing any files. - diff --git a/content/styleguide/text.txt b/content/styleguide/text.txt new file mode 100644 index 0000000000..d7223c159c --- /dev/null +++ b/content/styleguide/text.txt @@ -0,0 +1,309 @@ +Title: Content styleguide + +---- + +Description: Information on how to contribute to the Kirby website. + +---- + +Priority: 0.5 + +---- + +Intro: + +This page contains our guidelines for writing content and the custom Markdown extensions we use. If you want to make any proposals for updates or submit new Cookbook articles, please read this first. + +---- + +Text: + +## Wording & Style + +Kirby’s docs are written in *American English*, so its orthographic rules apply to all content on the site, including text shown in images. Screenshots, code and other examples should always stick with English as well to keep the documentation as accessible as possible to all of our users. + +We try to use language that is as simple as possible to make it easier to understand for non-native speakers. + +Always use full sentences (except in lists). + +### Use of names + +We use a lot of names and terms on the site. Usage of those names should be consistent. We follow this set of rules: + +- Everything that is a "trademark" of some sorts is written like intended by the author. + `Composer`, `GitHub`, `HTTP Basic auth`, `JavaScript`, `Markdown`, `MySQL`, `SmartyPants`, `SQLite`, `Vue.js`, `YouTube`, `Whoops` +- Our own names are written like this: + `Kirby`, `Panel`, `KirbyTag`, `KirbyTags`, `KirbyText`, `Starterkit`, `Plainkit`, `Pluginkit` +- Acronyms are always written like they are commonly used (typically all-caps). + `API`, `CSS`, `HTTP`, `JS`, `REST`, `SQL`, `URL`, `YAML` +- Everything that is not a trademark/name or acronym is lowercased (if not at the beginning of a sentence). This also applies to terms that have a "special" meaning in Kirby, but are not listed above. + `template`, `snippet`, `blueprint`, `field method`, … + + +## Formatting & Structure + +We use (glossary: kirbytext) to write the content on our website. On top of that, we also use some custom Markdown extensions that help us with formatting the content in our docs and elsewhere on the site. + +Use native Markdown features over HTML or KirbyTags wherever possible and avoid inline CSS at all cost. This ensures the portability of our content for future updates and is often more readable than any complex markup like HTML or KirbyTags. This guide assumes that you are already familiar with basic Markdown formatting. If not, please refer to our (link: docs/guide/content/text-formatting text: text formatting guide) first to learn how text formatting works in Kirby. + +### Inline styling + +Use *italics* and **bold** formatting to draw attention to single words or parts of sentences. You can also put "quotes" around words where appropriate. Every value that represents a file name, path or variable, should be displayed as inline code, e.g. `/site/config/config.php` and `$page` to clearly separate it from the rest of the text. As inline code is set in a monospace font, this also makes it easier for the reader to identify single letters within that particular phrase, which is especially important for variable names and code examples. + +In general, you should use text formatting sparingly to prevent the text from becoming too cluttered. Every deviation from the regular typography will add noise to the page, but not necessarily make it easier to understand the content. A well-structured page with subheaders usually does not need very much additional formatting (except for inline code, depending on the subject). + +**TL;DR:** Use formatting only where it adds any benefit for the reader. + +### Data types in inline code + +Our custom Markdown extension automatically handles highlighting of atomic data types and classes available in PHP. In addition to that, Kirby’s built-in classes will get highlighting applied and linked to their respective entry in the (link: docs/reference text: reference). The latter only works if the class name contains the fully-qualified name including namespace (i.e. contains at least one backslash `\` character). If the content of the `` element starts with an uppercase letter and the class exists in the current environment, it is highlighted, but not linked. All class names must be specified case-sensitive. If that also fails, the highlighter assumes given inline code is not a data type or class name. You can also specify multiple types by separating them with a pipe `|` character. Any inline code that does not solely consist of alphanumeric characters, underscores `_` and backslashes `\` is considered to be not a data type. + +```markdown +Use a string `string` or `int` as parameter. + +The `Kirby\Cms\Page` class is the heart of Kirby. + +Return value: `Kirby\Cms\Page|null` + +``` + +Available data types: `string`, `int`, `float`, `bool`, `object`, `array`, `null`, `mixed` + +Class examples: `Kirby\Cms\Page`, `Kirby\Toolkit\Str` + +Multiple data types: `Kirby\Cms\Page|null`, `string|bool` + +### Headlines + +Use headlines generously to structure your content, this especially holds true for long pages with long text content. Do not use **H1** headlines as these are reserved for the page title. You can use anything from **H2** and below. If the page template contains a table of contents at the top, each **H2** will be listed there to provide a quick overview of the page contents. Everything from **H3** and below is not included in the TOC. Use (link: docs/reference/text/markdown/headlines text: Markdown syntax) to mark up headers. + +Headlines should never end with a colon: + +```markdown +## Don't do this: + +## Do this instead +``` + +## Code Examples + +Code examples that are part of a sentence should be marked up as `inline code`, whereas longer or multiline code examples should always be written as code blocks. These do not only get syntax-highlighting, but also display a button to copy their contents to the clipboard, which is quite handy. + +Use the *fenced code block style* (```) and always specify the language of the code (e.g. ```php), so the syntax highlighter can properly colorize it. If your example represents the contents of a specific file or needs to have a title, you should add a title to the codeblock by adding it after the language definition surrounded by double quotes (e.g. ```php "/site/config/config.php"): + +
+
```php "/site/snippets/hero.php"
+<figure class="hero">
+  ...
+</figure>
+…
+```
+
+
+ +### Common programming languages + +The examples shown below list all programming languages supported by the syntax highlighter: + +```plaintext "Plain text (plaintext)" +Code blocks are very useful for developers and other people who look at code or other things that are written in plain text. As you can see, it uses a fixed-width font. +``` + +```javascript "JavaScript (javascript) " +const gallery = document.querySelector('.js-gallery'); +``` + +```php "PHP (php)" +$gallery = new Gallery('My Gallery', ['imagesPerRow' => 5]); +``` + +```html "HTML (html)" + +``` + +```css "CSS (css)" +.gallery-error { + color: #ff0000; +} +``` + +```yaml "YAML (yaml)" +gallery: + imagesPerRow: 5 + images: + - image1.jpg + - image2.jpg +``` + +```bash "bash" +npm run gallery-server +``` + +```markdown "Markdown (markdown)" +# Headline + +The **gallery server** is an *awesome* server. + +- It’s very very fast, pages usually only take between 5.0 and 15.0 seconds to load! +- We still support PHP 4! + +## Installation + +1. Make sure that your PC runs Windows Vista or Windows ME. Windows 7 and 10 are not stable yet. +2. Download a copy of Winamp and your favourite theme, so you can listen to your own music while browsing the photo gallery. + +``` + +### Kirby-specific file types + +Our content files follow a simple schema for storing variables in a human-readable format. Examples of content files (located in the `/content` directory of your Kirby installation by default) can be highlighted by specifying `kirbycontent` as the code language. As our content is stored in a content file itself, you need to add 2 spaces of indentation for all content in the block to prevent the content parsing any separators in your example (`----` in an otherwise empty line). The indentation is automatically removed when the content is displayed. + +```kirbycontent "Kirby Content (kirbycontent)" + Title: My Gallery Page + + ---- + + Text: This page contains my awesome gallery. +``` + +Always use uppercase field names. + +For highlighting content itself, specify `kirbytext` as the code block’s language. KirbyText examples also get highlighting for Markdown formatting. If you need to include KirbyTags into a code sample, you have to escape the opening bracket of each tag `(` by substituting it with `(` to prevent the parser from interpreting that particular tag. + +```kirbytext "KirbyText (kirbytext)" + This is an example of (glossary: kirbytext) with **benefits**. +``` + +## Custom KirbyTags + +### (screencast: …) + +Adds a box with a screencast video: + +```kirbytext +(screencast: https://www.youtube.com/watch?v=EDVYjxWMecc title: How to install Kirby in 5 minutes text: We are using PHP's built-in server to create a simple local development environment.) +``` + +#### Example + +(screencast: https://www.youtube.com/watch?v=EDVYjxWMecc title: How to install Kirby in 5 minutes text: We are using PHP's built-in server to create a simple local development environment.) + +### (glossary: …) + +The glossary KirbyTag inserts a link to the corresponding (link: docs/glossary text: glossary) article. Use wherever you feel that the explanation of a particular term might be beneficial to the reader. Repeated terms on a single parge should *not* be given a glossary tag on every occurence. + +The example below uses glossary entry’s title as text: + +```kirbytext +(glossary: kirbytext) +``` + +You can also add a custom text (useful for adding the tooltip to conjugated words): + +```kirbytext +The (glossary: Panel text: Panel’s) interface has been completely re-designed for Kirby 3. +``` + +#### Example + +You can find more information about the (glossary: panel) in our docs. + +### (reference: …) + +Shows a grid of subpages of a reference page. + +```kirbytext +(reference: text/kirbytags) +``` + +#### Example + +(reference: text/kirbytags) + + + +## File structures + +If you want to visualize the contents of a directory, use our *filesystem* Markdown extension for generating a nice infographic of the file structure. The filesystem component is used by inserting a fenced code block and setting `filesystem` as the code language. Directories are marked with a slash `/` the the end of the line, files just use their full file name including the extension. Use 2 spaces of indentation to nest files and folders. The *filesystem* component will add the corresponding icons to every folder and file for the most common file extensions. For indicating omissioned files and folders, use `...` or `…`, the corresponding item is displayed without an icon. + +
+
+```filesystem
+assets/
+  css/
+    styles.css
+  fonts/
+    robotron.woff2
+  …
+  images/
+    logo.svg
+    background.jpg
+  js/
+    main.js
+kirby/
+site/
+  templates/
+    default.php
+```
+
+ +#### Example + +```filesystem +assets/ + css/ + styles.css + fonts/ + robotron.woff2 + … + images/ + logo.svg + background.jpg + js/ + main.js +kirby/ +site/ + templates/ + default.php +``` + +## Info & Warning boxes + +If an article or section requires the user to pay specific attention to certain requirements, pitfalls or to provide further information on a subject, you can add **info** and **warning** boxes to separate these pieces of information both visually and semantically from the regular text. Use the <info> and <warning> HTML-style tags to mark up these blocks. Markdown is supported inside, so you can use all features of Markdown and even Kirbytags to style the content of these boxes. The parser transforms these tags into the corresponding HTML structure. + + +
+
<info>
+You need to setup a **local development environment** to run Kirby. There’s ton of options available, each of them comes with its individual benefits and pitfalls.
+</info>
+
+<success>
+Something went really well. Congrats!
+</success>
+
+<warning>
+Before updating your Kirby installation, always create a fresh backup first.
+</warning>
+
+<alert>
+This is really dangerous. Better know what you are doing.
+</alert>
+
+ +#### Example + + +You need to setup a **local development environment** to run Kirby. There’s a ton of options available, whereas each of them comes them with its individual benefits and downsides. + + + +Something went really well. Congrats! + + + +Before updating your Kirby installation, always create a backup before changing any files. + + + +This is really dangerous. Better know what you are doing. + diff --git a/content/try/answers/1_trial-period/answer.txt b/content/try/answers/1_trial-period/answer.txt new file mode 100644 index 0000000000..1c0e9ae138 --- /dev/null +++ b/content/try/answers/1_trial-period/answer.txt @@ -0,0 +1,8 @@ +Title: How long can I try it? +---- +Text: + +Your **online demo** will be erased after an hour. You can always start a new one if you need more time though. + +Your **local installation** does not expire. You can try it as long as you want. + diff --git a/content/try/answers/2_limited-features/answer.txt b/content/try/answers/2_limited-features/answer.txt new file mode 100644 index 0000000000..47cdabb2df --- /dev/null +++ b/content/try/answers/2_limited-features/answer.txt @@ -0,0 +1,5 @@ +Title: Does the trial mode have all features? +---- +Text: + +Yes, there are no hidden or disabled features during the trial. You get a fully functional Kirby installation. diff --git a/content/try/answers/3_test-server/answer.txt b/content/try/answers/3_test-server/answer.txt new file mode 100644 index 0000000000..5a326f895e --- /dev/null +++ b/content/try/answers/3_test-server/answer.txt @@ -0,0 +1,5 @@ +Title: Can I install it on a test server? +---- +Text: + +Yes, you can install Kirby on a private test server for free and check all requirements there. diff --git a/content/try/answers/4_panel-banner/answer.txt b/content/try/answers/4_panel-banner/answer.txt new file mode 100644 index 0000000000..6a5dfa4309 --- /dev/null +++ b/content/try/answers/4_panel-banner/answer.txt @@ -0,0 +1,5 @@ +Title: Can I disable the registration banner in the Panel? +---- +Text: + +Yes, you can disable the banner by purchasing a license 😉 diff --git a/content/try/answers/5_when-to-buy/answer.txt b/content/try/answers/5_when-to-buy/answer.txt new file mode 100644 index 0000000000..6ad6c38b13 --- /dev/null +++ b/content/try/answers/5_when-to-buy/answer.txt @@ -0,0 +1,5 @@ +Title: When do I need to buy a license? +---- +Text: + +Make sure that Kirby works for you first. We want you to be happy. Once your project is ready to be launched, buy a license and register your installation on your live server. diff --git a/content/try/answers/6_templates/answer.txt b/content/try/answers/6_templates/answer.txt new file mode 100644 index 0000000000..e482907cd4 --- /dev/null +++ b/content/try/answers/6_templates/answer.txt @@ -0,0 +1,7 @@ +Title: Can I edit templates in the online demo? +---- +Text: + +No, you cannot edit any of the configuration files, templates, snippets or any other part of the online demo code. The online demo is all about exploring the Panel without having to install Kirby first. + +You can find the code for our online demo on GitHub and install it locally if you want to dive deeper: https://github.com/getkirby/demokit diff --git a/content/try/answers/answers.txt b/content/try/answers/answers.txt new file mode 100644 index 0000000000..368f1653f3 --- /dev/null +++ b/content/try/answers/answers.txt @@ -0,0 +1 @@ +Title: Answers diff --git a/content/try/try.txt b/content/try/try.txt index 5bb63d56ec..cdbd45d738 100644 --- a/content/try/try.txt +++ b/content/try/try.txt @@ -6,11 +6,17 @@ Description: Download Kirby and try it out for free, before buying it. ---- +Thumbnail: + - + title: Try Kirby for free + +---- + Priority: 0.9 ---- Intro: -Discover how Kirby helps you build any type of website. Explore our online demo or download the kits to get started
… and when you’re convinced, (link: buy text: buy your license) +Discover how Kirby helps you build any type of website. Explore our online demo or download the kits to get started diff --git a/content/voices/0_andy-bell/andy-bell.jpg b/content/voices/0_andy-bell/andy-bell.jpg new file mode 100644 index 0000000000..1c5c875fa8 Binary files /dev/null and b/content/voices/0_andy-bell/andy-bell.jpg differ diff --git a/content/voices/0_andy-bell/voice.txt b/content/voices/0_andy-bell/voice.txt new file mode 100644 index 0000000000..02b38d9c36 --- /dev/null +++ b/content/voices/0_andy-bell/voice.txt @@ -0,0 +1,17 @@ +Title: Andy Bell + +---- + +Website: https://piccalil.li/ + +---- + +Text: Blimey, Kirby has come on a lot since I last used it. A fantastic CMS. + +---- + +Link: https://twitter.com/piccalilli_/status/1191815150178897924 + +---- + +Bio: Developer & author diff --git a/content/voices/0_arranrp/arranrp.jpg b/content/voices/0_arranrp/arranrp.jpg deleted file mode 100644 index adc4808500..0000000000 Binary files a/content/voices/0_arranrp/arranrp.jpg and /dev/null differ diff --git a/content/voices/0_arranrp/voice.txt b/content/voices/0_arranrp/voice.txt deleted file mode 100644 index 854680213c..0000000000 --- a/content/voices/0_arranrp/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Arran Ross-Paterson ----- -Username: arranrp ----- -Tweet: http://twitter.com/arranrp/status/192962234803167232 ----- -Text: I used @getkirby for the @eventhandleruk site and it was such a great tool I'm planning on using it in workshops soon. \ No newline at end of file diff --git a/content/voices/0_bart-vandeputte/bart-vandeputte.jpg b/content/voices/0_bart-vandeputte/bart-vandeputte.jpg deleted file mode 100644 index 7d51dae544..0000000000 Binary files a/content/voices/0_bart-vandeputte/bart-vandeputte.jpg and /dev/null differ diff --git a/content/voices/0_bart-vandeputte/voice.txt b/content/voices/0_bart-vandeputte/voice.txt deleted file mode 100644 index 2748bb2163..0000000000 --- a/content/voices/0_bart-vandeputte/voice.txt +++ /dev/null @@ -1,14 +0,0 @@ -Title: Bart Vandeputte - ----- - -Text: I initially tried Kirby as a prototyping framework. It worked out so great I now build most of my sites with it. -It's by far the best CMS I've used for multilingual content-sites. - ----- - -Url: https://twitter.com/bvdputte - ----- - -Username: bvdputte diff --git a/content/voices/0_beyond-tellerrand/btconf.jpg b/content/voices/0_beyond-tellerrand/btconf.jpg deleted file mode 100644 index cd26c5fdd2..0000000000 Binary files a/content/voices/0_beyond-tellerrand/btconf.jpg and /dev/null differ diff --git a/content/voices/0_beyond-tellerrand/voice.txt b/content/voices/0_beyond-tellerrand/voice.txt deleted file mode 100644 index 8d90ac48fa..0000000000 --- a/content/voices/0_beyond-tellerrand/voice.txt +++ /dev/null @@ -1,9 +0,0 @@ -Title: beyond tellerrand - ----- - -Url: https://beyondtellerrand.com/ - ----- - -Text: Kirby is the way to go. Easy set up, super fast if you have to modify anything and absolutely reliable. \ No newline at end of file diff --git a/content/voices/0_bowstreet/bowstreet.jpg b/content/voices/0_bowstreet/bowstreet.jpg deleted file mode 100644 index 78c5a49cf1..0000000000 Binary files a/content/voices/0_bowstreet/bowstreet.jpg and /dev/null differ diff --git a/content/voices/0_bowstreet/voice.txt b/content/voices/0_bowstreet/voice.txt deleted file mode 100644 index 7168d48380..0000000000 --- a/content/voices/0_bowstreet/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Bowstreet ----- -Username: bowstreet ----- -Tweet: https://twitter.com/bowstreet/status/362932869028524033 ----- -Text: After so many big web applications and sites we really love the downright simplicity of @getkirby. \ No newline at end of file diff --git a/content/voices/0_brendan-dawes/brendan-dawes.jpeg b/content/voices/0_brendan-dawes/brendan-dawes.jpeg new file mode 100644 index 0000000000..e093b8fb2a Binary files /dev/null and b/content/voices/0_brendan-dawes/brendan-dawes.jpeg differ diff --git a/content/voices/0_brendan-dawes/brendan-dawes.png b/content/voices/0_brendan-dawes/brendan-dawes.png deleted file mode 100644 index d46cd84355..0000000000 Binary files a/content/voices/0_brendan-dawes/brendan-dawes.png and /dev/null differ diff --git a/content/voices/0_brendan-dawes/voice.txt b/content/voices/0_brendan-dawes/voice.txt index a89dea50af..14e1154f1d 100644 --- a/content/voices/0_brendan-dawes/voice.txt +++ b/content/voices/0_brendan-dawes/voice.txt @@ -2,16 +2,12 @@ Title: Brendan Dawes ---- -Username: brendandawes +Website: http://www.brendandawes.com/ ---- -Tweet: https://twitter.com/#!/brendandawes/status/157389852416016384 +Text: Been using Kirby for my site for many years but now using v3 for a site for a friend and oh my. It’s quite brilliant. The new Layout and Blocks feature is so good. Wonderful. ---- -Url: http://www.brendandawes.com/ - ----- - -Text: Just read the docs for @getkirby and it looks great. @bastianallgeier is one clever bastard. \ No newline at end of file +Bio: Digital artist diff --git a/content/voices/0_brian-warren/brian-warren.jpg b/content/voices/0_brian-warren/brian-warren.jpg deleted file mode 100644 index 811157a57f..0000000000 Binary files a/content/voices/0_brian-warren/brian-warren.jpg and /dev/null differ diff --git a/content/voices/0_brian-warren/voice.txt b/content/voices/0_brian-warren/voice.txt deleted file mode 100644 index b45ac0a07c..0000000000 --- a/content/voices/0_brian-warren/voice.txt +++ /dev/null @@ -1,13 +0,0 @@ -Title: Brian Warren - ----- - -Username: mrwarren - ----- - -Url: http://begoodnotbad.com - ----- - -Text: I couldn’t be happier with my choice to use Kirby. It’s a stellar application that suits me very well. \ No newline at end of file diff --git a/content/voices/0_cameron-moll/cameron-moll.jpg b/content/voices/0_cameron-moll/cameron-moll.jpg new file mode 100644 index 0000000000..8f76f58579 Binary files /dev/null and b/content/voices/0_cameron-moll/cameron-moll.jpg differ diff --git a/content/voices/0_cameron-moll/voice.txt b/content/voices/0_cameron-moll/voice.txt new file mode 100644 index 0000000000..0c6ebb369e --- /dev/null +++ b/content/voices/0_cameron-moll/voice.txt @@ -0,0 +1,17 @@ +Title: Cameron Moll + +---- + +Website: http://cameronmoll.com/ + +---- + +Text: I've been kicking the tires on Kirby as I revamp my site and it's been... outstanding✨ Feels and acts like a lightweight CMS, relatively easy to customize, and (so far) pretty adaptable for the modifications I've thrown at it. + +---- + +Link: https://twitter.com/cameronmoll/status/1222951871763054593 + +---- + +Bio: VP design/research diff --git a/content/voices/0_colly/simon-collison.jpg b/content/voices/0_colly/simon-collison.jpg new file mode 100644 index 0000000000..5a0e4aab0d Binary files /dev/null and b/content/voices/0_colly/simon-collison.jpg differ diff --git a/content/voices/0_colly/voice.txt b/content/voices/0_colly/voice.txt new file mode 100644 index 0000000000..a464621584 --- /dev/null +++ b/content/voices/0_colly/voice.txt @@ -0,0 +1,11 @@ +Title: Simon Collison +---- +Username: colly +---- +Link: https://twitter.com/colly/status/1214864770035322880 +---- +Text: Switching my sites to Kirby has transformed how I feel about them. I've rediscovered the ”designers who hack” spirit … I feel like I can build anything. +---- +Website: https://colly.com +---- +Bio: Designer, writer, speaker & event director diff --git a/content/voices/0_dan-leatherman/dan-leatherman.jpeg b/content/voices/0_dan-leatherman/dan-leatherman.jpeg deleted file mode 100644 index d4818c4377..0000000000 Binary files a/content/voices/0_dan-leatherman/dan-leatherman.jpeg and /dev/null differ diff --git a/content/voices/0_dan-leatherman/voice.txt b/content/voices/0_dan-leatherman/voice.txt deleted file mode 100644 index 88f6e8c36f..0000000000 --- a/content/voices/0_dan-leatherman/voice.txt +++ /dev/null @@ -1,17 +0,0 @@ -Title: Dan Leatherman - ----- - -Username: danleatherman - ----- - -Tweet: https://twitter.com/danleatherman/status/156592691847770112 - ----- - -Url: http://danleatherman.com/ - ----- - -Text: So far really enjoying @getkirby. It's like the simple CMS I've dreamed about for years. \ No newline at end of file diff --git a/content/voices/0_diesdas-digital/diesdas.png b/content/voices/0_diesdas-digital/diesdas.png new file mode 100644 index 0000000000..4b462169f2 Binary files /dev/null and b/content/voices/0_diesdas-digital/diesdas.png differ diff --git a/content/voices/0_diesdas-digital/voice.txt b/content/voices/0_diesdas-digital/voice.txt new file mode 100644 index 0000000000..22102f75da --- /dev/null +++ b/content/voices/0_diesdas-digital/voice.txt @@ -0,0 +1,13 @@ +Title: diesdas.digital + +---- + +Website: https://www.diesdas.digital/ + +---- + +Text: Kirby is a wonderful piece of software. It's our go-to CMS. + +---- + +Bio: Studio for strategy, design and code diff --git a/content/voices/0_edenspiekermann/edenspiekermann.jpeg b/content/voices/0_edenspiekermann/edenspiekermann.jpeg deleted file mode 100644 index e99cefacb2..0000000000 Binary files a/content/voices/0_edenspiekermann/edenspiekermann.jpeg and /dev/null differ diff --git a/content/voices/0_edenspiekermann/edenspiekermann.jpg b/content/voices/0_edenspiekermann/edenspiekermann.jpg new file mode 100644 index 0000000000..47dd6a69a5 Binary files /dev/null and b/content/voices/0_edenspiekermann/edenspiekermann.jpg differ diff --git a/content/voices/0_edenspiekermann/voice.txt b/content/voices/0_edenspiekermann/voice.txt index c88cef6889..b724ffb8ea 100644 --- a/content/voices/0_edenspiekermann/voice.txt +++ b/content/voices/0_edenspiekermann/voice.txt @@ -6,12 +6,16 @@ Username: edenspiekermann ---- -Tweet: https://twitter.com/edenspiekermann/status/504655558629392385 +Link: https://twitter.com/edenspiekermann/status/504655558629392385 ---- -Url: https://www.edenspiekermann.com/ +Website: https://www.edenspiekermann.com/ ---- -Text: easy to setup, easy to use and flexible as hell – that's what @getkirby says about establishing a wiki and we approve \ No newline at end of file +Text: Easy to setup, easy to use and flexible as hell – that's what Kirby says about establishing a wiki and we approve + +---- + +Bio: Global design consultancy diff --git a/content/voices/0_elliot-jay-stocks/elliot-jay-stocks.jpg b/content/voices/0_elliot-jay-stocks/elliot-jay-stocks.jpg new file mode 100644 index 0000000000..c5f4660f72 Binary files /dev/null and b/content/voices/0_elliot-jay-stocks/elliot-jay-stocks.jpg differ diff --git a/content/voices/0_elliot-jay-stocks/voice.txt b/content/voices/0_elliot-jay-stocks/voice.txt new file mode 100644 index 0000000000..f5c0fc4237 --- /dev/null +++ b/content/voices/0_elliot-jay-stocks/voice.txt @@ -0,0 +1,13 @@ +Title: Elliot Jay Stocks + +---- + +Website: https://elliotjaystocks.com/ + +---- + +Text: There’s something so beautifully simple about editing .txt files to update your website; something very Web1.0 — and I mean that very much in a good way. + +---- + +Bio: Designer @GoogleFonts / Musician diff --git a/content/voices/0_geri-coady/geri-coady.jpg b/content/voices/0_geri-coady/geri-coady.jpg new file mode 100644 index 0000000000..7a1333ee47 Binary files /dev/null and b/content/voices/0_geri-coady/geri-coady.jpg differ diff --git a/content/voices/0_geri-coady/voice.txt b/content/voices/0_geri-coady/voice.txt new file mode 100644 index 0000000000..35112b09ef --- /dev/null +++ b/content/voices/0_geri-coady/voice.txt @@ -0,0 +1,17 @@ +Title: Geri Coady + +---- + +Link: https://twitter.com/hellogeri/status/1323753534656053251 + +---- + +Website: https://www.geridrawsjapan.com/ + +---- + +Text: Just in case anyone was on the lookout for a nice, lightweight CMS made by nice people, I highly recommend Kirby ❤️ + +---- + +Bio: Illustrator & author diff --git a/content/voices/0_gilles-vauvarin/gilles-vauvarin.jpg b/content/voices/0_gilles-vauvarin/gilles-vauvarin.jpg index 6df26e701c..73a8e8a3f0 100644 Binary files a/content/voices/0_gilles-vauvarin/gilles-vauvarin.jpg and b/content/voices/0_gilles-vauvarin/gilles-vauvarin.jpg differ diff --git a/content/voices/0_gilles-vauvarin/voice.txt b/content/voices/0_gilles-vauvarin/voice.txt index 8fd3598965..b3c9bb733f 100644 --- a/content/voices/0_gilles-vauvarin/voice.txt +++ b/content/voices/0_gilles-vauvarin/voice.txt @@ -7,3 +7,11 @@ Text: I was looking for a CMS easy to deploy and back up, simple, flexible, whic ---- Username: pixenjoy + +---- + +Website: https://pixenjoy.com/ + +---- + +Bio: Freelance Developer diff --git a/content/voices/0_grand-public/grand-public.jpg b/content/voices/0_grand-public/grand-public.jpg new file mode 100644 index 0000000000..42f02f4ce2 Binary files /dev/null and b/content/voices/0_grand-public/grand-public.jpg differ diff --git a/content/voices/0_grand-public/grand-public.png b/content/voices/0_grand-public/grand-public.png deleted file mode 100644 index 074aa5ac86..0000000000 Binary files a/content/voices/0_grand-public/grand-public.png and /dev/null differ diff --git a/content/voices/0_grand-public/voice.txt b/content/voices/0_grand-public/voice.txt index c5669c546e..7b28f7ada4 100644 --- a/content/voices/0_grand-public/voice.txt +++ b/content/voices/0_grand-public/voice.txt @@ -6,4 +6,8 @@ Text: We choose Kirby because it’s easy to use and possible to customize it to ---- -Url: http://grandpublic.se +Website: http://grandpublic.se + +---- + +Bio: Brand agency diff --git a/content/voices/0_grant-hutchinson/splorp.jpeg b/content/voices/0_grant-hutchinson/splorp.jpeg deleted file mode 100644 index e002c3d251..0000000000 Binary files a/content/voices/0_grant-hutchinson/splorp.jpeg and /dev/null differ diff --git a/content/voices/0_grant-hutchinson/voice.txt b/content/voices/0_grant-hutchinson/voice.txt deleted file mode 100644 index 7f5d3e2061..0000000000 --- a/content/voices/0_grant-hutchinson/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Grant Hutchinson ----- -Username: splorp ----- -Tweet: https://twitter.com/splorp/status/162939436533940224 ----- -Text: Interested in a slick, flat file CMS? I’m loving all the recent updates and tutorials for @getkirby. diff --git a/content/voices/0_hamishmcneill/hamishmcneill.png b/content/voices/0_hamishmcneill/hamishmcneill.png deleted file mode 100644 index 6c362f0be4..0000000000 Binary files a/content/voices/0_hamishmcneill/hamishmcneill.png and /dev/null differ diff --git a/content/voices/0_hamishmcneill/voice.txt b/content/voices/0_hamishmcneill/voice.txt deleted file mode 100644 index ed43c88146..0000000000 --- a/content/voices/0_hamishmcneill/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Hamish McNeill ----- -Username: hamishmcneill ----- -Tweet: https://twitter.com/hamishmcneill/status/365027937365393409 ----- -Text: Spent some time working with @getkirby last night for a new site – such a lean, clean, flexible, file-based CMS machine! <3 \ No newline at end of file diff --git a/content/voices/0_ivo-mynttinen/ivo-mynttinen.png b/content/voices/0_ivo-mynttinen/ivo-mynttinen.png deleted file mode 100644 index ac1d3da48f..0000000000 Binary files a/content/voices/0_ivo-mynttinen/ivo-mynttinen.png and /dev/null differ diff --git a/content/voices/0_ivo-mynttinen/voice.txt b/content/voices/0_ivo-mynttinen/voice.txt deleted file mode 100644 index 7413ed279a..0000000000 --- a/content/voices/0_ivo-mynttinen/voice.txt +++ /dev/null @@ -1,17 +0,0 @@ -Title: Ivo Mynttinen - ----- - -Username: ivomynttinen - ----- - -Tweet: https://twitter.com/ivomynttinen/status/585399812402515968 - ----- - -Url: https://ivomynttinen.com/ - ----- - -Text: After 2 client projects I'm convinced – @getkirby is the most awesome CMS ever. \ No newline at end of file diff --git a/content/voices/0_jessicahische/jessica-hische.jpg b/content/voices/0_jessicahische/jessica-hische.jpg new file mode 100644 index 0000000000..93b61b9c2e Binary files /dev/null and b/content/voices/0_jessicahische/jessica-hische.jpg differ diff --git a/content/voices/0_jessicahische/voice.txt b/content/voices/0_jessicahische/voice.txt new file mode 100644 index 0000000000..64f170d334 --- /dev/null +++ b/content/voices/0_jessicahische/voice.txt @@ -0,0 +1,13 @@ +Title: Jessica Hische + +---- + +Website: https://www.jessicahische.is/awesome + +---- + +Text: My whole site is on Kirby except for my store—highly recommend! So great for organizing projects because it’s all just folders of images and text docs. + +---- + +Bio: Lettering artist & author diff --git a/content/voices/0_jon-hicks/jon-hicks.jpg b/content/voices/0_jon-hicks/jon-hicks.jpg new file mode 100644 index 0000000000..25906d0c5f Binary files /dev/null and b/content/voices/0_jon-hicks/jon-hicks.jpg differ diff --git a/content/voices/0_jon-hicks/voice.txt b/content/voices/0_jon-hicks/voice.txt new file mode 100644 index 0000000000..f4310334a9 --- /dev/null +++ b/content/voices/0_jon-hicks/voice.txt @@ -0,0 +1,13 @@ +Title: Jon Hicks + +---- + +Website: https://hicks.design/ + +---- + +Text: I feel like I’ve only scratched the surface of what Kirby's capable of + +---- + +Bio: Designer & illustrator diff --git a/content/voices/0_julie-ng/jng5.jpg b/content/voices/0_julie-ng/jng5.jpg deleted file mode 100644 index 1c21a4cfdf..0000000000 Binary files a/content/voices/0_julie-ng/jng5.jpg and /dev/null differ diff --git a/content/voices/0_julie-ng/julie-ng.jpg b/content/voices/0_julie-ng/julie-ng.jpg new file mode 100644 index 0000000000..f7ad90c6e9 Binary files /dev/null and b/content/voices/0_julie-ng/julie-ng.jpg differ diff --git a/content/voices/0_julie-ng/voice.txt b/content/voices/0_julie-ng/voice.txt index 0ef9a452be..181bc1bd0b 100644 --- a/content/voices/0_julie-ng/voice.txt +++ b/content/voices/0_julie-ng/voice.txt @@ -1,7 +1,9 @@ Title: Julie Ng ---- -Username: jng5 +Link: https://twitter.com/jng5/status/199608333215342595 ---- -Tweet: https://twitter.com/jng5/status/199608333215342595 +Text: Really loving how flexible Kirby is. The documentation is also really thorough and fab. ---- -Text: Really loving how flexible @getkirby is. The documentation is also really thorough and fab. \ No newline at end of file +Bio: Developer at Microsoft +---- +Website: http://julie.io/ diff --git a/content/voices/0_l-daniel-swakman/l-daniel-swakman.jpg b/content/voices/0_l-daniel-swakman/l-daniel-swakman.jpg index d7f8a56c0e..44383502b1 100644 Binary files a/content/voices/0_l-daniel-swakman/l-daniel-swakman.jpg and b/content/voices/0_l-daniel-swakman/l-daniel-swakman.jpg differ diff --git a/content/voices/0_l-daniel-swakman/voice.txt b/content/voices/0_l-daniel-swakman/voice.txt index 9511636a69..ddc3882997 100644 --- a/content/voices/0_l-daniel-swakman/voice.txt +++ b/content/voices/0_l-daniel-swakman/voice.txt @@ -2,8 +2,12 @@ Title: L. Daniel Swakman ---- -Text: More and more a CMS needs to be headless and flexible to configure. I just <3 @getkirby’s clean & simple panel UI and native JSON support! +Text: More and more a CMS needs to be headless and flexible to configure. I just love Kirby’s clean & simple panel UI and native JSON support! ---- -Url: https://www.ldaniel.eu/ +Website: https://sincere.studio/ + +---- + +Bio: Independent designer/developer diff --git a/content/voices/0_luke-dorny/luxuryluke.jpeg b/content/voices/0_luke-dorny/luxuryluke.jpeg deleted file mode 100644 index 0bb696828e..0000000000 Binary files a/content/voices/0_luke-dorny/luxuryluke.jpeg and /dev/null differ diff --git a/content/voices/0_luke-dorny/voice.txt b/content/voices/0_luke-dorny/voice.txt deleted file mode 100644 index bbfab3cc8a..0000000000 --- a/content/voices/0_luke-dorny/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Luke Dorny ----- -Username: luxuryluke ----- -Tweet: https://twitter.com/luxuryluke/status/156611963185676289 ----- -Text: … @getkirby I've been looking at it. Extremely impressed with how clean and ready it is. diff --git a/content/voices/0_marc-thiele/marcthiele.jpeg b/content/voices/0_marc-thiele/marcthiele.jpeg deleted file mode 100644 index 00b3e4f5f5..0000000000 Binary files a/content/voices/0_marc-thiele/marcthiele.jpeg and /dev/null differ diff --git a/content/voices/0_marc-thiele/marcthiele.jpg b/content/voices/0_marc-thiele/marcthiele.jpg new file mode 100644 index 0000000000..56dfeb76d9 Binary files /dev/null and b/content/voices/0_marc-thiele/marcthiele.jpg differ diff --git a/content/voices/0_marc-thiele/voice.txt b/content/voices/0_marc-thiele/voice.txt index c21ea54411..6d22bea8a1 100644 --- a/content/voices/0_marc-thiele/voice.txt +++ b/content/voices/0_marc-thiele/voice.txt @@ -2,8 +2,12 @@ Title: Marc Thiele ---- -Text: Quick. Well documented. Best support. With Kirby a basic site setup is done within 5 minutes. Brilliant. +Text: Fast. Well documented. Best support. With Kirby a basic site setup is done within 5 minutes. Brilliant. ---- -Url: https://marcthiele.com +Website: https://beyondtellerrand.com + +---- + +Bio: Organizer of @btconf diff --git a/content/voices/0_matthias-ott/matthias-ott.jpg b/content/voices/0_matthias-ott/matthias-ott.jpg new file mode 100644 index 0000000000..ff92c88e6b Binary files /dev/null and b/content/voices/0_matthias-ott/matthias-ott.jpg differ diff --git a/content/voices/0_matthias-ott/voice.txt b/content/voices/0_matthias-ott/voice.txt new file mode 100644 index 0000000000..41418dc125 --- /dev/null +++ b/content/voices/0_matthias-ott/voice.txt @@ -0,0 +1,17 @@ +Title: Matthias Ott + +---- + +Website: https://matthiasott.com/ + +---- + +Text: Working with Kirby is such a joy! + +---- + +Link: https://twitter.com/m_ott/status/1235134616023031808 + +---- + +Bio: UX designer, UI engineer, teacher, speaker diff --git a/content/voices/0_nigel-ewan/nigel.jpg b/content/voices/0_nigel-ewan/nigel.jpg new file mode 100644 index 0000000000..523d529bb9 Binary files /dev/null and b/content/voices/0_nigel-ewan/nigel.jpg differ diff --git a/content/voices/0_nigel-ewan/voice.txt b/content/voices/0_nigel-ewan/voice.txt new file mode 100644 index 0000000000..dc925802fb --- /dev/null +++ b/content/voices/0_nigel-ewan/voice.txt @@ -0,0 +1,17 @@ +Title: Nigel Ewan + +---- + +Website: http://nigelewan.com/ + +---- + +Text: Kirby is the best CMS I’ve ever worked with in 15-ish years of building websites. Worth every penny, even for little personal projects. + +---- + +Link: https://twitter.com/nigel/status/1215731478996377600 + +---- + +Bio: Interdisciplinary designer diff --git a/content/voices/0_nikhil-nigade/dezinezync.jpeg b/content/voices/0_nikhil-nigade/dezinezync.jpeg deleted file mode 100644 index df32dedcfb..0000000000 Binary files a/content/voices/0_nikhil-nigade/dezinezync.jpeg and /dev/null differ diff --git a/content/voices/0_nikhil-nigade/voice.txt b/content/voices/0_nikhil-nigade/voice.txt deleted file mode 100644 index c4064a7f92..0000000000 --- a/content/voices/0_nikhil-nigade/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Nikhil Nigade ----- -Username: dezinezync ----- -Tweet: https://twitter.com/dezinezync/status/152100194920562688 ----- -Text: Goodbye Wordpress. Hello @getkirby. ♥ first sight. http://getkirby.com/ \ No newline at end of file diff --git a/content/voices/0_rene-stalder/rene-stalder.jpg b/content/voices/0_rene-stalder/rene-stalder.jpg new file mode 100644 index 0000000000..ff40f31d01 Binary files /dev/null and b/content/voices/0_rene-stalder/rene-stalder.jpg differ diff --git a/content/voices/0_rene-stalder/voice.txt b/content/voices/0_rene-stalder/voice.txt new file mode 100644 index 0000000000..23cd2d36d7 --- /dev/null +++ b/content/voices/0_rene-stalder/voice.txt @@ -0,0 +1,17 @@ +Title: René Stalder + +---- + +Text: I probably was never as convinced of something the way I am about Kirby. The last 4 months I solely built on it and I wouldn't want to recommend anything else to my potential clients. + +---- + +Website: https://renestalder.me/en/ + +---- + +Link: https://twitter.com/renestalder/status/1362077174581391364 + +---- + +Bio: Front-end-developer & accessibility consultant diff --git a/content/voices/0_ringomoss/ringomoss.jpeg b/content/voices/0_ringomoss/ringomoss.jpeg deleted file mode 100644 index 6ef36c3ea3..0000000000 Binary files a/content/voices/0_ringomoss/ringomoss.jpeg and /dev/null differ diff --git a/content/voices/0_ringomoss/voice.txt b/content/voices/0_ringomoss/voice.txt deleted file mode 100644 index d081bdd476..0000000000 --- a/content/voices/0_ringomoss/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Ringo Moss ----- -Username: ringomoss ----- -Tweet: http://twitter.com/ringomoss/status/287544636925415424 ----- -Text: Messing about with @getkirby. Absolutely superb, amazingly well documented, super simple, everything works. I LOVE IT! \ No newline at end of file diff --git a/content/voices/0_roobottom/roobottom.jpg b/content/voices/0_roobottom/roobottom.jpg deleted file mode 100644 index 01f1ba1efc..0000000000 Binary files a/content/voices/0_roobottom/roobottom.jpg and /dev/null differ diff --git a/content/voices/0_roobottom/voice.txt b/content/voices/0_roobottom/voice.txt deleted file mode 100644 index cb59799c43..0000000000 --- a/content/voices/0_roobottom/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Jon Roobottom ----- -Username: roobottom ----- -Tweet: https://twitter.com/roobottom/status/308287052301090816 ----- -Text: Must say, I'm absolutely in love with @getkirby — simply the best php based CMS I've ever used. It's a thing of logical-beauty. diff --git a/content/voices/0_ryan-collins/Ryan_Collins.png b/content/voices/0_ryan-collins/Ryan_Collins.png deleted file mode 100644 index 0287f56242..0000000000 Binary files a/content/voices/0_ryan-collins/Ryan_Collins.png and /dev/null differ diff --git a/content/voices/0_ryan-collins/voice.txt b/content/voices/0_ryan-collins/voice.txt deleted file mode 100644 index 55ffba3493..0000000000 --- a/content/voices/0_ryan-collins/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Ryan Collins ----- -Username: Ryan_Collins ----- -Tweet: https://twitter.com/Ryan_Collins/status/162577768901644288 ----- -Text: Wow, @getkirby is insanely powerful and easy to work with, I suggest you all check it out. diff --git a/content/voices/0_ryan-gorley/ryan-gorley.jpg b/content/voices/0_ryan-gorley/ryan-gorley.jpg new file mode 100644 index 0000000000..6480a8e447 Binary files /dev/null and b/content/voices/0_ryan-gorley/ryan-gorley.jpg differ diff --git a/content/voices/0_ryan-gorley/voice.txt b/content/voices/0_ryan-gorley/voice.txt new file mode 100644 index 0000000000..71939d1720 --- /dev/null +++ b/content/voices/0_ryan-gorley/voice.txt @@ -0,0 +1,13 @@ +Title: Ryan Gorley + +---- + +Website: https://freehive.com/ + +---- + +Text: If you're a web designer or web developer, whether you use Kirby or not, sign up for these emails! They are always packed with great info. + +---- + +Bio: Creative director diff --git a/content/voices/0_sascha-bregenhorn/netzrocker.jpg b/content/voices/0_sascha-bregenhorn/netzrocker.jpg deleted file mode 100644 index cfe3a047a5..0000000000 Binary files a/content/voices/0_sascha-bregenhorn/netzrocker.jpg and /dev/null differ diff --git a/content/voices/0_sascha-bregenhorn/voice.txt b/content/voices/0_sascha-bregenhorn/voice.txt deleted file mode 100644 index 81d0d6ad42..0000000000 --- a/content/voices/0_sascha-bregenhorn/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Sascha Bregenhorn ----- -Username: netzrocker ----- -Tweet: https://twitter.com/SaschaFromMars/status/156485076945874944 ----- -Text: I'm thrilled. File-based cms @getkirby is super-easy, super-clean and super-awesome. Thanks, @bastianallgeier. diff --git a/content/voices/0_sebastian-tischer/Tischer_S.jpeg b/content/voices/0_sebastian-tischer/Tischer_S.jpeg deleted file mode 100644 index 17a3e6be47..0000000000 Binary files a/content/voices/0_sebastian-tischer/Tischer_S.jpeg and /dev/null differ diff --git a/content/voices/0_sebastian-tischer/voice.txt b/content/voices/0_sebastian-tischer/voice.txt deleted file mode 100644 index b5b491815f..0000000000 --- a/content/voices/0_sebastian-tischer/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Sebastian Tischer ----- -Username: Tischer_S ----- -Tweet: https://twitter.com/Tischer_S/status/225143306798108672 ----- -Text: Just love working with Kirby and the documentation is world class and a real charm ;) Thanks for creating this amazing product :) \ No newline at end of file diff --git a/content/voices/0_steveu/steveu.jpg b/content/voices/0_steveu/steveu.jpg deleted file mode 100644 index e8dfef1f07..0000000000 Binary files a/content/voices/0_steveu/steveu.jpg and /dev/null differ diff --git a/content/voices/0_steveu/voice.txt b/content/voices/0_steveu/voice.txt deleted file mode 100644 index 8b755f3a54..0000000000 --- a/content/voices/0_steveu/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Steve Urmston ----- -Username: steveu ----- -Tweet: http://twitter.com/steveu/status/184671973966745601 ----- -Text: @getkirby This is awesome! I'm finding it painful to build sites *without* using Kirby. Outstanding. \ No newline at end of file diff --git a/content/voices/0_tyler-finck/sursly.jpeg b/content/voices/0_tyler-finck/sursly.jpeg deleted file mode 100644 index 4086dda836..0000000000 Binary files a/content/voices/0_tyler-finck/sursly.jpeg and /dev/null differ diff --git a/content/voices/0_tyler-finck/voice.txt b/content/voices/0_tyler-finck/voice.txt deleted file mode 100644 index 6dbcf103b0..0000000000 --- a/content/voices/0_tyler-finck/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Tyler Finck ----- -Username: sursly ----- -Tweet: https://twitter.com/sursly/status/168032904096657408 ----- -Text: Pretty sure I'm in love with @getkirby. Good gravy. Adios, Wordpress. diff --git a/content/voices/0_victa/victa.jpeg b/content/voices/0_victa/victa.jpeg deleted file mode 100644 index 79ef588bd9..0000000000 Binary files a/content/voices/0_victa/victa.jpeg and /dev/null differ diff --git a/content/voices/0_victa/voice.txt b/content/voices/0_victa/voice.txt deleted file mode 100644 index 41befb9548..0000000000 --- a/content/voices/0_victa/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Victor Coulon ----- -Username: _victa ----- -Tweet: http://twitter.com/_victa/status/194006380921888768 ----- -Text: If you're looking for a powerful, easy to use and well documented CMS which works without DB (and efforts) : simply @getkirby \ No newline at end of file diff --git a/content/voices/0_warchamp7/voice.txt b/content/voices/0_warchamp7/voice.txt new file mode 100644 index 0000000000..c71152b0f8 --- /dev/null +++ b/content/voices/0_warchamp7/voice.txt @@ -0,0 +1,17 @@ +Title: warchamp7 + +---- + +Website: https://obsproject.com/ + +---- + +Text: Kirby is such a pleasure to work with + +---- + +Link: https://twitter.com/Warchamp7/status/1182713390881525761 + +---- + +Bio: Developer at @OBSProject diff --git a/content/voices/0_warchamp7/warchamp7.jpg b/content/voices/0_warchamp7/warchamp7.jpg new file mode 100644 index 0000000000..f28ec14959 Binary files /dev/null and b/content/voices/0_warchamp7/warchamp7.jpg differ diff --git a/content/voices/0_whoiscemk/voice.txt b/content/voices/0_whoiscemk/voice.txt deleted file mode 100644 index 1c7c7b7b44..0000000000 --- a/content/voices/0_whoiscemk/voice.txt +++ /dev/null @@ -1,7 +0,0 @@ -Title: Cem K. ----- -Username: whoiscemk ----- -Tweet: https://twitter.com/whoiscemk/status/229333395635847170 ----- -Text: I *LOVED* how easy it was to move my @getkirby sites from one server (@zerigo) to another (@macminicolo). The future is DB-less. Trust me. \ No newline at end of file diff --git a/content/voices/0_whoiscemk/whoiscemk.jpeg b/content/voices/0_whoiscemk/whoiscemk.jpeg deleted file mode 100644 index 31b7427319..0000000000 Binary files a/content/voices/0_whoiscemk/whoiscemk.jpeg and /dev/null differ diff --git a/content/voices/link.txt b/content/voices/link.txt deleted file mode 100644 index c46ca35057..0000000000 --- a/content/voices/link.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: What others say about Kirby - ----- - -Link: home diff --git a/content/voices/voices.txt b/content/voices/voices.txt new file mode 100644 index 0000000000..4fe3a65d9e --- /dev/null +++ b/content/voices/voices.txt @@ -0,0 +1 @@ +Title: What others say about Kirby diff --git a/content/why/why.txt b/content/why/why.txt deleted file mode 100644 index de55fe1ddb..0000000000 --- a/content/why/why.txt +++ /dev/null @@ -1,92 +0,0 @@ -Title: Why Kirby? - ----- - -Description: Learn more about the benefits and unique features, which Kirby has to offer. - ----- - -Intro: - -People from different professions told us why their projects were (link: love text: made with Kirby.) - ----- - -Priority: 0.9 - ----- - -Clients: - -- headline: Keep your costs at a minimum - text: > - Kirby's (link: docs/guide/installation#requirements text: requirements) are very low. Your clients can either keep their cheap hosting or you can get started with low hosting costs for them and scale up if required. Don't waste money on complex setups and system administration. You can update Kirby within minutes. With our regular bi-monthly (link: https://roadmap.getkirby.com text: release cycle), we save your team from update stress. This keeps maintenance costs low. -- headline: Real-world features - text: > - We all come from a client project background building websites as freelancers or in agencies for many years, and we know exactly what clients need. With Kirby, we focus on the features that move you and your clients forward. We strive for designs that are tailored to your needs: precise, efficient and powerful. Kirby is meant to power (link: love text: high-quality websites), built by professionals. -- headline: "Happy team, happy clients: better results" - text: Developers, designers and content editors feel very positive about their experience with Kirby. This means that your projects get done faster, with a more motivated team and happier clients. -- headline: Future-proof - text: Typical client projects don't finish after launch. Kirby helps you grow and extend projects. Your developers can create new page types, templates, landing pages and custom features anytime. It's important to know for you and your clients that there will be no unexpected road-blocks in the future. -- headline: A healthy roadmap - text: Kirby has been around for seven years. We released 3 major versions during that time. We know how important it is that you can trust your content management system not to vanish the next day. That's why we have built our business on a sustainable model with a reliable roadmap. We have been profitable for years and we do everything to keep Kirby running and running and running for you. -- headline: Kirby scales - text: From small sites to high-traffic platforms––Kirby comes with an incredible performance and can be scaled to match the popularity of any project. -- headline: Great support & a fantastic community - text: > - In our (link: community/#team text: team), everyone is involved with support. We believe in long-term personal connections with our customers. Our (link: https://forum.getkirby.com text: forum) is well-known for the friendly and helpful environment. Combined with a wonderful community of professionals, we are always there for you. -- headline: No lock-in - text: We want to keep you as customers for as long as possible. But we don't want to lock you in. Kirby's content structure is open and easy to migrate to any other system. This is all about giving you confidence in our system. - ----- -Editors: - -- headline: The perfect content curation environment - text: We built our panel to fit any content in the best possible way. No matter if you need to curate projects, products, retailers, team members, restaurant menus, customers, galleries, albums, documentation or articles, the Kirby Panel will always feel at home. -- headline: Feel at home—without endless workshops - text: You care all about your content and the clean, clutter-free interface of the Panel will reflect that. With Kirby you get started right away without days of training or endless boring workshops. -- headline: Kirby helps you focus - text: We optimized Kirby's interface to help you finish your work fast and efficient. We want you to have confidence in your content management system and enjoy the process of updating your website. Come back later without having to relearn everything. -- headline: Reliable - text: Content in Kirby is fully version-controllable and easy to back up. This frees you and your team from annoying or costly editing issues. -- headline: International - text: Kirby has multi-language support built right in. Get started with a single language and add additional translations later. Work together in a team to get your content out to an international audience around the world. - ----- -Developers: - -- headline: Keeping it simple - text: Kirby's architecture is built with simplicity and flexibility in mind. Download it, put it in the web root of your server and go. With Kirby, you start to be efficient in minutes. -- headline: Flexible - text: We love LEGO and Kirby is like digital LEGO. With our PHP API, you can fetch any type of content or file, filter, modify and combine data and create anything that your project requires. If you can dream it, you can probably build it with Kirby. Whenever you hit a road-block, you can be pretty sure that there's a way to extend the system with a plugin and the forum will always be there for you to help you with new ideas. -- headline: Runs on almost anything - text: "Kirby is happy as long as there's (link: docs/guide/quickstart#requirements text: a recent PHP version and a web server). You don't need tons of RAM, disk space, lots of PHP extensions or a database server. Pretty much any cheap shared hosting will do. This is great to experiment in a low-cost environment, but it's also liberating in client projects when your clients already have some unpleasant hosting plan lying around." -- headline: It's fast - text: Kirby is fast by default. Our Starterkit pages render in between 30ms - 70ms (running on Valet+ on macOS) without caching enabled. With SSD hosting becoming an industry standard, Kirby installations often have a huge performance benefit compared to other database-driven systems or even our file-based competitors. If this is not enough, we have a powerful caching engine that can be switched from files to APCu, memcached or your own favorite cache engine. -- headline: Fewer dependencies = less trouble - text: We love to keep things simple. That’s why we built Kirby on top of our own micro framework that focuses on providing what we need for Kirby. With this setup, we can bring you all those amazing features at a bundle size of just ~3MB, including the Panel. This ensures better performance and less bloat. You can keep it vanilla or bring your own framework or PHP libraries of choice without feeling bad about it. -- headline: Your templates - text: Kirby's default template engine is built around PHP and HTML. It's extremely fast and with our object-oriented, chainable PHP API, it's also very powerful. But Kirby 3 is in fact template engine agnostic. If you prefer Twig, Blade or any other engine, you can replace ours. There are plugins for Twig and Blade and it's possible to build your own. -- headline: Headless option - text: Bring your own frontend, SPA or mobile application in combination with our headless API. Use the full power of our Panel and publish projects to any imaginable destination. -- headline: Secure - text: Kirby 3 is built on a modern, secure stack with PHP and Vue.js at its core. Our file-based architecture solves a lot of the typical security issues of modern CMS systems by eliminating the database and all connected SQL injections. We follow OWASP standards closely and only had a handful vulnerability reports in the last 7 years. We provide security patches within a day in such cases. -- headline: Extensive documentation - text: We spend a lot of time writing documentation for every aspect of Kirby. Get started with our guide, take a deep dive into every tiny detail with our reference or learn about all kinds of solutions in our cookbook. -- headline: A wonderful community - text: You are never alone with your problems. Our friendly community has evolved into a great family of professional designers and developers over the years and we are always here to help you out. - ----- - -Designers: - -- headline: Built for your content - text: Kirby's admin interface is the perfect platform for your content. With a design as reduced as possible, Kirby puts the focus on your images, your videos, your articles, etc., providing timeless simplicity–not brutal branding. -- headline: A philosophy of minimalism - text: Our philosophy at Kirby is to start as lean as possible and to create a powerful set of LEGO bricks for you. With Kirby you add the things you need in a project instead of having to remove tons of unwanted features and plugins to get started. -- headline: Your design, your markup - text: Kirby makes no assumptions about the way you design your site, nor does it impose anything on you, no frameworks, no widgets… Each Kirby site is 100% yours. With our incredibly flexible template system you start with a minimal layout and get very detailed with the individual design for any type of page. -- headline: Be the admin interface designer - text: You can customize our admin panel to the very last bit, and put as much care into the editing experience as you put into the design of the frontend. Combine interface elements and features in a way that reflects your design intentions and content requirements in the best possible way. -- headline: Be part of the development process - text: Design and code go closely together in digital projects. It's great to see the boundaries between designers and developers vanish and Kirby tries to help with that. We want you to feel comfortable with the development process as a designer. Our template engine is so straightforward that many designers without coding knowledge use Kirby to get started. diff --git a/index.php b/index.php new file mode 100644 index 0000000000..9b08443255 --- /dev/null +++ b/index.php @@ -0,0 +1,5 @@ +render(); diff --git a/media/index.html b/media/index.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package-lock.json b/package-lock.json index b274e1c3ee..c551b12875 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9958 +1,7006 @@ { "name": "getkirby.com", - "version": "3.0.0", - "lockfileVersion": 1, + "version": "3.2.0", + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/core": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.0.tgz", - "integrity": "sha512-Dzl7U0/T69DFOTwqz/FJdnOSWS57NpjNfCwMKHABr589Lg8uX1RrlBIJ7L5Dubt/xkLsx0xH5EBFzlBVes1ayA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helpers": "^7.4.0", - "@babel/parser": "^7.4.0", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.0", - "@babel/types": "^7.4.0", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.11", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", - "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", - "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", - "dev": true, - "requires": { - "@babel/types": "^7.4.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", - "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.0", - "@babel/types": "^7.4.0" - } - }, - "@babel/traverse": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.0.tgz", - "integrity": "sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.0", - "@babel/parser": "^7.4.0", - "@babel/types": "^7.4.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", - "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "packages": { + "": { + "name": "getkirby.com", + "version": "3.2.0", + "license": "UNLICENSED", + "devDependencies": { + "cssnano": "^4.1.10", + "postcss": "^8.2.6", + "postcss-cli": "^8.3.1", + "postcss-import": "^14.0.0", + "uglifyjs-folder": "^2.0.0" } }, - "@babel/generator": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", - "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, - "requires": { - "@babel/types": "^7.4.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } + "@babel/highlight": "^7.12.13" } }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", "dev": true, - "requires": { - "@babel/types": "^7.0.0" + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@babel/helper-split-export-declaration": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", - "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "@babel/types": "^7.4.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "@babel/helpers": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.2.tgz", - "integrity": "sha512-gQR1eQeroDzFBikhrCccm5Gs2xBjZ57DNjGbqTaHo911IpmSxflOQWMAHPw/TXk8L3isv7s9lYzUkexOeTQUYg==", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.0", - "@babel/types": "^7.4.0" - }, "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", - "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", - "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", - "dev": true, - "requires": { - "@babel/types": "^7.4.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", - "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.0", - "@babel/types": "^7.4.0" - } - }, - "@babel/traverse": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.0.tgz", - "integrity": "sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.0", - "@babel/parser": "^7.4.0", - "@babel/types": "^7.4.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", - "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } + "color-name": "1.1.3" } }, - "@babel/parser": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.2.tgz", - "integrity": "sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g==", + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "@babel/template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", - "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.0", - "@babel/types": "^7.4.0" + "engines": { + "node": ">=4" } }, - "@babel/traverse": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.0.tgz", - "integrity": "sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA==", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.0", - "@babel/parser": "^7.4.0", - "@babel/types": "^7.4.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "@babel/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", - "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - }, "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" + "engines": { + "node": ">= 8" } }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@types/core-js": { - "version": "0.9.46", - "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-0.9.46.tgz", - "integrity": "sha512-LooLR6XHes9V+kNYRz1Qm8w3atw9QMn7XeZUmIpUelllF9BdryeUKd/u0Wh5ErcjpWfG39NrToU9MF7ngsTFVw==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" + "dependencies": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "node_modules/@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", "dev": true }, - "@types/mkdirp": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.3.29.tgz", - "integrity": "sha1-fyrX7FX5FEgvybHsS7GuYCjUYGY=", + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, - "@types/node": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.4.tgz", - "integrity": "sha512-02tIL+QIi/RW4E5xILdoAMjeJ9kYq5t5S2vciUdFPXv/ikFTb0zK8q9vXkg4+WAJuYXGiVT1H28AkD2C+IkXVw==", + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/rimraf": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-0.0.28.tgz", - "integrity": "sha1-VWJRm8eWPKyoq/fxKMrjtZTUHQY=", + "node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", "dev": true }, - "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, - "@types/vfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", - "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true, - "requires": { - "@types/node": "*", - "@types/unist": "*", - "@types/vfile-message": "*" + "engines": { + "node": ">=8" } }, - "@types/vfile-message": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-1.0.1.tgz", - "integrity": "sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "@types/node": "*", - "@types/unist": "*" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "engines": { + "node": ">=8" } }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "requires": { - "acorn": "^4.0.3" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } + "engines": { + "node": ">= 4.0.0" } }, - "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, - "adjust-sourcemap-loader": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz", - "integrity": "sha512-958oaHHVEXMvsY7v7cC5gEkNIcoaAVIhZ4mBReYVZJOTP9IgKmzLjIOhTtzpLMu+qriXvLsVjJ155EeInp45IQ==", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { - "assert": "^1.3.0", - "camelcase": "^1.2.1", - "loader-utils": "^1.1.0", - "lodash.assign": "^4.0.1", - "lodash.defaults": "^3.1.2", - "object-path": "^0.9.2", - "regex-parser": "^2.2.9" - }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "lodash.defaults": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", - "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", - "dev": true, - "requires": { - "lodash.assign": "^3.0.0", - "lodash.restparam": "^3.0.0" - }, - "dependencies": { - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - } - } - } - } + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true + "node_modules/browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } }, - "agentkeepalive": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz", - "integrity": "sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=" + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "algoliasearch": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-3.32.1.tgz", - "integrity": "sha512-NaaHMboU9tKwrU3aim7LlzSDqKb+1TGaC+Lx3NOttSnuMHbPpaf+7LtJL4KlosbRWEwqb9t5wSYMVDrPTH2dNA==", - "requires": { - "agentkeepalive": "^2.2.0", - "debug": "^2.6.9", - "envify": "^4.0.0", - "es6-promise": "^4.1.0", - "events": "^1.1.0", - "foreach": "^2.0.5", - "global": "^4.3.2", - "inherits": "^2.0.1", - "isarray": "^2.0.1", - "load-script": "^1.0.0", - "object-keys": "^1.0.11", - "querystring-es3": "^0.2.1", - "reduce": "^1.0.1", - "semver": "^5.1.0", - "tunnel-agent": "^0.6.0" - } - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "anymatch": { + "node_modules/caller-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "engines": { + "node": ">=4" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true, - "requires": { - "sprintf-js": "~1.0.2" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "engines": { + "node": ">=6" } }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, - "requires": { - "array-uniq": "^1.0.1" + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "node_modules/caniuse-lite": { + "version": "1.0.30001208", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz", + "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "util": "0.10.3" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "node_modules/color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "dev": true, - "requires": { - "lodash": "^4.17.11" + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" } }, - "async-chain-proxy": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/async-chain-proxy/-/async-chain-proxy-0.1.5.tgz", - "integrity": "sha512-JYUzBrCWkKdBQ02H2f1N8xR4JXeWGcw2V8i2AzJjeXGTz40rqqbKkDmQieL8iHNp70W1M44WXqFsvk4Cx49H1Q==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "babel-polyfill": "^6.23.0" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "async-each-series": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", - "dev": true + "node_modules/color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "autoprefixer": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", - "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, - "requires": { - "browserslist": "^2.11.3", - "caniuse-lite": "^1.0.30000805", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.17", - "postcss-value-parser": "^3.2.3" + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "awesomplete": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/awesomplete/-/awesomplete-1.1.4.tgz", - "integrity": "sha512-AgYrODNlVD3ZJ6Em54YesLnOSusuVCjoRAt0l5bi3L1Oiv5r5dkPdxVPJaG3/wnPlxRUmGcpGnK02VK7N02kCg==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", - "dev": true + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true, + "engines": { + "node": "*" + } }, - "axios": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", - "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "dev": true, - "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dev": true, - "requires": { - "debug": "=3.1.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - } + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" } }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "node_modules/css-declaration-sorter/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - } + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "babel-eslint": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz", - "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==", + "node_modules/css-declaration-sorter/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "node_modules/css-declaration-sorter/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "node_modules/css-declaration-sorter/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "dependencies": { + "color-name": "1.1.3" } }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "node_modules/css-declaration-sorter/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/css-declaration-sorter/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "engines": { + "node": ">=4" } }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "node_modules/css-declaration-sorter/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "node_modules/css-declaration-sorter/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" } }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "node_modules/cssnano-preset-default/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "node_modules/cssnano-preset-default/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "node_modules/cssnano-preset-default/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "dependencies": { + "color-name": "1.1.3" } }, - "babel-loader": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", - "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", + "node_modules/cssnano-preset-default/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/cssnano-preset-default/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" + "engines": { + "node": ">=4" } }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "node_modules/cssnano-preset-default/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "node_modules/cssnano-preset-default/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" + "engines": { + "node": ">=6.9.0" } }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "engines": { + "node": ">=6.9.0" } }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "node_modules/cssnano-util-raw-cache/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "node_modules/cssnano-util-raw-cache/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "node_modules/cssnano-util-raw-cache/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "node_modules/cssnano-util-raw-cache/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "dependencies": { + "color-name": "1.1.3" } }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "node_modules/cssnano-util-raw-cache/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/cssnano-util-raw-cache/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "engines": { + "node": ">=4" } }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "node_modules/cssnano-util-raw-cache/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "node_modules/cssnano-util-raw-cache/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "engines": { + "node": ">=6.9.0" } }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "node_modules/cssnano/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "node_modules/cssnano/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "node_modules/cssnano/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "node_modules/cssnano/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "dependencies": { + "color-name": "1.1.3" } }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "node_modules/cssnano/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/cssnano/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "engines": { + "node": ">=4" } }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "node_modules/cssnano/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "node_modules/cssnano/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "engines": { + "node": ">=0.10.0" } }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" + "engines": { + "node": ">=0.10.0" } }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" } }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "node_modules/dependency-graph": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz", + "integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==", "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" + "engines": { + "node": ">= 0.6.0" } }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" } }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" } - } + ] + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true }, - "babel-preset-env": { + "node_modules/domutils": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - }, - "dependencies": { - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - } + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" } }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "node_modules/electron-to-chromium": { + "version": "1.3.712", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.712.tgz", + "integrity": "sha512-3kRVibBeCM4vsgoHHGKHmPocLqtFAGTrebXxxtgKs87hNUzXrX2NuS3jnBys7IozCnw7viQlozxKkmty2KNfrw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "node_modules/es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - } + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "engines": { + "node": ">=6" } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "backstopjs": { - "version": "3.8.8", - "resolved": "https://registry.npmjs.org/backstopjs/-/backstopjs-3.8.8.tgz", - "integrity": "sha512-WlESPgltrNp6aZQTzSywER51zsIpMWJQwA4qSUquVP87Z3nj49tVZy+fA4j0B06iTMQ7Uw030jkZltBJCKPx/A==", + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true, - "requires": { - "casperjs": "^1.1.0-beta5", - "chalk": "^1.1.3", - "chromy": "0.5.11", - "diverged": "^0.1.3", - "fs-extra": "^0.30.0", - "jump.js": "^1.0.2", - "junit-report-builder": "^1.3.1", - "lodash": "^4.17.11", - "minimist": "^1.2.0", - "node-resemble-js": "^0.2.0", - "object-hash": "1.1.5", - "opn": "^5.3.0", - "os": "^0.1.1", - "p-map": "^1.1.1", - "path": "^0.12.7", - "phantomjs-prebuilt": "^2.1.16", - "portfinder": "^1.0.17", - "puppeteer": "^1.2.0-next.1523485686787", - "super-simple-web-server": "^1.1.0", - "temp": "^0.8.3" + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "engines": { + "node": ">=4" } }, - "bail": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", - "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==", + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "node_modules/fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "node_modules/fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "dependencies": { + "reusify": "^1.0.4" } }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, - "bcrypt-pbkdf": { + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, - "better-assert": { + "node_modules/has-symbols": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true, - "requires": { - "callsite": "1.0.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", "dev": true }, - "bignumber.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", - "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=", + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", "dev": true }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", "dev": true }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true, - "requires": { - "inherits": "~2.0.0" + "engines": { + "node": ">= 4" } }, - "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", - "dev": true + "node_modules/import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "dependencies": { + "import-from": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "bmp-js": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", - "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=", - "dev": true + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "node_modules/import-from/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", "dev": true, - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "body-scroll-lock": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-2.6.1.tgz", - "integrity": "sha512-fsDsq10+BJrk/+eGADqxspyZpGiKSh3dK8ByE6KuDK0REmPB99U05p1t9xVTAM9J6j9PJGm6W/W+HsCPnOFj+Q==" + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "node_modules/is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "brorand": { + "node_modules/is-color-stop": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } }, - "browser-sync": { - "version": "2.26.12", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.12.tgz", - "integrity": "sha512-1GjAe+EpZQJgtKhWsxklEjpaMV0DrRylpHRvZWgOphDQt+bfLZjfynl/j1WjSFIx8ozj9j78g6Yk4TqD3gKaMA==", + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", "dev": true, - "requires": { - "browser-sync-client": "^2.26.12", - "browser-sync-ui": "^2.26.12", - "bs-recipes": "1.3.4", - "bs-snippet-injector": "^2.0.1", - "chokidar": "^3.4.1", - "connect": "3.6.6", - "connect-history-api-fallback": "^1", - "dev-ip": "^1.0.1", - "easy-extender": "^2.3.4", - "eazy-logger": "^3", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "^1.18.1", - "immutable": "^3", - "localtunnel": "^2.0.0", - "micromatch": "^4.0.2", - "opn": "5.3.0", - "portscanner": "2.1.1", - "qs": "6.2.3", - "raw-body": "^2.3.2", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "send": "0.16.2", - "serve-index": "1.9.1", - "serve-static": "1.13.2", - "server-destroy": "1.0.1", - "socket.io": "2.1.1", - "ua-parser-js": "^0.7.18", - "yargs": "^15.4.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", - "dev": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "browser-sync-client": { - "version": "2.26.12", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.12.tgz", - "integrity": "sha512-bEBDRkufKxrIfjOsIB1FN9itUEXr2oLtz1AySgSSr80K2AWzmtoYnxtVASx/i40qFrSdeI31pNvdCjHivihLVA==", + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true, - "requires": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "^1.1.3", - "rxjs": "^5.5.6" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "browser-sync-ui": { - "version": "2.26.12", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.12.tgz", - "integrity": "sha512-PkAJNf/TfCFTCkQUfXplR2Kp/+/lbCWFO9lrgLZsmxIhvMLx2pYZFBbTBIaem8qjXhld9ZcESUC8EdU5VWFJgQ==", + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true, - "requires": { - "async-each-series": "0.1.1", - "connect-history-api-fallback": "^1", - "immutable": "^3", - "server-destroy": "1.0.1", - "socket.io-client": "^2.0.4", - "stream-throttle": "^0.1.3" + "engines": { + "node": ">=0.10.0" } }, - "browser-sync-webpack-plugin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/browser-sync-webpack-plugin/-/browser-sync-webpack-plugin-2.2.2.tgz", - "integrity": "sha512-x92kl8LdBi4dp6YVXYqrSoDkOCOLCeBOrYSY0h9Sk1VcCDSoZC1Vc62eae6TfC2ljN4/L+aYlkzE46kirHzbgA==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, - "requires": { - "lodash": "^4" + "engines": { + "node": ">=0.10.0" } }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "engines": { + "node": ">=8" } }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "engines": { + "node": ">=0.12.0" } }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "node_modules/is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, - "requires": { - "pako": "~1.0.5" + "engines": { + "node": ">=8" } }, - "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" + "engines": { + "node": ">=0.10.0" } }, - "bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", - "dev": true - }, - "bs-snippet-injector": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", - "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", - "dev": true - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", - "dev": true - }, - "buffer-from": { + "node_modules/is-resolvable": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "buffer-xor": { + "node_modules/is-symbol": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - }, - "dependencies": { - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - } + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "requires": { - "callsites": "^2.0.0" - }, "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "engines": { + "node": ">=0.10.0" } }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - }, "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - } + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "caniuse-db": { - "version": "1.0.30000954", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000954.tgz", - "integrity": "sha512-Rwd/JRb1/7wXzSOS5AQHXp4RBWXeNNPZW/9Gmv1kfO14ayrssFOM+vbu/0CPkYOCSZK6QZGMlrzaXznGLPkBAA==", + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", "dev": true }, - "caniuse-lite": { - "version": "1.0.30000954", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000954.tgz", - "integrity": "sha512-Wopmc0eVSSG1d9/O4JTn0OmGhUfhEHNkHhoCjUrGSImvHI+2YQWkOI1RRNTUFNSHbSAD8J41jbdZrPP4r32cbQ==", + "node_modules/lodash.forown": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz", + "integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, - "casperjs": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/casperjs/-/casperjs-1.1.4.tgz", - "integrity": "sha1-6wH07YWsUgqPTZMrTap00+d7x0Y=", + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", "dev": true }, - "ccount": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", - "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==", + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "node_modules/map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "engines": { + "node": ">=8" }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "character-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", - "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==", + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, - "character-entities-html4": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", - "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==", - "dev": true + "node_modules/meow": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", + "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "arrify": "^2.0.1", + "camelcase": "^6.0.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "character-entities-legacy": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", - "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==", - "dev": true + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } }, - "character-reference-invalid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", - "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==", - "dev": true + "node_modules/micromatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.3.tgz", + "integrity": "sha512-ueuSaP4i67F/FAUac9zzZ0Dz/5KeKDkITYIS/k4fps+9qeh1SkeH6gbljcqz97mNBOsaWZ+iv2UobMKK/yD+aw==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.6" + } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "chokidar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", - "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - } + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" } }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true + "node_modules/minimist-options/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "chrome-launcher": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.10.5.tgz", - "integrity": "sha512-Gbzg8HlWhyuoVqflhiXwfFXhzNfNWvAkSWv2QR1Yl6mwsMo1oCLAVjp2tIySuS4lrZLEjzVx1fOy584yE76P4g==", + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, - "requires": { - "@types/core-js": "^0.9.41", - "@types/mkdirp": "^0.3.29", - "@types/node": "^9.3.0", - "@types/rimraf": "^0.0.28", - "is-wsl": "^1.1.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "0.5.1", - "rimraf": "^2.6.1" - }, - "dependencies": { - "@types/node": { - "version": "9.6.46", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.46.tgz", - "integrity": "sha512-W8W76mPzOkN1KuzB25yFIqv1ESj2gp8MILJByUnLcDhOZsuSaDhY8vXLEP9+6OWCqNe7W+3zh2L+rb8kg9rsFA==", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - } + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "chrome-remote-interface": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.25.7.tgz", - "integrity": "sha512-6zI6LbR2IiGmduFZededaerEr9hHXabxT/L+fRrdq65a0CfyLMzpq0BKuZiqN0Upqcacsb6q2POj7fmobwBsEA==", + "node_modules/nanoid": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", + "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==", "dev": true, - "requires": { - "commander": "2.11.x", - "ws": "3.3.x" + "bin": { + "nanoid": "bin/nanoid.cjs" }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "chromy": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/chromy/-/chromy-0.5.11.tgz", - "integrity": "sha512-SBz5/xPYgeQiwFGMixPNQcbgnzsRHGCJnZKNJ5S0SmauSUY77/mqA8NjotQa12SZ3tZy0NX2gyGP41BAUWI6Rg==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "requires": { - "async-chain-proxy": "^0.1.5", - "babel-runtime": "^6.26.0", - "chrome-launcher": "^0.10.2", - "chrome-remote-interface": "^0.25.5", - "jimp": "^0.2.28", - "uuid": "^3.2.1" + "engines": { + "node": ">=0.10.0" } }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "engines": { + "node": ">=6" } }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, - "requires": { - "chalk": "^1.1.3" - }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - } + "boolbase": "~1.0.0" } }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "node_modules/object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "node_modules/object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", "dev": true, - "requires": { - "source-map": "~0.6.0" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "requires": { - "restore-cursor": "^2.0.0" + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "cli-width": { + "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "clipboard": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", - "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" } }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "clone-deep": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, - "requires": { - "for-own": "^1.0.0", - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.0", - "shallow-clone": "^1.0.0" - }, "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "clone-regexp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz", - "integrity": "sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "requires": { - "is-regexp": "^1.0.0", - "is-supported-regexp-flag": "^1.0.0" + "engines": { + "node": ">=8" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "requires": { - "q": "^1.1.2" + "engines": { + "node": ">=8" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collapse-white-space": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", - "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true, - "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" + "engines": { + "node": ">=0.10.0" } }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "node_modules/postcss": { + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.9.tgz", + "integrity": "sha512-b+TmuIL4jGtCHtoLi+G/PisuIl9avxs8IZMSmlABRwNz5RLUUACrC+ws81dcomz1nRezm5YPdXiMEzBEKgYn+Q==", "dev": true, - "requires": { - "color-name": "^1.1.1" + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.22", + "source-map": "^0.6.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "dev": true, - "requires": { - "color-name": "^1.0.0" + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" } }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "node_modules/postcss-calc/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "node_modules/postcss-calc/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "delayed-stream": "~1.0.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "node_modules/postcss-calc/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true + "node_modules/postcss-calc/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "node_modules/postcss-calc/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true + "node_modules/postcss-calc/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } }, - "compressible": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.16.tgz", - "integrity": "sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA==", + "node_modules/postcss-calc/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "mime-db": ">= 1.38.0 < 2" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/postcss-calc/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "node_modules/postcss-cli": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.3.1.tgz", + "integrity": "sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q==", "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "dependencies": { + "chalk": "^4.0.0", + "chokidar": "^3.3.0", + "dependency-graph": "^0.9.0", + "fs-extra": "^9.0.0", + "get-stdin": "^8.0.0", + "globby": "^11.0.0", + "postcss-load-config": "^3.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^3.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "postcss": "bin/postcss" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "concatenate": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/concatenate/-/concatenate-0.0.2.tgz", - "integrity": "sha1-C0nW6MQQR9dyjNyNYqCGYjOXtJ8=", + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dev": true, - "requires": { - "globs": "^0.1.2" + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "node_modules/postcss-colormin/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" + "dependencies": { + "color-convert": "^1.9.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-colormin/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", - "dev": true + "node_modules/postcss-colormin/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "node_modules/postcss-colormin/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "date-now": "^0.1.4" + "dependencies": { + "color-name": "1.1.3" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "node_modules/postcss-colormin/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "consolidate": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", - "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", + "node_modules/postcss-colormin/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "bluebird": "^3.1.1" + "engines": { + "node": ">=4" } }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true + "node_modules/postcss-colormin/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "node_modules/postcss-colormin/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true + "node_modules/postcss-convert-values/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "node_modules/postcss-convert-values/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "node_modules/postcss-convert-values/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "node_modules/postcss-convert-values/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "node_modules/postcss-convert-values/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "node_modules/postcss-convert-values/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } }, - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "node_modules/postcss-convert-values/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-convert-values/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "node_modules/postcss-discard-comments/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "node_modules/postcss-discard-comments/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "cross-env": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", - "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", + "node_modules/postcss-discard-comments/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "cross-spawn": "^6.0.5", - "is-windows": "^1.0.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/postcss-discard-comments/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "dependencies": { + "color-name": "1.1.3" } }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "node_modules/postcss-discard-comments/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "node_modules/postcss-discard-comments/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "inherits": "^2.0.3", + "dependencies": { + "chalk": "^2.4.2", "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "supports-color": "^6.1.0" }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-loader": { - "version": "0.28.11", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", - "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", + "node_modules/postcss-discard-comments/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": "^3.10.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.1.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" + "dependencies": { + "postcss": "^7.0.0" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - } + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "css-unit-converter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", - "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", - "dev": true - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "node_modules/postcss-discard-duplicates/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" - }, - "dependencies": { - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" - } - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "dev": true, - "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "node_modules/postcss-discard-duplicates/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "node_modules/postcss-discard-duplicates/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "array-find-index": "^1.0.1" + "dependencies": { + "color-name": "1.1.3" } }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "node_modules/postcss-discard-duplicates/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "node_modules/postcss-discard-duplicates/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "es5-ext": "^0.10.9" + "engines": { + "node": ">=4" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "node_modules/postcss-discard-duplicates/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "assert-plus": "^1.0.0" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "date-format": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-0.0.2.tgz", - "integrity": "sha1-+v1Ej3IRXvHitzkVWukvK+bCjdE=", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" + "node_modules/postcss-discard-duplicates/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "node_modules/postcss-discard-empty/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "node_modules/postcss-discard-empty/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "node_modules/postcss-discard-empty/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "node_modules/postcss-discard-empty/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "repeating": "^2.0.0" + "dependencies": { + "color-name": "1.1.3" } }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "node_modules/postcss-discard-empty/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "node_modules/postcss-discard-empty/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "engines": { + "node": ">=4" } }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "node_modules/postcss-discard-empty/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "path-type": "^3.0.0" - }, "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "diverged": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/diverged/-/diverged-0.1.3.tgz", - "integrity": "sha512-W8BLyp4Eo+YW9uQ3F5c9BXDT9ITCARA2CFQVb+v57FWYfkr0XjwNOASZacDCq+syk1i/obZ4BZ3w1qtlRO6hQw==", + "node_modules/postcss-discard-empty/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "diff": "^3.5.0", - "pixelmatch": "^4.0.2", - "pngjs": "^3.3.3", - "super-simple-web-server": "^1.0.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "node_modules/postcss-discard-overridden/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/postcss-discard-overridden/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "esutils": "^2.0.2" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "node_modules/postcss-discard-overridden/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true + "node_modules/postcss-discard-overridden/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "node_modules/postcss-discard-overridden/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "node_modules/postcss-discard-overridden/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "domelementtype": "1" + "engines": { + "node": ">=4" } }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "node_modules/postcss-discard-overridden/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", - "dev": true - }, - "dotenv-expand": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", - "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "node_modules/postcss-discard-overridden/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "easy-extender": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "node_modules/postcss-import": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.1.tgz", + "integrity": "sha512-Xn2+z++vWObbEPhiiKO1a78JiyhqipyrXHBb3AHpv0ks7Cdg+GxQQJ24ODNMTanldf7197gSP3axppO9yaG0lA==", "dev": true, - "requires": { - "lodash": "^4.17.10" + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "eazy-logger": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", - "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "node_modules/postcss-load-config": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.0.1.tgz", + "integrity": "sha512-/pDHe30UYZUD11IeG8GWx9lNtu1ToyTsZHnyy45B4Mrwr/Kb6NgYl7k753+05CJNKnjbwh4975amoPJ+TEjHNQ==", "dev": true, - "requires": { - "tfunk": "^3.0.1" + "dependencies": { + "cosmiconfig": "^7.0.0", + "import-cwd": "^3.0.0" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "node_modules/postcss-load-config/node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "node_modules/postcss-load-config/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "electron-to-chromium": { - "version": "1.3.119", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.119.tgz", - "integrity": "sha512-3mtqcAWa4HgG+Djh/oNXlPH0cOH6MmtwxN1nHSaReb9P0Vn51qYPqYwLeoSuAX9loU1wrOBhFbiX3CkeIxPfgg==", - "dev": true + "node_modules/postcss-load-config/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "node_modules/postcss-load-config/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "engines": { + "node": ">=4" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "node_modules/postcss-merge-longhand/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-merge-longhand/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-merge-longhand/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-merge-longhand/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-merge-longhand/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "node_modules/postcss-merge-longhand/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "node_modules/postcss-merge-longhand/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "once": "^1.4.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "engine.io": { + "node_modules/postcss-merge-rules/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" - }, - "dependencies": { - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "engine.io-client": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.4.tgz", - "integrity": "sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ==", + "node_modules/postcss-merge-rules/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "node_modules/postcss-merge-rules/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "node_modules/postcss-merge-rules/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" + "dependencies": { + "color-name": "1.1.3" } }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "node_modules/postcss-merge-rules/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "envify": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", - "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", - "requires": { - "esprima": "^4.0.0", - "through": "~2.3.4" + "node_modules/postcss-merge-rules/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" } }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "node_modules/postcss-merge-rules/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "prr": "~1.0.1" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, - "requires": { - "is-arrayish": "^0.2.1" + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" } }, - "error-stack-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", - "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", + "node_modules/postcss-merge-rules/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "stackframe": "^1.0.4" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "node_modules/postcss-minify-font-values/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "es5-ext": { - "version": "0.10.49", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz", - "integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==", + "node_modules/postcss-minify-font-values/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "node_modules/postcss-minify-font-values/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "node_modules/postcss-minify-font-values/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "dependencies": { + "color-name": "1.1.3" } }, - "es6-promise": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", - "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" + "node_modules/postcss-minify-font-values/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "node_modules/postcss-minify-font-values/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "es6-promise": "^4.0.3" + "engines": { + "node": ">=4" } }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "node_modules/postcss-minify-font-values/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-font-values/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "es6-templates": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", - "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, - "requires": { - "recast": "~0.11.12", - "through": "~2.3.6" + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "node_modules/postcss-minify-gradients/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "node_modules/postcss-minify-gradients/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "node_modules/postcss-minify-gradients/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "eslint": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.3.tgz", - "integrity": "sha512-vMGi0PjCHSokZxE0NLp2VneGw5sio7SSiDNgIUn2tC0XkWJRNOIoHIg3CliLVfXnJsiHxGAYrkw0PieAu8+KYQ==", + "node_modules/postcss-minify-gradients/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.12.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", - "dev": true - }, - "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "dependencies": { + "color-name": "1.1.3" } }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "node_modules/postcss-minify-gradients/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/postcss-minify-gradients/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "engines": { + "node": ">=4" } }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "node_modules/postcss-minify-gradients/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "node_modules/postcss-minify-gradients/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "dependencies": { + "has-flag": "^3.0.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - } + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + "node_modules/postcss-minify-params/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "node_modules/postcss-minify-params/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "estraverse": "^4.0.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "node_modules/postcss-minify-params/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "estraverse": "^4.1.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true + "node_modules/postcss-minify-params/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "node_modules/postcss-minify-params/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "node_modules/postcss-minify-params/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "node_modules/postcss-minify-params/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "node_modules/postcss-minify-params/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "original": ">=0.0.5" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "node_modules/postcss-minify-selectors/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "execall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", - "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", + "node_modules/postcss-minify-selectors/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "clone-regexp": "^1.0.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "node_modules/postcss-minify-selectors/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "node_modules/postcss-minify-selectors/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", - "qs": "6.5.1", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - } + "dependencies": { + "color-name": "1.1.3" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "node_modules/postcss-minify-selectors/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/postcss-minify-selectors/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" } }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "node_modules/postcss-minify-selectors/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "node_modules/postcss-normalize-charset/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "node_modules/postcss-normalize-charset/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "~1.0.1" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "node_modules/postcss-normalize-charset/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "node_modules/postcss-normalize-charset/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "fast-glob": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", - "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "node_modules/postcss-normalize-charset/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" + "engines": { + "node": ">=4" } }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "node_modules/postcss-normalize-charset/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "node_modules/postcss-normalize-charset/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "node_modules/postcss-normalize-display-values/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "node_modules/postcss-normalize-display-values/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "node_modules/postcss-normalize-display-values/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "flat-cache": "^2.0.1" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "file-loader": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", - "integrity": "sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg==", + "node_modules/postcss-normalize-display-values/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "loader-utils": "^1.0.2" + "dependencies": { + "color-name": "1.1.3" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "node_modules/postcss-normalize-display-values/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/postcss-normalize-display-values/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-display-values/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/postcss-normalize-positions/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "locate-path": "^2.0.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "node_modules/postcss-normalize-positions/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-positions/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", - "dev": true + "node_modules/postcss-normalize-positions/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "node_modules/postcss-normalize-positions/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "node_modules/postcss-normalize-positions/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "engines": { + "node": ">=4" } }, - "focus-visible": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/focus-visible/-/focus-visible-4.1.5.tgz", - "integrity": "sha512-yo/njtk/BB4Z2euzaZe3CZrg4u5s5uEi7ZwbHBJS2quHx51N0mmcx9nTIiImUGlgy+vf26d0CcQluahBBBL/Fw==" + "node_modules/postcss-normalize-positions/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } }, - "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/postcss-normalize-positions/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "is-callable": "^1.1.3" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + "node_modules/postcss-normalize-repeat-style/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "node_modules/postcss-normalize-repeat-style/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "node_modules/postcss-normalize-repeat-style/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "node_modules/postcss-normalize-repeat-style/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "node_modules/postcss-normalize-repeat-style/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "map-cache": "^0.2.2" + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "friendly-errors-webpack-plugin": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", - "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==", + "node_modules/postcss-normalize-repeat-style/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "chalk": "^1.1.3", - "error-stack-parser": "^2.0.0", - "string-width": "^2.0.0" + "dependencies": { + "has-flag": "^3.0.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - } + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "node_modules/postcss-normalize-string/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "node_modules/postcss-normalize-string/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "node_modules/postcss-normalize-string/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "node_modules/postcss-normalize-string/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-normalize-string/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "fsevents": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "node_modules/postcss-normalize-string/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "globals": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", - "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", - "dev": true - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", - "dev": true - }, - "globs": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globs/-/globs-0.1.4.tgz", - "integrity": "sha512-D23dWbOq48vlOraoSigbcQV4tWrnhwk+E/Um2cMuDS3/5dwGmdFeA7L/vAvDhLFlQOTDqHcXh35m/71g2A2WzQ==", - "dev": true, - "requires": { - "glob": "^7.1.1" - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "requires": { - "delegate": "^3.1.2" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-loader": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.4.5.tgz", - "integrity": "sha1-X7zYfNY6XEmn/OL+VvQl4Fcpxow=", - "dev": true, - "requires": { - "es6-templates": "^0.2.2", - "fastparse": "^1.1.1", - "html-minifier": "^3.0.1", - "loader-utils": "^1.0.2", - "object-assign": "^4.1.0" - } - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - } - } - } - } - }, - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "readable-stream": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", - "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "http-parser-js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - } - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "img-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/img-loader/-/img-loader-3.0.1.tgz", - "integrity": "sha512-0jDJqexgzOuq3zlXwFTBKJlMcaP1uXyl5t4Qu6b1IgXb3IwBDjPfVylBC8vHFIIESDw/S+5QkBbtBrt4T8wESA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - } - }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "dependencies": { - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } + "engines": { + "node": ">=4" } }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "node_modules/postcss-normalize-string/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "import-lazy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", - "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", - "dev": true - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", - "dev": true, - "requires": { - "meow": "^3.3.0" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true - }, - "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/postcss-normalize-string/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "is-alphabetical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", - "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==", - "dev": true - }, - "is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", - "dev": true - }, - "is-alphanumerical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", - "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "dev": true, - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "node_modules/postcss-normalize-timing-functions/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "binary-extensions": "^1.0.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "node_modules/postcss-normalize-timing-functions/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "builtin-modules": "^1.0.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "node_modules/postcss-normalize-timing-functions/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-decimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", - "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/postcss-normalize-timing-functions/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "color-name": "1.1.3" } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/postcss-normalize-timing-functions/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "node_modules/postcss-normalize-timing-functions/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "number-is-nan": "^1.0.0" + "engines": { + "node": ">=4" } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "node_modules/postcss-normalize-timing-functions/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "is-extglob": "^2.1.1" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "is-hexadecimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", - "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==", + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "node_modules/postcss-normalize-timing-functions/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "dev": true, - "requires": { - "lodash.isfinite": "^3.3.2" + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "node_modules/postcss-normalize-unicode/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "is-number": "^4.0.0" - }, "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "node_modules/postcss-normalize-unicode/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "is-path-inside": "^1.0.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "node_modules/postcss-normalize-unicode/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "path-is-inside": "^1.0.1" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/postcss-normalize-unicode/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "isobject": "^3.0.1" + "dependencies": { + "color-name": "1.1.3" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "node_modules/postcss-normalize-unicode/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "node_modules/postcss-normalize-unicode/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "has": "^1.0.1" + "engines": { + "node": ">=4" } }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-supported-regexp-flag": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", - "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", - "dev": true - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "node_modules/postcss-normalize-unicode/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-whitespace-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", - "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-word-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", - "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "isarray": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", - "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "node_modules/postcss-normalize-unicode/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "node_modules/postcss-normalize-url/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "jimp": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", - "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", + "node_modules/postcss-normalize-url/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "bignumber.js": "^2.1.0", - "bmp-js": "0.0.3", - "es6-promise": "^3.0.2", - "exif-parser": "^0.1.9", - "file-type": "^3.1.0", - "jpeg-js": "^0.2.0", - "load-bmfont": "^1.2.3", - "mime": "^1.3.4", - "mkdirp": "0.5.1", - "pixelmatch": "^4.0.0", - "pngjs": "^3.0.0", - "read-chunk": "^1.0.1", - "request": "^2.65.0", - "stream-to-buffer": "^0.1.0", - "tinycolor2": "^1.1.2", - "url-regex": "^3.0.0" - }, - "dependencies": { - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "dev": true - }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - } + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "jpeg-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", - "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=", - "dev": true + "node_modules/postcss-normalize-url/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", - "dev": true + "node_modules/postcss-normalize-url/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "node_modules/postcss-normalize-url/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "node_modules/postcss-normalize-url/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "engines": { + "node": ">=4" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "node_modules/postcss-normalize-url/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "optional": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "node_modules/postcss-normalize-url/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true + "node_modules/postcss-normalize-whitespace/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "node_modules/postcss-normalize-whitespace/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "node_modules/postcss-normalize-whitespace/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true + "node_modules/postcss-normalize-whitespace/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "node_modules/postcss-normalize-whitespace/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "node_modules/postcss-normalize-whitespace/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=4" } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "node_modules/postcss-normalize-whitespace/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "jump.js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jump.js/-/jump.js-1.0.2.tgz", - "integrity": "sha1-4GQbR/QKOPITnCX9oFAL8o5DAVo=", + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "junit-report-builder": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/junit-report-builder/-/junit-report-builder-1.3.3.tgz", - "integrity": "sha512-75bwaXjP/3ogyzOSkkcshXGG7z74edkJjgTZlJGAyzxlOHaguexM3VLG6JyD9ZBF8mlpgsUPB1sIWU4LISgeJw==", + "node_modules/postcss-normalize-whitespace/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "date-format": "0.0.2", - "lodash": "^4.17.15", - "mkdirp": "^0.5.0", - "xmlbuilder": "^10.0.0" - }, "dependencies": { - "xmlbuilder": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", - "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==", - "dev": true - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", - "dev": true - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "dev": true, - "requires": { - "graceful-fs": "^4.1.9" + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "known-css-properties": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.11.0.tgz", - "integrity": "sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w==", - "dev": true + "node_modules/postcss-ordered-values/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "laravel-mix": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-2.1.14.tgz", - "integrity": "sha512-M/Vzgr6+QQGukciAQ91SZvOhUyrPm41bq/nRyF2j2HR8/g3vzvTQbRkdTGOpq9Z+y3REEj8qR2A3ScnEG37Dgw==", + "node_modules/postcss-ordered-values/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "autoprefixer": "^7.2.6", - "babel-core": "^6.24.1", - "babel-loader": "^7.1.1", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-preset-env": "^1.5.1", - "chokidar": "^2.0.3", - "clean-css": "^4.1.3", - "concatenate": "0.0.2", - "css-loader": "^0.28.9", - "dotenv": "^4.0.0", - "dotenv-expand": "^4.2.0", - "extract-text-webpack-plugin": "^3.0.2", - "file-loader": "^0.11.2", - "friendly-errors-webpack-plugin": "^1.6.1", - "fs-extra": "^3.0.1", - "glob": "^7.1.2", - "html-loader": "^0.4.5", - "img-loader": "^3.0.0", - "lodash": "^4.17.5", - "md5": "^2.2.1", - "node-sass": "^4.9.0", - "postcss-loader": "^2.1.0", - "resolve-url-loader": "^2.2.1", - "sass-loader": "^6.0.5", - "style-loader": "^0.18.2", - "uglify-js": "^2.8.29", - "uglifyjs-webpack-plugin": "^1.1.8", - "vue-loader": "^13.7.1", - "vue-template-compiler": "^2.5.13", - "webpack": "^3.11.0", - "webpack-chunk-hash": "^0.4.0", - "webpack-dev-server": "^2.11.1", - "webpack-merge": "^4.1.0", - "webpack-notifier": "^1.5.1", - "yargs": "^8.0.2" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "lazysizes": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/lazysizes/-/lazysizes-5.2.2.tgz", - "integrity": "sha512-fYgOv1Y35M86/7qyAdPPqoOhuyZrjxEAPxqwToRY2bO/PoBJ4lSqZYuZoavNp6eyuLpIAdHodpsPfj2Lkt86FQ==" + "node_modules/postcss-ordered-values/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "node_modules/postcss-ordered-values/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "invert-kv": "^1.0.0" + "dependencies": { + "color-name": "1.1.3" } }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "node_modules/postcss-ordered-values/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "node_modules/postcss-ordered-values/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "engines": { + "node": ">=4" } }, - "lighthouse-logger": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz", - "integrity": "sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw==", + "node_modules/postcss-ordered-values/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "debug": "^2.6.8", - "marky": "^1.2.0" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "list.js": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/list.js/-/list.js-1.5.0.tgz", - "integrity": "sha1-pMv8goHd78Av2y0wyHSL+uJfvNo=", - "requires": { - "string-natural-compare": "^2.0.2" + "node_modules/postcss-ordered-values/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "load-bmfont": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz", - "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==", + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "dev": true, - "requires": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "node_modules/postcss-reduce-initial/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "load-script": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", - "integrity": "sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ=" - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "node_modules/postcss-reduce-initial/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "loadjs": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/loadjs/-/loadjs-3.6.1.tgz", - "integrity": "sha512-AZEBw2GWdJk2IzBgQ+Wohoao5j+t0rajqK8dJu8jQqgYxDTxhmCt0ayMo/vCa0ZAMvZxnJcam6uLICfnVd8KAw==" - }, - "localtunnel": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.0.tgz", - "integrity": "sha512-g6E0aLgYYDvQDxIjIXkgJo2+pHj3sGg4Wz/XP3h2KtZnRsWPbOQY+hw1H8Z91jep998fkcVE9l+kghO+97vllg==", + "node_modules/postcss-reduce-initial/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "axios": "0.19.0", - "debug": "4.1.1", - "openurl": "1.1.1", - "yargs": "13.3.0" - }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "node_modules/postcss-reduce-initial/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "dependencies": { + "color-name": "1.1.3" } }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "node_modules/postcss-reduce-initial/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "node_modules/postcss-reduce-initial/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" + "engines": { + "node": ">=4" } }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "node_modules/postcss-reduce-initial/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true + "node_modules/postcss-reduce-initial/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", - "dev": true + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "node_modules/postcss-reduce-transforms/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true + "node_modules/postcss-reduce-transforms/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true + "node_modules/postcss-reduce-transforms/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", - "dev": true + "node_modules/postcss-reduce-transforms/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "node_modules/postcss-reduce-transforms/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "node_modules/postcss-reduce-transforms/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "chalk": "^2.0.1" + "engines": { + "node": ">=4" } }, - "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", - "dev": true + "node_modules/postcss-reduce-transforms/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "longest-streak": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", - "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", - "dev": true + "node_modules/postcss-reduce-transforms/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "node_modules/postcss-reporter": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.2.tgz", + "integrity": "sha512-JyQ96NTQQsso42y6L1H1RqHfWH1C3Jr0pt91mVv5IdYddZAE9DUZxuferNgk6q0o6vBVOrfVJb10X1FgDzjmDw==", "dev": true, - "requires": { - "js-tokens": "^3.0.0" + "dependencies": { + "colorette": "^1.2.1", + "lodash.difference": "^4.5.0", + "lodash.forown": "^4.4.0", + "lodash.get": "^4.4.2", + "lodash.groupby": "^4.6.0", + "lodash.sortby": "^4.7.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "node_modules/postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "dependencies": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "node_modules/postcss-svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "node_modules/postcss-svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "pify": "^3.0.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "node_modules/postcss-svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "node_modules/postcss-svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "node_modules/postcss-svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "object-visit": "^1.0.0" + "engines": { + "node": ">=4" } }, - "markdown-escapes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", - "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==", - "dev": true + "node_modules/postcss-svgo/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } }, - "markdown-table": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", - "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==", + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "marky": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.1.tgz", - "integrity": "sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ==", - "dev": true + "node_modules/postcss-svgo/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", - "dev": true + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "mathml-tag-names": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.0.tgz", - "integrity": "sha512-3Zs9P/0zzwTob2pdgT0CHZuMbnSUSp8MB1bddfm+HDmnFWHGT4jvEZRf+2RuPoa+cjdn/z25SEt5gFTqdhvJAg==", - "dev": true + "node_modules/postcss-unique-selectors/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "node_modules/postcss-unique-selectors/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "node_modules/postcss-unique-selectors/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "mdast-util-compact": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.2.tgz", - "integrity": "sha512-d2WS98JSDVbpSsBfVvD9TaDMlqPRz7ohM/11G0rp5jOBb5q96RJ6YLszQ/09AAixyzh23FeIpCGqfaamEADtWg==", + "node_modules/postcss-unique-selectors/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "unist-util-visit": "^1.1.0" + "dependencies": { + "color-name": "1.1.3" } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "node_modules/postcss-unique-selectors/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "node_modules/postcss-unique-selectors/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "mimic-fn": "^1.0.0" + "engines": { + "node": ">=4" } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "node_modules/postcss-unique-selectors/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "node_modules/postcss-unique-selectors/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, - "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", - "dev": true + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "engines": { + "node": ">=8" } }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", - "dev": true + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, - "requires": { - "mime-db": "~1.33.0" + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, "dependencies": { - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - } + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" + "node_modules/read-pkg/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, - "requires": { - "brace-expansion": "^1.1.7" + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mitt": { + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "bin": { + "semver": "bin/semver" } }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "dev": true, - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - } + "is-arrayish": "^0.3.1" } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } + "engines": { + "node": ">=8" } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "engines": { + "node": ">=0.10.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, - "optional": true + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } }, - "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, - "requires": { - "lower-case": "^1.1.1" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "node-releases": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.11.tgz", - "integrity": "sha512-8v1j5KfP+s5WOTa1spNUAOfreajQPN12JXbRR0oDE+YrJBQCXBnNqUDj27EKpPLOoSiU3tKi3xGPB+JaOdUEQQ==", + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, - "requires": { - "semver": "^5.3.0" + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node-resemble-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-resemble-js/-/node-resemble-js-0.2.0.tgz", - "integrity": "sha1-ijbGZ4ph5dhFX+xYAJsbAnGxkJo=", + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "dev": true, - "requires": { - "jpeg-js": "0.2.0", - "pngjs": "~2.2.0" + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "pngjs": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-2.2.0.tgz", - "integrity": "sha1-ZJZjYJoOurh8jwiz/nJASLUdnX8=", - "dev": true - } + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node-sass": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", - "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "node_modules/stylehacks/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "2.2.5", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylehacks/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "node_modules/stylehacks/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "abbrev": "1" + "dependencies": { + "color-name": "1.1.3" } }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "node_modules/stylehacks/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/stylehacks/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "engines": { + "node": ">=4" } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "node_modules/stylehacks/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylehacks/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" } }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "node_modules/trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", "dev": true, - "requires": { - "path-key": "^2.0.0" + "engines": { + "node": ">=8" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "node_modules/uglifyjs-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uglifyjs-folder/-/uglifyjs-folder-2.0.0.tgz", + "integrity": "sha512-jQGpQ9TxgDE8p0M6jEmCZDquMf2k6O34yPUHnwZSSzKbOSqJA32CIjtsfWDP/CPTnTVfDur/IUOwnNb5mBN0lQ==", + "dev": true, + "dependencies": { + "extend": "3.0.2", + "globby": "11.0.1", + "graceful-fs": "4.2.4", + "meow": "7.0.1", + "mkdirp": "1.0.4", + "terser": "4.8.0" + }, + "bin": { + "uglifyjs-folder": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/uglifyjs-folder/node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uglifyjs-folder/node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "number-is-nan": { + "node_modules/uglifyjs-folder/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uniq": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "object-hash": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.1.5.tgz", - "integrity": "sha1-vdhE4DDQhhtpLKF1xsq2ho7CM9c=", - "dev": true + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" - }, - "object-path": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", - "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", - "dev": true + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { - "isobject": "^3.0.0" + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "requires": { - "isobject": "^3.0.1" + "engines": { + "node": ">=10" } }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "requires": { - "ee-first": "1.1.1" + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "requires": { - "wrappy": "1" + "engines": { + "node": ">=6" } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "node_modules/yargs/node_modules/yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true, + "engines": { + "node": ">=10" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "@babel/highlight": "^7.12.13" } }, - "openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", "dev": true, "requires": { - "url-parse": "^1.4.3" + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" } }, - "os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=", + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", "dev": true }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true }, - "os-tmpdir": { + "alphanum-sort": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "color-convert": "^2.0.1" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { - "p-try": "^1.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "sprintf-js": "~1.0.2" } }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "callsites": "^3.0.0" + "fill-range": "^7.0.1" } }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", "dev": true, "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" } }, - "parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=", - "dev": true - }, - "parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=", + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", - "dev": true, - "requires": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" - } - }, - "parse-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.1.tgz", - "integrity": "sha512-NBWYLQm1KSoDKk7GAHyioLTvCZ5QjdH/ASBBQTD3iLiAWJXS5bg1jEWI8nIJ+vgVvsceBVBcDGRWSo0KVQBvvg==", + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, - "parse-headers": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", - "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { - "for-each": "^0.3.3", - "string.prototype.trim": "^1.1.2" + "callsites": "^2.0.0" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "caller-callsite": "^2.0.0" } }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "requires": { - "process": "^0.11.1", - "util": "^0.10.3" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" }, "dependencies": { - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true } } }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { + "caniuse-api": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "caniuse-lite": { + "version": "1.0.30001208", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz", + "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==", "dev": true }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" } }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } }, - "phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, "requires": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" - }, - "dependencies": { - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "color-name": "1.1.3" } }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", - "dev": true, - "requires": { - "pngjs": "^3.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true - }, - "popper.js": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.7.tgz", - "integrity": "sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==" - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "dev": true, "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" + "color-convert": "^1.9.1", + "color-string": "^1.5.4" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "ms": "^2.1.1" + "color-name": "1.1.3" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true } } }, - "portscanner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", - "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "async": "1.5.2", - "is-number-like": "^1.0.3" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } + "color-name": "~1.1.4" } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", "dev": true, "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, - "postcss-calc": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", - "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "dev": true, "requires": { - "css-unit-converter": "^1.1.1", - "postcss": "^7.0.5", - "postcss-selector-parser": "^5.0.0-rc.4", - "postcss-value-parser": "^3.3.1" + "postcss": "^7.0.1", + "timsort": "^0.3.0" }, "dependencies": { "ansi-styles": { @@ -9986,16 +7034,31 @@ } } }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -10003,29 +7066,6 @@ "supports-color": "^6.1.0" } }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -10037,507 +7077,263 @@ } } }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "dev": true, - "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, "requires": { - "postcss": "^5.0.14" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "mdn-data": "2.0.4", + "source-map": "^0.6.1" } }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", "dev": true, "requires": { - "postcss": "^5.0.4" + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "color-convert": "^1.9.0" } }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "dev": true, - "requires": { - "postcss": "^5.0.14" - }, - "dependencies": { "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "color-name": "1.1.3" } }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "dev": true, - "requires": { - "postcss": "^5.0.16" - }, - "dependencies": { - "chalk": { + "color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "^3.0.0" } } } }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "dev": true, - "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "color-convert": "^1.9.0" } }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", - "dev": true, - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "^3.0.0" } } } }, - "postcss-html": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", - "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", - "dev": true, - "requires": { - "htmlparser2": "^3.10.0" - } + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true }, - "postcss-jsx": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/postcss-jsx/-/postcss-jsx-0.36.0.tgz", - "integrity": "sha512-/lWOSXSX5jlITCKFkuYU2WLFdrncZmjSVyNpHAunEgirZXLwI8RjU556e3Uz4mv0WVHnJA9d3JWb36lK9Yx99g==", - "dev": true, - "requires": { - "@babel/core": ">=7.1.0" - } + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true }, - "postcss-less": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", - "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "dev": true, "requires": { - "postcss": "^7.0.14" + "postcss": "^7.0.0" }, "dependencies": { "ansi-styles": { @@ -10571,10 +7367,31 @@ } } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -10582,12 +7399,6 @@ "supports-color": "^6.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -10599,1094 +7410,988 @@ } } }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "dependency-graph": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz", + "integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "electron-to-chromium": { + "version": "1.3.712", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.712.tgz", + "integrity": "sha512-3kRVibBeCM4vsgoHHGKHmPocLqtFAGTrebXxxtgKs87hNUzXrX2NuS3jnBys7IozCnw7viQlozxKkmty2KNfrw==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", "dev": true, "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" + "import-from": "^3.0.0" } }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - } + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", "dev": true, "requires": { - "cosmiconfig": "^2.1.1", - "object-assign": "^4.1.0" + "resolve-from": "^5.0.0" }, "dependencies": { - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, - "postcss-loader": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", - "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "postcss": "^6.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^0.4.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } + "binary-extensions": "^2.0.0" } }, - "postcss-markdown": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/postcss-markdown/-/postcss-markdown-0.36.0.tgz", - "integrity": "sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ==", + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", "dev": true, "requires": { - "remark": "^10.0.1", - "unist-util-find-all-after": "^1.0.2" + "call-bind": "^1.0.0" } }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", "dev": true, "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" } }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", "dev": true, "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "has": "^1.0.3" } }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" } }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "p-locate": "^4.1.0" } }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, + "lodash.forown": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz", + "integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", + "dev": true + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "meow": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", + "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", "dev": true, "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "@types/minimist": "^1.2.0", + "arrify": "^2.0.1", + "camelcase": "^6.0.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" } }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.3.tgz", + "integrity": "sha512-ueuSaP4i67F/FAUac9zzZ0Dz/5KeKDkITYIS/k4fps+9qeh1SkeH6gbljcqz97mNBOsaWZ+iv2UobMKK/yD+aw==", "dev": true, "requires": { - "postcss": "^6.0.1" + "braces": "^3.0.1", + "picomatch": "^2.2.1" } }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } } }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "minimist": "^1.2.5" } }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "nanoid": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", + "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==", + "dev": true + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { - "postcss": "^5.0.5" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "boolbase": "~1.0.0" + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", "dev": true, "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" } }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", "dev": true, "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" } }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "p-try": "^2.0.0" } }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "p-limit": "^2.2.0" } }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" + "callsites": "^3.0.0" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } } } }, - "postcss-reporter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz", - "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "chalk": "^2.4.1", - "lodash": "^4.17.11", - "log-symbols": "^2.2.0", - "postcss": "^7.0.7" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "postcss": { + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.9.tgz", + "integrity": "sha512-b+TmuIL4jGtCHtoLi+G/PisuIl9avxs8IZMSmlABRwNz5RLUUACrC+ws81dcomz1nRezm5YPdXiMEzBEKgYn+Q==", "dev": true, "requires": { - "postcss": "^7.0.0" + "colorette": "^1.2.2", + "nanoid": "^3.1.22", + "source-map": "^0.6.1" + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" }, "dependencies": { "ansi-styles": { @@ -11720,10 +8425,31 @@ } } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -11731,12 +8457,6 @@ "supports-color": "^6.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -11748,14 +8468,37 @@ } } }, - "postcss-sass": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.5.tgz", - "integrity": "sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A==", + "postcss-cli": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.3.1.tgz", + "integrity": "sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "chokidar": "^3.3.0", + "dependency-graph": "^0.9.0", + "fs-extra": "^9.0.0", + "get-stdin": "^8.0.0", + "globby": "^11.0.0", + "postcss-load-config": "^3.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^3.0.0", + "yargs": "^16.0.0" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dev": true, "requires": { - "gonzales-pe": "^4.2.3", - "postcss": "^7.0.1" + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -11789,10 +8532,31 @@ } } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -11800,10 +8564,10 @@ "supports-color": "^6.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, "supports-color": { @@ -11817,13 +8581,14 @@ } } }, - "postcss-scss": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz", - "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==", + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -11857,10 +8622,31 @@ } } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -11868,10 +8654,10 @@ "supports-color": "^6.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, "supports-color": { @@ -11885,24 +8671,12 @@ } } }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-sorting": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-4.1.0.tgz", - "integrity": "sha512-r4T2oQd1giURJdHQ/RMb72dKZCuLOdWx2B/XhXN1Y1ZdnwXsKH896Qz6vD4tFy9xSjpKNYhlZoJmWyhH/7JUQw==", + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, "requires": { - "lodash": "^4.17.4", "postcss": "^7.0.0" }, "dependencies": { @@ -11937,10 +8711,31 @@ } } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -11948,12 +8743,6 @@ "supports-color": "^6.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -11965,1367 +8754,796 @@ } } }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" + "postcss": "^7.0.0" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "color-convert": "^1.9.0" } }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "dev": true, - "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - } - } - } - }, - "postcss-syntax": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", - "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", - "dev": true - }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - }, - "dependencies": { "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "color-name": "1.1.3" } }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "dev": true, - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - }, - "dependencies": { - "chalk": { + "color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.6.0" - } - }, - "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "puppeteer": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", - "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^2.2.1", - "mime": "^2.0.3", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "ms": "2.1.2" - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "has-flag": "^3.0.0" + } + } } }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "dev": true, "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" + "postcss": "^7.0.0" }, "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "color-name": "1.1.3" } }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true - } - } - }, - "read-chunk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", - "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "has-flag": "^3.0.0" } } } }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "dev": true, - "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "reduce": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce/-/reduce-1.0.2.tgz", - "integrity": "sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ==", - "requires": { - "object-keys": "^1.1.0" - }, - "dependencies": { - "object-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", - "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==" - } - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "dev": true, - "requires": { - "balanced-match": "^0.4.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remark": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz", - "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==", - "dev": true, - "requires": { - "remark-parse": "^6.0.0", - "remark-stringify": "^6.0.0", - "unified": "^7.0.0" - } - }, - "remark-parse": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", - "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", - "dev": true, - "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - } - }, - "remark-stringify": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz", - "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==", - "dev": true, - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^1.1.0", - "mdast-util-compact": "^1.0.0", - "parse-entities": "^1.0.2", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^1.0.1", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" - } - }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "requires": { - "throttleit": "^1.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "postcss": "^7.0.0" }, "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "resolve-url-loader": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-2.3.2.tgz", - "integrity": "sha512-sc/UVgiADdoTc+4cGPB7cUCnlEkzlxD1NXHw4oa9qA0fp30H8mAQ2ePJBP9MQ029DUuhEPouhNdvzT37pBCV0g==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "^1.1.0", - "camelcase": "^4.1.0", - "convert-source-map": "^1.5.1", - "loader-utils": "^1.1.0", - "lodash.defaults": "^4.0.0", - "rework": "^1.0.1", - "rework-visit": "^1.0.0", - "source-map": "^0.5.7", - "urix": "^0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "resp-modifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", - "dev": true, - "requires": { - "debug": "^2.2.0", - "minimatch": "^3.0.2" - } - }, - "respimage": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/respimage/-/respimage-1.4.2.tgz", - "integrity": "sha1-E3mQB8YcYbf0ecTBP4LHGZSVH4g=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "postcss-import": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.1.tgz", + "integrity": "sha512-Xn2+z++vWObbEPhiiKO1a78JiyhqipyrXHBb3AHpv0ks7Cdg+GxQQJ24ODNMTanldf7197gSP3axppO9yaG0lA==", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "postcss-load-config": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.0.1.tgz", + "integrity": "sha512-/pDHe30UYZUD11IeG8GWx9lNtu1ToyTsZHnyy45B4Mrwr/Kb6NgYl7k753+05CJNKnjbwh4975amoPJ+TEjHNQ==", "dev": true, "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" + "cosmiconfig": "^7.0.0", + "import-cwd": "^3.0.0" }, "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true } } }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass-loader": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", - "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "dev": true, "requires": { - "clone-deep": "^2.0.1", - "loader-utils": "^1.0.1", - "lodash.tail": "^4.1.1", - "neo-async": "^2.5.0", - "pify": "^3.0.0" + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" }, "dependencies": { - "pify": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "dev": true, "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" }, "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "has-flag": "^3.0.0" } } } }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "requires": { - "node-forge": "^0.10.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - } - }, - "serialize-javascript": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", - "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "has-flag": "^3.0.0" } } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "dev": true, "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^5.0.0", - "mixin-object": "^2.0.1" + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" }, "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -13336,872 +9554,452 @@ "requires": { "color-convert": "^1.9.0" } - } - } - }, - "smoothscroll-polyfill": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz", - "integrity": "sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "color-name": "1.1.3" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "has-flag": "^3.0.0" } } } }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "dev": true, "requires": { - "kind-of": "^3.2.0" + "postcss": "^7.0.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "color-convert": "^1.9.0" } - } - } - }, - "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", - "dev": true, - "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" - }, - "dependencies": { - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" + "color-name": "1.1.3" } }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "better-assert": "~1.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "better-assert": "~1.0.0" + "has-flag": "^3.0.0" } - }, - "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + } + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", - "to-array": "0.1.4" + "color-convert": "^1.9.0" } }, - "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "color-name": "1.1.3" } - } - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dev": true - }, - "socket.io-client": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.1.tgz", - "integrity": "sha512-YXmXn3pA8abPOY//JtYxou95Ihvzmg8U6kQyolArkIyLd0pgVhrfor/iMsox8cn07WCOOvvuJ6XKegzIucPutQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.4.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.1.tgz", - "integrity": "sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "ms": "2.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", - "dev": true, - "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" - }, - "dependencies": { - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "websocket-driver": ">=0.5.1" + "has-flag": "^3.0.0" } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true + } + } }, - "spdy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "dev": true, "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "ms": "^2.1.1" + "color-name": "1.1.3" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "ms": "^2.1.1" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "readable-stream": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", - "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "has-flag": "^3.0.0" } } } }, - "specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "stackframe": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", - "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", - "dev": true - }, - "state-toggle": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", - "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "color-convert": "^1.9.0" } - } - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "stream-throttle": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", - "dev": true, - "requires": { - "commander": "^2.2.0", - "limiter": "^1.0.5" - } - }, - "stream-to": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", - "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=", - "dev": true - }, - "stream-to-buffer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", - "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", - "dev": true, - "requires": { - "stream-to": "~0.2.0" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-natural-compare": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-2.0.3.tgz", - "integrity": "sha512-4Kcl12rNjc+6EKhY8QyDVuQTAlMWwRiNbsxnVwBUKFr7dYPQuXVrtNU4sEkjF9LHY0AY6uVbB3ktbkIH4LC+BQ==" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "has-flag": "^3.0.0" } } } }, - "string.prototype.trim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", - "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.0", - "function-bind": "^1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-entities": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", - "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", - "dev": true, - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "style-loader": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", - "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" - } - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", - "dev": true - }, - "stylelint": { - "version": "9.10.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-9.10.1.tgz", - "integrity": "sha512-9UiHxZhOAHEgeQ7oLGwrwoDR8vclBKlSX7r4fH0iuu0SfPwFaLkb1c7Q2j1cqg9P7IDXeAV2TvQML/fRQzGBBQ==", + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "dev": true, "requires": { - "autoprefixer": "^9.0.0", - "balanced-match": "^1.0.0", - "chalk": "^2.4.1", - "cosmiconfig": "^5.0.0", - "debug": "^4.0.0", - "execall": "^1.0.0", - "file-entry-cache": "^4.0.0", - "get-stdin": "^6.0.0", - "global-modules": "^2.0.0", - "globby": "^9.0.0", - "globjoin": "^0.1.4", - "html-tags": "^2.0.0", - "ignore": "^5.0.4", - "import-lazy": "^3.1.0", - "imurmurhash": "^0.1.4", - "known-css-properties": "^0.11.0", - "leven": "^2.1.0", - "lodash": "^4.17.4", - "log-symbols": "^2.0.0", - "mathml-tag-names": "^2.0.1", - "meow": "^5.0.0", - "micromatch": "^3.1.10", - "normalize-selector": "^0.2.0", - "pify": "^4.0.0", - "postcss": "^7.0.13", - "postcss-html": "^0.36.0", - "postcss-jsx": "^0.36.0", - "postcss-less": "^3.1.0", - "postcss-markdown": "^0.36.0", - "postcss-media-query-parser": "^0.2.3", - "postcss-reporter": "^6.0.0", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^4.0.0", - "postcss-sass": "^0.3.5", - "postcss-scss": "^2.0.0", - "postcss-selector-parser": "^3.1.0", - "postcss-syntax": "^0.36.2", - "postcss-value-parser": "^3.3.0", - "resolve-from": "^4.0.0", - "signal-exit": "^3.0.2", - "slash": "^2.0.0", - "specificity": "^0.4.1", - "string-width": "^3.0.0", - "style-search": "^0.1.0", - "sugarss": "^2.0.0", - "svg-tags": "^1.0.0", - "table": "^5.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -14211,489 +10009,359 @@ "color-convert": "^1.9.0" } }, - "autoprefixer": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.5.0.tgz", - "integrity": "sha512-hMKcyHsZn5+qL6AUeP3c8OyuteZ4VaUlg+fWbyl8z7PqsKHF/Bf8/px3K6AT8aMzDkBo8Bc11245MM+itDBOxQ==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "browserslist": "^4.4.2", - "caniuse-lite": "^1.0.30000947", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.14", - "postcss-value-parser": "^3.3.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "browserslist": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.2.tgz", - "integrity": "sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000951", - "electron-to-chromium": "^1.3.116", - "node-releases": "^1.1.11" + "color-name": "1.1.3" } }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30000951", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000951.tgz", - "integrity": "sha512-eRhP+nQ6YUkIcNQ6hnvdhMkdc7n3zadog0KXNRxAZTT2kHjUb1yGn71OrPhSn8MOvlX97g5CR97kGVj8fMsXWg==", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "cosmiconfig": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz", - "integrity": "sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "lodash.get": "^4.4.2", - "parse-json": "^4.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "ms": "^2.1.1" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "electron-to-chromium": { - "version": "1.3.118", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.118.tgz", - "integrity": "sha512-/1FpHvmKmKo2Z6CCza2HfkrKvKhU7Rq4nvyX1FOherdTrdTufhVrJbCrcrIqgqUCI+BG6JC2rlY4z5QA1G0NOw==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "file-entry-cache": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-4.0.0.tgz", - "integrity": "sha512-AVSwsnbV8vH/UVbvgEhf3saVQXORNv0ZzSkvkhQIaia5Tia+JhGTaa/ePUSVoPHQyGayQNmYfkzFi3WZV5zcpA==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "has-flag": "^3.0.0" } - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "color-convert": "^1.9.0" } }, - "globby": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.1.0.tgz", - "integrity": "sha512-VtYjhHr7ncls724Of5W6Kaahz0ag7dB4G62/2HsN+xEKG6SrPzM1AJMerGxQTwJGnN9reeyxdvXbuZYpfssCvg==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.1", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "ignore": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.6.tgz", - "integrity": "sha512-/+hp3kUf/Csa32ktIaj0OlRqQxrgs30n62M90UBpNd9k+ENEch5S+hmbW3DtcJGz3sYFTh4F3A6fQ0q7KWsp4w==", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "color-name": "1.1.3" } }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "has-flag": "^3.0.0" } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "color-convert": "^1.9.0" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "has-flag": "^3.0.0" } } } }, - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "dependencies": { - "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - } + "color-name": "1.1.3" } }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, - "read-pkg-up": { + "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "glob": "^7.1.3" + "has-flag": "^3.0.0" } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "color-convert": "^1.9.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "color-name": "1.1.3" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "has-flag": "^3.0.0" } } } }, - "stylelint-config-recommended": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-2.1.0.tgz", - "integrity": "sha512-ajMbivOD7JxdsnlS5945KYhvt7L/HwN6YeYF2BH6kE4UCLJR0YvXMf+2j7nQpJyYLZx9uZzU5G1ZOSBiWAc6yA==", - "dev": true - }, - "stylelint-config-standard": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-18.2.0.tgz", - "integrity": "sha512-07x0TaSIzvXlbOioUU4ORkCIM07kyIuojkbSVCyFWNVgXMXYHfhnQSCkqu+oHWJf3YADAnPGWzdJ53NxkoJ7RA==", - "dev": true, - "requires": { - "stylelint-config-recommended": "^2.1.0" - } - }, - "stylelint-order": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-2.1.0.tgz", - "integrity": "sha512-8oX4Y3Bh4e3s9e7nnYJkeyYg5yx8Fa7wwTNXJcabPrNqavK9FqZ3zNJFvCJFn+v5qTngvVWsh33DpOP2BdroBg==", + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "dev": true, "requires": { - "lodash": "^4.17.10", - "postcss": "^7.0.2", - "postcss-sorting": "^4.1.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -14727,10 +10395,31 @@ } } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -14738,10 +10427,10 @@ "supports-color": "^6.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, "supports-color": { @@ -14755,51 +10444,15 @@ } } }, - "stylelint-scss": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.5.4.tgz", - "integrity": "sha512-hEdEOfFXVqxWcUbenBONW/cAw5cJcEDasY8tGwKNAAn1GDHoZO1ATdWpr+iIk325mPGIQqVb1sUxsRxuL70trw==", - "dev": true, - "requires": { - "lodash": "^4.17.11", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^5.0.0", - "postcss-value-parser": "^3.3.1" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "sugarss": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", - "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "dev": true, "requires": { - "postcss": "^7.0.2" + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -14833,10 +10486,31 @@ } } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -14844,10 +10518,10 @@ "supports-color": "^6.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, "supports-color": { @@ -14857,1438 +10531,859 @@ "dev": true, "requires": { "has-flag": "^3.0.0" - } - } - } - }, - "super-simple-web-server": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/super-simple-web-server/-/super-simple-web-server-1.1.1.tgz", - "integrity": "sha512-wM+qHdU+a4dF9QSTezvcyYknMMIjMVdb+CBHzSV6BCrEtetSWkmQTK+0hpBApjDFxwmM/l5Axxo61KZVathomQ==", - "dev": true, - "requires": { - "express": "^4.16.3" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "svgxuse": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/svgxuse/-/svgxuse-1.2.6.tgz", - "integrity": "sha512-0KC0I24LDskC2vaVjUQfFmdtKJk8wFwMYOjCci0HlhBRSc0F86dZRqNBHf6BoS5bibQ7chgnBQWyJCTYkzVuSA==" - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, - "table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", - "dev": true, - "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", - "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", - "dev": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "dev": true, - "requires": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "tfunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", - "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "object-path": "^0.9.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - } - } - }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", - "dev": true - }, - "time-stamp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", - "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, - "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=", - "dev": true - }, - "tippy.js": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-4.2.1.tgz", - "integrity": "sha512-xEE7zYNgQxCDdPcuT6T04f0frPh0wO7CcIqJKMFazU/NqusyjCgYSkLRosIHoiRkZMRzSPOudC8wRN5GjvAyOQ==", - "requires": { - "popper.js": "^1.14.7" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "trim-trailing-lines": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", - "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==", - "dev": true - }, - "trough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz", - "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==", - "dev": true - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" - } - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" + } + } } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.22", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", - "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "dev": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" + "color-name": "1.1.3" } }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" + "has-flag": "^3.0.0" } } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "dev": true, "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "color-convert": "^1.9.0" } }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" + "has-flag": "^3.0.0" } } } }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "unherit": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", - "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "xtend": "^4.0.1" - } - }, - "unified": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", - "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "@types/vfile": "^3.0.0", - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^3.0.0", - "x-is-string": "^0.1.0" - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unist-util-find-all-after": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.2.tgz", - "integrity": "sha512-nDl79mKpffXojLpCimVXnxhlH/jjaTnDuScznU9J4jjsaUtBdDbxmlc109XtcqxY4SDO0SwzngsxxW8DIISt1w==", - "dev": true, - "requires": { - "unist-util-is": "^2.0.0" - } - }, - "unist-util-is": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", - "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==", - "dev": true - }, - "unist-util-remove-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz", - "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==", + "postcss-reporter": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.2.tgz", + "integrity": "sha512-JyQ96NTQQsso42y6L1H1RqHfWH1C3Jr0pt91mVv5IdYddZAE9DUZxuferNgk6q0o6vBVOrfVJb10X1FgDzjmDw==", "dev": true, "requires": { - "unist-util-visit": "^1.1.0" + "colorette": "^1.2.1", + "lodash.difference": "^4.5.0", + "lodash.forown": "^4.4.0", + "lodash.get": "^4.4.2", + "lodash.groupby": "^4.6.0", + "lodash.sortby": "^4.7.0" } }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", - "dev": true - }, - "unist-util-visit": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.0.tgz", - "integrity": "sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw==", + "postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "dev": true, "requires": { - "unist-util-visit-parents": "^2.0.0" + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" } }, - "unist-util-visit-parents": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz", - "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==", + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "dev": true, "requires": { - "unist-util-is": "^2.1.2" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" }, "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "isarray": "1.0.0" + "has-flag": "^3.0.0" } } } }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "punycode": "^2.1.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true } } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true } } }, - "url-parse": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", - "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" + "picomatch": "^2.2.1" } }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "requires": { - "ip-regex": "^1.0.1" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" } }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "utils-merge": { + "rgb-regex": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", "dev": true }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "queue-microtask": "^1.2.2" } }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, - "vendors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", - "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "dev": true, "requires": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" + "is-arrayish": "^0.3.1" }, "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "dev": true } } }, - "vfile-location": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.4.tgz", - "integrity": "sha512-KRL5uXQPoUKu+NGvQVL4XLORw45W62v4U4gxJ3vRlDfI9QsT4ZN1PNXn/zQpKUulqGDpYuT0XDfp5q9O87/y/w==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { - "unist-util-stringify-position": "^1.1.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { - "indexof": "0.0.1" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "vue-hot-reload-api": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz", - "integrity": "sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g==", + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, - "vue-loader": { - "version": "13.7.3", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.7.3.tgz", - "integrity": "sha512-ACCwbfeC6HjY2pnDii+Zer+MZ6sdOtwvLmDXRK/BoD3WNR551V22R6KEagwHoTRJ0ZlIhpCBkptpCU6+Ri/05w==", + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { - "consolidate": "^0.14.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "lru-cache": "^4.1.1", - "postcss": "^6.0.8", - "postcss-load-config": "^1.1.0", - "postcss-selector-parser": "^2.0.0", - "prettier": "^1.7.0", - "resolve": "^1.4.0", - "source-map": "^0.6.1", - "vue-hot-reload-api": "^2.2.0", - "vue-style-loader": "^3.0.0", - "vue-template-es2015-compiler": "^1.6.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", - "dev": true, - "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0", - "postcss-load-options": "^1.2.0", - "postcss-load-plugins": "^2.3.0" - } - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "vue-style-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-3.1.2.tgz", - "integrity": "sha512-ICtVdK/p+qXWpdSs2alWtsXt9YnDoYjQe0w5616j9+/EhjoxZkbun34uWgsMFnC1MhrMMwaWiImz3K2jK1Yp2Q==", + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, - "vue-template-compiler": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz", - "integrity": "sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg==", + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { - "de-indent": "^1.0.2", - "he": "^1.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true - }, - "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, - "optional": true, "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true - } + "ansi-regex": "^5.0.0" } }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "requires": { - "minimalistic-assert": "^1.0.0" + "min-indent": "^1.0.0" } }, - "webpack": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", - "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "dev": true, "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "color-convert": "^1.9.0" } }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" + "has-flag": "^3.0.0" } } } }, - "webpack-chunk-hash": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/webpack-chunk-hash/-/webpack-chunk-hash-0.4.0.tgz", - "integrity": "sha1-a0DDBw+8n/DP4P54HHF0r2x8FqQ=", - "dev": true - }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } + "has-flag": "^4.0.0" } }, - "webpack-dev-server": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz", - "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==", + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "dev": true, "requires": { - "ansi-html": "0.0.7", - "array-includes": "^3.0.3", - "bonjour": "^3.5.0", - "chokidar": "^2.1.2", - "compression": "^1.7.3", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", - "http-proxy-middleware": "^0.19.1", - "import-local": "^1.0.0", - "internal-ip": "1.2.0", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "selfsigned": "^1.9.1", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.1.5", - "spdy": "^4.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" }, "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" + "color-convert": "^1.9.0" } }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "color-name": "1.1.3" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "pify": { + "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -16297,381 +11392,235 @@ "requires": { "has-flag": "^3.0.0" } - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } } } }, - "webpack-merge": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", - "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dev": true, "requires": { - "lodash": "^4.17.5" + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" } }, - "webpack-notifier": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.7.0.tgz", - "integrity": "sha512-L3UKrl500xk0VDYKkwQxy5/BPhBWsZ2xHsAx2Qe3dVKYUEk9+y690RcNTMIUcVOK2fRgK7KK3PA4ccOq1h+fTg==", + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "node-notifier": "^5.1.2", - "object-assign": "^4.1.0", - "strip-ansi": "^3.0.1" + "is-number": "^7.0.0" } }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "uglifyjs-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uglifyjs-folder/-/uglifyjs-folder-2.0.0.tgz", + "integrity": "sha512-jQGpQ9TxgDE8p0M6jEmCZDquMf2k6O34yPUHnwZSSzKbOSqJA32CIjtsfWDP/CPTnTVfDur/IUOwnNb5mBN0lQ==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "extend": "3.0.2", + "globby": "11.0.1", + "graceful-fs": "4.2.4", + "meow": "7.0.1", + "mkdirp": "1.0.4", + "terser": "4.8.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true } } }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dev": true, "requires": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" } }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", "dev": true }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { + "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "dev": true, "requires": { - "mkdirp": "^0.5.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" } }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "async-limiter": "~1.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", "dev": true }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" } }, - "xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=", - "dev": true - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true } } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } } } } diff --git a/package.json b/package.json index e1acb7adcf..600959b5f9 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,19 @@ { "name": "getkirby.com", - "version": "3.0.0", + "version": "3.2.0", "description": "The entire getkirby.com website.", "main": "index.js", "scripts": { - "start": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", - "build": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", - "lint": "./node_modules/.bin/stylelint ./src/scss/**/*.scss && ./node_modules/.bin/eslint ./src/js/", - "backstop-config": "./scripts/backstop-config", - "backstop-reference": "npm run build && backstop reference", - "backstop-test": "npm run build && backstop test", - "backstop-report": "backstop openReport" + "build": "npm run css && npm run js", + "css": "postcss --replace assets/css/**", + "js": "uglifyjs-folder assets/js --output assets/js --each --extension .js --config-file uglify.json" + }, + "devDependencies": { + "cssnano": "^4.1.10", + "postcss": "^8.2.6", + "postcss-cli": "^8.3.1", + "postcss-import": "^14.0.0", + "uglifyjs-folder": "^2.0.0" }, "repository": { "type": "git", @@ -21,56 +24,5 @@ "bugs": { "url": "https://github.com/getkirby/getkirby.com/issues" }, - "homepage": "https://github.com/getkirby/getkirby.com#readme", - "devDependencies": { - "babel-eslint": "^10.0.1", - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "backstopjs": "^3.8.8", - "browser-sync": "^2.26.12", - "browser-sync-webpack-plugin": "^2.2.2", - "cross-env": "^5.2.0", - "eslint": "^5", - "extend": "^3.0.2", - "laravel-mix": "^2.1.14", - "postcss-calc": "^7", - "stylelint": "^9.10.1", - "stylelint-config-standard": "^18.2.0", - "stylelint-order": "^2.1.0", - "stylelint-scss": "^3.5.4" - }, - "dependencies": { - "algoliasearch": "^3.32.1", - "awesomplete": "^1.1.4", - "body-scroll-lock": "^2.6.1", - "clipboard": "^2", - "es6-promise": "^4.2.6", - "focus-visible": "^4.1.5", - "lazysizes": "^5.2.1-rc1", - "list.js": "^1.5.0", - "loadjs": "^3.6.1", - "respimage": "^1.4.2", - "smoothscroll-polyfill": "^0.4.4", - "svgxuse": "^1.2.6", - "tippy.js": "^4.2.1" - }, - "eslintConfig": { - "root": true, - "parser": "babel-eslint", - "env": { - "browser": true, - "es6": true - }, - "extends": [ - "eslint:recommended" - ], - "rules": { - "quotes": [ - "error", - "double", - { - "avoidEscape": true - } - ] - } - } + "homepage": "https://github.com/getkirby/getkirby.com#readme" } diff --git a/www/pgp.asc b/pgp.asc similarity index 100% rename from www/pgp.asc rename to pgp.asc diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000000..b30792e6d8 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,13 @@ +module.exports = { + plugins: [ + require('postcss-import')(), + require('cssnano')({ + preset: [ + 'default', + { + calc: false + } + ] + }), + ], +} diff --git a/scripts/algolia-index b/scripts/algolia-index index e1903b2718..877b836805 100755 --- a/scripts/algolia-index +++ b/scripts/algolia-index @@ -17,7 +17,7 @@ require __DIR__ . '/../kirby/bootstrap.php'; $props = [ 'roots' => [ - 'index' => __DIR__ . '/../www', + 'index' => __DIR__ . '/..', 'content' => __DIR__ . '/../content', 'site' => __DIR__ . '/../site', ], diff --git a/scripts/backstop-config b/scripts/backstop-config deleted file mode 100755 index 45e58a70d8..0000000000 --- a/scripts/backstop-config +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env php - [ - 'index' => __DIR__ . '/../www', - 'content' => __DIR__ . '/../content', - 'site' => __DIR__ . '/../site', - ], - ]); - - // renaming map - $templates = [ - 'recipe' => 'cookbook-recipe', - 'issue' => 'kosmos-issue', - 'v35' => 'release-35', - - 'documentation' => 'guides', - 'method' => 'reference-classmethod', - 'class' => 'reference-class', - 'component' => 'reference-component', - 'endpoint' => 'reference-endpoint', - 'endpoints' => 'reference-endpoints', - 'extension' => 'reference-extension', - 'extensions' => 'reference-extensions', - 'field-method' => 'reference-fieldmethod', - 'field-methods' => 'reference-fieldmethods', - 'helper' => 'reference-helper', - 'helpers' => 'reference-helpers', - 'hook' => 'reference-hook', - 'hooks' => 'reference-hooks', - 'icon' => 'reference-icon', - 'icons' => 'reference-icons', - 'kirbytag' => 'reference-kirbytag', - 'kirbytags' => 'reference-kirbytags', - 'packages' => 'reference-packages', - 'section' => 'reference-panelsection', - 'sections' => 'reference-panelsections', - 'cheatsheet' => 'reference', - 'root' => 'reference-root', - 'roots' => 'reference-roots', - 'cheatsheet-section' => 'reference-section', - 'cheatsheet-article' => 'reference-article', - 'ui' => 'reference-ui', - 'url' => 'reference-url', - 'urls' => 'reference-urls', - 'validator' => 'reference-validator', - 'validators' => 'reference-validators' - ]; - - $index = $kirby->site()->index(); - $pages = $index->filterBy('intendedTemplate', 'in', array_keys($templates)); - $kirby->impersonate('kirby'); - - foreach ($pages as $page) { - $old = $page->intendedTemplate()->name(); - $new = $templates[$old]; - F::rename($page->root() . '/' . $page->intendedTemplate()->name() . '.txt', $new); - echo "\033[1m" . $page->id() . ": " . $old . " -> " . $new ."\033[0m\n"; - } - - exit(0); \ No newline at end of file diff --git a/site/accounts/index.html b/site/accounts/index.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/site/blueprints/pages/default.yml b/site/blueprints/pages/default.yml new file mode 100644 index 0000000000..0021d73ebc --- /dev/null +++ b/site/blueprints/pages/default.yml @@ -0,0 +1,8 @@ +title: Default Page +preset: page +fields: + text: + label: Text + type: textarea + size: large + diff --git a/site/blueprints/site.yml b/site/blueprints/site.yml new file mode 100644 index 0000000000..3dd50f1625 --- /dev/null +++ b/site/blueprints/site.yml @@ -0,0 +1,3 @@ +title: Site +preset: pages +unlisted: true diff --git a/site/cache/index.html b/site/cache/index.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/site/collections/audience.php b/site/collections/audience.php new file mode 100644 index 0000000000..a4895d110f --- /dev/null +++ b/site/collections/audience.php @@ -0,0 +1,5 @@ +children()->listed(); +}; diff --git a/site/collections/cases.php b/site/collections/cases.php new file mode 100644 index 0000000000..158d95b13c --- /dev/null +++ b/site/collections/cases.php @@ -0,0 +1,5 @@ +find('love')->children()->listed(); +}; diff --git a/site/collections/causes.php b/site/collections/causes.php new file mode 100644 index 0000000000..ca19f6ce7a --- /dev/null +++ b/site/collections/causes.php @@ -0,0 +1,12 @@ +collection('cases')->find([ + 'fridays-for-future-at', + 'berlin-in-bewegung', + 'fairclimatefund', + 'strassenfeger', + 'natucate', + 'teteenlair' + ]); +}; diff --git a/site/collections/cookbook/categories.php b/site/collections/cookbook/categories.php new file mode 100644 index 0000000000..63e1196b96 --- /dev/null +++ b/site/collections/cookbook/categories.php @@ -0,0 +1,5 @@ +children()->listed(); +}; diff --git a/site/collections/kirby.php b/site/collections/kirby.php new file mode 100644 index 0000000000..9625d4ebf5 --- /dev/null +++ b/site/collections/kirby.php @@ -0,0 +1,5 @@ +find('contact', 'privacy', 'license', 'security', 'styleguide'); +}; diff --git a/site/collections/voices/home.php b/site/collections/voices/home.php new file mode 100644 index 0000000000..9e198523a9 --- /dev/null +++ b/site/collections/voices/home.php @@ -0,0 +1,10 @@ +children()->find([ + 'jon-hicks', + 'grand-public', + 'colly', + 'diesdas-digital', + ]); +}; diff --git a/site/config/algolia.php b/site/config/algolia.php deleted file mode 100755 index f2507749a4..0000000000 --- a/site/config/algolia.php +++ /dev/null @@ -1,78 +0,0 @@ - 'S7OGBIAJTV', - 'key' => $key, - 'index' => 'getkirby-3', - 'fields' => [ - 'url', - 'template', - 'title', - 'description' => function ($page) { - return strip_tags($page->description()->kt()); - }, - 'excerpt' => function ($page) { - return strip_tags($page->excerpt()->kt()); - }, - 'text' => function($page) { - return strip_tags($page->text()->kt()); - }, - 'area' => function ($page) { - if (Str::startsWith($page->id(), 'docs/reference') === true) { - return 'reference'; - } - - switch ($page->template()->name()) { - case 'cookbook-recipe': - return 'cookbook'; - case 'guide': - return 'guide'; - case 'kosmos-issue': - return 'kosmos'; - case 'plugin': - return 'plugin'; - } - - } - ], - 'templates' => [ - 'reference-article', - 'reference-section', - 'reference-class' => [ - 'filter' => function ($page) { - return $page->isListed() === true; - } - ], - 'reference-component', - 'contact', - 'reference-endpoint', - 'reference-extension', - 'reference-fieldmethod', - 'guide', - 'reference-helper', - 'reference-hook', - 'reference-icon', - 'kosmos-issue', - 'reference-kirbytag', - 'reference-classmethod' => [ - 'filter' => function ($page) { - return $page->isListed() === true && - $page->parent()->isListed() === true; - } - ], - 'plugin', - 'cookbook-recipe', - 'release', - 'reference-root', - 'reference-section', - 'text', - 'reference-url', - 'reference-validator', - ] -]; diff --git a/site/config/banner.php b/site/config/banner.php new file mode 100644 index 0000000000..844f241f63 --- /dev/null +++ b/site/config/banner.php @@ -0,0 +1,13 @@ + false, + 'types' => [ + 'sale' => [ + 'text' => '🛍   Save 20% until April 30th', + 'url' => '/buy', + 'startDate' => '2021-04-01', + 'endDate' => '2021-04-30', + ], + ] +]; diff --git a/site/config/cache.php b/site/config/cache.php new file mode 100644 index 0000000000..5c15f8b4dd --- /dev/null +++ b/site/config/cache.php @@ -0,0 +1,12 @@ + [ + 'active' => true, + 'type' => 'apcu' + ], + 'plugins' => [ + 'active' => true, + 'type' => 'apcu' + ] +]; diff --git a/site/config/config.getkirby.com.php b/site/config/config.getkirby.com.php old mode 100755 new mode 100644 index 4acd62d0d7..b2e7a0990e --- a/site/config/config.getkirby.com.php +++ b/site/config/config.getkirby.com.php @@ -1,22 +1,8 @@ false, - 'cache' => [ - 'pages' => [ - 'active' => true, - 'type' => 'apcu' - ], - 'plugins' => [ - 'active' => true, - 'type' => 'apcu' - ] - ], - 'cachebuster' => [ - 'mode' => 'path' - ], - 'keycdn' => [ + 'cache' => require __DIR__ . '/cache.php', + 'cdn' => [ 'domain' => 'https://assets.getkirby.com', ], - 'referenceLookup' => true ]; diff --git a/site/config/config.getkirby.test.php b/site/config/config.getkirby.test.php deleted file mode 100644 index 798be03468..0000000000 --- a/site/config/config.getkirby.test.php +++ /dev/null @@ -1,6 +0,0 @@ - true, - 'referenceLookup' => false -]; diff --git a/site/config/config.php b/site/config/config.php old mode 100755 new mode 100644 index b949834a00..d0dd68f688 --- a/site/config/config.php +++ b/site/config/config.php @@ -1,101 +1,17 @@ '/', - 'markdown' => [ - 'extra' => true, - ], - 'price' => [ - 'eur' => 99, - 'usd' => 115 - ], - // 'sale' => [ - // 'text' => 'Save 20% per license
only until December 22nd', - // 'banner' => 'Save 20% per license until December 22nd' - // ], - - 'api' => false, - 'panel' => false, - 'debug' => true, - 'algolia' => require __DIR__ . '/algolia.php', - 'routes' => require __DIR__ . '/routes.php', - 'github' => 'https://github.com/getkirby', - 'plugins' => [ - 'categories' => [ - 'panel' => ['icon' => 'panel', 'label' => 'Panel'], - 'templating' => ['icon' => 'html', 'label' => 'Templating'], - 'seo' => ['icon' => 'seo', 'label' => 'SEO'], - // 'accessibility' => ['icon' => 'user', 'label' => 'Accessibility'], - 'security' => ['icon' => 'lock', 'label' => 'Security'], - 'performance' => ['icon' => 'performance', 'label' => 'Performance'], - 'analytics' => ['icon' => 'analytics', 'label' => 'Analytics'], - 'assets' => ['icon' => 'image', 'label' => 'Assets'], - 'text' => ['icon' => 'text', 'label' => 'Text'], - 'forms' => ['icon' => 'forms', 'label' => 'Forms'], - 'utilities' => ['icon' => 'wand', 'label' => 'Utilities'], - 'integrations' => ['icon' => 'integration', 'label' => 'Integrations'], - 'social' => ['icon' => 'twitter', 'label' => 'Social Networking'] - ] - ], - - 'kirby.meta.templatesInclude' => [ - 'home', - 'buy', - 'community', - 'guide', - 'coookbook', - 'cookbook-recipe', - 'reference', - 'reference-kirbytags', - 'reference-kirbytag', - 'reference-section', - 'reference-article', - 'reference-fieldmethods', - 'reference-fieldmethod', - 'reference-classmethod', - 'reference-class', - 'reference-urls', - 'reference-url', - 'reference-roots', - 'reference-root', - 'reference-validators', - 'reference-validator', - 'reference-extensions', - 'reference-extension', - 'reference-hooks', - 'reference-hook', - 'reference-component', - 'reference-endpoints', - 'reference-endpoint', - 'glossary', - 'archive', - 'contact', - 'kosmos', - 'kosmos-issue', - 'text', - 'cases', - 'plugins', - 'press', - 'search', - 'styleguide', - 'try', - 'release', - 'why', - ], - 'kirby.meta.pagesInclude' => [ - ], - 'kirby.meta.pagesExclude' => [ - 'docs/reference/@/.*', - ], - 'cache' => [ - 'pages' => [ - 'active' => false, - 'type' => 'apcu' - ], - 'plugins' => [ - 'active' => true, - 'type' => 'file' - ] - ], + 'api' => false, + 'banner' => require __DIR__ . '/banner.php', + 'debug' => true, + 'github' => 'https://github.com/getkirby', + 'features' => require __DIR__ . '/features.php', + 'meta' => require __DIR__ . '/meta.php', + 'panel' => false, + 'plugins' => require __DIR__ . '/plugins.php', + 'routes' => require __DIR__ . '/routes.php', + 'search' => require __DIR__ . '/search.php', + 'thumbs' => [ + 'driver' => 'im' + ] ]; diff --git a/site/config/config.redesign.getkirby.test.php b/site/config/config.redesign.getkirby.test.php new file mode 100644 index 0000000000..158a16d17f --- /dev/null +++ b/site/config/config.redesign.getkirby.test.php @@ -0,0 +1,8 @@ + [ + 'driver' => 'im', + 'bin' => '/usr/local/bin/convert' + ] +]; diff --git a/site/config/config.zone.getkirby.com.php b/site/config/config.zone.getkirby.com.php new file mode 100644 index 0000000000..2c2f6f5cac --- /dev/null +++ b/site/config/config.zone.getkirby.com.php @@ -0,0 +1,8 @@ + require __DIR__ . '/cache.php', + 'cdn' => [ + 'domain' => 'https://redesigngetkirby-1653.kxcdn.com/', + ], +]; diff --git a/site/config/features.php b/site/config/features.php new file mode 100644 index 0000000000..2a0767f816 --- /dev/null +++ b/site/config/features.php @@ -0,0 +1,109 @@ + [ + 'text' => 'The Panel', + 'icon' => 'outline/panel', + 'link' => '/features/creators#the-panel' + ], + 'field-blocks' => [ + 'text' => 'Blocks field', + 'icon' => 'outline/blocks', + 'link' => '/features/creators#next-level-editing' + ], + 'field-layout' => [ + 'text' => 'Layout field', + 'icon' => 'outline/blocks', + 'link' => '/features/designers#layout-field' + ], + 'plugins' => [ + 'text' => 'Plugins', + 'icon' => 'outline/3d', + 'link' => '/features/developers#plugins' + ], + 'languages' => [ + 'text' => 'Languages', + 'icon' => 'outline/globe', + 'link' => '/features/creators#go-global' + ], + 'users' => [ + 'text' => 'Users', + 'icon' => 'outline/users', + 'link' => '/docs/guide/users' + ], + 'files' => [ + 'text' => 'Just files & folders', + 'icon' => 'outline/content', + 'link' => '/features/developers#at-the-core-files-folders' + ], + 'assets' => [ + 'text' => 'Assets', + 'icon' => 'outline/link', + 'link' => '/features/creators#asset-management' + ], + 'headless' => [ + 'text' => 'Go headless', + 'icon' => 'outline/cloud', + 'link' => '/features/developers#go-headless' + ], + 'templates' => [ + 'text' => 'Templating', + 'icon' => 'outline/components', + 'link' => '/features/developers#templating' + ], + 'publish-workflow' => [ + 'text' => 'Publishing', + 'icon' => 'outline/thumb', + 'link' => '/docs/guide/content/publishing-workflow' + ], + 'routes' => [ + 'text' => 'Routing', + 'icon' => 'outline/directions', + 'link' => '/docs/guide/routing' + ], + 'cache' => [ + 'text' => 'Caching', + 'icon' => 'outline/database', + 'link' => '/docs/guide/cache' + ], + 'email' => [ + 'text' => 'Emailing', + 'icon' => 'outline/email', + 'link' => '/docs/guide/emails' + ], + 'docs' => [ + 'text' => 'Extensive docs', + 'icon' => 'outline/book', + 'link' => '/docs' + ], + 'cookbook' => [ + 'text' => 'Cookbook', + 'icon' => 'outline/bookmark', + 'link' => '/docs/cookbook' + ], + 'authentication' => [ + 'text' => 'Authentication', + 'icon' => 'outline/users', + 'link' => '/docs/guide/authentication' + ], + 'virtual-pages' => [ + 'text' => 'Virtual pages', + 'icon' => 'outline/360deg', + 'link' => '/docs/guide/virtual-pages' + ], + 'hooks' => [ + 'text' => 'Hooks', + 'icon' => 'outline/hook', + 'link' => '/docs/reference/plugins/extensions/hooks' + ], + 'content-representations' => [ + 'text' => 'Content representations', + 'icon' => 'outline/json', + 'link' => '/docs/guide/templates/content-representations' + ], + 'multi-site' => [ + 'text' => 'Multi-site setup', + 'icon' => 'outline/hierarchy', + 'link' => '/docs/cookbook/setup/multisite' + ], +]; diff --git a/site/config/meta.php b/site/config/meta.php new file mode 100644 index 0000000000..3f3b1bd2f5 --- /dev/null +++ b/site/config/meta.php @@ -0,0 +1,14 @@ + [ + 'pages' => [ + 'docs\/reference\/@\/.*' + ], + 'templates' => [ + 'error', + 'link', + 'reference-packages' + ] + ], +]; \ No newline at end of file diff --git a/site/config/plugins.php b/site/config/plugins.php new file mode 100644 index 0000000000..0abc89cba7 --- /dev/null +++ b/site/config/plugins.php @@ -0,0 +1,18 @@ + [ + 'panel' => ['icon' => 'panel', 'label' => 'Panel'], + 'templating' => ['icon' => 'html', 'label' => 'Templating'], + 'seo' => ['icon' => 'seo', 'label' => 'SEO'], + 'security' => ['icon' => 'lock', 'label' => 'Security'], + 'performance' => ['icon' => 'performance', 'label' => 'Performance'], + 'analytics' => ['icon' => 'analytics', 'label' => 'Analytics'], + 'assets' => ['icon' => 'image', 'label' => 'Assets'], + 'text' => ['icon' => 'text', 'label' => 'Text'], + 'forms' => ['icon' => 'forms', 'label' => 'Forms'], + 'utilities' => ['icon' => 'wand', 'label' => 'Utilities'], + 'integrations' => ['icon' => 'integration', 'label' => 'Integrations'], + 'social' => ['icon' => 'twitter', 'label' => 'Social Networking'] + ] +]; \ No newline at end of file diff --git a/site/config/redirects.php b/site/config/redirects.php index 0bb51dffc7..7a74695562 100644 --- a/site/config/redirects.php +++ b/site/config/redirects.php @@ -2,9 +2,10 @@ return [ // Simple + 'blog/kosmos-(:any)' => 'kosmos/$1', + 'community' => 'https://chat.getkirby.com', + 'community/(:all?)' => 'https://chat.getkirby.com', 'docs/guide/installation' => 'docs/guide/quickstart', - 'reference' => 'docs/reference', - 'reference/(:all)' => 'docs/reference/$1', 'docs/cheatsheet' => 'docs/reference', 'docs/cheatsheet/(:all?)' => 'docs/reference/$1', 'docs/toolkit' => 'docs/reference', @@ -13,10 +14,14 @@ 'docs/cookbook/migration/files' => 'docs/cookbook/setup/migrate-files', 'docs/cookbook/migration/users' => 'docs/cookbook/setup/migrate-users', 'docs/cookbook/migration/plugins' => 'docs/cookbook/setup/migrate-plugins', + 'made-with-kirby-and-love' => 'love', + 'product' => 'features/developers', + 'reference' => 'docs/reference', + 'reference/(:all)' => 'docs/reference/$1', + 'resources' => 'kosmos', 'v3' => 'releases/3.0', 'v35' => 'releases/3.5', - 'blog/kosmos-(:any)' => 'kosmos/$1', - 'made-with-kirby-and-love' => 'love', + 'why' => 'features/developers', // With logic 'docs/reference/(:any)/(:all?)' => function ($group, $path = null) { diff --git a/site/config/search.php b/site/config/search.php new file mode 100755 index 0000000000..7beea0a912 --- /dev/null +++ b/site/config/search.php @@ -0,0 +1,96 @@ + [ + 'all' => 'All pages', + 'guide' => 'Guide', + 'reference' => 'Reference', + 'cookbook' => 'Cookbook', + 'plugin' => 'Plugin', + 'kosmos' => 'Kosmos' + ], + 'algolia' => [ + 'app' => 'S7OGBIAJTV', + 'key' => $key, + 'index' => 'getkirby-3', + 'fields' => [ + 'template', + 'title', + 'description' => function ($page) { + $field = $page->description()->or($page->excerpt()->or($page->intro())); + return strip_tags($field->kti()); + }, + 'text' => function($page) { + return strip_tags($page->text()->kti()); + }, + 'area' => function ($page) { + if (Str::startsWith($page->id(), 'docs/reference') === true) { + return 'reference'; + } + + switch ($page->intendedTemplate()->name()) { + case 'cookbook-recipe': + return 'cookbook'; + case 'guide': + return 'guide'; + case 'kosmos-issue': + return 'kosmos'; + case 'plugin': + return 'plugin'; + } + } + ], + 'templates' => [ + 'cookbook-category', + 'cookbook-recipe', + 'glossary', + 'guide', + 'kosmos-issue', + 'plugin', + 'reference-article', + 'reference-block', + 'reference-class' => [ + 'filter' => function ($page) { + // don't index the auto-generated pages + // in docs/reference/@/classes + return Str::startsWith($page->id(), 'docs/reference/@') === false; + } + ], + 'reference-classmethod' => [ + 'filter' => function ($page) { + // don't index the auto-generated pages + // in docs/reference/@/classes + return Str::startsWith($page->id(), 'docs/reference/@') === false; + } + ], + 'reference-component', + 'reference-endpoint', + 'reference-extension', + 'reference-fieldmethod', + 'reference-helper', + 'reference-hook', + 'reference-icon', + 'reference-kirbytag', + 'reference-packages', + 'reference-panelsection', + 'reference-root', + 'reference-section', + 'reference-ui', + 'reference-url', + 'reference-validator', + 'security', + 'text', + 'release', + 'release-35' + ] + ] +]; diff --git a/site/controllers/buy.php b/site/controllers/buy.php old mode 100755 new mode 100644 index e0f06833bf..43dcb825c6 --- a/site/controllers/buy.php +++ b/site/controllers/buy.php @@ -1,13 +1,7 @@ $sale, - 'saleText' => option('sale.text'), - 'price' => option('price.eur') - ]; - + return [ + 'questions' => $page->find('answers')->children() + ]; }; diff --git a/site/controllers/contributors.php b/site/controllers/contributors.php deleted file mode 100644 index f749f1c466..0000000000 --- a/site/controllers/contributors.php +++ /dev/null @@ -1,11 +0,0 @@ - $page->find('team')->children()->listed(), - 'forum' => $page->find('forum'), - 'themes' => $page->find('themes'), - 'pluginsPage' => $page->find('plugins'), - 'plugins' => page('plugins')->children()->children()->filterBy('featured', 'true')->shuffle()->limit(9), - ]; -}; diff --git a/site/controllers/cookbook-category.php b/site/controllers/cookbook-category.php new file mode 100755 index 0000000000..f66f3d1c39 --- /dev/null +++ b/site/controllers/cookbook-category.php @@ -0,0 +1,23 @@ +slug() === 'new') { + $recipes = page('docs/cookbook') + ->children() + ->listed() + ->children() + ->listed() + ->filterBy('isNew', true); + } else { + $recipes = $page + ->children() + ->listed() + ->sortBy('published', 'desc'); + } + + return [ + 'recipes' => $recipes + ]; + +}; diff --git a/site/controllers/cookbook-recipe.php b/site/controllers/cookbook-recipe.php deleted file mode 100755 index 73e710a395..0000000000 --- a/site/controllers/cookbook-recipe.php +++ /dev/null @@ -1,18 +0,0 @@ - $category->slug(), - 'title' => $category->title(), - 'items' => $category->parent()->recipes($category->slug())->not($page)->shuffle()->limit(5) - ]; - }, $page->categories()); - - return [ - 'headlines' => $page->text()->headlines('h2'), - 'categories' => $categories - ]; - -}; diff --git a/site/controllers/cookbook.php b/site/controllers/cookbook.php deleted file mode 100755 index 80af834f67..0000000000 --- a/site/controllers/cookbook.php +++ /dev/null @@ -1,22 +0,0 @@ -children()->listed(); - $recipes = $categories->children()->listed(); - - if ($category = get('category')) { - $recipes = $page->recipes($category); - } - - if (get('new')) { - $recipes = $page->grandChildren()->filterBy('isNew', true); - } - - return [ - 'recipes' => $recipes->sortBy('title', 'asc'), - 'categories' => $categories, - 'category' => $categories->find($category) - ]; - -}; diff --git a/site/controllers/glossary.php b/site/controllers/glossary.php deleted file mode 100644 index 34586d11cb..0000000000 --- a/site/controllers/glossary.php +++ /dev/null @@ -1,7 +0,0 @@ - $page->children()->sortBy('title', 'asc'), - ]; -}; diff --git a/site/controllers/guides.php b/site/controllers/guides.php deleted file mode 100644 index 8e404c3bda..0000000000 --- a/site/controllers/guides.php +++ /dev/null @@ -1,15 +0,0 @@ -children()->listed(); - - return [ - 'mainItems' => $items->filterBy('template', 'not in', $sidebarItemTemplates), - 'sidebarItems' => $items->filterBy('template', 'in', $sidebarItemTemplates), - ]; - -}; diff --git a/site/controllers/home.php b/site/controllers/home.php old mode 100755 new mode 100644 index 353093aa29..db6dc8a112 --- a/site/controllers/home.php +++ b/site/controllers/home.php @@ -1,13 +1,28 @@ $page->image('chameleon.jpg'), - 'components' => $page->image('components.jpg'), - 'hero' => $page->image('hero.jpg'), - 'matomo' => $page->image('matomo.jpg'), - 'panel' => $page->images()->find('dashboard.jpg', 'article.jpg', 'blog.jpg', 'microsite.jpg', 'product.jpg'), - ]; +return function ($page) { + $storyId = get('your') ?? 'company'; + $story = $page->find($storyId) ?? $page->find('company'); + $storyImage = $story->images()->findBy('name', 'panel'); + // shows banner only startDate/endDate is empty or current date is between in + if (option('banner.enabled') === true) { + foreach (option('banner.types', []) as $type) { + if ( + (empty($type['startDate']) === true || V::date($type['startDate'], '<=', date('Y-m-d'))) && + (empty($type['endDate']) === true || V::date($type['endDate'], '>=', date('Y-m-d'))) + ) { + $banner = $type; + break; + } + } + } + + return [ + 'banner' => $banner ?? null, + 'story' => $story, + 'storyImage' => $storyImage + ]; }; diff --git a/site/controllers/plugin.php b/site/controllers/plugin.php index cf733c2682..adafe3855c 100755 --- a/site/controllers/plugin.php +++ b/site/controllers/plugin.php @@ -1,12 +1,14 @@ $page->download(), - 'author' => $page->parent(), - 'authorPlugins' => $page->siblings(false), - 'relatedPlugins' => page('plugins')->grandChildren()->filterBy('category', $page->category()->value())->not($page) + 'categories' => $categories, + 'currentCategory' => $page->category(), + 'download' => $page->download(), + 'author' => $page->parent(), + 'authorPlugins' => $page->siblings(false), + 'relatedPlugins' => page('plugins')->grandChildren()->filterBy('category', $page->category()->value())->not($page) ]; - }; diff --git a/site/controllers/plugins.php b/site/controllers/plugins.php index 2d28080410..7867f60bfe 100755 --- a/site/controllers/plugins.php +++ b/site/controllers/plugins.php @@ -3,35 +3,30 @@ return function($page) { $categories = option('plugins.categories'); - $category = get('category'); - $developer = get('developer'); + $category = param('category'); + $heading = 'All plugins'; if ($category && array_key_exists($category, $categories) === false) { $category = null; } - if ($developer && !$page->find($developer)) { - $developer = null; - } - - $plugins = $page->children()->children(); + $plugins = $page + ->children() + ->children() + ->filterBy('recommended', '') + ->sortBy('title', 'asc'); - if ($developer) { - $plugins = $page->find($developer)->children(); - } if ($category) { $plugins = $plugins->filterBy('category', $category); + $heading = $categories[$category]['label'] . ' plugins'; } - // don't use plugins with a recommended field - $plugins = $plugins->filterBy('recommended', ''); - return [ - 'plugins' => $plugins->sortBy('title', 'asc'), - 'categories' => $categories, - 'category' => $category, - 'developer' => $developer + 'categories' => $categories, + 'currentCategory' => $category, + 'heading' => $heading, + 'plugins' => $plugins, ]; }; diff --git a/site/controllers/reference-class.php b/site/controllers/reference-class.php deleted file mode 100644 index 9584697a43..0000000000 --- a/site/controllers/reference-class.php +++ /dev/null @@ -1,11 +0,0 @@ - 60*24*365*2 - ]); - } - -}; diff --git a/site/controllers/reference-icon.php b/site/controllers/reference-icon.php new file mode 100644 index 0000000000..521bb0ace2 --- /dev/null +++ b/site/controllers/reference-icon.php @@ -0,0 +1,8 @@ + [16, 32, 64], + 'colors' => ['Black', 'White'] + ]; +}; diff --git a/site/controllers/reference-kirbytag.php b/site/controllers/reference-kirbytag.php deleted file mode 100644 index 9e8796fbc6..0000000000 --- a/site/controllers/reference-kirbytag.php +++ /dev/null @@ -1,7 +0,0 @@ - $page->attributes(), - ]; -}; diff --git a/site/controllers/reference-section.php b/site/controllers/reference-section.php new file mode 100644 index 0000000000..71b074ae8b --- /dev/null +++ b/site/controllers/reference-section.php @@ -0,0 +1,15 @@ + 60 * 24 * 365* 2 + ]); + } + + return [ + 'entries' => $page->children()->referenced() + ]; +}; + \ No newline at end of file diff --git a/site/controllers/search.php b/site/controllers/search.php index b7a956422a..168c0cf095 100644 --- a/site/controllers/search.php +++ b/site/controllers/search.php @@ -1,33 +1,30 @@ option('algolia'); + $query = trim(get('q')); + $area = trim(get('area')); - if (!$options) { - go(); - } - - $pageNum = param('page'); - $query = trim(get('q')); + if (empty($query) === false) { - if (!empty($query)) { - $results = algolia()->search($query, $pageNum, [ - 'hitsPerPage' => $hitsPerPage, + $params = [ + 'hitsPerPage' => 50, 'attributesToHighlight' => false, 'attributesToSnippet' => '*' - ]); - } else { - $results = new Collection; - $results = $results->paginate(10); + ]; + + if (empty($area) == false && $area !== 'all') { + $params['filters'] = 'area:' . $area; + } + + $results = algolia()->search($query, param('page') ?? 1, $params); } return [ - 'results' => $results, - 'query' => html(strip_tags($query), false), - 'hitsPerPage' => $hitsPerPage, - 'startNumber' => ($hitsPerPage * ($results->pagination()->page() -1) + 1), + 'results' => $results ?? [], + 'pagination' => isset($results) ? $results->pagination() : null, + 'query' => html(strip_tags($query), false), + 'area' => empty($area) ? null : $area, + 'areas' => option('search.areas') ]; - }; diff --git a/site/controllers/security.php b/site/controllers/security.php deleted file mode 100644 index ab3d2d2a42..0000000000 --- a/site/controllers/security.php +++ /dev/null @@ -1,28 +0,0 @@ -incidents(); - $incidentsTable = snippet('security-incidents', compact('incidents'), true); - - $noVulns = null; - foreach ($incidents as $incident) { - if ($noVulns === null || version_compare($incident->fixed(), $noVulns, '>')) { - $noVulns = $incident->fixed(); - } - } - - $data = [ - 'latest' => $kirby->version(), - 'no-vulnerabilities' => $noVulns - ]; - - $supported = $page->supported(); - $supportedTable = snippet('security-supported', compact('supported'), true); - - $text = new Field($page, 'text', Str::template($page->text(), array_merge($data, [ - 'incidents' => $incidentsTable, - 'supported' => $supportedTable - ]))); - - return compact('text', 'supported', 'incidents'); -}; diff --git a/site/controllers/try.php b/site/controllers/try.php index 66c0390825..1a3face43c 100644 --- a/site/controllers/try.php +++ b/site/controllers/try.php @@ -2,47 +2,25 @@ return function($kirby, $page) { - $statusMessage = $statusType = null; - if ($error = param('error')) { - $statusType = 'error'; - - switch ($error) { - case 'not-found': - $statusMessage = 'The requested demo instance does not exist or has expired. ' . - 'Feel free to create a new instance.'; - break; - case 'rate-limit': - $statusMessage = 'Your IP address has reached the maximum number of concurrent demo ' . - 'instances. Please try again later or continue with one of your ' . - 'existing instances. Maybe your colleague has one you can play around ' . - 'with together? :)'; - break; - case 'overload': - $statusMessage = 'Our demo server is currently being used by a lot of users, please ' . - 'try again later. Sorry for the inconvenience!'; - break; - default: - $statusMessage = 'An unexpected error occured in the demo manager. Please let us know ' . - 'if this keeps happening. Thanks!'; - } - } elseif ($status = param('status')) { - $statusType = 'status'; + $statusMessage = $statusType = $statusIcon = null; + $statusMessages = [ + 'not-found' => 'The requested demo instance does not exist or has expired. Feel free to create a new instance.', + 'rate-limit' => 'Your IP address has reached the maximum number of concurrent demo instances. Please try again later or continue with one of your existing instances. Maybe your colleague has one you can play around with together? :)', + 'overload' => 'Our demo server is currently being used by a lot of users, please try again later. Sorry for the inconvenience!', + 'deleted' => 'Your demo instance was deleted successfully. Thanks for trying out Kirby! You can create a new demo at any time.', + 'default' => 'An unexpected error occured in the demo manager. Please let us know if this keeps happening. Thanks!', + ]; - switch ($status) { - case 'deleted': - $statusMessage = 'Your demo instance was deleted successfully. Thanks for trying out ' . - 'Kirby! You can create a new demo at any time.'; - break; - default: - $statusType = 'error'; - $statusMessage = 'Something unexpected happened in the demo manager. Please let us know ' . - 'if this keeps happening. Thanks!'; - } + if ($status = (param('error') ?? param('status'))) { + $statusMessage = $statusMessages[$status] ?? $statusMessages['default']; + $statusType = $status === 'deleted' ? 'info' : 'warning'; } return [ + 'questions' => $page->find('answers')->children(), + 'statusIcon' => $statusType === 'warning' ? 'warning' : 'check', 'statusMessage' => $statusMessage, - 'statusType' => $statusType + 'statusType' => $statusType, ]; }; diff --git a/site/controllers/why.php b/site/controllers/why.php new file mode 100644 index 0000000000..2ef20ee4b5 --- /dev/null +++ b/site/controllers/why.php @@ -0,0 +1,12 @@ + [ + 'clients' => 'Clients & agencies', + 'editors' => 'Content creators', + 'developers' => 'Developers', + 'designers' => 'Designers' + ] + ]; +}; diff --git a/site/snippets/docs/api/auth-login-data.php b/site/docs/api/auth-login-data.php similarity index 100% rename from site/snippets/docs/api/auth-login-data.php rename to site/docs/api/auth-login-data.php diff --git a/site/snippets/docs/api/auth-parameters.php b/site/docs/api/auth-parameters.php similarity index 100% rename from site/snippets/docs/api/auth-parameters.php rename to site/docs/api/auth-parameters.php diff --git a/site/snippets/docs/api/avatar-parameters.php b/site/docs/api/avatar-parameters.php similarity index 100% rename from site/snippets/docs/api/avatar-parameters.php rename to site/docs/api/avatar-parameters.php diff --git a/site/snippets/docs/api/file-content-data.php b/site/docs/api/file-content-data.php similarity index 100% rename from site/snippets/docs/api/file-content-data.php rename to site/docs/api/file-content-data.php diff --git a/site/snippets/docs/api/file-name-data.php b/site/docs/api/file-name-data.php similarity index 100% rename from site/snippets/docs/api/file-name-data.php rename to site/docs/api/file-name-data.php diff --git a/site/snippets/docs/api/file-parameters.php b/site/docs/api/file-parameters.php similarity index 100% rename from site/snippets/docs/api/file-parameters.php rename to site/docs/api/file-parameters.php diff --git a/site/snippets/docs/api/file-sort-data.php b/site/docs/api/file-sort-data.php similarity index 100% rename from site/snippets/docs/api/file-sort-data.php rename to site/docs/api/file-sort-data.php diff --git a/site/snippets/docs/api/file-upload-data.php b/site/docs/api/file-upload-data.php similarity index 100% rename from site/snippets/docs/api/file-upload-data.php rename to site/docs/api/file-upload-data.php diff --git a/site/snippets/docs/api/files-parameters.php b/site/docs/api/files-parameters.php similarity index 100% rename from site/snippets/docs/api/files-parameters.php rename to site/docs/api/files-parameters.php diff --git a/site/snippets/docs/api/language-create-data.php b/site/docs/api/language-create-data.php similarity index 100% rename from site/snippets/docs/api/language-create-data.php rename to site/docs/api/language-create-data.php diff --git a/site/snippets/docs/api/language-parameters.php b/site/docs/api/language-parameters.php similarity index 100% rename from site/snippets/docs/api/language-parameters.php rename to site/docs/api/language-parameters.php diff --git a/site/snippets/docs/api/language-update-data.php b/site/docs/api/language-update-data.php similarity index 100% rename from site/snippets/docs/api/language-update-data.php rename to site/docs/api/language-update-data.php diff --git a/site/snippets/docs/api/languages-parameters.php b/site/docs/api/languages-parameters.php similarity index 100% rename from site/snippets/docs/api/languages-parameters.php rename to site/docs/api/languages-parameters.php diff --git a/site/snippets/docs/api/page-blueprints-parameters.php b/site/docs/api/page-blueprints-parameters.php similarity index 100% rename from site/snippets/docs/api/page-blueprints-parameters.php rename to site/docs/api/page-blueprints-parameters.php diff --git a/site/snippets/docs/api/page-create-data.php b/site/docs/api/page-create-data.php similarity index 100% rename from site/snippets/docs/api/page-create-data.php rename to site/docs/api/page-create-data.php diff --git a/site/snippets/docs/api/page-delete-data.php b/site/docs/api/page-delete-data.php similarity index 100% rename from site/snippets/docs/api/page-delete-data.php rename to site/docs/api/page-delete-data.php diff --git a/site/snippets/docs/api/page-ids.php b/site/docs/api/page-ids.php similarity index 100% rename from site/snippets/docs/api/page-ids.php rename to site/docs/api/page-ids.php diff --git a/site/snippets/docs/api/page-parameters.php b/site/docs/api/page-parameters.php similarity index 100% rename from site/snippets/docs/api/page-parameters.php rename to site/docs/api/page-parameters.php diff --git a/site/snippets/docs/api/page-slug-data.php b/site/docs/api/page-slug-data.php similarity index 100% rename from site/snippets/docs/api/page-slug-data.php rename to site/docs/api/page-slug-data.php diff --git a/site/snippets/docs/api/page-status-data.php b/site/docs/api/page-status-data.php similarity index 100% rename from site/snippets/docs/api/page-status-data.php rename to site/docs/api/page-status-data.php diff --git a/site/snippets/docs/api/page-template-data.php b/site/docs/api/page-template-data.php similarity index 100% rename from site/snippets/docs/api/page-template-data.php rename to site/docs/api/page-template-data.php diff --git a/site/snippets/docs/api/page-title-data.php b/site/docs/api/page-title-data.php similarity index 100% rename from site/snippets/docs/api/page-title-data.php rename to site/docs/api/page-title-data.php diff --git a/site/snippets/docs/api/pages-parameters.php b/site/docs/api/pages-parameters.php similarity index 100% rename from site/snippets/docs/api/pages-parameters.php rename to site/docs/api/pages-parameters.php diff --git a/site/snippets/docs/api/role-parameters.php b/site/docs/api/role-parameters.php similarity index 100% rename from site/snippets/docs/api/role-parameters.php rename to site/docs/api/role-parameters.php diff --git a/site/snippets/docs/api/roles-parameters.php b/site/docs/api/roles-parameters.php similarity index 100% rename from site/snippets/docs/api/roles-parameters.php rename to site/docs/api/roles-parameters.php diff --git a/site/snippets/docs/api/search-post.php b/site/docs/api/search-post.php similarity index 100% rename from site/snippets/docs/api/search-post.php rename to site/docs/api/search-post.php diff --git a/site/snippets/docs/api/search-query.php b/site/docs/api/search-query.php similarity index 100% rename from site/snippets/docs/api/search-query.php rename to site/docs/api/search-query.php diff --git a/site/snippets/docs/api/site-blueprints-parameters.php b/site/docs/api/site-blueprints-parameters.php similarity index 100% rename from site/snippets/docs/api/site-blueprints-parameters.php rename to site/docs/api/site-blueprints-parameters.php diff --git a/site/snippets/docs/api/site-content-data.php b/site/docs/api/site-content-data.php similarity index 100% rename from site/snippets/docs/api/site-content-data.php rename to site/docs/api/site-content-data.php diff --git a/site/snippets/docs/api/site-find-parameters.php b/site/docs/api/site-find-parameters.php similarity index 100% rename from site/snippets/docs/api/site-find-parameters.php rename to site/docs/api/site-find-parameters.php diff --git a/site/snippets/docs/api/site-parameters.php b/site/docs/api/site-parameters.php similarity index 100% rename from site/snippets/docs/api/site-parameters.php rename to site/docs/api/site-parameters.php diff --git a/site/snippets/docs/api/site-search-parameters.php b/site/docs/api/site-search-parameters.php similarity index 100% rename from site/snippets/docs/api/site-search-parameters.php rename to site/docs/api/site-search-parameters.php diff --git a/site/snippets/docs/api/site-title-data.php b/site/docs/api/site-title-data.php similarity index 100% rename from site/snippets/docs/api/site-title-data.php rename to site/docs/api/site-title-data.php diff --git a/site/snippets/docs/api/translation-parameters.php b/site/docs/api/translation-parameters.php similarity index 100% rename from site/snippets/docs/api/translation-parameters.php rename to site/docs/api/translation-parameters.php diff --git a/site/snippets/docs/api/translations-parameters.php b/site/docs/api/translations-parameters.php similarity index 100% rename from site/snippets/docs/api/translations-parameters.php rename to site/docs/api/translations-parameters.php diff --git a/site/snippets/docs/api/user-content-data.php b/site/docs/api/user-content-data.php similarity index 100% rename from site/snippets/docs/api/user-content-data.php rename to site/docs/api/user-content-data.php diff --git a/site/snippets/docs/api/user-create-data.php b/site/docs/api/user-create-data.php similarity index 100% rename from site/snippets/docs/api/user-create-data.php rename to site/docs/api/user-create-data.php diff --git a/site/snippets/docs/api/user-email-data.php b/site/docs/api/user-email-data.php similarity index 100% rename from site/snippets/docs/api/user-email-data.php rename to site/docs/api/user-email-data.php diff --git a/site/snippets/docs/api/user-language-data.php b/site/docs/api/user-language-data.php similarity index 100% rename from site/snippets/docs/api/user-language-data.php rename to site/docs/api/user-language-data.php diff --git a/site/snippets/docs/api/user-name-data.php b/site/docs/api/user-name-data.php similarity index 100% rename from site/snippets/docs/api/user-name-data.php rename to site/docs/api/user-name-data.php diff --git a/site/snippets/docs/api/user-parameters.php b/site/docs/api/user-parameters.php similarity index 100% rename from site/snippets/docs/api/user-parameters.php rename to site/docs/api/user-parameters.php diff --git a/site/snippets/docs/api/user-password-data.php b/site/docs/api/user-password-data.php similarity index 100% rename from site/snippets/docs/api/user-password-data.php rename to site/docs/api/user-password-data.php diff --git a/site/snippets/docs/api/user-role-data.php b/site/docs/api/user-role-data.php similarity index 100% rename from site/snippets/docs/api/user-role-data.php rename to site/docs/api/user-role-data.php diff --git a/site/snippets/docs/api/users-parameters.php b/site/docs/api/users-parameters.php similarity index 100% rename from site/snippets/docs/api/users-parameters.php rename to site/docs/api/users-parameters.php diff --git a/site/snippets/docs/blocks/blocks.php b/site/docs/blocks/blocks.php similarity index 100% rename from site/snippets/docs/blocks/blocks.php rename to site/docs/blocks/blocks.php diff --git a/site/snippets/docs/fields/events/input.php b/site/docs/fields/events/input.php similarity index 100% rename from site/snippets/docs/fields/events/input.php rename to site/docs/fields/events/input.php diff --git a/site/snippets/docs/fields/methods/focus.php b/site/docs/fields/methods/focus.php similarity index 100% rename from site/snippets/docs/fields/methods/focus.php rename to site/docs/fields/methods/focus.php diff --git a/site/snippets/docs/fields/props/after.php b/site/docs/fields/props/after.php similarity index 100% rename from site/snippets/docs/fields/props/after.php rename to site/docs/fields/props/after.php diff --git a/site/snippets/docs/fields/props/autocomplete.php b/site/docs/fields/props/autocomplete.php similarity index 100% rename from site/snippets/docs/fields/props/autocomplete.php rename to site/docs/fields/props/autocomplete.php diff --git a/site/snippets/docs/fields/props/autofocus.php b/site/docs/fields/props/autofocus.php similarity index 100% rename from site/snippets/docs/fields/props/autofocus.php rename to site/docs/fields/props/autofocus.php diff --git a/site/snippets/docs/fields/props/before.php b/site/docs/fields/props/before.php similarity index 100% rename from site/snippets/docs/fields/props/before.php rename to site/docs/fields/props/before.php diff --git a/site/snippets/docs/fields/props/disabled.php b/site/docs/fields/props/disabled.php similarity index 100% rename from site/snippets/docs/fields/props/disabled.php rename to site/docs/fields/props/disabled.php diff --git a/site/snippets/docs/fields/props/help.php b/site/docs/fields/props/help.php similarity index 100% rename from site/snippets/docs/fields/props/help.php rename to site/docs/fields/props/help.php diff --git a/site/snippets/docs/fields/props/icon.php b/site/docs/fields/props/icon.php similarity index 100% rename from site/snippets/docs/fields/props/icon.php rename to site/docs/fields/props/icon.php diff --git a/site/snippets/docs/fields/props/label.php b/site/docs/fields/props/label.php similarity index 100% rename from site/snippets/docs/fields/props/label.php rename to site/docs/fields/props/label.php diff --git a/site/snippets/docs/fields/props/max.php b/site/docs/fields/props/max.php similarity index 100% rename from site/snippets/docs/fields/props/max.php rename to site/docs/fields/props/max.php diff --git a/site/snippets/docs/fields/props/maxlength.php b/site/docs/fields/props/maxlength.php similarity index 100% rename from site/snippets/docs/fields/props/maxlength.php rename to site/docs/fields/props/maxlength.php diff --git a/site/snippets/docs/fields/props/min.php b/site/docs/fields/props/min.php similarity index 100% rename from site/snippets/docs/fields/props/min.php rename to site/docs/fields/props/min.php diff --git a/site/snippets/docs/fields/props/minlength.php b/site/docs/fields/props/minlength.php similarity index 100% rename from site/snippets/docs/fields/props/minlength.php rename to site/docs/fields/props/minlength.php diff --git a/site/snippets/docs/fields/props/name.php b/site/docs/fields/props/name.php similarity index 100% rename from site/snippets/docs/fields/props/name.php rename to site/docs/fields/props/name.php diff --git a/site/snippets/docs/fields/props/options.php b/site/docs/fields/props/options.php similarity index 100% rename from site/snippets/docs/fields/props/options.php rename to site/docs/fields/props/options.php diff --git a/site/snippets/docs/fields/props/pattern.php b/site/docs/fields/props/pattern.php similarity index 100% rename from site/snippets/docs/fields/props/pattern.php rename to site/docs/fields/props/pattern.php diff --git a/site/snippets/docs/fields/props/placeholder.php b/site/docs/fields/props/placeholder.php similarity index 100% rename from site/snippets/docs/fields/props/placeholder.php rename to site/docs/fields/props/placeholder.php diff --git a/site/snippets/docs/fields/props/required.php b/site/docs/fields/props/required.php similarity index 100% rename from site/snippets/docs/fields/props/required.php rename to site/docs/fields/props/required.php diff --git a/site/snippets/docs/fields/props/spellcheck.php b/site/docs/fields/props/spellcheck.php similarity index 100% rename from site/snippets/docs/fields/props/spellcheck.php rename to site/docs/fields/props/spellcheck.php diff --git a/site/snippets/docs/filters.php b/site/docs/filters.php similarity index 100% rename from site/snippets/docs/filters.php rename to site/docs/filters.php diff --git a/site/snippets/docs/immutable-objects.php b/site/docs/immutable-objects.php similarity index 100% rename from site/snippets/docs/immutable-objects.php rename to site/docs/immutable-objects.php diff --git a/site/snippets/docs/inputs/events/input.php b/site/docs/inputs/events/input.php similarity index 100% rename from site/snippets/docs/inputs/events/input.php rename to site/docs/inputs/events/input.php diff --git a/site/snippets/docs/inputs/events/invalid.php b/site/docs/inputs/events/invalid.php similarity index 100% rename from site/snippets/docs/inputs/events/invalid.php rename to site/docs/inputs/events/invalid.php diff --git a/site/snippets/docs/inputs/methods/focus.php b/site/docs/inputs/methods/focus.php similarity index 100% rename from site/snippets/docs/inputs/methods/focus.php rename to site/docs/inputs/methods/focus.php diff --git a/site/snippets/docs/inputs/props/after.php b/site/docs/inputs/props/after.php similarity index 100% rename from site/snippets/docs/inputs/props/after.php rename to site/docs/inputs/props/after.php diff --git a/site/snippets/docs/inputs/props/autocomplete.php b/site/docs/inputs/props/autocomplete.php similarity index 100% rename from site/snippets/docs/inputs/props/autocomplete.php rename to site/docs/inputs/props/autocomplete.php diff --git a/site/snippets/docs/inputs/props/autofocus.php b/site/docs/inputs/props/autofocus.php similarity index 100% rename from site/snippets/docs/inputs/props/autofocus.php rename to site/docs/inputs/props/autofocus.php diff --git a/site/snippets/docs/inputs/props/before.php b/site/docs/inputs/props/before.php similarity index 100% rename from site/snippets/docs/inputs/props/before.php rename to site/docs/inputs/props/before.php diff --git a/site/snippets/docs/inputs/props/disabled.php b/site/docs/inputs/props/disabled.php similarity index 100% rename from site/snippets/docs/inputs/props/disabled.php rename to site/docs/inputs/props/disabled.php diff --git a/site/snippets/docs/inputs/props/icon.php b/site/docs/inputs/props/icon.php similarity index 100% rename from site/snippets/docs/inputs/props/icon.php rename to site/docs/inputs/props/icon.php diff --git a/site/snippets/docs/inputs/props/id.php b/site/docs/inputs/props/id.php similarity index 100% rename from site/snippets/docs/inputs/props/id.php rename to site/docs/inputs/props/id.php diff --git a/site/snippets/docs/inputs/props/max.php b/site/docs/inputs/props/max.php similarity index 100% rename from site/snippets/docs/inputs/props/max.php rename to site/docs/inputs/props/max.php diff --git a/site/snippets/docs/inputs/props/maxlength.php b/site/docs/inputs/props/maxlength.php similarity index 100% rename from site/snippets/docs/inputs/props/maxlength.php rename to site/docs/inputs/props/maxlength.php diff --git a/site/snippets/docs/inputs/props/min.php b/site/docs/inputs/props/min.php similarity index 100% rename from site/snippets/docs/inputs/props/min.php rename to site/docs/inputs/props/min.php diff --git a/site/snippets/docs/inputs/props/minlength.php b/site/docs/inputs/props/minlength.php similarity index 100% rename from site/snippets/docs/inputs/props/minlength.php rename to site/docs/inputs/props/minlength.php diff --git a/site/snippets/docs/inputs/props/name.php b/site/docs/inputs/props/name.php similarity index 100% rename from site/snippets/docs/inputs/props/name.php rename to site/docs/inputs/props/name.php diff --git a/site/snippets/docs/inputs/props/options.php b/site/docs/inputs/props/options.php similarity index 100% rename from site/snippets/docs/inputs/props/options.php rename to site/docs/inputs/props/options.php diff --git a/site/snippets/docs/inputs/props/pattern.php b/site/docs/inputs/props/pattern.php similarity index 100% rename from site/snippets/docs/inputs/props/pattern.php rename to site/docs/inputs/props/pattern.php diff --git a/site/snippets/docs/inputs/props/placeholder.php b/site/docs/inputs/props/placeholder.php similarity index 100% rename from site/snippets/docs/inputs/props/placeholder.php rename to site/docs/inputs/props/placeholder.php diff --git a/site/snippets/docs/inputs/props/required.php b/site/docs/inputs/props/required.php similarity index 100% rename from site/snippets/docs/inputs/props/required.php rename to site/docs/inputs/props/required.php diff --git a/site/snippets/docs/inputs/props/spellcheck.php b/site/docs/inputs/props/spellcheck.php similarity index 100% rename from site/snippets/docs/inputs/props/spellcheck.php rename to site/docs/inputs/props/spellcheck.php diff --git a/site/snippets/docs/inputs/props/theme.php b/site/docs/inputs/props/theme.php similarity index 100% rename from site/snippets/docs/inputs/props/theme.php rename to site/docs/inputs/props/theme.php diff --git a/site/docs/kits.php b/site/docs/kits.php new file mode 100644 index 0000000000..0d89dc3c14 --- /dev/null +++ b/site/docs/kits.php @@ -0,0 +1,21 @@ +
+
+

+ + Starterkit + +

+

The Starterkit is a full-blown Kirby installation with a lot of example content, blueprints, templates and more. It is ideal for new users to explore many of Kirby's options and get to know the Panel. +

+
+
+

+ + Plainkit + +

+

+ The Plainkit is a minimal Kirby setup with the basics you need to start a project from scratch. It is the ideal choice if you are already familiar with Kirby and want to start step-by-step. +

+
+
diff --git a/site/snippets/docs/layouts/to-layouts.php b/site/docs/layouts/to-layouts.php similarity index 100% rename from site/snippets/docs/layouts/to-layouts.php rename to site/docs/layouts/to-layouts.php diff --git a/site/snippets/docs/panel-field-columns.php b/site/docs/panel-field-columns.php similarity index 100% rename from site/snippets/docs/panel-field-columns.php rename to site/docs/panel-field-columns.php diff --git a/site/snippets/docs/panel-field-max-and-min.php b/site/docs/panel-field-max-and-min.php similarity index 100% rename from site/snippets/docs/panel-field-max-and-min.php rename to site/docs/panel-field-max-and-min.php diff --git a/site/snippets/docs/panel-field-options.php b/site/docs/panel-field-options.php similarity index 100% rename from site/snippets/docs/panel-field-options.php rename to site/docs/panel-field-options.php diff --git a/site/snippets/docs/panel-picker-pagination.php b/site/docs/panel-picker-pagination.php similarity index 100% rename from site/snippets/docs/panel-picker-pagination.php rename to site/docs/panel-picker-pagination.php diff --git a/site/snippets/docs/permissions/option-permissions.php b/site/docs/permissions/option-permissions.php similarity index 100% rename from site/snippets/docs/permissions/option-permissions.php rename to site/docs/permissions/option-permissions.php diff --git a/site/snippets/docs/sections/conditional-sections.php b/site/docs/sections/conditional-sections.php similarity index 100% rename from site/snippets/docs/sections/conditional-sections.php rename to site/docs/sections/conditional-sections.php diff --git a/site/layouts/article.php b/site/layouts/article.php new file mode 100644 index 0000000000..5bffad9645 --- /dev/null +++ b/site/layouts/article.php @@ -0,0 +1,49 @@ + + + + + + + +
+
+
+
+ +
+

title() ?>

+ intro()->isNotEmpty()): ?> +
+

+ intro()->kti() ?> +

+
+ +
+ + + + +
+ + text()->kt() ?> + +
+ +
+ +
+ +
+ + 'Kirby', + 'menu' => collection('kirby') + ]) ?> + +
+
+
+ + + diff --git a/site/layouts/cookbook.php b/site/layouts/cookbook.php new file mode 100644 index 0000000000..b5e42c8856 --- /dev/null +++ b/site/layouts/cookbook.php @@ -0,0 +1,31 @@ + + + + + + + +
+
+
+
+ +
+

+
+ +
+ + +
+
+ +
+
+ +
+
+
+ + + diff --git a/site/layouts/default.php b/site/layouts/default.php new file mode 100644 index 0000000000..4a6a645959 --- /dev/null +++ b/site/layouts/default.php @@ -0,0 +1,18 @@ + + + + + + + +
+ +
+ + +
+ +
+ + + diff --git a/site/layouts/features.php b/site/layouts/features.php new file mode 100644 index 0000000000..5a564c28c6 --- /dev/null +++ b/site/layouts/features.php @@ -0,0 +1,64 @@ + + + + + + + + +
+ +
+
+
+
+
+

headline()->or($page->description()) ?>

+

+
+
+

title() ?>

+
    + benefits()->yaml() as $item): ?> +
  • + +
  • + +
+
+
+
+ + + + +
+

What are you waiting for?

+ [ + [ + 'text' => 'Try now', + 'link' => '/try', + 'icon' => 'download' + ], + [ + 'text' => 'Guide', + 'link' => '/docs/guide', + 'icon' => 'flash', + 'style' => 'outlined' + ] + ] + ]) ?> +
+ +
+ +
+ +
+
+ +
+ + + diff --git a/site/layouts/plugins.php b/site/layouts/plugins.php new file mode 100644 index 0000000000..2f8866c739 --- /dev/null +++ b/site/layouts/plugins.php @@ -0,0 +1,77 @@ + + + + + + + + + +
+
+
+
+ + +
+ +
+
+ +
+
+
+ + + diff --git a/site/layouts/reference.php b/site/layouts/reference.php new file mode 100644 index 0000000000..d4b36a4443 --- /dev/null +++ b/site/layouts/reference.php @@ -0,0 +1,163 @@ + + + + + + + + + + + +
+ +
+ + + 'reference']) ?> +
+
+ + + +
+ + + + hasEntries()): ?> + + + +
+
+
+

title() ?>

+ excerpt()->isNotEmpty()): ?> +
+
+ excerpt()->kt() ?> +
+
+ + +
+ + + + + + + + + +
+
+
+ + + + + + + diff --git a/site/models/cookbook-recipe.php b/site/models/cookbook-recipe.php new file mode 100644 index 0000000000..b4a1dcb008 --- /dev/null +++ b/site/models/cookbook-recipe.php @@ -0,0 +1,19 @@ +published()->toDate('U') > (time() - 4500000); + } + + public function metadata(): array + { + return [ + 'thumbnail' => [ + 'lead' => 'Cookbook', + 'title' => $this->title() + ] + ]; + } +} diff --git a/site/models/guide.php b/site/models/guide.php new file mode 100644 index 0000000000..07453f4312 --- /dev/null +++ b/site/models/guide.php @@ -0,0 +1,22 @@ +images()->findBy('extension', 'svg'); + + if ($image === null) { + $image = $this->parents()->flip()->not(page('docs/guide')->parents())->images()->findBy('extension', 'svg'); + } + + return [ + 'description' => strip_tags($this->intro()->kirbytags()), + 'thumbnail' => [ + 'lead' => $this->metaLead(page('docs/guide'), 'Guide'), + 'image' => $image + ] + ]; + } + +} diff --git a/site/models/kosmos-issue.php b/site/models/kosmos-issue.php new file mode 100644 index 0000000000..82a5534513 --- /dev/null +++ b/site/models/kosmos-issue.php @@ -0,0 +1,19 @@ + 'Kirby Kosmos Episode ' . $this->uid(), + 'description' => 'Read issue no. ' . $this->uid() . ' of our monthly newsletter online.', + 'thumbnail' => [ + 'lead' => 'Kirby Kosmos', + 'title' => 'Episode ' . $this->uid(), + 'image' => $this->image() + ], + 'changefreq' => 'never' + ]; + } +} diff --git a/site/models/plugin.php b/site/models/plugin.php index 2ad603f095..b8a3cfa880 100644 --- a/site/models/plugin.php +++ b/site/models/plugin.php @@ -1,102 +1,120 @@ kirby()->cache('plugins'); - } - - public function cacheId($section): string - { - return $this->id() . '/' . $section; - } - - public function download() - { - $repo = $this->repository()->value(); - - if (Str::contains($repo, 'github')) { - return $repo . '/archive/master.zip'; - } else if (Str::contains($repo, 'bitbucket')) { - return $repo . '/get/master.zip'; - } else if (Str::contains($repo, 'gitlab')) { - $reponame = basename($repo); - return $repo . '/-/archive/master/' . $reponame . '-master.zip'; + public function cache() + { + return $this->kirby()->cache('plugins'); } - return $repo; - } + public function cacheId($section): string + { + return $this->id() . '/' . $section; + } - public function info() - { - $info = Data::read($this->file('composer.json')->root()); + public function download() + { + $repo = $this->repository()->value(); - return Nest::create($info, $this); + if (Str::contains($repo, 'github')) { + return $repo . '/archive/master.zip'; + } else if (Str::contains($repo, 'bitbucket')) { + return $repo . '/get/master.zip'; + } else if (Str::contains($repo, 'gitlab')) { + $reponame = basename($repo); + return $repo . '/-/archive/master/' . $reponame . '-master.zip'; + } - } + return $repo; + } - public function version($onlyIfCached = false) - { + public function icon() + { + return option('plugins.categories.' . $this->category() . '.icon'); + } - $repo = $this->repository(); + public function info() + { + $info = Data::read($this->file('composer.json')->root()); - if (Str::contains($repo, 'github') === false) { - return false; + return Nest::create($info, $this); } - $cacheId = $this->cacheId('version'); - $version = $this->cache()->get($cacheId); + public function metadata(): array + { + return [ + 'thumbnail' => [ + 'lead' => 'Plugin', + 'image' => $this->screenshot() + ] + ]; + } - if ($version === null) { + public function screenshot(): ?File + { + return $this->images()->findBy('name', 'screenshot'); + } - if ($onlyIfCached === true) { - return false; - } + public function version($onlyIfCached = false) + { - $path = Url::path((string)$repo); - $response = Remote::get('https://api.github.com/repos/' . $path . '/releases/latest', [ - 'headers' => [ - 'User-Agent' => 'Kirby' - ] - ]); + $repo = $this->repository(); - $version = $response->json()['tag_name'] ?? false; + if (Str::contains($repo, 'github') === false) { + return false; + } - $this->cache()->set($cacheId, $version, 60); + $cacheId = $this->cacheId('version'); + $version = $this->cache()->get($cacheId); - } + if ($version === null) { - return $version; + if ($onlyIfCached === true) { + return false; + } - } + $path = Url::path((string)$repo); + $response = Remote::get('https://api.github.com/repos/' . $path . '/releases/latest', [ + 'headers' => ['User-Agent' => 'Kirby'] + ]); - public function toJson($onlyIfCached = false) - { + $version = $response->json()['tag_name'] ?? false; - $screenshot = $this->images()->findBy('name', 'screenshot'); + $this->cache()->set($cacheId, $version, 60); - return [ - 'title' => $this->title()->value(), - 'url' => $this->url(), - 'author' => [ - 'name' => $this->parent()->title()->value(), - 'url' => dirname($this->repository()), - ], - 'repository' => $this->repository()->value(), - 'download' => $this->download(), - 'category' => option('plugins.categories.' . $this->category() . '.label'), - 'description' => $this->description()->value(), - 'screenshot' => $screenshot ? $screenshot->url() : null, - 'version' => $this->version($onlyIfCached) - ]; + } - } + return $version; + + } + + public function toJson($onlyIfCached = false) + { + + $screenshot = $this->images()->findBy('name', 'screenshot'); + + return [ + 'title' => $this->title()->value(), + 'url' => $this->url(), + 'author' => [ + 'name' => $this->parent()->title()->value(), + 'url' => dirname($this->repository()), + ], + 'repository' => $this->repository()->value(), + 'download' => $this->download(), + 'category' => option('plugins.categories.' . $this->category() . '.label'), + 'description' => $this->description()->value(), + 'screenshot' => $screenshot ? $screenshot->url() : null, + 'version' => $this->version($onlyIfCached) + ]; + + } } diff --git a/site/models/reference-article.php b/site/models/reference-article.php new file mode 100644 index 0000000000..d50802394b --- /dev/null +++ b/site/models/reference-article.php @@ -0,0 +1,17 @@ + strip_tags($this->excerpt()->kirbytags()), + 'thumbnail' => [ + 'lead' => $this->metaLead(page('docs/reference')) + ] + ]; + } + +} diff --git a/site/models/reference-class.php b/site/models/reference-class.php new file mode 100644 index 0000000000..d294cb1c79 --- /dev/null +++ b/site/models/reference-class.php @@ -0,0 +1,276 @@ +kirby()->root('kirby') . '/config/aliases.php'; + + $alias = array_search($this->name(), static::$aliases); + $value = $alias !== false ? $alias : null; + return new Field($this, 'alias', $value); + } + + public function children(): Pages + { + if ($this->children !== null) { + return $this->children; + } + + $children = []; + $pages = parent::children(); + $reflection = $this->reflection(); + $methods = $reflection->getMethods(); + + foreach ($methods as $method) + { + // Don't include protected or private methods + if ($method->isPublic() === false) { + continue; + } + + $slug = Str::kebab($method->getName()); + + if ($page = $pages->find($slug)) { + $content = $page->content()->toArray(); + } else { + $content = []; + } + + $isMagic = substr($slug, 0, 1) === '_'; + $num = $isMagic ? null : 0; + + // Ensure that constructor method is listed, + // while other magic methods remain unlisted + if ($slug === '__construct') { + $num = 0; + + // Automatially activate $props support for + // constructur classmethod pages + if ($parameter = $method->getParameters()[0]) { + if ($type = $parameter->getType()) { + if ($type->getName() === 'array') { + $content['properties'] = $content['properties'] ?? '$' . $parameter->getName(); + } + } + } + } + + $children[] = [ + 'slug' => $slug, + 'model' => 'reference-classmethod', + 'template' => 'reference-classmethod', + 'parent' => $this, + 'content' => $content, + 'num' => $num + ]; + } + + // Create the actual class methods as children pages collection + $children = Pages::factory($children, $this)->filterBy('exists', true); + + // If the class is flagged as proxying another class, + // get the proxied class object and merge all its methods that are + // not covered by an actual class method + if ($this->proxies()->isNotEmpty()) { + if ($proxy = ReferenceClassPage::findByName($this->proxies())) { + $methods = $proxy->children()->filter(function ($method) use ($children) { + return $children->findByURI($method->slug()) === null; + }); + $missing = $methods->not($methods->intersection($children)); + $children = $children->add($missing); + } + } + + // Return children pages collection sorted by slug, + // but making sure `__construct` goes first + return $this->children = $children->sortBy( + 'isMagic', 'desc', + 'slug', 'asc', + SORT_NATURAL); + } + + public function exists(): bool + { + return class_exists($this->name()) === true || + trait_exists($this->name()) === true; + + } + + public static function findByName(string $class): ?Page + { + $class = ltrim($class, '\\'); + $class = ReferenceClassAliasesPage::resolve($class); + + // don't even start to look if the class does not exist in Kirby + if (class_exists($class) === false) { + return null; + } + + $packages = 'docs/reference/@/classes'; + $class = explode('\\', $class); + + if (count($class) > 2) { + $namespace = implode('//', array_slice($class, 1, -1)); + $class = array_slice($class, -1)[0]; + $id = Str::slug($namespace) . '/' . Str::slug($class); + + if ($page = page($packages . '/' . $id)) { + if ($page->intendedTemplate()->name() === 'link') { + $page = page($page->link()); + } + + return $page; + } + } + + return null; + } + + public function isStatic(): bool + { + return method_exists($this->name(), '__construct') === false; + } + + public function isTrait(): bool + { + if ($reflection = $this->reflection()) { + return $reflection->isTrait(); + } + + return false; + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'thumbnail' => [ + 'lead' => 'Reference / Object', + 'title' => $this->name() + ] + ]); + } + + public function name(bool $short = false): string + { + if ($short === true) { + // prefer content field `name` + if ($this->content()->has('name')) { + return $this->content()->get('name')->value(); + } + + return $this->reflection()->getShortName(); + } + + // get class name as defined in content file + return $this->class()->value(); + } + + public function properties(): array + { + if ($this->props !== null) { + return $this->props; + } + + $reflection = $this->reflection(); + + + if (!$reflection) { + return $this->props = []; + } + + $traits = []; + $getTraits = function ($class) use(&$getTraits, &$traits) { + if ($class->getParentClass() !== false) { + $getTraits($class->getParentClass()); + } + + $traits = array_merge($traits, $class->getTraitNames()); + }; + $getTraits($reflection); + + if (in_array('Kirby\\Toolkit\\Properties', $traits) === false) { + return $this->props = []; + } + + $properties = array_filter($reflection->getProperties(), function ($prop) use ($reflection) { + return $prop->getName() !== 'propertyData' && + $prop->isStatic() === false && + $reflection->hasMethod('set' . $prop->getName()) === true; + }); + + $data = []; + + foreach ($properties as $prop) { + + $name = $prop->getName(); + $description = null; + $type = null; + $required = false; + + if ($method = $reflection->getMethod('set' . $name)) { + $required = $method->getNumberOfRequiredParameters() > 0; + $parameter = $method->getParameters()[0]; + + try { + $doc = new DocBlock($method->getDocComment()); + $description = (string)$doc->getSummary(); + } catch (Throwable $e) { + $doc = null; + } + + if ($doc && $doc->getTag('internal')) { + continue; + } + + if ($type = $parameter->getType()) { + $type = $type->getName(); + } elseif ($doc) { + $type = (string)$doc->getParameters()[0]->getType(); + } + } + + $type = Type::factory($type ?? 'mixed', $this); + $data[] = compact('name', 'required', 'type', 'description'); + } + + // sort by the name of the prop + array_multisort(array_column($data, 'name'), SORT_ASC, $data); + + return $this->props = $data; + } + + public function onGitHub(string $path = ''): Field + { + $path = str_replace('Kirby\\', '', $this->name()); + $path = str_replace('\\', '/', $path); + return parent::onGitHub('src/' . $path . '.php'); + } + + public function title(): Field + { + if ($this->content()->has('title')) { + return parent::title(); + } + + $title = $this->name(true); + return parent::title()->value($title); + } + + protected function _reflection() + { + return new ReflectionClass($this->name()); + } + +} diff --git a/site/models/reference-classaliases.php b/site/models/reference-classaliases.php new file mode 100644 index 0000000000..c418cd6b0e --- /dev/null +++ b/site/models/reference-classaliases.php @@ -0,0 +1,66 @@ +root('kirby') . '/config/aliases.php'; + } + + public function children(): Pages + { + if ($this->children !== null) { + return $this->children; + } + + $aliases = $this->aliases(); + $children = []; + + foreach ($aliases as $alias => $class) { + + $parts = explode('\\', $class); + + $children[] = [ + 'slug' => Str::kebab($alias), + 'model' => 'link', + 'template' => 'link', + 'parent' => $this, + 'num' => 0, + 'content' => [ + 'title' => ucfirst($alias), + 'excerpt' => '→ ' . $class, + 'link' => ReferenceClassPage::findByName($class)->id() + ], + ]; + } + + return $this->children = Pages::factory($children, $this); + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'thumbnail' => [ + 'lead' => 'Reference / Class' + ] + ]); + } + + public static function resolve(string $name): string + { + $aliases = static::aliases(); + return $aliases[Str::lower($name)] ?? $name; + + } + +} diff --git a/site/models/reference-classmethod.php b/site/models/reference-classmethod.php new file mode 100644 index 0000000000..8966c16991 --- /dev/null +++ b/site/models/reference-classmethod.php @@ -0,0 +1,130 @@ +class(true); + + if ($this->name() === '__construct') { + return 'new ' . $class . Str::after($call, $this->slug()); + } + + if ($this->isStatic() === true) { + return $class . '::' . $call; + } + + return '$' . strtolower($class) . '->' . $call; + } + + public function class(bool $short = false): string + { + return $this->parent()->name($short); + } + + public function exists(): bool + { + return method_exists($this->class(), $this->name()); + } + + public function inheritedFrom(): ?string + { + if ($this->inherited !== null) { + return $this->inherited; + } + + if ($parent = $this->reflection()->getDeclaringClass()) { + if ($parent->getName() === $this->parent()->name()) { + return null; + } + + if ($page = ReferenceClassPage::findByName($parent->getName())) { + return $this->inherited = $page->name(); + } + + return $this->inherited = $parent->getName(); + } + + return null; + } + + /** + * Checks if this is a magic method + * + * @return boolean + */ + public function isMagic(): bool + { + return substr($this->slug(), 0, 2) === '__'; + } + + /** + * Checks if this is static + * + * @return boolean + */ + public function isStatic(): bool + { + if ($reflection = $this->reflection()) { + return $reflection->isStatic() === true; + } + + return false; + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'thumbnail' => [ + 'lead' => 'Reference / Method' + ] + ]); + } + + public function onGitHub(string $path = ''): Field + { + if ($reflection = $this->reflection()) { + $file = $reflection->getFileName(); + $path = Str::from($file, 'src/'); + return parent::onGitHub($path); + } + } + + public function parameters(): array + { + if ($this->parameters !== null) { + return $this->parameters; + } + + $parameters = parent::parameters(); + + foreach ($parameters as $key => $parameter) { + $parameters[$key]['type'] = Type::factory($parameter['type'], $this); + } + + return $this->parameters = $parameters; + } + + public function title(): Field + { + $call = $this->call($this->name() . '()'); + return parent::title()->value($call); + } + + protected function _reflection() + { + return new ReflectionMethod($this->parent()->name(), $this->name()); + } + +} diff --git a/site/models/reference-component.php b/site/models/reference-component.php new file mode 100644 index 0000000000..b802e6bcdf --- /dev/null +++ b/site/models/reference-component.php @@ -0,0 +1,50 @@ +kirby()->root('kirby') . '/config/components.php'; + } + + return static::$components[$this->name()] ?? false; + } + + public function exists(): bool + { + return $this->component() !== false; + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'thumbnail' => [ + 'lead' => 'Reference / Core component' + ] + ]); + } + + public function name(): string + { + return $this->content()->get('name')->or($this->slug()); + } + + public function onGitHub(string $path = ''): Field + { + return parent::onGitHub('config/components.php'); + } + + protected function _reflection() + { + if ($component = $this->component()) { + return new ReflectionFunction($component); + } + } +} diff --git a/site/models/reference-endpoint.php b/site/models/reference-endpoint.php new file mode 100644 index 0000000000..6b4b4ff5a7 --- /dev/null +++ b/site/models/reference-endpoint.php @@ -0,0 +1,28 @@ +method() . ': ' . $this->title(); + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'description' => 'Documentation for the ' . $this->title() . 'API endpoint.', + 'thumbnail' => [ + 'lead' => 'Reference / API' + ] + ]); + } + + public function title(): Field + { + return parent::title()->value('/api' . parent::title()); + } +} diff --git a/site/models/reference-endpoints.php b/site/models/reference-endpoints.php new file mode 100644 index 0000000000..2657f46c00 --- /dev/null +++ b/site/models/reference-endpoints.php @@ -0,0 +1,24 @@ +value('/api/' . $this->slug()); + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'description' => 'Documentation for ' . $this->title() . ' API endpoints.', + 'thumbnail' => [ + 'lead' => 'Reference / API' + ] + ]); + } + +} diff --git a/site/models/reference-extension.php b/site/models/reference-extension.php new file mode 100644 index 0000000000..69c1b42dfd --- /dev/null +++ b/site/models/reference-extension.php @@ -0,0 +1,18 @@ + [ + 'lead' => 'Reference / Extension', + 'title' => $this->title() + ] + ]); + } + +} diff --git a/site/models/reference-extensions.php b/site/models/reference-extensions.php new file mode 100644 index 0000000000..a0499a984c --- /dev/null +++ b/site/models/reference-extensions.php @@ -0,0 +1,8 @@ +name()); + } + + /** + * Returns example how field method would be called + * + * @return string + */ + public function call(): string + { + return '$field->' . parent::call(); + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'thumbnail' => [ + 'lead' => 'Reference / Field method' + ] + ]); + } + + /** + * Returns the URL to the source code on GitHub + * + * @return \Kirby\Cms\Field + */ + public function onGitHub(string $path = ''): Field + { + if (is_a($this->reflection(), 'ReflectionMethod') === true) { + return parent::onGitHub('src/Cms/Field.php'); + } + + return parent::onGitHub('config/methods.php'); + } + + /** + * Returns an array with all parameter info. + * Omits the inserted `$field` parameter from refleciton info as + * it does not get passed on the call + * + * @return array + */ + public function parameters(): array + { + $parameters = parent::parameters(); + + // Kirby automatically inserts $field as first parameter on all methods + // defined in `kirby/config/methods.php`. The reflection picks up this + // parameter, however, we need to remove it from the list as it does not + // actually get passed when calling the field method + if (isset($parameters[0]) && $parameters[0]['name'] === '$field') { + array_shift($parameters); + } + + return $parameters; + } + + /** + * Returns title based on field method call + * + * @return \Kirby\Cms\Field + */ + public function title(): Field + { + return parent::title()->value('$field->' . $this->name() . '()'); + } + + /** + * Helper for reflection object + */ + protected function _reflection() + { + $key = strtolower($this->name()); + + if (isset(Field::$methods[$key]) === true) { + return new ReflectionFunction(Field::$methods[$key]); + } + + if (method_exists(Field::class, $this->name()) === true) { + return new ReflectionMethod(Field::class, $this->name()); + } + } + +} diff --git a/site/models/reference-fieldmethods.php b/site/models/reference-fieldmethods.php new file mode 100644 index 0000000000..5c927c5412 --- /dev/null +++ b/site/models/reference-fieldmethods.php @@ -0,0 +1,70 @@ +children !== null) { + return $this->children; + } + + $children = []; + $pages = parent::children(); + $methods = array_merge( + $this->getDynamicMethods(), + $this->getNativeMethods() + ); + + foreach ($methods as $name => $reflection) { + $slug = Str::kebab($name); + + if ($page = $pages->find($slug)) { + $content = $page->content()->toArray(); + } else { + $content = []; + } + + $children[] = [ + 'slug' => $slug, + 'num' => 0, + 'template' => 'reference-fieldmethod', + 'model' => 'reference-fieldmethod', + 'parent' => $this, + 'content' => $content + ]; + } + + return $this->children = Pages::factory($children, $this)->sortBy('title', 'asc'); + } + + protected function getDynamicMethods() + { + $methods = (include $this->kirby()->root('kirby') . '/config/methods.php')($this->kirby()); + + foreach ($methods as $key => $function) { + $methods[$key] = new ReflectionFunction($function); + } + + return $methods; + } + + protected function getNativeMethods() + { + $methods = []; + $reflection = new ReflectionClass(Field::class); + + foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { + $name = $method->getName(); + + if (substr($name, 0, 1) !== '_') { + $methods[$name] = $method; + } + } + + return $methods; + } + +} diff --git a/site/models/reference-helper.php b/site/models/reference-helper.php new file mode 100644 index 0000000000..7f693dc9f5 --- /dev/null +++ b/site/models/reference-helper.php @@ -0,0 +1,38 @@ +slug()); + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'thumbnail' => [ + 'lead' => 'Reference / Helper' + ] + ]); + } + + public function onGitHub(string $path = ''): Field + { + return parent::onGitHub('config/helpers.php'); + } + + public function title(): Field + { + return parent::title()->value($this->name() . '()'); + } + + protected function _reflection() + { + return new ReflectionFunction($this->slug()); + } + +} diff --git a/site/models/reference-helpers.php b/site/models/reference-helpers.php new file mode 100644 index 0000000000..e58812608e --- /dev/null +++ b/site/models/reference-helpers.php @@ -0,0 +1,8 @@ +arguments(); + } + + public function example() + { + $tab = ' '; + $args = $this->arguments(); + + $example[] = '```php "/site/config/config.php"'; + $example[] = 'return ['; + $example[] = $tab . "'hooks' => ["; + $example[] = $tab . $tab . "'" . $this->title() . "' => function ($args) {"; + $example[] = $tab . $tab . $tab . '// your code goes here'; + + if ($this->type() == 'apply') { + $example[] = $tab . $tab . $tab . 'return ' . $args . ';'; + } + + $example[] = $tab . $tab . '}'; + $example[] = $tab . ']'; + $example[] = ']'; + $example[] = '```'; + + return parent::example()->value(implode(PHP_EOL, $example)); + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'description' => 'Reference page for the hook ' . $this->title(), + 'thumbnail' => [ + 'lead' => 'Reference / Hooks' + ] + ]); + } + +} diff --git a/site/models/reference-hooks.php b/site/models/reference-hooks.php new file mode 100644 index 0000000000..024606e278 --- /dev/null +++ b/site/models/reference-hooks.php @@ -0,0 +1,44 @@ +children !== null) { + return $this->children; + } + + $pages = parent::children(); + $children = array_map(function ($hook) use ($pages) { + + $slug = Str::slug($hook['Name']); + + if ($page = $pages->find($slug)) { + $content = $page->content()->toArray(); + } else { + $content = []; + } + + $content = array_merge([ + 'title' => $hook['Name'], + 'arguments' => implode(', ', Str::split($hook['Arguments'])), + 'type' => $hook['Type'] + ], $content); + + return [ + 'slug' => Str::slug($hook['Name']), + 'template' => 'reference-hook', + 'model' => 'reference-hook', + 'num' => 0, + 'content' => $content + ]; + }, csv($this->root() . '/hooks.csv')); + + return $this->children = Pages::factory($children, $this); + } + +} diff --git a/site/models/reference-icon.php b/site/models/reference-icon.php new file mode 100644 index 0000000000..9910dba348 --- /dev/null +++ b/site/models/reference-icon.php @@ -0,0 +1,20 @@ + $this->slug() . ' icon', + 'description' => 'Preview of the ”' . $this->slug() . '“ icon.', + 'thumbnail' => [ + 'lead' => 'Reference / Icon', + 'title' => $this->slug() + ] + ]); + } + +} diff --git a/site/models/reference-icons.php b/site/models/reference-icons.php new file mode 100644 index 0000000000..e9b1864470 --- /dev/null +++ b/site/models/reference-icons.php @@ -0,0 +1,37 @@ +children !== null) { + return $this->children; + } + + $children = []; + $root = $this->kirby()->root('panel') . '/dist/img/icons.svg'; + $file = F::read($root); + $svg = new SimpleXMLElement($file); + + foreach ($svg->defs->children() as $symbol) { + $slug = str_replace('icon-', '', $symbol->attributes()->id); + $children[] = [ + 'slug' => $slug, + 'template' => 'reference-icon', + 'model' => 'reference-icon', + 'num' => 0, + 'content' => [ + 'excerpt' => '<k-icon type="' . $slug . '">' + ] + ]; + } + + return $this->children = Pages::factory($children, $this) + ->sortBy('slug'); + } + +} diff --git a/site/models/reference-kirbytag.php b/site/models/reference-kirbytag.php new file mode 100644 index 0000000000..4bf5cb2e55 --- /dev/null +++ b/site/models/reference-kirbytag.php @@ -0,0 +1,63 @@ +name()]['attr']; + } + + public function exists(): bool + { + return isset(KirbyTag::$types[$this->name()]) === true; + } + + + public function line(): ?int + { + if ($reflection = $this->reflection()) { + $line = $reflection->getStartLine(); + $line -= 2; + + $attributes = $this->attributes(); + + if (count($attributes) > 0) { + $line -= count($attributes) + 1; + } + + return $line; + } + + return null; + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'ogtitle' => $this->title() . ' KirbyTag', + 'thumbnail' => [ + 'lead' => 'Reference / KirbyTag' + ] + ]); + } + + public function onGitHub(string $path = ''): Field + { + return parent::onGitHub('config/tags.php'); + } + + public function title(): Field + { + return new Field($this, 'title', '(' . $this->name() . ': …)'); + } + + protected function _reflection() + { + return new ReflectionFunction(KirbyTag::$types[$this->name()]['html']); + } +} diff --git a/site/models/reference-kirbytags.php b/site/models/reference-kirbytags.php new file mode 100644 index 0000000000..82c707ef9f --- /dev/null +++ b/site/models/reference-kirbytags.php @@ -0,0 +1,8 @@ +children !== null) { + return $this->children; + } + + $children = []; + $root = $this->kirby()->root('kirby') . '/src'; + + foreach (Dir::dirs($root) as $package) { + // Package + $children[] = static::package( + ucfirst($package), + $root . '/' . $package, + $this + ); + + // Subpackages + foreach (Dir::dirs($root . '/' . $package) as $subpackage) { + $children[] = static::package( + ucfirst($package) . '\\' . ucfirst($subpackage), + $root . '/' . $package . '/' . $subpackage, + $this + ); + } + } + + return $this->children = Pages::factory($children, $this); + } + + /** + * Creates an array of page properties for all class files in the + * provided root, assigning them to a provided namespace + * + * @param string $root + * @param string $namespace + * @return array + */ + protected static function classes(string $root, string $namespace): array + { + $pages = []; + + foreach (Dir::files($root) as $class) { + $name = ucfirst(basename($class, '.php')); + $class = 'Kirby\\' . $namespace . '\\' . $name; + $reference = page('docs/reference'); + + // See if class is a top-level priority object in Reference + $objects = $reference->find('objects')->children()->listed(); + $priority = $objects->filterBy('class', $class)->first(); + + // Also make sure to check the Tools section + if ($priority === null) { + $tools = $reference->find('tools')->children()->listed(); + $priority = $tools->filterBy('class', $class)->first(); + } + + // If we already have it in the Reference, create a link + if ($priority) { + $pages[] = [ + 'slug' => Str::slug($name), + 'model' => 'link', + 'template' => 'link', + 'num' => 0, + 'content' => [ + 'title' => $priority->name(true), + 'excerpt' => $priority->excerpt(), + 'link' => $priority->id() + ] + ]; + + // Otherwise create virtual class page + } else { + $pages[] = [ + 'slug' => Str::slug($name), + 'model' => 'reference-class', + 'template' => 'reference-class', + 'num' => 0, + 'content' => [ + 'class' => $class + ] + ]; + } + } + + return $pages; + } + + /** + * Return package props with classes as children collection + * + * @param string $name + * @param string $root + * @param static $parent + * @return array + */ + protected static function package(string $name, string $root, $parent): array + { + return [ + 'slug' => $slug = Str::slug($name), + 'template' => 'link', + 'parent' => $parent, + 'num' => 0, + 'content' => [ + 'title' => 'Kirby\\' . $name, + 'link' => 'docs/reference/@/classes#' . $slug + ], + 'children' => static::classes($root, $name) + ]; + } + +} diff --git a/site/models/reference-panelsection.php b/site/models/reference-panelsection.php new file mode 100644 index 0000000000..927b3bc663 --- /dev/null +++ b/site/models/reference-panelsection.php @@ -0,0 +1,8 @@ +value('```php' . PHP_EOL . 'root(\'' . $this->slug() . '\') ?>' . PHP_EOL . '```'); + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'thumbnail' => [ + 'lead' => 'Reference / Roots' + ] + ]); + } + + public function setup(): string + { + $text = $this->parent()->custom()->kt()->value(); + return str_replace('{{ root }}', $this->slug(), $text); + } + + public function template(): Template + { + return $this->kirby()->template('reference-system'); + } + + + public function title(): Field + { + return parent::title()->value('$kirby->root(\'' . $this->slug() . '\')'); + } + +} diff --git a/site/models/reference-roots.php b/site/models/reference-roots.php new file mode 100644 index 0000000000..ba72ae6739 --- /dev/null +++ b/site/models/reference-roots.php @@ -0,0 +1,8 @@ +value(html('slug() . '>')); + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'description' => 'Documentation for the ' . $this->excerpt() . ' Vue component.', + 'thumbnail' => [ + 'lead' => 'UI Kit', + 'title' => html_entity_decode($this->excerpt()) + ] + ]); + } + +} diff --git a/site/models/reference-url.php b/site/models/reference-url.php new file mode 100644 index 0000000000..f090c1e5ee --- /dev/null +++ b/site/models/reference-url.php @@ -0,0 +1,40 @@ +value('```php' . PHP_EOL . 'url(\'' . $this->slug() . '\') ?>' . PHP_EOL . '```'); + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'thumbnail' => [ + 'lead' => 'Reference / URL' + ] + ]); + } + + public function setup(): string + { + $text = $this->parent()->custom()->kt()->value(); + return str_replace('{{ url }}', $this->slug(), $text); + } + + public function template(): Template + { + return $this->kirby()->template('reference-system'); + } + + public function title(): Field + { + return parent::title()->value('$kirby->url(\'' . $this->slug() . '\')'); + } + +} diff --git a/site/models/reference-urls.php b/site/models/reference-urls.php new file mode 100644 index 0000000000..6812030764 --- /dev/null +++ b/site/models/reference-urls.php @@ -0,0 +1,8 @@ +name()]); + } + + public function metadata(): array + { + return array_replace_recursive(parent::metadata(), [ + 'thumbnail' => [ + 'lead' => 'Reference / Validator' + ] + ]); + } + + public function onGitHub(string $path = ''): Field + { + return parent::onGitHub('src/Toolkit/V.php'); + } + + protected function _reflection() + { + return new ReflectionFunction(V::$validators[$this->name()]); + } + +} diff --git a/site/models/reference-validators.php b/site/models/reference-validators.php new file mode 100644 index 0000000000..ab33c64a06 --- /dev/null +++ b/site/models/reference-validators.php @@ -0,0 +1,46 @@ +children !== null) { + return $this->children; + } + + $children = []; + $validators = array_keys(V::$validators); + $pages = parent::children(); + + foreach ($validators as $validator) { + $slug = Str::kebab($validator); + + if ($page = $pages->find($slug)) { + $content = $page->content()->toArray(); + } else { + $content = []; + } + + $children[] = [ + 'slug' => $slug, + 'num' => 0, + 'model' => 'reference-validator', + 'template' => 'reference-validator', + 'parent' => $this, + 'content' => array_merge( + $content, + ['title' => $validator] + ) + ]; + } + + return Pages::factory($children, $this); + } + +} diff --git a/site/models/reference.php b/site/models/reference.php new file mode 100644 index 0000000000..c2e2149ac0 --- /dev/null +++ b/site/models/reference.php @@ -0,0 +1,9 @@ +toStructure(); + return parent::incidents()->toStructure()->flip(); } public function incidentsTable() { - return snippet('security-incidents', ['incidents' => $this->incidents()], true); + return snippet('templates/security/incidents', ['incidents' => $this->incidents()], true); } public function replace() @@ -36,7 +36,7 @@ public function supported() public function supportedTable() { - return snippet('security-supported', ['supported' => $this->supported()], true); + return snippet('templates/security/supported', ['supported' => $this->supported()], true); } public function text() diff --git a/site/plugins/algolia/composer.json b/site/plugins/algolia/composer.json deleted file mode 100644 index 1bb660c716..0000000000 --- a/site/plugins/algolia/composer.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "require": { - "algolia/algoliasearch-client-php": "^1.25" - }, - "autoload": { - "psr-4": { - "Kirby\\Algolia\\": "src/" - } - } -} diff --git a/site/plugins/algolia/composer.lock b/site/plugins/algolia/composer.lock deleted file mode 100644 index 2d38d85d6f..0000000000 --- a/site/plugins/algolia/composer.lock +++ /dev/null @@ -1,69 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "hash": "d7ec7db31282670f0361cd8c334a4f60", - "content-hash": "cdee6ddd5693e3e3219b3a843c5ac41b", - "packages": [ - { - "name": "algolia/algoliasearch-client-php", - "version": "1.25.1", - "source": { - "type": "git", - "url": "https://github.com/algolia/algoliasearch-client-php.git", - "reference": "805021ea52630756d2da01d482309a2fdc47d3c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/algolia/algoliasearch-client-php/zipball/805021ea52630756d2da01d482309a2fdc47d3c0", - "reference": "805021ea52630756d2da01d482309a2fdc47d3c0", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4", - "satooshi/php-coveralls": "^1.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "AlgoliaSearch": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Algolia Team", - "email": "contact@algolia.com" - }, - { - "name": "Ryan T. Catlin", - "email": "ryan.catlin@gmail.com" - }, - { - "name": "Jonathan H. Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Algolia Search API Client for PHP", - "homepage": "https://github.com/algolia/algoliasearch-client-php", - "time": "2018-03-02 13:24:10" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": [], - "platform-dev": [] -} diff --git a/site/plugins/algolia/index.php b/site/plugins/algolia/index.php deleted file mode 100644 index f9c05d2343..0000000000 --- a/site/plugins/algolia/index.php +++ /dev/null @@ -1,13 +0,0 @@ - - * @license MIT - * @link https://getkirby.com - */ -class Results extends Collection -{ - - // Result metadata - protected $totalCount; - protected $processingTime; - protected $searchQuery; - protected $params; - - /** - * Class constructor - * - * @param array $results Returned data from an Algolia search operation - */ - public function __construct ($results) - { - // Defaults in case the results are invalid - $defaults = [ - 'hits' => [], - 'page' => 0, - 'nbHits' => 0, - 'nbPages' => 0, - 'hitsPerPage' => 20, - 'processingTimeMS' => 0, - 'query' => '', - 'params' => '' - ]; - - $results = array_merge($defaults, $results); - - // Convert the hits to Obj objects - $hits = array_map(function ($hit) { - return new Obj($hit); - }, $results['hits']); - - // Get metadata from the results - // Algolia uses zero based page indexes while Kirby's pagination starts at 1 - $page = $results['page'] + 1; - $totalCount = $results['nbHits']; - $hitsPerPage = $results['hitsPerPage']; - $processingTime = $results['processingTimeMS']; - $searchQuery = $results['query']; - $params = $results['params']; - - // Store the results - parent::__construct($hits); - - $this->totalCount = $totalCount; - $this->processingTime = $processingTime; - $this->searchQuery = $searchQuery; - $this->params = $params; - - // Paginate the collection - $this->pagination = new Pagination([ - 'page' => $page, - 'total' => $totalCount, - 'limit' => $hitsPerPage, - ]); - - } - - /** - * Returns the total count of results for the search query - * $results->count() returns the count of results on the current pagination page - * - * @return int - */ - public function totalCount() - { - return $this->totalCount; - } - - /** - * Returns the Algolia server processing time in ms - * - * @return int - */ - public function processingTime() - { - return $this->processingTime; - } - - /** - * Returns the search query - * - * @return string - */ - public function searchQuery() - { - return $this->searchQuery; - } - - /** - * Returns the Algolia search parameter string - * Useful when debugging search requests - * - * @return string - */ - public function params() - { - return $this->params; - } -} diff --git a/site/plugins/algolia/src/Search.php b/site/plugins/algolia/src/Search.php deleted file mode 100644 index 9869f648a5..0000000000 --- a/site/plugins/algolia/src/Search.php +++ /dev/null @@ -1,395 +0,0 @@ - - * @license MIT - * @link https://getkirby.com - */ -class Search -{ - - // Singleton class instance - public static $instance; - - // Algolia client instance - protected $algolia; - - // Config settings - protected $options; - - // Caches - protected $indexCache = []; - - /** - * Class constructor - */ - public function __construct() - { - $this->options = option('algolia'); - - if (isset($this->options['app'], $this->options['key']) === false) { - throw new Exception('Please set your Algolia API credentials in the Kirby configuration.'); - } - - $this->algolia = new AlgoliaClient($this->options['app'], $this->options['key']); - } - - /** - * Returns a singleton instance of the Algolia class - * - * @return Algolia - */ - public static function instance(): self - { - return static::$instance = static::$instance ?? new static; - } - - /** - * Sends a search query to Algolia and returns a paginated collection of results - * - * @param string $query Search query - * @param integer $page Pagination page to return (starts at 1, not 0!) - * @param array $options Search parameters to override the default settings - * See https://www.algolia.com/doc/php#full-text-search-parameters - * @return Collection - */ - public function search(string $query = null, $page = 1, array $options = []): Results - { - $defaults = $this->options['options'] ?? []; - $options = array_merge($defaults, $options); - - // Set the page parameter - // Algolia uses zero based page indexes while Kirby's pagination starts at 1 - $options['page'] = ($page)? $page - 1 : 0; - - // Start the search - $results = $this->getIndex()->search($query, $options); - - // Return a collection of the results - return new Results($results); - } - - /** - * Indexes everything and replaces the current index - * - * Uses atomical re-indexing: - * https://www.algolia.com/doc/faq/index-configuration/how-can-i-update-all-the-objects-of-my-index - */ - public function index() - { - // Get the settings from the main index - $mainIndex = $this->getIndex(); - $settings = $mainIndex->getSettings(); - - // Make sure that we don't copy over slaves - $settings['slaves'] = []; - - // Save the settings into a fresh temp index - $tempIndex = $this->getIndex(true); - $tempIndex->setSettings($settings); - $tempIndex->clearIndex(); - - // Add all objects back in - $queue = []; - - foreach(site()->index()->filter([$this, 'isIndexable']) as $p) { - $queue[] = $this->formatPage($p); - - // Always upload objects in batches of 100 for performance reasons - if (count($queue) >= 100) { - $tempIndex->saveObjects($queue); - $queue = []; - } - } - - // Upload the remaining objects - $tempIndex->saveObjects($queue); - - // Move the temp index to the main index - $this->algolia->moveIndex($this->getIndexName(true), $this->getIndexName()); - } - - /** - * Inserts a page into the index - * Used by Panel hooks - * - * @param Page $page Kirby page - */ - public function insertPage(Page $page) - { - if (static::isIndexable($page) === false) { - return false; - } - - $this->getIndex()->saveObject(static::formatPage($page)); - } - - /** - * Updates a page in the index - * Used by Panel hooks - * - * @param Page $page Kirby page - */ - public function updatePage(Page $page) - { - if (static::isIndexable($page) === false) { - // Delete the page from the index - $this->deletePage($page); - return false; - } - - $this->getIndex()->saveObject(static::formatPage($page)); - } - - /** - * Moves a page in the index - * Used by Panel hooks - * - * @param Page $oldPage Kirby page object before the move - * @param Page $newPage Kirby page object after the move - */ - public function movePage(Page $oldPage, Page $newPage) - { - // Delete the old object - $this->deletePage($oldPage); - - // Insert the new object - $this->insertPage($newPage); - } - - /** - * Deletes a page from the index - * - * @param Page|string $id Kirby page or page ID - */ - public function deletePage($id) - { - if ($id instanceof Page) { - $id = $id->id(); - } - - $this->getIndex()->deleteObject($id); - } - - /** - * Deletes a page and all its children from the index - * Used by Panel hooks - * - * @param Page|string $page Kirby page or page ID - */ - public function deletePageRecursive($page) - { - if (is_string($page)) { - $page = page($page); - } - - if (!$page) { - return false; - } - - $this->deletePage($page); - - foreach ($page->children() as $p) { - $this->deletePageRecursive($p); - } - } - - /** - * Checks if a specific page should be included in the Algolia index - * Uses the configuration option algolia.templates - * - * @param Page $page Kirby page - * @return boolean - */ - public static function isIndexable(Page $page) - { - $templates = option('algolia')['templates'] ?? []; - $pageTemplate = $page->intendedTemplate()->name(); - - // Quickly whitelist simple definitions - // Example: array('project') - if (in_array($pageTemplate, $templates, true)) { - return true; - } - - // Sort out pages whose template is not defined - if (!isset($templates[$pageTemplate])) { - return false; - } - - $template = $templates[$pageTemplate]; - - // Check if the template is defined as a boolean - // Example: array('project' => true, 'contact' => false) - if (is_bool($template)) { - return $template; - } - - // Skip every value that is not a boolean or array for consistency - if (!is_array($template)) { - return false; - } - - // Check for the custom filter function - // Example: array('project' => array('filter' => function($page) {...})) - if (isset($template['filter'])) { - $filter = $template['filter']; - if (is_callable($filter) && !call_user_func($filter, $page)) { - return false; - } - } - - // No rule was violated, the page is indexable - return true; - } - - /** - * Converts a page into a data array for Algolia - * Uses the configuration options algolia.fields and algolia.templates - * - * @param Page $page Kirby page - * @return array - */ - public static function formatPage(Page $page) - { - $fields = option('algolia')['fields'] ?? ['url', 'intendedTemplate']; - $templates = option('algolia')['templates'] ?? []; - - $pageTemplate = $page->intendedTemplate()->name(); - - // Merge fields with the default fields and make array structure consistent - if (isset($templates[$pageTemplate]['fields'])) { - $fields = array_merge( - static::cleanUpFields($fields), - static::cleanUpFields($templates[$pageTemplate]['fields']) - ); - } else { - $fields = static::cleanUpFields($fields); - } - - // Build resulting data array - $data = ['objectID' => $page->id()]; - - foreach ($fields as $name => $operation) { - if (is_callable($operation)) { - // Custom function - $data[$name] = call_user_func($operation, $page); - } elseif(is_string($operation)) { - // Field method without parameters - $result = $page->$name(); - - if(is_a($result, Field::class) === false) { - $result = new Field($page, $name, $result); - } - - $result = $result->$operation(); - - // Make sure that the result is not an object - $data[$name] = (is_object($result))? (string)$result : $result; - } elseif(is_array($operation)) { - // Field method with parameters - $result = $page->$name(); - - // Skip invalid definitions - if(!isset($operation[0])) { - $data[$name] = (string)$result; - continue; - } - - if(!($result instanceof Field)) { - $result = new Field($page, $name, $result); - } - - $parameters = array_slice($operation, 1); - $operation = $operation[0]; - $result = call_user_func_array(array($result, $operation), $parameters); - - // Make sure that the result is not an object - $data[$name] = (is_object($result))? (string)$result : $result; - } else { - // No or invalid operation, convert to string - $data[$name] = (string)$page->$name(); - } - } - - return $data; - } - - /** - * Returns the number of indexable pages - * - * @return int - */ - public function objectCount() { - return site()->index()->filter()->count(); - } - - /** - * Returns the correct Algolia index (temporary or main) - * - * @param boolean $temp If true, returns the temporary index - * @return AlgoliaSearch\Index - */ - protected function getIndex($temp = false) { - $index = $this->getIndexName($temp); - - if(isset($this->indexCache[$index])) return $this->indexCache[$index]; - return $this->indexCache[$index] = $this->algolia->initIndex($index); - } - - /** - * Returns the name of the correct Algolia index (temporary or main) - * - * @param boolean $temp If true, returns the name of the temporary index - * @return string - */ - protected function getIndexName($temp = false) { - $index = $this->options['index'] ?? 'kirby'; - - if ($temp) { - return $this->options['index.temp'] ?? $index . '_temp'; - } else { - return $index; - } - } - - /** - * Makes an array of fields and operations consistent - * for formatPage() - * - * @param array $fields - * @return array - */ - protected static function cleanUpFields($fields) { - $result = array(); - - foreach($fields as $name => $operation) { - // Make sure the name is always the key, even if no operation was given - if(is_int($name)) { - $name = $operation; - $operation = null; - } - - $result[$name] = $operation; - } - - // Make sure that the fields are sorted alphabetically for consistence - ksort($result); - return $result; - } -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/.php_cs b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/.php_cs deleted file mode 100644 index df1a700cae..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/.php_cs +++ /dev/null @@ -1,18 +0,0 @@ -in(__DIR__ . DIRECTORY_SEPARATOR . 'src') - ->in(__DIR__ . DIRECTORY_SEPARATOR . 'tests') -; - -return Symfony\CS\Config\Config::create() - ->setUsingCache(true) - ->level(Symfony\CS\FixerInterface::SYMFONY_LEVEL) - ->fixers([ - 'align_double_arrow', - 'long_array_syntax', - '-multiline_array_trailing_comma', - '-pre_increment', - ]) - ->finder($finder) -; diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/.styleci.yml b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/.styleci.yml deleted file mode 100644 index 96526ee099..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/.styleci.yml +++ /dev/null @@ -1,11 +0,0 @@ -preset: PSR2 - -linting: true - -enabled: - - long_array_syntax - -finder: - path: - - "src/AlgoliaSearch" - - "tests/AlgoliaSearch" \ No newline at end of file diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/LICENSE.txt b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/LICENSE.txt deleted file mode 100644 index 8c315f450b..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Algolia -http://www.algolia.com/ - -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/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/algoliasearch.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/algoliasearch.php deleted file mode 100644 index 85d1a5ab18..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/algoliasearch.php +++ /dev/null @@ -1,42 +0,0 @@ -=5.3", - "ext-mbstring": "*" - }, - "require-dev": { - "satooshi/php-coveralls": "^1.0", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4" - }, - "autoload": { - "psr-0": { - "AlgoliaSearch": "src/" - } - }, - "autoload-dev": { - "psr-0": { - "AlgoliaSearch\\Tests": "tests/" - } - } -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/resources/ca-bundle.crt b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/resources/ca-bundle.crt deleted file mode 100644 index 99b310bce9..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/resources/ca-bundle.crt +++ /dev/null @@ -1,3895 +0,0 @@ -## -## ca-bundle.crt -- Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012 -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## - -# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $ - -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE -ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT -B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR -fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW -8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE -CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS -spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 -zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB -BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 -70+sB3c4 ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 1 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy -MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE -NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i -o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq -kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 -RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 3 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy -MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD -VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS -xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi -up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 -mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd -k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq -WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM -XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC -lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ ------END CERTIFICATE----- - -Verisign Class 2 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h -cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp -Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h -cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp -Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx -nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC -wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA -ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK -1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk -LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -ValiCert Class 1 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy -MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi -GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm -DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG -lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX -icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP -Orf1LXLI ------END CERTIFICATE----- - -ValiCert Class 2 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC -CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf -ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ -SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV -UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 -W9ViH0Pd ------END CERTIFICATE----- - -RSA Root Certificate 1 -====================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td -3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H -BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs -3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF -V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r -on+jjBXu ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E -bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ -rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ -Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB -FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N -y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h -a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc -D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- - -Verisign Class 2 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y -azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug -b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y -aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 -tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 -C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS -0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs -Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 -JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf -0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx -JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j -GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Entrust.net Secure Server CA -============================ ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl -ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG -A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi -eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p -dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ -aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 -gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw -ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l -dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw -NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow -HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN -Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 -n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC -AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER -gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS -o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z -2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX -OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -Equifax Secure Global eBusiness CA -================================== ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp -bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds -b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV -PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN -qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn -hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs -MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN -I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY -NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 2 -============================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE -ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT -DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn -2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 -BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx -JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e -uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 -jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia -78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm -V+GRMOrN ------END CERTIFICATE----- - -AddTrust Low-Value Services Root -================================ ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU -cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO -ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 -54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr -oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 -Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui -GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w -HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw -HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt -ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr -mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj -ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust External Root -====================== ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD -VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw -NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU -cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg -Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 -+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw -Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo -aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy -2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 -7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL -VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk -VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 -e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u -G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -AddTrust Public Services Root -============================= ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU -cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ -BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l -dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu -nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i -d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG -Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw -HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G -A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G -A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 -JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 -Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H -EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust Qualified Certificates Root -==================================== ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU -cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx -CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx -64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 -KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o -L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR -wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU -MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE -BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y -azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze -RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB -iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Global CA 2 -==================== ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw -MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ -NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k -LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA -Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b -HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH -K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 -srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh -ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL -OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC -x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -UTN-USER First-Network Applications -=================================== ------BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp -BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 -WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T -YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB -cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug -mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj -DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu -Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi -P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE -j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w -HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j -cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G -CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y -IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK -RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp -xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq -DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE ------END CERTIFICATE----- - -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -Certum Root CA -============== ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK -ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla -Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u -by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x -wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL -kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ -89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K -Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P -NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ -GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg -GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ -0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS -qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo Secure Services root -=========================== ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw -MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi -BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP -9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc -rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC -oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V -p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E -FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj -YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm -aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL -DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw -pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H -RR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo Trusted Services root -============================ ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw -MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h -bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw -IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 -3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y -/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 -juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS -ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud -DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp -ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl -cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA -BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l -R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O -9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx -ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 -XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk -lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB -lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy -lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt -66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn -wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh -D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy -BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie -J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud -DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU -a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv -Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 -UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm -VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK -+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW -IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 -WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X -f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II -4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 -VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx -OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg -DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij -KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K -DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv -BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp -p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 -nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX -MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM -Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz -uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT -BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB -BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD -VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 -ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE -AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV -qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s -hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z -POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 -Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp -8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC -bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu -g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p -vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr -qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 1 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw -NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 -7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 -EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl -0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 -2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa -HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT -iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 -28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV -yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR -vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P -qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z -IRlXvVWa ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -Staat der Nederlanden Root CA -============================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE -ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w -HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh -bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt -vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P -jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca -C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth -vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 -22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV -HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v -dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN -BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR -EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw -MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -TDC Internet Root CA -==================== ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE -ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx -NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu -ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j -xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL -znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc -5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 -otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI -AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM -VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM -MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe -UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G -CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb -O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU -Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - -TDC OCES Root CA -================ ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE -ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 -MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH -nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 -zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV -iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde -dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO -3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB -5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k -ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm -cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp -Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x -LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM -MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm -aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 -+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 -NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 -A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc -A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 -AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 -AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== ------END CERTIFICATE----- - -UTN DATACorp SGC Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ -BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa -MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w -HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy -dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys -raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo -wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA -9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv -33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud -DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 -BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD -LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 -I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx -EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP -DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN USERFirst Email Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 -BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 -OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx -FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx -ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz -dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx -B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 -om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG -TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl -yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE -AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV -HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll -bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH -AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne -xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ -5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV -NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ -w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- - -UTN USERFirst Hardware Root CA -============================== ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd -BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx -OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 -eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz -ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI -wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd -tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 -i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf -Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw -gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF -lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF -UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW -XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 -lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn -iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 -nfhmqA== ------END CERTIFICATE----- - -UTN USERFirst Object Root CA -============================ ------BEGIN CERTIFICATE----- -MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb -BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz -NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx -HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy -dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR -loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ -w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu -lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 -RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL -BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 -ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly -c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw -DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw -NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO -PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE -qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG -hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= ------END CERTIFICATE----- - -Camerfirma Chambers of Commerce Root -==================================== ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx -NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp -cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn -MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC -AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU -xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH -NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW -DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV -d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud -EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v -cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P -AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh -bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi -fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD -L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN -UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n -ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 -erfutGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -Camerfirma Global Chambersign Root -================================== ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx -NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt -YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg -MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw -ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J -1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O -by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl -6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c -8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ -BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j -aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B -Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj -aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA -PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y -gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ -PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 -IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes -t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -NetLock Qualified (Class QA) Root -================================= ------BEGIN CERTIFICATE----- -MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn -eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 -bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 -LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 -dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP -aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV -CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e -8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb -m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ -0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM -0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 -YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh -biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p -a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz -YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg -YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg -ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov -L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr -Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 -aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg -YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 -IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 -DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN -wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg -W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc -R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR -5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko ------END CERTIFICATE----- - -NetLock Notary (Class A) Root -============================= ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI -EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j -ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX -DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH -EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD -VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz -cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM -D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ -z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC -/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 -tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 -4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG -A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC -Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn -LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz -IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh -IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu -b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg -Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp -bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 -ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP -ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB -CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr -KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM -8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -NetLock Business (Class B) Root -=============================== ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg -VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD -VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv -bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg -VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S -o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr -1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ -RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh -dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 -ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv -c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz -Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA -bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 -YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj -cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM -43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR -stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -NetLock Express (Class C) Root -============================== ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ -BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j -ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z -W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 -euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw -DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN -RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn -YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB -IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i -aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y -emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k -IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ -UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg -YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 -xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW -gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj -YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH -AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw -Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg -U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 -LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh -cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT -dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC -AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh -3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm -vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk -fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ -EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl -1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ -lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro -g14= ------END CERTIFICATE----- - -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - -Firmaprofesional Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT -GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp -Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA -ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL -MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT -OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 -ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V -j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH -lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf -3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 -NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww -KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG -AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD -ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf -wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm -7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG -VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= ------END CERTIFICATE----- - -Wells Fargo Root CA -=================== ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl -bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv -MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX -x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 -E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 -OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j -sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj -YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF -BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD -ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv -m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R -OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 -tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- - -Swisscom Root CA 1 -================== ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG -EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy -dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 -MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln -aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC -IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM -MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF -NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe -AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC -b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn -7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN -cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp -WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 -haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY -MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw -HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 -MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn -jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ -MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H -VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl -vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl -OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 -1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq -nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy -x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW -NY6E0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -Certplus Class 2 Primary CA -=========================== ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE -BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN -OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy -dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR -5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ -Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO -YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e -e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME -CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ -YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t -L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD -P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R -TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ -7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -DST ACES CA X6 -============== ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT -MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha -MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE -CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI -DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa -pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow -GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy -MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu -Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy -dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU -CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 -5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs -vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 -oKfN5XozNmr6mis= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 1 -============================================== ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP -MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 -acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx -MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB -TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC -aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX -yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i -Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ -8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 -W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME -BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 -sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY -nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2 -============================================== ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN -MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr -dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe -LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI -x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g -QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr -5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB -AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ -hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P -9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 -UrbnBEI= ------END CERTIFICATE----- - -SwissSign Platinum CA - G2 -========================== ------BEGIN CERTIFICATE----- -MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT -BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw -HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM -U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu -669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF -eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne -WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo -j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6 -8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T -aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy -domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D -+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV -CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv -zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW -IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1 -Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3 -NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4 -U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8 -KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl -9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B -aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs -OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY -Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci -IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw -EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN -MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp -c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq -t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C -jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg -vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF -ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR -AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend -jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO -peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR -7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi -GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 -OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm -5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr -44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf -Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m -Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp -mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk -vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf -KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br -NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj -viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT -BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X -DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 -aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG -9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 -N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm -+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH -6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu -MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h -qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 -FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs -ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc -celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X -CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB -tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P -4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F -kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L -3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx -/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa -DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP -e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu -WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ -DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub -DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - -Security Communication EV RootCA1 -================================= ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE -BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl -Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO -/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX -WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z -ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 -bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK -9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm -iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG -Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW -mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW -T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - -S-TRUST Authentication and Encryption Root CA 2005 PN -===================================================== ------BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE -BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh -cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT -LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w -NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk -ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj -aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp -b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob -4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL -g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf -eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3 -KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB -/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv -bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU -D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD -pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08 -P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA -nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit -F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b -Hz2eBIPdltkdOpQ= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. -====================================== ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT -AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg -LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w -HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ -U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh -IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN -yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU -2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 -4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP -2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm -8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf -HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa -Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK -5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b -czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g -ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF -BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug -cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf -AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX -EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v -/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 -MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 -3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk -eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f -/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h -RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU -Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== ------END CERTIFICATE----- - -TC TrustCenter Class 2 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw -MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw -IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 -xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ -Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u -SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G -dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ -KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj -TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP -JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk -vQ== ------END CERTIFICATE----- - -TC TrustCenter Class 3 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw -MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W -yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo -6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ -uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk -2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE -O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 -yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 -IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal -092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc -5A== ------END CERTIFICATE----- - -TC TrustCenter Universal CA I -============================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN -MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg -VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw -JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC -qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv -xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw -ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O -gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j -BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG -1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy -vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 -ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a -7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -Deutsche Telekom Root CA 2 -========================== ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT -RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG -A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 -MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G -A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS -b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 -bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI -KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY -AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK -Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV -jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV -HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr -E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy -zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 -rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G -dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -ComSign CA -========== ------BEGIN CERTIFICATE----- -MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD -EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy -MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp -Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q -ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy -P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN -GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk -YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM -rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy -oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P -AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+ -VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2 -QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI -mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb -/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG -zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U -AGegcQCCSA== ------END CERTIFICATE----- - -ComSign Secured CA -================== ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE -AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w -NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD -QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs -49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH -7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB -kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 -9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw -AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t -U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA -j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC -AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a -BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp -FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP -51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 -============================================================================================================================= ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH -DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q -aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry -b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV -BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg -S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 -MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl -IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF -n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl -IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft -dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl -cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO -Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 -xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR -6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd -BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 -N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT -y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh -LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M -dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= ------END CERTIFICATE----- - -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -Buypass Class 3 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 -MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx -ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 -n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia -AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c -1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 -pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA -EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 -htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj -el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg -QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe -Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt -IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by -X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b -gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr -eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ -TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy -Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn -uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI -qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm -ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 -Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW -Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t -FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm -zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k -XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT -bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU -RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK -1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt -2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ -Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 -AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -CNNIC ROOT -========== ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE -ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw -OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD -o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz -VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT -VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or -czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK -y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC -wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S -lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 -Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM -O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 -BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 -G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m -mxE= ------END CERTIFICATE----- - -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) Főtanúsítvány -============================================ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G2 -================================== ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC -TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l -ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ -5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn -vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj -CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil -e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR -OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI -CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 -48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi -trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 -qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB -AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC -ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA -A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz -+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj -f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN -kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk -CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF -URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb -CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h -oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV -IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm -66+KAQ== ------END CERTIFICATE----- - -CA Disig -======== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK -QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw -MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz -bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm -GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD -Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo -hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt -ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w -gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P -AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz -aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff -ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa -BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t -WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 -mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K -ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA -4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -ACEDICOM Root -============= ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD -T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 -MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG -A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk -WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD -YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew -MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb -m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk -HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT -xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 -3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 -2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq -TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz -4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU -9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg -aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP -eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk -zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 -ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI -KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq -nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE -I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp -MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o -tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ -VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2 -yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa -XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n -0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ -RjXZ+Hxb ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi -=================================================== ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz -ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 -MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 -cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u -aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY -8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y -jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI -JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk -9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG -SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d -F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq -D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 -Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -TC TrustCenter Universal CA III -=============================== ------BEGIN CERTIFICATE----- -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe -Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU -QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex -KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt -QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO -juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut -CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 -M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G -A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA -g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ -KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK -BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq -woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG -EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz -MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu -QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ -03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK -ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU -+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC -PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT -OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK -F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK -0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ -0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB -leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID -AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ -SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG -NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O -BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l -Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga -kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q -hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs -g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 -aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 -nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC -ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo -Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z -WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -Certinomis - Autorité Racine -============================= ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK -Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg -LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG -A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw -JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa -wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly -Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw -2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N -jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q -c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC -lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb -xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g -530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna -4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x -WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva -R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 -nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B -CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv -JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE -qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b -WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE -wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ -vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -A-Trust-nQual-03 -================ ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE -Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy -a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R -dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw -RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 -ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 -c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA -zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n -yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE -SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 -iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V -cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV -eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 -ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr -sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd -JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 -ahq97BvIxYSazQ== ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -Security Communication RootCA2 -============================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC -SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy -aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ -+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R -3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV -spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K -EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 -QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj -u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk -3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q -tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 -mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -Actalis Authentication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM -BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE -AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky -MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz -IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ -wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa -by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 -zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f -YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 -oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l -EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 -hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 -EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 -jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY -iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI -WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 -JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx -K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ -Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC -4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo -2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz -lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem -OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 -vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -Trustis FPS Root CA -=================== ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG -EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 -IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV -BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ -RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk -H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa -cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt -o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA -AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd -BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c -GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC -yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P -8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV -l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl -iB6XzCGcKQENZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ -Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 -dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu -c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv -bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 -aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t -L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 -fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm -N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN -Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T -tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX -e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA -2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs -HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib -D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -StartCom Certification Authority G2 -=================================== ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE -ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O -o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG -4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi -Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul -Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs -O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H -vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L -nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS -FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa -z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ -KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk -J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ -JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG -/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc -nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld -blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc -l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm -7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm -obp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -Buypass Class 2 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X -DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 -g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn -9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b -/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU -CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff -awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI -zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn -Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX -Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs -M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI -osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S -aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd -DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD -LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 -oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC -wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS -CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN -rJgWVqA= ------END CERTIFICATE----- - -Buypass Class 3 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X -DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH -sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR -5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh -7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ -ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH -2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV -/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ -RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA -Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq -j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G -uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG -Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 -ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 -KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz -6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug -UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe -eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi -Cp/HuZc= ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 3 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx -MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK -9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU -NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF -iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W -0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr -AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb -fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT -ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h -P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== ------END CERTIFICATE----- - -EE Certification Centre Root CA -=============================== ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM -dcGWxZ0= ------END CERTIFICATE----- diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/AlgoliaConnectionException.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/AlgoliaConnectionException.php deleted file mode 100644 index a9abec296f..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/AlgoliaConnectionException.php +++ /dev/null @@ -1,30 +0,0 @@ -caInfoPath = __DIR__.'/../../resources/ca-bundle.crt'; - foreach ($options as $option => $value) { - switch ($option) { - case self::CAINFO: - $this->caInfoPath = $value; - break; - case self::CURLOPT: - $this->curlOptions = $this->checkCurlOptions($value); - break; - case self::PLACES_ENABLED: - $this->placesEnabled = (bool) $value; - break; - case self::FAILING_HOSTS_CACHE: - if (! $value instanceof FailingHostsCache) { - throw new \InvalidArgumentException('failingHostsCache must be an instance of \AlgoliaSearch\FailingHostsCache.'); - } - break; - default: - throw new \Exception('Unknown option: '.$option); - } - } - - $failingHostsCache = isset($options[self::FAILING_HOSTS_CACHE]) ? $options[self::FAILING_HOSTS_CACHE] : null; - $this->context = new ClientContext($applicationID, $apiKey, $hostsArray, $this->placesEnabled, $failingHostsCache); - } - - /** - * Release curl handle. - */ - public function __destruct() - { - } - - /** - * Change the default connect timeout of 1s to a custom value - * (only useful if your server has a very slow connectivity to Algolia backend). - * - * @param int $connectTimeout the connection timeout - * @param int $timeout the read timeout for the query - * @param int $searchTimeout the read timeout used for search queries only - * - * @throws AlgoliaException - */ - public function setConnectTimeout($connectTimeout, $timeout = 30, $searchTimeout = 5) - { - $version = curl_version(); - $isPhpOld = version_compare(phpversion(), '5.2.3', '<'); - $isCurlOld = version_compare($version['version'], '7.16.2', '<'); - - if (($isPhpOld || $isCurlOld) && $this->context->connectTimeout < 1) { - throw new AlgoliaException( - "The timeout can't be a float with a PHP version less than 5.2.3 or a curl version less than 7.16.2" - ); - } - $this->context->connectTimeout = $connectTimeout; - $this->context->readTimeout = $timeout; - $this->context->searchTimeout = $searchTimeout; - } - - /** - * Allow to use IP rate limit when you have a proxy between end-user and Algolia. - * This option will set the X-Forwarded-For HTTP header with the client IP - * and the X-Forwarded-API-Key with the API Key having rate limits. - * - * @param string $adminAPIKey the admin API Key you can find in your dashboard - * @param string $endUserIP the end user IP (you can use both IPV4 or IPV6 syntax) - * @param string $rateLimitAPIKey the API key on which you have a rate limit - */ - public function enableRateLimitForward($adminAPIKey, $endUserIP, $rateLimitAPIKey) - { - $this->context->setRateLimit($adminAPIKey, $endUserIP, $rateLimitAPIKey); - } - - /** - * The aggregation of the queries to retrieve the latest query - * uses the IP or the user token to work efficiently. - * If the queries are made from your backend server, - * the IP will be the same for all of the queries. - * We're supporting the following HTTP header to forward the IP of your end-user - * to the engine, you just need to set it for each query. - * - * @see https://www.algolia.com/doc/faq/analytics/will-the-analytics-still-work-if-i-perform-the-search-through-my-backend - * - * @param string $ip - */ - public function setForwardedFor($ip) - { - $this->context->setForwardedFor($ip); - } - - /** - * It's possible to use the following token to track users that have the same IP - * or to track users that use different devices. - * - * @see https://www.algolia.com/doc/faq/analytics/will-the-analytics-still-work-if-i-perform-the-search-through-my-backend - * - * @param string $token - */ - public function setAlgoliaUserToken($token) - { - $this->context->setAlgoliaUserToken($token); - } - - /** - * Disable IP rate limit enabled with enableRateLimitForward() function. - */ - public function disableRateLimitForward() - { - $this->context->disableRateLimit(); - } - - /** - * Call isAlive. - */ - public function isAlive() - { - $this->request( - $this->context, - 'GET', - '/1/isalive', - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout - ); - } - - /** - * Allow to set custom headers. - * - * @param string $key - * @param string $value - */ - public function setExtraHeader($key, $value) - { - $this->context->setExtraHeader($key, $value); - } - - /** - * This method allows to query multiple indexes with one API call. - * - * @param array $queries - * @param string $indexNameKey - * @param string $strategy - * @param array $requestHeaders - * - * @return mixed - * - * @throws AlgoliaException - * @throws \Exception - */ - public function multipleQueries($queries, $indexNameKey = 'indexName', $strategy = 'none') - { - $requestHeaders = func_num_args() === 4 && is_array(func_get_arg(3)) ? func_get_arg(3) : array(); - - if ($queries == null) { - throw new \Exception('No query provided'); - } - $requests = array(); - foreach ($queries as $query) { - if (array_key_exists($indexNameKey, $query)) { - $indexes = $query[$indexNameKey]; - unset($query[$indexNameKey]); - } else { - throw new \Exception('indexName is mandatory'); - } - $req = array('indexName' => $indexes, 'params' => $this->buildQuery($query)); - - array_push($requests, $req); - } - - return $this->request( - $this->context, - 'POST', - '/1/indexes/*/queries', - array(), - array('requests' => $requests, 'strategy' => $strategy), - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->searchTimeout, - $requestHeaders - ); - } - - /** - * List all existing indexes - * return an object in the form: - * array( - * "items" => array( - * array("name" => "contacts", "createdAt" => "2013-01-18T15:33:13.556Z"), - * array("name" => "notes", "createdAt" => "2013-01-18T15:33:13.556Z") - * ) - * ). - * - * @return mixed - * - * @throws AlgoliaException - */ - public function listIndexes() - { - $requestHeaders = func_num_args() === 1 && is_array(func_get_arg(0)) ? func_get_arg(0) : array(); - - return $this->request( - $this->context, - 'GET', - '/1/indexes/', - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Delete an index. - * - * @param string $indexName the name of index to delete - * - * @return mixed an object containing a "deletedAt" attribute - */ - public function deleteIndex($indexName) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - return $this->request( - $this->context, - 'DELETE', - '/1/indexes/'.urlencode($indexName), - null, - null, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Move an existing index. - * - * @param string $srcIndexName the name of index to copy. - * @param string $dstIndexName the new index name that will contains a copy of srcIndexName (destination will be overwritten - * if it already exist). - * - * @return mixed - */ - public function moveIndex($srcIndexName, $dstIndexName) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - $request = array('operation' => 'move', 'destination' => $dstIndexName); - - return $this->request( - $this->context, - 'POST', - '/1/indexes/'.urlencode($srcIndexName).'/operation', - array(), - $request, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Copy an existing index. - * - * @param string $srcIndexName the name of index to copy. - * @param string $dstIndexName the new index name that will contains a copy of srcIndexName (destination will be overwritten - * if it already exist). - * - * @return mixed - */ - public function copyIndex($srcIndexName, $dstIndexName) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - return $this->scopedCopyIndex($srcIndexName, $dstIndexName, array(), $requestHeaders); - } - - /** - * Copy an existing index and define what to copy along with records: - * - settings - * - synonyms - * - query rules - * - * By default, everything is copied. - * - * @param string $srcIndexName the name of index to copy. - * @param string $dstIndexName the new index name that will contains a copy of srcIndexName (destination will be overwritten if it already exist). - * @param array $scope Resource to copy along with records: 'settings', 'rules', 'synonyms' - * @param array $requestHeaders - * @return mixed - */ - public function scopedCopyIndex($srcIndexName, $dstIndexName, array $scope = array(), array $requestHeaders = array()) - { - $request = array( - 'operation' => 'copy', - 'destination' => $dstIndexName, - ); - - if (! empty($scope)) { - $request['scope'] = $scope; - } - - return $this->request( - $this->context, - 'POST', - '/1/indexes/'.urlencode($srcIndexName).'/operation', - array(), - $request, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Return last logs entries. - * - * @param int $offset Specify the first entry to retrieve (0-based, 0 is the most recent log entry). - * @param int $length Specify the maximum number of entries to retrieve starting at offset. Maximum allowed value: 1000. - * @param mixed $type - * - * @return mixed - * - * @throws AlgoliaException - */ - public function getLogs($offset = 0, $length = 10, $type = 'all') - { - $requestHeaders = func_num_args() === 4 && is_array(func_get_arg(3)) ? func_get_arg(3) : array(); - - if (gettype($type) == 'boolean') { //Old prototype onlyError - if ($type) { - $type = 'error'; - } else { - $type = 'all'; - } - } - - return $this->request( - $this->context, - 'GET', - '/1/logs?offset='.$offset.'&length='.$length.'&type='.$type, - null, - null, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Add a userID to the mapping - * @return an object containing a "updatedAt" attribute - * - * @throws AlgoliaException - */ - public function assignUserID($userID, $clusterName) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - $requestHeaders["X-Algolia-User-ID"] = $userID; - - $request = array('cluster' => $clusterName); - - return $this->request( - $this->context, - 'POST', - '/1/clusters/mapping', - null, - $request, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Remove a userID from the mapping - * @return an object containing a "deletedAt" attribute - * - * @throws AlgoliaException - */ - public function removeUserID($userID) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - $requestHeaders["X-Algolia-User-ID"] = $userID; - - return $this->request( - $this->context, - 'DELETE', - '/1/clusters/mapping', - null, - null, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * List available cluster in the mapping - * return an object in the form: - * array( - * "clusters" => array( - * array("clusterName" => "name", "nbRecords" => 0, "nbUserIDs" => 0, "dataSize" => 0) - * ) - * ). - * - * @return mixed - * @throws AlgoliaException - */ - public function listClusters() - { - $requestHeaders = func_num_args() === 1 && is_array(func_get_arg(0)) ? func_get_arg(0) : array(); - - return $this->request( - $this->context, - 'GET', - '/1/clusters', - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Get one userID in the mapping - * return an object in the form: - * array( - * "userID" => "userName", - * "clusterName" => "name", - * "nbRecords" => 0, - * "dataSize" => 0 - * ). - * - * @return mixed - * @throws AlgoliaException - */ - public function getUserID($userID) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - return $this->request( - $this->context, - 'GET', - '/1/clusters/mapping/'.urlencode($userID), - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * List userIDs in the mapping - * return an object in the form: - * array( - * "userIDs" => array( - * array("userID" => "userName", "clusterName" => "name", "nbRecords" => 0, "dataSize" => 0) - * ), - * "page" => 0, - * "hitsPerPage" => 20 - * ). - * - * @return mixed - * @throws AlgoliaException - */ - public function listUserIDs($page = 0, $hitsPerPage = 20) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - return $this->request( - $this->context, - 'GET', - '/1/clusters/mapping?page='.$page.'&hitsPerPage='.$hitsPerPage, - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Get top userID in the mapping - * return an object in the form: - * array( - * "topUsers" => array( - * "clusterName" => array( - * array("userID" => "userName", "nbRecords" => 0, "dataSize" => 0) - * ) - * ) - * ). - * - * @return mixed - * @throws AlgoliaException - */ - public function getTopUserID() - { - $requestHeaders = func_num_args() === 1 && is_array(func_get_arg(0)) ? func_get_arg(0) : array(); - - return $this->request( - $this->context, - 'GET', - '/1/clusters/mapping/top', - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Search userIDs in the mapping - * return an object in the form: - * array( - * "hits" => array( - * array("userID" => "userName", "clusterName" => "name", "nbRecords" => 0, "dataSize" => 0) - * ), - * "nbHits" => 0 - * "page" => 0, - * "hitsPerPage" => 20 - * ). - * - * @return mixed - * @throws AlgoliaException - */ - public function searchUserIDs($query, $clusterName = null, $page = null, $hitsPerPage = null) - { - $requestHeaders = func_num_args() === 5 && is_array(func_get_arg(4)) ? func_get_arg(4) : array(); - - $params = array(); - - if ($query !== null) { - $params['query'] = $query; - } - - if ($clusterName !== null) { - $params['cluster'] = $clusterName; - } - - if ($page !== null) { - $params['page'] = $page; - } - - if ($hitsPerPage !== null) { - $params['hitsPerPage'] = $hitsPerPage; - } - - return $this->request( - $this->context, - 'POST', - '/1/clusters/mapping/search', - null, - $params, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Get the index object initialized (no server call needed for initialization). - * - * @param string $indexName the name of index - * - * @return Index - * - * @throws AlgoliaException - */ - public function initIndex($indexName) - { - if (empty($indexName)) { - throw new AlgoliaException('Invalid index name: empty string'); - } - - return new Index($this->context, $this, $indexName); - } - - /** - * List all existing API keys with their associated ACLs. - * - * @return mixed - * - * @throws AlgoliaException - */ - public function listApiKeys() - { - $requestHeaders = func_num_args() === 1 && is_array(func_get_arg(0)) ? func_get_arg(0) : array(); - - return $this->request( - $this->context, - 'GET', - '/1/keys', - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @return mixed - * @deprecated use listApiKeys instead - */ - public function listUserKeys() - { - return $this->listApiKeys(); - } - - /** - * Get ACL of a API key. - * - * @param string $key - * - * @return mixed - */ - public function getApiKey($key) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - return $this->request( - $this->context, - 'GET', - '/1/keys/'.$key, - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $key - * @return mixed - * @deprecated use getApiKey instead - */ - public function getUserKeyACL($key) - { - return $this->getApiKey($key); - } - - /** - * Delete an existing API key. - * - * @param string $key - * - * @return mixed - */ - public function deleteApiKey($key) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - return $this->request( - $this->context, - 'DELETE', - '/1/keys/'.$key, - null, - null, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $key - * @return mixed - * @deprecated use deleteApiKey instead - */ - public function deleteUserKey($key) - { - return $this->deleteApiKey($key); - } - - /** - * Create a new API key. - * - * @param array $obj can be two different parameters: - * The list of parameters for this key. Defined by an array that - * can contain the following values: - * - acl: array of string - * - indices: array of string - * - validity: int - * - referers: array of string - * - description: string - * - maxHitsPerQuery: integer - * - queryParameters: string - * - maxQueriesPerIPPerHour: integer - * Or the list of ACL for this key. Defined by an array of string that - * can contains the following values: - * - search: allow to search (https and http) - * - addObject: allows to add/update an object in the index (https only) - * - deleteObject : allows to delete an existing object (https only) - * - deleteIndex : allows to delete index content (https only) - * - settings : allows to get index settings (https only) - * - editSettings : allows to change index settings (https only) - * @param int $validity the number of seconds after which the key will be automatically removed (0 means - * no time limit for this key) - * @param int $maxQueriesPerIPPerHour Specify the maximum number of API calls allowed from an IP address per hour. - * Defaults to 0 (no rate limit). - * @param int $maxHitsPerQuery Specify the maximum number of hits this API key can retrieve in one call. - * Defaults to 0 (unlimited) - * @param array|null $indexes Specify the list of indices to target (null means all) - * - * @return mixed - * - * @throws AlgoliaException - */ - public function addApiKey($obj, $validity = 0, $maxQueriesPerIPPerHour = 0, $maxHitsPerQuery = 0, $indexes = null) - { - $requestHeaders = func_num_args() === 6 && is_array(func_get_arg(5)) ? func_get_arg(5) : array(); - - if ($obj !== array_values($obj)) { - // if $obj doesn't have required entries, we add the default values - $params = $obj; - if ($validity != 0) { - $params['validity'] = $validity; - } - if ($maxQueriesPerIPPerHour != 0) { - $params['maxQueriesPerIPPerHour'] = $maxQueriesPerIPPerHour; - } - if ($maxHitsPerQuery != 0) { - $params['maxHitsPerQuery'] = $maxHitsPerQuery; - } - } else { - $params = array( - 'acl' => $obj, - 'validity' => $validity, - 'maxQueriesPerIPPerHour' => $maxQueriesPerIPPerHour, - 'maxHitsPerQuery' => $maxHitsPerQuery, - ); - } - - if ($indexes != null) { - $params['indexes'] = $indexes; - } - - return $this->request( - $this->context, - 'POST', - '/1/keys', - array(), - $params, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $obj - * @param int $validity - * @param int $maxQueriesPerIPPerHour - * @param int $maxHitsPerQuery - * @param null $indexes - * @return mixed - * @deprecated use addApiKey instead - */ - public function addUserKey($obj, $validity = 0, $maxQueriesPerIPPerHour = 0, $maxHitsPerQuery = 0, $indexes = null) - { - return $this->addApiKey($obj, $validity, $maxQueriesPerIPPerHour, $maxHitsPerQuery, $indexes); - } - - /** - * Update an API key. - * - * @param string $key - * @param array $obj can be two different parameters: - * The list of parameters for this key. Defined by a array that - * can contains the following values: - * - acl: array of string - * - indices: array of string - * - validity: int - * - referers: array of string - * - description: string - * - maxHitsPerQuery: integer - * - queryParameters: string - * - maxQueriesPerIPPerHour: integer - * Or the list of ACL for this key. Defined by an array of string that - * can contains the following values: - * - search: allow to search (https and http) - * - addObject: allows to add/update an object in the index (https only) - * - deleteObject : allows to delete an existing object (https only) - * - deleteIndex : allows to delete index content (https only) - * - settings : allows to get index settings (https only) - * - editSettings : allows to change index settings (https only) - * @param int $validity the number of seconds after which the key will be automatically removed (0 means - * no time limit for this key) - * @param int $maxQueriesPerIPPerHour Specify the maximum number of API calls allowed from an IP address per hour. - * Defaults to 0 (no rate limit). - * @param int $maxHitsPerQuery Specify the maximum number of hits this API key can retrieve in one call. Defaults - * to 0 (unlimited) - * @param array|null $indexes Specify the list of indices to target (null means all) - * - * @return mixed - * - * @throws AlgoliaException - */ - public function updateApiKey( - $key, - $obj, - $validity = 0, - $maxQueriesPerIPPerHour = 0, - $maxHitsPerQuery = 0, - $indexes = null - ) { - $requestHeaders = func_num_args() === 7 && is_array(func_get_arg(6)) ? func_get_arg(6) : array(); - - if ($obj !== array_values($obj)) { // is dict of value - $params = $obj; - $params['validity'] = $validity; - $params['maxQueriesPerIPPerHour'] = $maxQueriesPerIPPerHour; - $params['maxHitsPerQuery'] = $maxHitsPerQuery; - } else { - $params = array( - 'acl' => $obj, - 'validity' => $validity, - 'maxQueriesPerIPPerHour' => $maxQueriesPerIPPerHour, - 'maxHitsPerQuery' => $maxHitsPerQuery, - ); - } - if ($indexes != null) { - $params['indexes'] = $indexes; - } - - return $this->request( - $this->context, - 'PUT', - '/1/keys/'.$key, - array(), - $params, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $key - * @param $obj - * @param int $validity - * @param int $maxQueriesPerIPPerHour - * @param int $maxHitsPerQuery - * @param null $indexes - * @return mixed - * @deprecated use updateApiKey instead - */ - public function updateUserKey( - $key, - $obj, - $validity = 0, - $maxQueriesPerIPPerHour = 0, - $maxHitsPerQuery = 0, - $indexes = null - ) { - $requestHeaders = func_num_args() === 7 && is_array(func_get_arg(6)) ? func_get_arg(6) : array(); - - return $this->updateApiKey($key, $obj, $validity, $maxQueriesPerIPPerHour, $maxHitsPerQuery, $indexes, $requestHeaders); - } - - /** - * Send a batch request targeting multiple indices. - * - * @param array $requests an associative array defining the batch request body - * @param array $requestHeaders - * - * @return mixed - */ - public function batch($requests) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - return $this->request( - $this->context, - 'POST', - '/1/indexes/*/batch', - array(), - array('requests' => $requests), - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Generate a secured and public API Key from a list of query parameters and an - * optional user token identifying the current user. - * - * @param string $privateApiKey your private API Key - * @param mixed $query the list of query parameters applied to the query (used as security) - * @param string|null $userToken an optional token identifying the current user - * - * @return string - */ - public static function generateSecuredApiKey($privateApiKey, $query, $userToken = null) - { - if (is_array($query)) { - $queryParameters = array(); - if (array_keys($query) !== array_keys(array_keys($query))) { - // array of query parameters - $queryParameters = $query; - } else { - // array of tags - $tmp = array(); - foreach ($query as $tag) { - if (is_array($tag)) { - array_push($tmp, '('.implode(',', $tag).')'); - } else { - array_push($tmp, $tag); - } - } - $tagFilters = implode(',', $tmp); - $queryParameters['tagFilters'] = $tagFilters; - } - if ($userToken != null && strlen($userToken) > 0) { - $queryParameters['userToken'] = $userToken; - } - $urlEncodedQuery = static::buildQuery($queryParameters); - } else { - if (strpos($query, '=') === false) { - // String of tags - $queryParameters = array('tagFilters' => $query); - - if ($userToken != null && strlen($userToken) > 0) { - $queryParameters['userToken'] = $userToken; - } - $urlEncodedQuery = static::buildQuery($queryParameters); - } else { - // url encoded query - $urlEncodedQuery = $query; - if ($userToken != null && strlen($userToken) > 0) { - $urlEncodedQuery = $urlEncodedQuery.'&userToken='.urlencode($userToken); - } - } - } - $content = hash_hmac('sha256', $urlEncodedQuery, $privateApiKey).$urlEncodedQuery; - - return base64_encode($content); - } - - /** - * @param array $args - * - * @return string - */ - public static function buildQuery($args) - { - foreach ($args as $key => $value) { - if (gettype($value) == 'array') { - $args[$key] = Json::encode($value); - } - } - - return http_build_query($args); - } - - /** - * @param ClientContext $context - * @param string $method - * @param string $path - * @param array $params - * @param array $data - * @param array $hostsArray - * @param int $connectTimeout - * @param int $readTimeout - * @param array $requestHeaders - * - * @return mixed - * - * @throws AlgoliaException - */ - public function request( - $context, - $method, - $path, - $params, - $data, - $hostsArray, - $connectTimeout, - $readTimeout - ) { - $requestHeaders = func_num_args() === 9 && is_array(func_get_arg(8)) ? func_get_arg(8) : array(); - - $exceptions = array(); - $cnt = 0; - foreach ($hostsArray as &$host) { - $cnt += 1; - if ($cnt == 3) { - $connectTimeout += 2; - $readTimeout += 10; - } - try { - $res = $this->doRequest($context, $method, $host, $path, $params, $data, $connectTimeout, $readTimeout, $requestHeaders); - if ($res !== null) { - return $res; - } - } catch (AlgoliaException $e) { - throw $e; - } catch (\Exception $e) { - $exceptions[$host] = $e->getMessage(); - if ($context instanceof ClientContext) { - $context->addFailingHost($host); // Needs to be before the rotation otherwise it will not be rotated - $context->rotateHosts(); - } - } - } - throw new AlgoliaConnectionException('Hosts unreachable: '.implode(',', $exceptions)); - } - - /** - * @param ClientContext $context - * @param string $method - * @param string $host - * @param string $path - * @param array $params - * @param array $data - * @param int $connectTimeout - * @param int $readTimeout - * @param array $requestHeaders - * - * @return mixed - * - * @throws AlgoliaException - * @throws \Exception - */ - public function doRequest( - $context, - $method, - $host, - $path, - $params, - $data, - $connectTimeout, - $readTimeout - ) { - $requestHeaders = func_num_args() === 9 && is_array(func_get_arg(8)) ? func_get_arg(8) : array(); - - if (strpos($host, 'http') === 0) { - $url = $host.$path; - } else { - $url = 'https://'.$host.$path; - } - - if ($params != null && count($params) > 0) { - $params2 = array(); - foreach ($params as $key => $val) { - if (is_array($val)) { - $params2[$key] = Json::encode($val); - } else { - $params2[$key] = $val; - } - } - $url .= '?'.http_build_query($params2); - } - - // initialize curl library - $curlHandle = curl_init(); - - // set curl options - try { - foreach ($this->curlOptions as $curlOption => $optionValue) { - curl_setopt($curlHandle, constant($curlOption), $optionValue); - } - } catch (\Exception $e) { - $this->invalidOptions($this->curlOptions, $e->getMessage()); - } - - //curl_setopt($curlHandle, CURLOPT_VERBOSE, true); - - $defaultHeaders = null; - if ($context->adminAPIKey == null) { - $defaultHeaders = array( - 'X-Algolia-Application-Id' => $context->applicationID, - 'X-Algolia-API-Key' => $context->apiKey, - 'Content-type' => 'application/json', - ); - } else { - $defaultHeaders = array( - 'X-Algolia-Application-Id' => $context->applicationID, - 'X-Algolia-API-Key' => $context->adminAPIKey, - 'X-Forwarded-For' => $context->endUserIP, - 'X-Algolia-UserToken' => $context->algoliaUserToken, - 'X-Forwarded-API-Key' => $context->rateLimitAPIKey, - 'Content-type' => 'application/json', - ); - } - - $headers = array_merge($defaultHeaders, $context->headers, $requestHeaders); - - $curlHeaders = array(); - foreach ($headers as $key => $value) { - $curlHeaders[] = $key.': '.$value; - } - - curl_setopt($curlHandle, CURLOPT_HTTPHEADER, $curlHeaders); - - curl_setopt($curlHandle, CURLOPT_USERAGENT, Version::getUserAgent()); - //Return the output instead of printing it - curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curlHandle, CURLOPT_FAILONERROR, true); - curl_setopt($curlHandle, CURLOPT_ENCODING, ''); - curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, true); - curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, 2); - curl_setopt($curlHandle, CURLOPT_CAINFO, $this->caInfoPath); - - curl_setopt($curlHandle, CURLOPT_URL, $url); - $version = curl_version(); - if (version_compare(phpversion(), '5.2.3', '>=') && version_compare($version['version'], '7.16.2', '>=') && $connectTimeout < 1) { - curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT_MS, $connectTimeout * 1000); - curl_setopt($curlHandle, CURLOPT_TIMEOUT_MS, $readTimeout * 1000); - } else { - curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT, $connectTimeout); - curl_setopt($curlHandle, CURLOPT_TIMEOUT, $readTimeout); - } - - // The problem is that on (Li|U)nix, when libcurl uses the standard name resolver, - // a SIGALRM is raised during name resolution which libcurl thinks is the timeout alarm. - curl_setopt($curlHandle, CURLOPT_NOSIGNAL, 1); - curl_setopt($curlHandle, CURLOPT_FAILONERROR, false); - - if ($method === 'GET') { - curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'GET'); - curl_setopt($curlHandle, CURLOPT_HTTPGET, true); - curl_setopt($curlHandle, CURLOPT_POST, false); - } else { - if ($method === 'POST') { - $body = ($data) ? Json::encode($data) : ''; - curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'POST'); - curl_setopt($curlHandle, CURLOPT_POST, true); - curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $body); - } elseif ($method === 'DELETE') { - curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'DELETE'); - curl_setopt($curlHandle, CURLOPT_POST, false); - } elseif ($method === 'PUT') { - $body = ($data) ? Json::encode($data) : ''; - curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'PUT'); - curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $body); - curl_setopt($curlHandle, CURLOPT_POST, true); - } - } - $mhandle = $context->getMHandle($curlHandle); - - // Do all the processing. - $running = null; - do { - $mrc = curl_multi_exec($mhandle, $running); - } while ($mrc == CURLM_CALL_MULTI_PERFORM); - - while ($running && $mrc == CURLM_OK) { - if (curl_multi_select($mhandle, 0.1) == -1) { - usleep(100); - } - do { - $mrc = curl_multi_exec($mhandle, $running); - } while ($mrc == CURLM_CALL_MULTI_PERFORM); - } - - $http_status = (int) curl_getinfo($curlHandle, CURLINFO_HTTP_CODE); - $response = curl_multi_getcontent($curlHandle); - $error = curl_error($curlHandle); - - if (!empty($error)) { - throw new \Exception($error); - } - - if ($http_status === 0 || $http_status === 503) { - // Could not reach host or service unavailable, try with another one if we have it - $context->releaseMHandle($curlHandle); - curl_close($curlHandle); - - return; - } - - $answer = Json::decode($response, true); - $context->releaseMHandle($curlHandle); - curl_close($curlHandle); - - if (intval($http_status / 100) == 4) { - throw new AlgoliaException(isset($answer['message']) ? $answer['message'] : $http_status.' error', $http_status); - } elseif (intval($http_status / 100) != 2) { - throw new \Exception($http_status.': '.$response, $http_status); - } - - return $answer; - } - - /** - * Checks if curl option passed are valid curl options. - * - * @param array $curlOptions must be array but no type required while first test throw clear Exception - * - * @return array - */ - protected function checkCurlOptions($curlOptions) - { - if (!is_array($curlOptions)) { - throw new \InvalidArgumentException( - sprintf( - 'AlgoliaSearch requires %s option to be array of valid curl options.', - static::CURLOPT - ) - ); - } - - $checkedCurlOptions = array_intersect(array_keys($curlOptions), array_keys($this->getCurlConstants())); - - if (count($checkedCurlOptions) !== count($curlOptions)) { - $this->invalidOptions($curlOptions); - } - - return $curlOptions; - } - - /** - * Get all php curl available options. - * - * @return array - */ - protected function getCurlConstants() - { - if (!is_null($this->curlConstants)) { - return $this->curlConstants; - } - - $curlAllConstants = get_defined_constants(true); - - if (isset($curlAllConstants['curl'])) { - $curlAllConstants = $curlAllConstants['curl']; - } elseif (isset($curlAllConstants['Core'])) { // hhvm - $curlAllConstants = $curlAllConstants['Core']; - } else { - return $this->curlConstants; - } - - $curlConstants = array(); - foreach ($curlAllConstants as $constantName => $constantValue) { - if (strpos($constantName, 'CURLOPT') === 0) { - $curlConstants[$constantName] = $constantValue; - } - } - - $this->curlConstants = $curlConstants; - - return $this->curlConstants; - } - - /** - * throw clear Exception when bad curl option is set. - * - * @param array $curlOptions - * @param string $errorMsg add specific message for disambiguation - */ - protected function invalidOptions(array $curlOptions = array(), $errorMsg = '') - { - throw new \OutOfBoundsException( - sprintf( - 'AlgoliaSearch %s options keys are invalid. %s given. error message : %s', - static::CURLOPT, - Json::encode($curlOptions), - $errorMsg - ) - ); - } - - /** - * @return PlacesIndex - */ - private function getPlacesIndex() - { - return new PlacesIndex($this->context, $this); - } - - /** - * @param string|null $appId - * @param string|null $apiKey - * @param array|null $hostsArray - * @param array $options - * - * @return PlacesIndex - */ - public static function initPlaces($appId = null, $apiKey = null, $hostsArray = null, $options = array()) - { - $options['placesEnabled'] = true; - $client = new static($appId, $apiKey, $hostsArray, $options); - - return $client->getPlacesIndex(); - } - - public function getContext() - { - return $this->context; - } -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/ClientContext.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/ClientContext.php deleted file mode 100644 index 2ad5ca59d3..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/ClientContext.php +++ /dev/null @@ -1,316 +0,0 @@ -connectTimeout = 1; - - // global timeout of 30s by default - $this->readTimeout = 30; - - // search timeout of 5s by default - $this->searchTimeout = 5; - - $this->applicationID = $applicationID; - $this->apiKey = $apiKey; - - $this->readHostsArray = $hostsArray; - $this->writeHostsArray = $hostsArray; - - if ($this->readHostsArray == null || count($this->readHostsArray) == 0) { - $this->readHostsArray = $this->getDefaultReadHosts($placesEnabled); - $this->writeHostsArray = $this->getDefaultWriteHosts($placesEnabled); - } - - if (($this->applicationID == null || mb_strlen($this->applicationID) == 0) && $placesEnabled === false) { - throw new Exception('AlgoliaSearch requires an applicationID.'); - } - - if (($this->apiKey == null || mb_strlen($this->apiKey) == 0) && $placesEnabled === false) { - throw new Exception('AlgoliaSearch requires an apiKey.'); - } - - $this->curlMHandle = null; - $this->adminAPIKey = null; - $this->endUserIP = null; - $this->algoliaUserToken = null; - $this->rateLimitAPIKey = null; - $this->headers = array(); - - if ($failingHostsCache === null) { - $this->failingHostsCache = new InMemoryFailingHostsCache(); - } else { - $this->failingHostsCache = $failingHostsCache; - } - - $this->rotateHosts(); - } - - /** - * @param bool $placesEnabled - * - * @return array - */ - private function getDefaultReadHosts($placesEnabled) - { - if ($placesEnabled) { - $hosts = array( - 'places-1.algolianet.com', - 'places-2.algolianet.com', - 'places-3.algolianet.com', - ); - shuffle($hosts); - array_unshift($hosts, 'places-dsn.algolia.net'); - - return $hosts; - } - - $hosts = array( - $this->applicationID.'-1.algolianet.com', - $this->applicationID.'-2.algolianet.com', - $this->applicationID.'-3.algolianet.com', - ); - shuffle($hosts); - array_unshift($hosts, $this->applicationID.'-dsn.algolia.net'); - - return $hosts; - } - - /** - * @param bool $placesEnabled - * - * @return array - */ - private function getDefaultWriteHosts($placesEnabled) - { - if ($placesEnabled) { - $hosts = array( - 'places-1.algolianet.com', - 'places-2.algolianet.com', - 'places-3.algolianet.com', - ); - shuffle($hosts); - array_unshift($hosts, 'places.algolia.net'); - - return $hosts; - } - - $hosts = array( - $this->applicationID.'-1.algolianet.com', - $this->applicationID.'-2.algolianet.com', - $this->applicationID.'-3.algolianet.com', - ); - shuffle($hosts); - array_unshift($hosts, $this->applicationID.'.algolia.net'); - - return $hosts; - } - - /** - * Closes eventually opened curl handles. - */ - public function __destruct() - { - if (is_resource($this->curlMHandle)) { - curl_multi_close($this->curlMHandle); - } - } - - /** - * @param $curlHandle - * - * @return resource - */ - public function getMHandle($curlHandle) - { - if (!is_resource($this->curlMHandle)) { - $this->curlMHandle = curl_multi_init(); - } - curl_multi_add_handle($this->curlMHandle, $curlHandle); - - return $this->curlMHandle; - } - - /** - * @param $curlHandle - */ - public function releaseMHandle($curlHandle) - { - curl_multi_remove_handle($this->curlMHandle, $curlHandle); - } - - /** - * @param string $ip - */ - public function setForwardedFor($ip) - { - $this->endUserIP = $ip; - } - - /** - * @param string $token - */ - public function setAlgoliaUserToken($token) - { - $this->algoliaUserToken = $token; - } - - /** - * @param string $adminAPIKey - * @param string $endUserIP - * @param string $rateLimitAPIKey - */ - public function setRateLimit($adminAPIKey, $endUserIP, $rateLimitAPIKey) - { - $this->adminAPIKey = $adminAPIKey; - $this->endUserIP = $endUserIP; - $this->rateLimitAPIKey = $rateLimitAPIKey; - } - - /** - * Disables the rate limit. - */ - public function disableRateLimit() - { - $this->adminAPIKey = null; - $this->endUserIP = null; - $this->rateLimitAPIKey = null; - } - - /** - * @param string $key - * @param string $value - */ - public function setExtraHeader($key, $value) - { - $this->headers[$key] = $value; - } - - /** - * @param string $host - */ - public function addFailingHost($host) - { - $this->failingHostsCache->addFailingHost($host); - } - - /** - * @return FailingHostsCache - */ - public function getFailingHostsCache() - { - return $this->failingHostsCache; - } - /** - * This method is called to pass on failing hosts. - * If the host is first either in the failingHosts array, we - * rotate the array to ensure the next API call will be directly made with a working - * host. This mainly ensures we don't add the equivalent of the connection timeout value to each - * request to the API. - */ - public function rotateHosts() - { - $failingHosts = $this->failingHostsCache->getFailingHosts(); - $i = 0; - while ($i <= count($this->readHostsArray) && in_array($this->readHostsArray[0], $failingHosts)) { - $i++; - $this->readHostsArray[] = array_shift($this->readHostsArray); - } - - $i = 0; - while ($i <= count($this->writeHostsArray) && in_array($this->writeHostsArray[0], $failingHosts)) { - $i++; - $this->writeHostsArray[] = array_shift($this->writeHostsArray); - } - } -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/FailingHostsCache.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/FailingHostsCache.php deleted file mode 100644 index 17ab336fa0..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/FailingHostsCache.php +++ /dev/null @@ -1,23 +0,0 @@ -failingHostsCacheFile = $this->getDefaultCacheFile(); - } else { - $this->failingHostsCacheFile = (string) $file; - } - - $this->assertCacheFileIsValid($this->failingHostsCacheFile); - - if ($ttl === null) { - $ttl = 60 * 5; // 5 minutes - } - - $this->ttl = (int) $ttl; - } - - /** - * @return int - */ - public function getTtl() - { - return $this->ttl; - } - - /** - * @param $file - */ - private function assertCacheFileIsValid($file) - { - $fileDirectory = dirname($file); - - if (! is_writable($fileDirectory)) { - throw new \RuntimeException(sprintf('Cache file directory "%s" is not writable.', $fileDirectory)); - } - - if (! file_exists($file)) { - // The dir being writable, the file will be created when needed. - return; - } - - if (! is_readable($file)) { - throw new \RuntimeException(sprintf('Cache file "%s" is not readable.', $file)); - } - - if (! is_writable($file)) { - throw new \RuntimeException(sprintf('Cache file "%s" is not writable.', $file)); - } - } - - /** - * @return string - */ - private function getDefaultCacheFile() - { - return sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'algolia-failing-hosts'; - } - - /** - * @param string $host - */ - public function addFailingHost($host) - { - $cache = $this->loadFailingHostsCacheFromDisk(); - - if (isset($cache[self::TIMESTAMP]) && isset($cache[self::FAILING_HOSTS])) { - // Update failing hosts cache. - // Here we don't take care of invalidating. We do that on retrieval. - if (!in_array($host, $cache[self::FAILING_HOSTS])) { - $cache[self::FAILING_HOSTS][] = $host; - $this->writeFailingHostsCacheFile($cache); - } - } else { - $cache[self::TIMESTAMP] = time(); - $cache[self::FAILING_HOSTS] = array($host); - $this->writeFailingHostsCacheFile($cache); - } - } - - /** - * Get failing hosts from cache. This method should also handle cache invalidation if required. - * The TTL of the failed hosts cache should be 5mins. - * - * @return array - */ - public function getFailingHosts() - { - $cache = $this->loadFailingHostsCacheFromDisk(); - - return isset($cache[self::FAILING_HOSTS]) ? $cache[self::FAILING_HOSTS] : array(); - } - - /** - * Removes the file storing the failing hosts. - */ - public function flushFailingHostsCache() - { - if (file_exists($this->failingHostsCacheFile)) { - unlink($this->failingHostsCacheFile); - } - } - - /** - * @return array - */ - private function loadFailingHostsCacheFromDisk() - { - if (! file_exists($this->failingHostsCacheFile)) { - return array(); - } - - $json = file_get_contents($this->failingHostsCacheFile); - if ($json === false) { - return array(); - } - - $data = json_decode($json, true); - - if (json_last_error() !== JSON_ERROR_NONE) { - return array(); - } - - // Some basic checks. - if ( - !isset($data[self::TIMESTAMP]) - || !isset($data[self::FAILING_HOSTS]) - || !is_int($data[self::TIMESTAMP]) - || !is_array($data[self::FAILING_HOSTS]) - ) { - return array(); - } - - // Validate the hosts array. - foreach ($data[self::FAILING_HOSTS] as $host) { - if (!is_string($host)) { - return array(); - } - } - - $elapsed = time() - $data[self::TIMESTAMP]; // Number of seconds elapsed. - - if ($elapsed > $this->ttl) { - $this->flushFailingHostsCache(); - - return array(); - } - - return $data; - } - - /** - * @param array $data - */ - private function writeFailingHostsCacheFile(array $data) - { - $json = json_encode($data); - if ($json !== false) { - file_put_contents($this->failingHostsCacheFile, $json); - } - } -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/InMemoryFailingHostsCache.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/InMemoryFailingHostsCache.php deleted file mode 100644 index a4cea21cd0..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/InMemoryFailingHostsCache.php +++ /dev/null @@ -1,76 +0,0 @@ -ttl = (int) $ttl; - } - - - /** - * @param string $host - */ - public function addFailingHost($host) - { - if (! in_array($host, self::$failingHosts)) { - // Keep a local cache of failed hosts in case the file based strategy doesn't work out. - self::$failingHosts[] = $host; - - if (self::$timestamp === null) { - self::$timestamp = time(); - } - } - } - - /** - * Get failing hosts from cache. This method should also handle cache invalidation if required. - * The TTL of the failed hosts cache should be 5mins. - * - * @return array - */ - public function getFailingHosts() - { - if (self::$timestamp === null) { - return self::$failingHosts; - } - - $elapsed = time() - self::$timestamp; - if ($elapsed > $this->ttl) { - $this->flushFailingHostsCache(); - } - - return self::$failingHosts; - } - - public function flushFailingHostsCache() - { - self::$failingHosts = array(); - self::$timestamp = null; - } -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Index.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Index.php deleted file mode 100644 index 6294cb9729..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Index.php +++ /dev/null @@ -1,1812 +0,0 @@ -context = $context; - $this->client = $client; - $this->indexName = $indexName; - $this->urlIndexName = urlencode($indexName); - } - - /** - * Perform batch operation on several objects. - * - * @param array $objects contains an array of objects to update (each object must contains an objectID - * attribute) - * @param string $objectIDKey the key in each object that contains the objectID - * @param string $objectActionKey the key in each object that contains the action to perform (addObject, updateObject, - * deleteObject or partialUpdateObject) - * - * @return mixed - * - * @throws \Exception - */ - public function batchObjects($objects, $objectIDKey = 'objectID', $objectActionKey = 'objectAction') - { - $requestHeaders = func_num_args() === 4 && is_array(func_get_arg(3)) ? func_get_arg(3) : array(); - - $requests = array(); - $allowedActions = array( - 'addObject', - 'updateObject', - 'deleteObject', - 'partialUpdateObject', - 'partialUpdateObjectNoCreate', - ); - - foreach ($objects as $obj) { - // If no or invalid action, assume updateObject - if (!isset($obj[$objectActionKey]) || !in_array($obj[$objectActionKey], $allowedActions)) { - throw new \Exception('invalid or no action detected'); - } - - $action = $obj[$objectActionKey]; - - // The action key is not included in the object - unset($obj[$objectActionKey]); - - $req = array('action' => $action, 'body' => $obj); - - if (array_key_exists($objectIDKey, $obj)) { - $req['objectID'] = (string) $obj[$objectIDKey]; - } - - $requests[] = $req; - } - - return $this->batch(array('requests' => $requests), $requestHeaders); - } - - /** - * Add an object in this index. - * - * @param array $content contains the object to add inside the index. - * The object is represented by an associative array - * @param string|null $objectID (optional) an objectID you want to attribute to this object - * (if the attribute already exist the old object will be overwrite) - * - * @return mixed - */ - public function addObject($content, $objectID = null) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - if ($objectID === null) { - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName, - array(), - $content, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - return $this->client->request( - $this->context, - 'PUT', - '/1/indexes/'.$this->urlIndexName.'/'.urlencode($objectID), - array(), - $content, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Add several objects. - * - * @param array $objects contains an array of objects to add. If the object contains an objectID - * @param string $objectIDKey - * - * @return mixed - */ - public function addObjects($objects, $objectIDKey = 'objectID') - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - $requests = $this->buildBatch('addObject', $objects, true, $objectIDKey); - - return $this->batch($requests, $requestHeaders); - } - - /** - * Get an object from this index. - * - * @param string $objectID the unique identifier of the object to retrieve - * @param string[] $attributesToRetrieve (optional) if set, contains the list of attributes to retrieve - * @param array $requestHeaders - * - * @return mixed - */ - public function getObject($objectID, $attributesToRetrieve = null) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - $id = urlencode($objectID); - if ($attributesToRetrieve === null) { - return $this->client->request( - $this->context, - 'GET', - '/1/indexes/'.$this->urlIndexName.'/'.$id, - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - if (is_array($attributesToRetrieve)) { - $attributesToRetrieve = implode(',', $attributesToRetrieve); - } - - return $this->client->request( - $this->context, - 'GET', - '/1/indexes/'.$this->urlIndexName.'/'.$id, - array('attributes' => $attributesToRetrieve), - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Get several objects from this index. - * - * @param array $objectIDs the array of unique identifier of objects to retrieve - * @param string[] $attributesToRetrieve (optional) if set, contains the list of attributes to retrieve - * @param array $requestHeaders - * - * @return mixed - * - * @throws \Exception - */ - public function getObjects($objectIDs, $attributesToRetrieve = null) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - if ($objectIDs == null) { - throw new \Exception('No list of objectID provided'); - } - - $requests = array(); - foreach ($objectIDs as $object) { - $req = array('indexName' => $this->indexName, 'objectID' => $object); - - if ($attributesToRetrieve) { - if (is_array($attributesToRetrieve)) { - $attributesToRetrieve = implode(',', $attributesToRetrieve); - } - - $req['attributesToRetrieve'] = $attributesToRetrieve; - } - - array_push($requests, $req); - } - - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/*/objects', - array(), - array('requests' => $requests), - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Update partially an object (only update attributes passed in argument). - * - * @param array $partialObject contains the object attributes to override, the - * object must contains an objectID attribute - * @param bool $createIfNotExists - * - * @return mixed - * - * @throws AlgoliaException - */ - public function partialUpdateObject($partialObject, $createIfNotExists = true) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - $queryString = $createIfNotExists ? '' : '?createIfNotExists=false'; - - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/'.urlencode($partialObject['objectID']).'/partial'.$queryString, - array(), - $partialObject, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Partially Override the content of several objects. - * - * @param array $objects contains an array of objects to update (each object must contains a objectID attribute) - * @param string $objectIDKey - * @param bool $createIfNotExists - * - * @return mixed - */ - public function partialUpdateObjects($objects, $objectIDKey = 'objectID', $createIfNotExists = true) - { - $requestHeaders = func_num_args() === 4 && is_array(func_get_arg(3)) ? func_get_arg(3) : array(); - if ($createIfNotExists) { - $requests = $this->buildBatch('partialUpdateObject', $objects, true, $objectIDKey); - } else { - $requests = $this->buildBatch('partialUpdateObjectNoCreate', $objects, true, $objectIDKey); - } - - return $this->batch($requests, $requestHeaders); - } - - /** - * Override the content of object. - * - * @param array $object contains the object to save, the object must contains an objectID attribute - * or attribute specified in $objectIDKey considered as objectID - * @param string $objectIDKey - * - * @return mixed - */ - public function saveObject($object, $objectIDKey = 'objectID') - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - return $this->client->request( - $this->context, - 'PUT', - '/1/indexes/'.$this->urlIndexName.'/'.urlencode($object[$objectIDKey]), - array(), - $object, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Override the content of several objects. - * - * @param array $objects contains an array of objects to update (each object must contains a objectID attribute) - * @param string $objectIDKey - * - * @return mixed - */ - public function saveObjects($objects, $objectIDKey = 'objectID') - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - $requests = $this->buildBatch('updateObject', $objects, true, $objectIDKey); - - return $this->batch($requests, $requestHeaders); - } - - /** - * Delete an object from the index. - * - * @param int|string $objectID the unique identifier of object to delete - * - * @return mixed - * - * @throws AlgoliaException - * @throws \Exception - */ - public function deleteObject($objectID) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - if ($objectID == null || mb_strlen($objectID) == 0) { - throw new \Exception('objectID is mandatory'); - } - - return $this->client->request( - $this->context, - 'DELETE', - '/1/indexes/'.$this->urlIndexName.'/'.urlencode($objectID), - null, - null, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Delete several objects. - * - * @param array $objects contains an array of objectIDs to delete. If the object contains an objectID - * - * @return mixed - */ - public function deleteObjects($objects) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - $objectIDs = array(); - foreach ($objects as $key => $id) { - $objectIDs[$key] = array('objectID' => $id); - } - $requests = $this->buildBatch('deleteObject', $objectIDs, true); - - return $this->batch($requests, $requestHeaders); - } - - public function deleteBy(array $args) - { - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/deleteByQuery', - null, - array('params' => $this->client->buildQuery($args)), - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout - ); - } - - /** - * @deprecated use `deleteBy()` instead. - * Delete all objects matching a query. - * - * @param string $query the query string - * @param array $args the optional query parameters - * @param bool $waitLastCall - * /!\ Be safe with "waitLastCall" - * In really rare cases you can have the number of hits smaller than the hitsPerPage - * param if you trigger the timeout of the search, in that case you won't remove all - * the records - * - * @return int the number of delete operations - */ - public function deleteByQuery($query, $args = array(), $waitLastCall = true) - { - $requestHeaders = func_num_args() === 4 && is_array(func_get_arg(3)) ? func_get_arg(3) : array(); - - $args['attributesToRetrieve'] = 'objectID'; - $args['hitsPerPage'] = 1000; - $args['distinct'] = false; - - $deletedCount = 0; - $results = $this->search($query, $args, $requestHeaders); - while ($results['nbHits'] != 0) { - $objectIDs = array(); - foreach ($results['hits'] as $elt) { - array_push($objectIDs, $elt['objectID']); - } - $res = $this->deleteObjects($objectIDs, $requestHeaders); - $deletedCount += count($objectIDs); - if ($results['nbHits'] < $args['hitsPerPage'] && false === $waitLastCall) { - break; - } - $this->waitTask($res['taskID'], 100, $requestHeaders); - $results = $this->search($query, $args, $requestHeaders); - } - - return $deletedCount; - } - - /** - * Search inside the index. - * - * @param string $query the full text query - * @param mixed $args (optional) if set, contains an associative array with query parameters: - * - page: (integer) Pagination parameter used to select the page to retrieve. - * Page is zero-based and defaults to 0. Thus, to retrieve the 10th page you need to set page=9 - * - hitsPerPage: (integer) Pagination parameter used to select the number of hits per page. - * Defaults to 20. - * - attributesToRetrieve: a string that contains the list of object attributes you want to - * retrieve (let you minimize the answer size). Attributes are separated with a comma (for - * example "name,address"). You can also use a string array encoding (for example - * ["name","address"]). By default, all attributes are retrieved. You can also use '*' to - * retrieve all values when an attributesToRetrieve setting is specified for your index. - * - attributesToHighlight: a string that contains the list of attributes you want to highlight - * according to the query. Attributes are separated by a comma. You can also use a string array - * encoding (for example ["name","address"]). If an attribute has no match for the query, the raw - * value is returned. By default all indexed text attributes are highlighted. You can use `*` if - * you want to highlight all textual attributes. Numerical attributes are not highlighted. A - * matchLevel is returned for each highlighted attribute and can contain: - * - full: if all the query terms were found in the attribute, - * - partial: if only some of the query terms were found, - * - none: if none of the query terms were found. - * - attributesToSnippet: a string that contains the list of attributes to snippet alongside the - * number of words to return (syntax is `attributeName:nbWords`). Attributes are separated by a - * comma (Example: attributesToSnippet=name:10,content:10). You can also use a string array - * encoding (Example: attributesToSnippet: ["name:10","content:10"]). By default no snippet is - * computed. - * - minWordSizefor1Typo: the minimum number of characters in a query word to accept one typo in - * this word. Defaults to 3. - * - minWordSizefor2Typos: the minimum number of characters in a query word to accept two typos - * in this word. Defaults to 7. - * - getRankingInfo: if set to 1, the result hits will contain ranking information in - * _rankingInfo attribute. - * - aroundLatLng: search for entries around a given latitude/longitude (specified as two floats - * separated by a comma). For example aroundLatLng=47.316669,5.016670). You can specify the - * maximum distance in meters with the aroundRadius parameter (in meters) and the precision for - * ranking with aroundPrecision - * (for example if you set aroundPrecision=100, two objects that are distant of less than 100m - * will be considered as identical for "geo" ranking parameter). At indexing, you should specify - * geoloc of an object with the _geoloc attribute (in the form {"_geoloc":{"lat":48.853409, - * "lng":2.348800}}) - * - insideBoundingBox: search entries inside a given area defined by the two extreme points of a - * rectangle (defined by 4 floats: p1Lat,p1Lng,p2Lat,p2Lng). For example - * insideBoundingBox=47.3165,4.9665,47.3424,5.0201). At indexing, you should specify geoloc of an - * object with the _geoloc attribute (in the form {"_geoloc":{"lat":48.853409, "lng":2.348800}}) - * - numericFilters: a string that contains the list of numeric filters you want to apply - * separated by a comma. The syntax of one filter is `attributeName` followed by `operand` - * followed by `value`. Supported operands are `<`, `<=`, `=`, `>` and `>=`. You can have - * multiple conditions on one attribute like for example numericFilters=price>100,price<1000. You - * can also use a string array encoding (for example numericFilters: ["price>100","price<1000"]). - * - tagFilters: filter the query by a set of tags. You can AND tags by separating them by - * commas. - * To OR tags, you must add parentheses. For example, tags=tag1,(tag2,tag3) means tag1 AND (tag2 - * OR tag3). You can also use a string array encoding, for example tagFilters: - * ["tag1",["tag2","tag3"]] means tag1 AND (tag2 OR tag3). At indexing, tags should be added in - * the _tags** attribute of objects (for example {"_tags":["tag1","tag2"]}). - * - facetFilters: filter the query by a list of facets. - * Facets are separated by commas and each facet is encoded as `attributeName:value`. - * For example: `facetFilters=category:Book,author:John%20Doe`. - * You can also use a string array encoding (for example - * `["category:Book","author:John%20Doe"]`). - * - facets: List of object attributes that you want to use for faceting. - * Attributes are separated with a comma (for example `"category,author"` ). - * You can also use a JSON string array encoding (for example ["category","author"]). - * Only attributes that have been added in **attributesForFaceting** index setting can be used in - * this parameter. You can also use `*` to perform faceting on all attributes specified in - * **attributesForFaceting**. - * - queryType: select how the query words are interpreted, it can be one of the following value: - * - prefixAll: all query words are interpreted as prefixes, - * - prefixLast: only the last word is interpreted as a prefix (default behavior), - * - prefixNone: no query word is interpreted as a prefix. This option is not recommended. - * - optionalWords: a string that contains the list of words that should be considered as - * optional when found in the query. The list of words is comma separated. - * - distinct: If set to 1, enable the distinct feature (disabled by default) if the - * attributeForDistinct index setting is set. This feature is similar to the SQL "distinct" - * keyword: when enabled in a query with the distinct=1 parameter, all hits containing a - * duplicate value for the attributeForDistinct attribute are removed from results. For example, - * if the chosen attribute is show_name and several hits have the same value for show_name, then - * only the best one is kept and others are removed. - * @param array $requestHeaders - * - * @return mixed - * @throws AlgoliaException - */ - public function search($query, $args = null) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - if ($args === null) { - $args = array(); - } - $args['query'] = $query; - - if (isset($args['disjunctiveFacets'])) { - return $this->searchWithDisjunctiveFaceting($query, $args); - } - - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/query', - array(), - array('params' => $this->client->buildQuery($args)), - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->searchTimeout, - $requestHeaders - ); - } - - /** - * @param $query - * @param $args - * @return mixed - * @throws AlgoliaException - */ - private function searchWithDisjunctiveFaceting($query, $args) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - if (! is_array($args['disjunctiveFacets']) || count($args['disjunctiveFacets']) <= 0) { - throw new \InvalidArgumentException('disjunctiveFacets needs to be an non empty array'); - } - - if (isset($args['filters'])) { - throw new \InvalidArgumentException('You can not use disjunctive faceting and the filters parameter'); - } - - /** - * Prepare queries - */ - // Get the list of disjunctive queries to do: 1 per disjunctive facet - $disjunctiveQueries = $this->getDisjunctiveQueries($args); - - // Format disjunctive queries for multipleQueries call - foreach ($disjunctiveQueries as &$disjunctiveQuery) { - $disjunctiveQuery['indexName'] = $this->indexName; - $disjunctiveQuery['query'] = $query; - unset($disjunctiveQuery['disjunctiveFacets']); - } - - // Merge facets and disjunctiveFacets for the hits query - $facets = isset($args['facets']) ? $args['facets'] : array(); - $facets = array_merge($facets, $args['disjunctiveFacets']); - unset($args['disjunctiveFacets']); - - // format the hits query for multipleQueries call - $args['query'] = $query; - $args['indexName'] = $this->indexName; - $args['facets'] = $facets; - - // Put the hit query first - array_unshift($disjunctiveQueries, $args); - - /** - * Do all queries in one call - */ - $results = $this->client->multipleQueries( - array_values($disjunctiveQueries), - 'indexName', - 'none', - $requestHeaders - ); - $results = $results['results']; - - /** - * Merge facets from disjunctive queries with facets from the hits query - */ - - // The first query is the hits query that the one we'll return to the user - $queryResults = array_shift($results); - - // To be able to add facets from disjunctive query we create 'facets' key in case we only have disjunctive facets - if (false === isset($queryResults['facets'])) { - $queryResults['facets'] = array(); - } - - foreach ($results as $disjunctiveResults) { - if (isset($disjunctiveResults['facets'])) { - foreach ($disjunctiveResults['facets'] as $facetName => $facetValues) { - $queryResults['facets'][$facetName] = $facetValues; - } - } - } - - return $queryResults; - } - - /** - * @param $queryParams - * @return array - */ - private function getDisjunctiveQueries($queryParams) - { - $queriesParams = array(); - - foreach ($queryParams['disjunctiveFacets'] as $facetName) { - $params = $queryParams; - $params['facets'] = array($facetName); - $facetFilters = isset($params['facetFilters']) ? $params['facetFilters']: array(); - $numericFilters = isset($params['numericFilters']) ? $params['numericFilters']: array(); - - $additionalParams = array( - 'hitsPerPage' => 1, - 'page' => 0, - 'attributesToRetrieve' => array(), - 'attributesToHighlight' => array(), - 'attributesToSnippet' => array(), - 'analytics' => false - ); - - $additionalParams['facetFilters'] = $this->getAlgoliaFiltersArrayWithoutCurrentRefinement($facetFilters, $facetName . ':'); - $additionalParams['numericFilters'] = $this->getAlgoliaFiltersArrayWithoutCurrentRefinement($numericFilters, $facetName); - - $queriesParams[$facetName] = array_merge($params, $additionalParams); - } - - return $queriesParams; - } - - /** - * @param $filters - * @param $needle - * @return array - */ - private function getAlgoliaFiltersArrayWithoutCurrentRefinement($filters, $needle) - { - // iterate on each filters which can be string or array and filter out every refinement matching the needle - for ($i = 0; $i < count($filters); $i++) { - if (is_array($filters[$i])) { - foreach ($filters[$i] as $filter) { - if (mb_substr($filter, 0, mb_strlen($needle)) === $needle) { - unset($filters[$i]); - $filters = array_values($filters); - $i--; - break; - } - } - } else { - if (mb_substr($filters[$i], 0, mb_strlen($needle)) === $needle) { - unset($filters[$i]); - $filters = array_values($filters); - $i--; - } - } - } - - return $filters; - } - - /** - * Perform a search inside facets. - * - * @param $facetName - * @param $facetQuery - * @param array $query - * @param array $requestHeaders - * - * @return mixed - */ - public function searchForFacetValues($facetName, $facetQuery, $query = array()) - { - $requestHeaders = func_num_args() === 4 && is_array(func_get_arg(3)) ? func_get_arg(3) : array(); - - $query['facetQuery'] = $facetQuery; - - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/facets/'.$facetName.'/query', - array(), - array('params' => $this->client->buildQuery($query)), - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->searchTimeout, - $requestHeaders - ); - } - - /** - * Perform a search with disjunctive facets generating as many queries as number of disjunctive facets. - * - * @param string $query the query - * @param array $disjunctive_facets the array of disjunctive facets - * @param array $params a hash representing the regular query parameters - * @param array $refinements a hash ("string" -> ["array", "of", "refined", "values"]) representing the current refinements - * ex: { "my_facet1" => ["my_value1", ["my_value2"], "my_disjunctive_facet1" => ["my_value1", "my_value2"] } - * - * @return mixed - * - * @throws AlgoliaException - * @throws \Exception - * @deprecated you should use $index->search($query, ['disjunctiveFacets' => $disjunctive_facets]]); instead - */ - public function searchDisjunctiveFaceting($query, $disjunctive_facets, $params = array(), $refinements = array()) - { - if (gettype($disjunctive_facets) != 'string' && gettype($disjunctive_facets) != 'array') { - throw new AlgoliaException('Argument "disjunctive_facets" must be a String or an Array'); - } - - if (gettype($refinements) != 'array') { - throw new AlgoliaException('Argument "refinements" must be a Hash of Arrays'); - } - - if (gettype($disjunctive_facets) == 'string') { - $disjunctive_facets = explode(',', $disjunctive_facets); - } - - $disjunctive_refinements = array(); - foreach ($refinements as $key => $value) { - if (in_array($key, $disjunctive_facets)) { - $disjunctive_refinements[$key] = $value; - } - } - $queries = array(); - $filters = array(); - - foreach ($refinements as $key => $value) { - $r = array_map( - function ($val) use ($key) { - return $key.':'.$val; - }, - $value - ); - - if (in_array($key, $disjunctive_refinements)) { - $filter = array_merge($filters, $r); - } else { - array_push($filters, $r); - } - } - $params['indexName'] = $this->indexName; - $params['query'] = $query; - $params['facetFilters'] = $filters; - array_push($queries, $params); - foreach ($disjunctive_facets as $disjunctive_facet) { - $filters = array(); - foreach ($refinements as $key => $value) { - if ($key != $disjunctive_facet) { - $r = array_map( - function ($val) use ($key) { - return $key.':'.$val; - }, - $value - ); - - if (in_array($key, $disjunctive_refinements)) { - $filter = array_merge($filters, $r); - } else { - array_push($filters, $r); - } - } - } - $params['indexName'] = $this->indexName; - $params['query'] = $query; - $params['facetFilters'] = $filters; - $params['page'] = 0; - $params['hitsPerPage'] = 0; - $params['attributesToRetrieve'] = array(); - $params['attributesToHighlight'] = array(); - $params['attributesToSnippet'] = array(); - $params['facets'] = $disjunctive_facet; - $params['analytics'] = false; - array_push($queries, $params); - } - $answers = $this->client->multipleQueries($queries); - - $aggregated_answer = $answers['results'][0]; - $aggregated_answer['disjunctiveFacets'] = array(); - for ($i = 1; $i < count($answers['results']); $i++) { - foreach ($answers['results'][$i]['facets'] as $key => $facet) { - $aggregated_answer['disjunctiveFacets'][$key] = $facet; - if (!in_array($key, $disjunctive_refinements)) { - continue; - } - foreach ($disjunctive_refinements[$key] as $r) { - if (is_null($aggregated_answer['disjunctiveFacets'][$key][$r])) { - $aggregated_answer['disjunctiveFacets'][$key][$r] = 0; - } - } - } - } - - return $aggregated_answer; - } - - /** - * Browse all index content. - * - * @param int $page Pagination parameter used to select the page to retrieve. - * Page is zero-based and defaults to 0. Thus, to retrieve the 10th page you need to set page=9 - * @param int $hitsPerPage : Pagination parameter used to select the number of hits per page. Defaults to 1000. - * - * @return mixed - * - * @throws AlgoliaException - */ - private function doBcBrowse($page = 0, $hitsPerPage = 1000) - { - return $this->client->request( - $this->context, - 'GET', - '/1/indexes/'.$this->urlIndexName.'/browse', - array('page' => $page, 'hitsPerPage' => $hitsPerPage), - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout - ); - } - - /** - * Wait the publication of a task on the server. - * All server task are asynchronous and you can check with this method that the task is published. - * - * @param string $taskID the id of the task returned by server - * @param int $timeBeforeRetry the time in milliseconds before retry (default = 100ms) - * - * @return mixed - */ - public function waitTask($taskID, $timeBeforeRetry = 100) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - while (true) { - $res = $this->getTaskStatus($taskID, $requestHeaders); - if ($res['status'] === 'published') { - return $res; - } - usleep($timeBeforeRetry * 1000); - } - } - - /** - * get the status of a task on the server. - * All server task are asynchronous and you can check with this method that the task is published or not. - * - * @param string $taskID the id of the task returned by server - * - * @return mixed - */ - public function getTaskStatus($taskID) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - return $this->client->request( - $this->context, - 'GET', - '/1/indexes/'.$this->urlIndexName.'/task/'.$taskID, - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Get settings of this index. - * - * @return mixed - * - * @throws AlgoliaException - */ - public function getSettings() - { - $requestHeaders = func_num_args() === 1 && is_array(func_get_arg(0)) ? func_get_arg(0) : array(); - - return $this->client->request( - $this->context, - 'GET', - '/1/indexes/'.$this->urlIndexName.'/settings?getVersion=2', - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * This function deletes the index content. Settings and index specific API keys are kept untouched. - * - * @return mixed - * - * @throws AlgoliaException - */ - public function clearIndex() - { - $requestHeaders = func_num_args() === 1 && is_array(func_get_arg(0)) ? func_get_arg(0) : array(); - - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/clear', - null, - null, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Set settings for this index. - * - * @param mixed $settings the settings object that can contains : - * - minWordSizefor1Typo: (integer) the minimum number of characters to accept one typo (default = - * 3). - * - minWordSizefor2Typos: (integer) the minimum number of characters to accept two typos (default - * = 7). - * - hitsPerPage: (integer) the number of hits per page (default = 10). - * - attributesToRetrieve: (array of strings) default list of attributes to retrieve in objects. - * If set to null, all attributes are retrieved. - * - attributesToHighlight: (array of strings) default list of attributes to highlight. - * If set to null, all indexed attributes are highlighted. - * - attributesToSnippet**: (array of strings) default list of attributes to snippet alongside the - * number of words to return (syntax is attributeName:nbWords). By default no snippet is computed. - * If set to null, no snippet is computed. - * - searchableAttributes (formerly named attributesToIndex): (array of strings) the list of fields you want to index. - * If set to null, all textual and numerical attributes of your objects are indexed, but you - * should update it to get optimal results. This parameter has two important uses: - * - Limit the attributes to index: For example if you store a binary image in base64, you want to - * store it and be able to retrieve it but you don't want to search in the base64 string. - * - Control part of the ranking*: (see the ranking parameter for full explanation) Matches in - * attributes at the beginning of the list will be considered more important than matches in - * attributes further down the list. In one attribute, matching text at the beginning of the - * attribute will be considered more important than text after, you can disable this behavior if - * you add your attribute inside `unordered(AttributeName)`, for example searchableAttributes: - * ["title", "unordered(text)"]. - * - attributesForFaceting: (array of strings) The list of fields you want to use for faceting. - * All strings in the attribute selected for faceting are extracted and added as a facet. If set - * to null, no attribute is used for faceting. - * - attributeForDistinct: (string) The attribute name used for the Distinct feature. This feature - * is similar to the SQL "distinct" keyword: when enabled in query with the distinct=1 parameter, - * all hits containing a duplicate value for this attribute are removed from results. For example, - * if the chosen attribute is show_name and several hits have the same value for show_name, then - * only the best one is kept and others are removed. - * - ranking: (array of strings) controls the way results are sorted. - * We have six available criteria: - * - typo: sort according to number of typos, - * - geo: sort according to decreasing distance when performing a geo-location based search, - * - proximity: sort according to the proximity of query words in hits, - * - attribute: sort according to the order of attributes defined by searchableAttributes, - * - exact: - * - if the user query contains one word: sort objects having an attribute that is exactly the - * query word before others. For example if you search for the "V" TV show, you want to find it - * with the "V" query and avoid to have all popular TV show starting by the v letter before it. - * - if the user query contains multiple words: sort according to the number of words that matched - * exactly (and not as a prefix). - * - custom: sort according to a user defined formula set in **customRanking** attribute. - * The standard order is ["typo", "geo", "proximity", "attribute", "exact", "custom"] - * - customRanking: (array of strings) lets you specify part of the ranking. - * The syntax of this condition is an array of strings containing attributes prefixed by asc - * (ascending order) or desc (descending order) operator. For example `"customRanking" => - * ["desc(population)", "asc(name)"]` - * - queryType: Select how the query words are interpreted, it can be one of the following value: - * - prefixAll: all query words are interpreted as prefixes, - * - prefixLast: only the last word is interpreted as a prefix (default behavior), - * - prefixNone: no query word is interpreted as a prefix. This option is not recommended. - * - highlightPreTag: (string) Specify the string that is inserted before the highlighted parts in - * the query result (default to ""). - * - highlightPostTag: (string) Specify the string that is inserted after the highlighted parts in - * the query result (default to ""). - * - optionalWords: (array of strings) Specify a list of words that should be considered as - * optional when found in the query. - * @param bool $forwardToReplicas - * - * @return mixed - * - * @throws AlgoliaException - */ - public function setSettings($settings, $forwardToReplicas = false) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - $url = '/1/indexes/'.$this->urlIndexName.'/settings'; - - if ($forwardToReplicas) { - $url = $url.'?forwardToReplicas=true'; - } - - return $this->client->request( - $this->context, - 'PUT', - $url, - array(), - $settings, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * List all existing API keys associated to this index with their associated ACLs. - * - * @return mixed - * - * @throws AlgoliaException - */ - public function listApiKeys() - { - $requestHeaders = func_num_args() === 1 && is_array(func_get_arg(0)) ? func_get_arg(0) : array(); - - return $this->client->request( - $this->context, - 'GET', - '/1/indexes/'.$this->urlIndexName.'/keys', - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @deprecated use listApiKeys instead - * @return mixed - */ - public function listUserKeys() - { - return $this->listApiKeys(); - } - - /** - * @deprecated use getApiKey in - * @param $key - * @return mixed - */ - public function getUserKeyACL($key) - { - return $this->getApiKey($key); - } - - /** - * Get ACL of a API key associated to this index. - * - * @param string $key - * - * @return mixed - * - * @throws AlgoliaException - */ - public function getApiKey($key) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - return $this->client->request( - $this->context, - 'GET', - '/1/indexes/'.$this->urlIndexName.'/keys/'.$key, - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - - /** - * Delete an existing API key associated to this index. - * - * @param string $key - * - * @return mixed - * - * @throws AlgoliaException - */ - public function deleteApiKey($key) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - return $this->client->request( - $this->context, - 'DELETE', - '/1/indexes/'.$this->urlIndexName.'/keys/'.$key, - null, - null, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $key - * @return mixed - * @deprecated use deleteApiKey instead - */ - public function deleteUserKey($key) - { - return $this->deleteApiKey($key); - } - - /** - * Create a new API key associated to this index. - * - * @param array $obj can be two different parameters: - * The list of parameters for this key. Defined by a array that - * can contains the following values: - * - acl: array of string - * - indices: array of string - * - validity: int - * - referers: array of string - * - description: string - * - maxHitsPerQuery: integer - * - queryParameters: string - * - maxQueriesPerIPPerHour: integer - * Or the list of ACL for this key. Defined by an array of NSString that - * can contains the following values: - * - search: allow to search (https and http) - * - addObject: allows to add/update an object in the index (https only) - * - deleteObject : allows to delete an existing object (https only) - * - deleteIndex : allows to delete index content (https only) - * - settings : allows to get index settings (https only) - * - editSettings : allows to change index settings (https only) - * @param int $validity the number of seconds after which the key will be automatically removed (0 means - * no time limit for this key) - * @param int $maxQueriesPerIPPerHour Specify the maximum number of API calls allowed from an IP address per hour. - * Defaults to 0 (no rate limit). - * @param int $maxHitsPerQuery Specify the maximum number of hits this API key can retrieve in one call. - * Defaults to 0 (unlimited) - * - * @return mixed - * - * @throws AlgoliaException - */ - public function addApiKey($obj, $validity = 0, $maxQueriesPerIPPerHour = 0, $maxHitsPerQuery = 0) - { - $requestHeaders = func_num_args() === 5 && is_array(func_get_arg(4)) ? func_get_arg(4) : array(); - - if ($obj !== array_values($obj)) { - // if $obj doesn't have required entries, we add the default values - $params = $obj; - if ($validity != 0) { - $params['validity'] = $validity; - } - if ($maxQueriesPerIPPerHour != 0) { - $params['maxQueriesPerIPPerHour'] = $maxQueriesPerIPPerHour; - } - if ($maxHitsPerQuery != 0) { - $params['maxHitsPerQuery'] = $maxHitsPerQuery; - } - } else { - $params = array( - 'acl' => $obj, - 'validity' => $validity, - 'maxQueriesPerIPPerHour' => $maxQueriesPerIPPerHour, - 'maxHitsPerQuery' => $maxHitsPerQuery, - ); - } - - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/keys', - array(), - $params, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $obj - * @param int $validity - * @param int $maxQueriesPerIPPerHour - * @param int $maxHitsPerQuery - * @return mixed - * @deprecated use addApiKey instead - */ - public function addUserKey($obj, $validity = 0, $maxQueriesPerIPPerHour = 0, $maxHitsPerQuery = 0) - { - return $this->addApiKey($obj, $validity, $maxQueriesPerIPPerHour, $maxHitsPerQuery); - } - - - /** - * Update an API key associated to this index. - * - * @param string $key - * @param array $obj can be two different parameters: - * The list of parameters for this key. Defined by a array that - * can contains the following values: - * - acl: array of string - * - indices: array of string - * - validity: int - * - referers: array of string - * - description: string - * - maxHitsPerQuery: integer - * - queryParameters: string - * - maxQueriesPerIPPerHour: integer - * Or the list of ACL for this key. Defined by an array of NSString that - * can contains the following values: - * - search: allow to search (https and http) - * - addObject: allows to add/update an object in the index (https only) - * - deleteObject : allows to delete an existing object (https only) - * - deleteIndex : allows to delete index content (https only) - * - settings : allows to get index settings (https only) - * - editSettings : allows to change index settings (https only) - * @param int $validity the number of seconds after which the key will be automatically removed (0 means - * no time limit for this key) - * @param int $maxQueriesPerIPPerHour Specify the maximum number of API calls allowed from an IP address per hour. - * Defaults to 0 (no rate limit). - * @param int $maxHitsPerQuery Specify the maximum number of hits this API key can retrieve in one call. - * Defaults to 0 (unlimited) - * - * @return mixed - * - * @throws AlgoliaException - */ - public function updateApiKey($key, $obj, $validity = 0, $maxQueriesPerIPPerHour = 0, $maxHitsPerQuery = 0) - { - $requestHeaders = func_num_args() === 6 && is_array(func_get_arg(5)) ? func_get_arg(5) : array(); - - // is dict of value - if ($obj !== array_values($obj)) { - $params = $obj; - $params['validity'] = $validity; - $params['maxQueriesPerIPPerHour'] = $maxQueriesPerIPPerHour; - $params['maxHitsPerQuery'] = $maxHitsPerQuery; - } else { - $params = array( - 'acl' => $obj, - 'validity' => $validity, - 'maxQueriesPerIPPerHour' => $maxQueriesPerIPPerHour, - 'maxHitsPerQuery' => $maxHitsPerQuery, - ); - } - - return $this->client->request( - $this->context, - 'PUT', - '/1/indexes/'.$this->urlIndexName.'/keys/'.$key, - array(), - $params, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $key - * @param $obj - * @param int $validity - * @param int $maxQueriesPerIPPerHour - * @param int $maxHitsPerQuery - * @return mixed - * @deprecated use updateApiKey instead - */ - public function updateUserKey($key, $obj, $validity = 0, $maxQueriesPerIPPerHour = 0, $maxHitsPerQuery = 0) - { - return $this->updateApiKey($key, $obj, $validity, $maxQueriesPerIPPerHour, $maxHitsPerQuery); - } - - /** - * Send a batch request. - * - * @param array $requests an associative array defining the batch request body - * @param array $requestHeaders pass custom header only for this request - * - * @return mixed - */ - public function batch($requests) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/batch', - array(), - $requests, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * Build a batch request. - * - * @param string $action the batch action - * @param array $objects the array of objects - * @param string $withObjectID set an 'objectID' attribute - * @param string $objectIDKey the objectIDKey - * - * @return array - */ - private function buildBatch($action, $objects, $withObjectID, $objectIDKey = 'objectID') - { - $requests = array(); - foreach ($objects as $obj) { - $req = array('action' => $action, 'body' => $obj); - if ($withObjectID && array_key_exists($objectIDKey, $obj)) { - $req['objectID'] = (string) $obj[$objectIDKey]; - } - array_push($requests, $req); - } - - return array('requests' => $requests); - } - - /** - * @param string $query - * @param array|null $params - * - * @return IndexBrowser - */ - private function doBrowse($query, $params = null) - { - return new IndexBrowser($this, $query, $params); - } - - /** - * @param string $query - * @param array|null $params - * @param $cursor - * @param array $requestHeaders - * - * @return mixed - */ - public function browseFrom($query, $params = null, $cursor = null) - { - $requestHeaders = func_num_args() === 4 && is_array(func_get_arg(3)) ? func_get_arg(3) : array(); - - if ($params === null) { - $params = array(); - } - foreach ($params as $key => $value) { - if (gettype($value) == 'array') { - $params[$key] = Json::encode($value); - } - } - if ($query != null) { - $params['query'] = $query; - } - if ($cursor != null) { - $params['cursor'] = $cursor; - } - - return $this->client->request( - $this->context, - 'GET', - '/1/indexes/'.$this->urlIndexName.'/browse', - $params, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $query - * @param $synonymType - * @param null $page - * @param null $hitsPerPage - * - * @return mixed - * - * @throws AlgoliaException - */ - public function searchSynonyms($query, array $synonymType = array(), $page = null, $hitsPerPage = null) - { - $requestHeaders = func_num_args() === 5 && is_array(func_get_arg(4)) ? func_get_arg(4) : array(); - - $params = array(); - - if ($query !== null) { - $params['query'] = $query; - } - - if (count($synonymType) > 0) { - $types = array(); - - foreach ($synonymType as $type) { - if (is_integer($type)) { - $types[] = SynonymType::getSynonymsTypeString($type); - } else { - $types[] = $type; - } - } - $params['type'] = implode(',', $types); - } - - if ($page !== null) { - $params['page'] = $page; - } - - if ($hitsPerPage !== null) { - $params['hitsPerPage'] = $hitsPerPage; - } - - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/synonyms/search', - null, - $params, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $objectID - * - * @return mixed - * - * @throws AlgoliaException - */ - public function getSynonym($objectID) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - return $this->client->request( - $this->context, - 'GET', - '/1/indexes/'.$this->urlIndexName.'/synonyms/'.urlencode($objectID), - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $objectID - * @param $forwardToReplicas - * - * @return mixed - * - * @throws AlgoliaException - */ - public function deleteSynonym($objectID, $forwardToReplicas = false) - { - $requestHeaders = func_num_args() === 3 && is_array(func_get_arg(2)) ? func_get_arg(2) : array(); - - return $this->client->request( - $this->context, - 'DELETE', - '/1/indexes/'.$this->urlIndexName.'/synonyms/'.urlencode($objectID).'?forwardToReplicas='.($forwardToReplicas ? 'true' : 'false'), - null, - null, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param bool $forwardToReplicas - * - * @return mixed - * - * @throws AlgoliaException - */ - public function clearSynonyms($forwardToReplicas = false) - { - $requestHeaders = func_num_args() === 2 && is_array(func_get_arg(1)) ? func_get_arg(1) : array(); - - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/synonyms/clear?forwardToReplicas='.($forwardToReplicas ? 'true' : 'false'), - null, - null, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $objects - * @param bool $forwardToReplicas - * @param bool $replaceExistingSynonyms - * - * @return mixed - * - * @throws AlgoliaException - */ - public function batchSynonyms($objects, $forwardToReplicas = false, $replaceExistingSynonyms = false) - { - $requestHeaders = func_num_args() === 4 && is_array(func_get_arg(3)) ? func_get_arg(3) : array(); - - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/synonyms/batch?replaceExistingSynonyms='.($replaceExistingSynonyms ? 'true' : 'false') - .'&forwardToReplicas='.($forwardToReplicas ? 'true' : 'false'), - null, - $objects, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param $objectID - * @param $content - * @param bool $forwardToReplicas - * - * @return mixed - * - * @throws AlgoliaException - */ - public function saveSynonym($objectID, $content, $forwardToReplicas = false) - { - $requestHeaders = func_num_args() === 4 && is_array(func_get_arg(3)) ? func_get_arg(3) : array(); - - return $this->client->request( - $this->context, - 'PUT', - '/1/indexes/'.$this->urlIndexName.'/synonyms/'.urlencode($objectID).'?forwardToReplicas='.($forwardToReplicas ? 'true' : 'false'), - null, - $content, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout, - $requestHeaders - ); - } - - /** - * @param int $batchSize - * - * @return SynonymIterator - */ - public function initSynonymIterator($batchSize = 1000) - { - return new SynonymIterator($this, $batchSize); - } - - /** - * @deprecated Please use searchForFacetValues instead - * @param $facetName - * @param $facetQuery - * @param array $query - * @return mixed - */ - public function searchFacet($facetName, $facetQuery, $query = array()) - { - return $this->searchForFacetValues($facetName, $facetQuery, $query); - } - - /** - * @param $params - * - * @return mixed - * - * @throws AlgoliaException - */ - public function searchRules(array $params = array()) - { - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/rules/search', - null, - $params, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout - ); - } - - /** - * @param $objectID - * - * @return mixed - * - * @throws AlgoliaException - */ - public function getRule($objectID) - { - return $this->client->request( - $this->context, - 'GET', - '/1/indexes/'.$this->urlIndexName.'/rules/'.urlencode($objectID), - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout - ); - } - - /** - * @param $objectID - * @param $forwardToReplicas - * - * @return mixed - * - * @throws AlgoliaException - */ - public function deleteRule($objectID, $forwardToReplicas = false) - { - return $this->client->request( - $this->context, - 'DELETE', - '/1/indexes/'.$this->urlIndexName.'/rules/'.urlencode($objectID).'?forwardToReplicas='.($forwardToReplicas ? 'true' : 'false'), - null, - null, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout - ); - } - - /** - * @param bool $forwardToReplicas - * - * @return mixed - * - * @throws AlgoliaException - */ - public function clearRules($forwardToReplicas = false) - { - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/rules/clear?forwardToReplicas='.($forwardToReplicas ? 'true' : 'false'), - null, - null, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout - ); - } - - /** - * @param $rules - * @param bool $forwardToReplicas - * @param bool $clearExistingRules - * - * @return mixed - * - * @throws AlgoliaException - */ - public function batchRules($rules, $forwardToReplicas = false, $clearExistingRules = false) - { - return $this->client->request( - $this->context, - 'POST', - '/1/indexes/'.$this->urlIndexName.'/rules/batch?clearExistingRules='.($clearExistingRules ? 'true' : 'false') - .'&forwardToReplicas='.($forwardToReplicas ? 'true' : 'false'), - null, - $rules, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout - ); - } - - /** - * @param $objectID - * @param $content - * @param bool $forwardToReplicas - * - * @return mixed - * - * @throws AlgoliaException - */ - public function saveRule($objectID, $content, $forwardToReplicas = false) - { - if (!isset($content['objectID'])) { - $content['objectID'] = $objectID; - } - - return $this->client->request( - $this->context, - 'PUT', - '/1/indexes/'.$this->urlIndexName.'/rules/'.urlencode($objectID).'?forwardToReplicas='.($forwardToReplicas ? 'true' : 'false'), - null, - $content, - $this->context->writeHostsArray, - $this->context->connectTimeout, - $this->context->readTimeout - ); - } - - /** - * @param int $batchSize - * - * @return RuleIterator - */ - public function initRuleIterator($batchSize = 500) - { - return new RuleIterator($this, $batchSize); - } - - /** - * @param string $name - * @param array $arguments - * - * @return mixed - */ - public function __call($name, $arguments) - { - if ($name === 'browse') { - if (count($arguments) >= 1 && is_string($arguments[0])) { - return call_user_func_array(array($this, 'doBrowse'), $arguments); - } - - return call_user_func_array(array($this, 'doBcBrowse'), $arguments); - } - - throw new \BadMethodCallException(sprintf('No method named %s was found.', $name)); - } -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/IndexBrowser.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/IndexBrowser.php deleted file mode 100644 index eef0c38bb5..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/IndexBrowser.php +++ /dev/null @@ -1,162 +0,0 @@ -index = $index; - $this->query = $query; - $this->params = $params; - - $this->position = 0; - - $this->doQuery($cursor, $requestHeaders); - } - - /** - * @return mixed - */ - public function current() - { - return $this->hit; - } - - /** - * @return mixed - */ - public function next() - { - return $this->hit; - } - - /** - * @return int - */ - public function key() - { - return $this->position; - } - - /** - * @return bool - */ - public function valid() - { - do { - if ($this->position < count($this->answer['hits'])) { - $this->hit = $this->answer['hits'][$this->position]; - $this->position++; - - return true; - } - - if (isset($this->answer['cursor']) && $this->answer['cursor']) { - $this->position = 0; - - $this->doQuery($this->answer['cursor']); - - continue; - } - - return false; - } while (true); - } - - public function rewind() - { - $this->cursor = null; - $this->position = 0; - } - - /** - * @return int - */ - public function cursor() - { - return $this->answer['cursor']; - } - - /** - * @param int $cursor - * @param array $requestHeaders - */ - private function doQuery($cursor = null, $requestHeaders = array()) - { - if ($cursor !== null) { - $this->params['cursor'] = $cursor; - } - - $this->answer = $this->index->browseFrom($this->query, $this->params, $cursor, $requestHeaders); - } -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Iterators/AlgoliaIterator.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Iterators/AlgoliaIterator.php deleted file mode 100644 index 53dab5858c..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Iterators/AlgoliaIterator.php +++ /dev/null @@ -1,152 +0,0 @@ -index = $index; - $this->hitsPerPage = (int) $hitsPerPage; - } - - /** - * Return the current element - * @return array - */ - public function current() - { - $this->ensureResponseExists(); - $hit = $this->response['hits'][$this->getHitIndexForCurrentPage()]; - - return $this->formatHit($hit); - } - - /** - * Move forward to next element - * @return void Any returned value is ignored. - */ - public function next() - { - $previousPage = $this->getCurrentPage(); - $this->key++; - if($this->getCurrentPage() !== $previousPage) { - // Discard the response if the page has changed. - $this->response = null; - } - } - - /** - * Return the key of the current element - * @return int - */ - public function key() - { - return $this->key; - } - - /** - * Checks if current position is valid. If the current position - * is not valid, we call Algolia' API to load more results - * until it's the last page. - * - * @return boolean The return value will be casted to boolean and then evaluated. - * Returns true on success or false on failure. - */ - public function valid() - { - $this->ensureResponseExists(); - - return isset($this->response['hits'][$this->getHitIndexForCurrentPage()]); - } - - /** - * Rewind the Iterator to the first element - * @return void Any returned value is ignored. - */ - public function rewind() - { - $this->key = 0; - $this->response = null; - } - - /** - * ensureResponseExists is always called prior - * to trying to access the response property. - */ - protected function ensureResponseExists() { - if ($this->response === null) { - $this->fetchCurrentPageResults(); - } - } - - /** - * getCurrentPage returns the current zero based page according to - * the current key and hits per page. - * - * @return int - */ - protected function getCurrentPage() - { - return (int) floor($this->key / ($this->hitsPerPage)); - } - - /** - * getHitIndexForCurrentPage retrieves the index - * of the hit in the current page. - * - * @return int - */ - protected function getHitIndexForCurrentPage() - { - return $this->key - ($this->getCurrentPage() * $this->hitsPerPage); - } - - /** - * Call Algolia' API to get new result batch - */ - abstract protected function fetchCurrentPageResults(); - - /** - * The export method might be is using search internally, this method - * is used to clean the results, like remove the highlight - * - * @param array $hit - * @return array formatted synonym array - */ - abstract protected function formatHit(array $hit); -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Iterators/RuleIterator.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Iterators/RuleIterator.php deleted file mode 100644 index 11b41834de..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Iterators/RuleIterator.php +++ /dev/null @@ -1,39 +0,0 @@ -response = $this->index->searchRules(array( - 'hitsPerPage' => $this->hitsPerPage, - 'page' => $this->getCurrentPage(), - )); - } -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Iterators/SynonymIterator.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Iterators/SynonymIterator.php deleted file mode 100644 index fd5d2b1d52..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Iterators/SynonymIterator.php +++ /dev/null @@ -1,29 +0,0 @@ -response = $this->index->searchSynonyms('', array(), $this->getCurrentPage(), $this->hitsPerPage); - } -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Json.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Json.php deleted file mode 100644 index f86819e325..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/Json.php +++ /dev/null @@ -1,58 +0,0 @@ -context = $context; - $this->client = $client; - } - - /** - * @param string $query - * @param array|null $args - * - * @return mixed - * - * @throws AlgoliaException - */ - public function search($query, $args = null) - { - if ($args === null) { - $args = array(); - } - $args['query'] = $query; - - return $this->client->request( - $this->context, - 'POST', - '/1/places/query', - array(), - array('params' => $this->client->buildQuery($args)), - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->searchTimeout - ); - } - - /** - * @param mixed $objectID - * - * @return mixed - * - * @throws AlgoliaException - */ - public function getObject($objectID) - { - return $this->client->request( - $this->context, - 'GET', - '/1/places/' . urlencode($objectID), - null, - null, - $this->context->readHostsArray, - $this->context->connectTimeout, - $this->context->searchTimeout - ); - } - - /** - * @param string $key - * @param string $value - */ - public function setExtraHeader($key, $value) - { - $this->context->setExtraHeader($key, $value); - } - - /** - * @return ClientContext - */ - public function getContext() - { - return $this->context; - } -} diff --git a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/SynonymType.php b/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/SynonymType.php deleted file mode 100644 index 8657203d11..0000000000 --- a/site/plugins/algolia/vendor/algolia/algoliasearch-client-php/src/AlgoliaSearch/SynonymType.php +++ /dev/null @@ -1,37 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - - private $classMapAuthoritative = false; - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 - if ('\\' == $class[0]) { - $class = substr($class, 1); - } - - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative) { - return false; - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if ($file === null && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if ($file === null) { - // Remember that this class does not exist. - return $this->classMap[$class] = false; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { - if (0 === strpos($class, $prefix)) { - foreach ($this->prefixDirsPsr4[$prefix] as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/site/plugins/algolia/vendor/composer/LICENSE b/site/plugins/algolia/vendor/composer/LICENSE deleted file mode 100644 index 1a28124886..0000000000 --- a/site/plugins/algolia/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) 2016 Nils Adermann, Jordi Boggiano - -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/site/plugins/algolia/vendor/composer/autoload_classmap.php b/site/plugins/algolia/vendor/composer/autoload_classmap.php deleted file mode 100644 index 7a91153b0d..0000000000 --- a/site/plugins/algolia/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,9 +0,0 @@ - array($vendorDir . '/algolia/algoliasearch-client-php/src'), -); diff --git a/site/plugins/algolia/vendor/composer/autoload_psr4.php b/site/plugins/algolia/vendor/composer/autoload_psr4.php deleted file mode 100644 index 7689cd8bf1..0000000000 --- a/site/plugins/algolia/vendor/composer/autoload_psr4.php +++ /dev/null @@ -1,10 +0,0 @@ - array($baseDir . '/src'), -); diff --git a/site/plugins/algolia/vendor/composer/autoload_real.php b/site/plugins/algolia/vendor/composer/autoload_real.php deleted file mode 100644 index 2ee8bb420c..0000000000 --- a/site/plugins/algolia/vendor/composer/autoload_real.php +++ /dev/null @@ -1,52 +0,0 @@ -= 50600 && !defined('HHVM_VERSION'); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInitcfdce6807f6063d1d6a6325cde18aba0::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - return $loader; - } -} diff --git a/site/plugins/algolia/vendor/composer/autoload_static.php b/site/plugins/algolia/vendor/composer/autoload_static.php deleted file mode 100644 index 2e0fc5948e..0000000000 --- a/site/plugins/algolia/vendor/composer/autoload_static.php +++ /dev/null @@ -1,42 +0,0 @@ - - array ( - 'Kirby\\Algolia\\' => 14, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'Kirby\\Algolia\\' => - array ( - 0 => __DIR__ . '/../..' . '/src', - ), - ); - - public static $prefixesPsr0 = array ( - 'A' => - array ( - 'AlgoliaSearch' => - array ( - 0 => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src', - ), - ), - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInitcfdce6807f6063d1d6a6325cde18aba0::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInitcfdce6807f6063d1d6a6325cde18aba0::$prefixDirsPsr4; - $loader->prefixesPsr0 = ComposerStaticInitcfdce6807f6063d1d6a6325cde18aba0::$prefixesPsr0; - - }, null, ClassLoader::class); - } -} diff --git a/site/plugins/algolia/vendor/composer/installed.json b/site/plugins/algolia/vendor/composer/installed.json deleted file mode 100644 index e1421da442..0000000000 --- a/site/plugins/algolia/vendor/composer/installed.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "name": "algolia/algoliasearch-client-php", - "version": "1.25.1", - "version_normalized": "1.25.1.0", - "source": { - "type": "git", - "url": "https://github.com/algolia/algoliasearch-client-php.git", - "reference": "805021ea52630756d2da01d482309a2fdc47d3c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/algolia/algoliasearch-client-php/zipball/805021ea52630756d2da01d482309a2fdc47d3c0", - "reference": "805021ea52630756d2da01d482309a2fdc47d3c0", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4", - "satooshi/php-coveralls": "^1.0" - }, - "time": "2018-03-02 13:24:10", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "AlgoliaSearch": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Algolia Team", - "email": "contact@algolia.com" - }, - { - "name": "Ryan T. Catlin", - "email": "ryan.catlin@gmail.com" - }, - { - "name": "Jonathan H. Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Algolia Search API Client for PHP", - "homepage": "https://github.com/algolia/algoliasearch-client-php" - } -] diff --git a/site/plugins/backstop/index.php b/site/plugins/backstop/index.php deleted file mode 100644 index 84149108a3..0000000000 --- a/site/plugins/backstop/index.php +++ /dev/null @@ -1,67 +0,0 @@ - [ - [ - 'pattern' => 'backstop-scenarios', - 'action' => function() use ($backstop_urlmap) { - - $scenarios = []; - - - $root = dirname(realpath('.')); // go one level up from `index.php` in public folder - $defaultConfig = $root . '/config.default.json'; - $userConfig = $root . '/config.json'; - - $config = json_decode(file_get_contents($defaultConfig), true); - if (file_exists($userConfig)) { - $config = array_merge($config, json_decode(file_get_contents($userConfig), true)); - } - - foreach ($backstop_urlmap as $scenario) { - $scenarios[] = [ - 'label' => ($page = page($scenario)) ? $page->title()->value() : $scenario, - 'url' => "http://{$config['host']}/{$scenario}", - ]; - } - - return Response::json([ - 'scenarios' => $scenarios - ]); - }, - ] - ], -]); diff --git a/site/plugins/cachebuster/index.php b/site/plugins/cachebuster/index.php deleted file mode 100644 index 676f08c63e..0000000000 --- a/site/plugins/cachebuster/index.php +++ /dev/null @@ -1,58 +0,0 @@ -roots()->assets() . '/mix-manifest.json'; - - if (file_exists($manifestFile)) { - static::$manifest = json_decode(file_get_contents($manifestFile), true); - } else { - static::$manifest = []; - } - } - - $key = preg_replace('/^\/?assets(\/.*)$/', '$1', $path); - - if (isset(static::$manifest[$key]) && preg_match('/\?id=([a-z0-9]+)$/', static::$manifest[$key], $matches)) { - return substr($matches[1], 0, 8); // only use first 8 chars of hash, that should be enough to be somewhat save - } - - // Fallback to modified time of assets file, if it - // has no entry in the manifest file or the entry - // has no hash. - return dechex(filemtime($root)); - } - - public static function path(string $path): string - { - if (strpos($path, url()) === 0) { - $path = ltrim(substr($path, strlen(url())), '/'); - } - - $kirby = App::instance(); - $root = $kirby->roots()->index() . '/' . $path; - - if (file_exists($root)) { - - $version = static::version($root, $path); - - if (option('cachebuster.mode') === 'path') { - $path = dirname($path) . '/' . F::name($path) . '.' . $version . '.' . F::extension($path); - } else { - $path = $path . '?v=' . $version; - } - } - - return $path; - } - -} diff --git a/site/plugins/cdn/helpers.php b/site/plugins/cdn/helpers.php new file mode 100644 index 0000000000..f85947adb5 --- /dev/null +++ b/site/plugins/cdn/helpers.php @@ -0,0 +1,36 @@ +mediaUrl(); + } + + $path = Url::path($file); + return option('cdn.domain') . '/' . $path . $query; +} diff --git a/site/plugins/cdn/index.php b/site/plugins/cdn/index.php new file mode 100644 index 0000000000..a34d3c9fe0 --- /dev/null +++ b/site/plugins/cdn/index.php @@ -0,0 +1,70 @@ + __DIR__ . '/src/Cachebuster.php' +]); + +use Kirby\Cdn\Cachebuster; +use Kirby\Cms\App; +use Kirby\Cms\FileVersion; + +Kirby::plugin('getkirby/cdn', [ + 'components' => [ + 'file::url' => function (App $kirby, $file): string { + + static $original; + + if ($file->type() === 'image') { + return cdn($file); + } + + if ($original === null) { + $original = $kirby->nativeComponent('file::url'); + } + + return $original($kirby, $file); + }, + 'file::version' => function (App $kirby, $file, $options) { + + static $original; + + if (option('cdn', false) !== false) { + $url = cdn($file, $options); + + return new FileVersion([ + 'modifications' => $options, + 'original' => $file, + 'root' => $file->root(), + 'url' => $url, + ]); + } + + if ($original === null) { + $original = $kirby->nativeComponent('file::version'); + } + + return $original($kirby, $file, $options); + }, + 'url' => function (App $kirby, $path, $options): string { + + static $original; + + if (preg_match('!assets!', $path)) { + $path = Cachebuster::path($path); + + if (option('cdn', false) !== false) { + return option('cdn.domain') . '/' . $path; + } + } + + if ($original === null) { + $original = $kirby->nativeComponent('url'); + } + + return $original($kirby, $path, $options); + }, + ] + +]); \ No newline at end of file diff --git a/site/plugins/cdn/src/Cachebuster.php b/site/plugins/cdn/src/Cachebuster.php new file mode 100644 index 0000000000..5d5dc584d5 --- /dev/null +++ b/site/plugins/cdn/src/Cachebuster.php @@ -0,0 +1,31 @@ +root('index') . '/' . $path; + + if (file_exists($root)) { + $version = static::version($root, $path); + $path = $path . '?v=' . $version; + } + + return $path; + } + +} diff --git a/site/plugins/columns/index.php b/site/plugins/columns/index.php deleted file mode 100755 index 76c37c857c..0000000000 --- a/site/plugins/columns/index.php +++ /dev/null @@ -1,26 +0,0 @@ - [ - 'kirbytags:before' => function ($text, array $data = []) { - - $text = preg_replace_callback('!\(columns(…|\.{3})\)(.*?)\((…|\.{3})columns\)!is', function ($matches) use ($data) { - - $columns = preg_split('!(\n|\r\n)\+{4}\s+(\n|\r\n)!', $matches[2]); - $html = []; - - foreach($columns as $column) { - $html[] = '
' . $this->kirbytext($column, $data) . '
'; - } - - return '
' . implode($html) . '
'; - - }, $text); - - return $text; - - }, - ] -]); diff --git a/site/plugins/compressor/index.php b/site/plugins/compressor/index.php deleted file mode 100644 index 9872888086..0000000000 --- a/site/plugins/compressor/index.php +++ /dev/null @@ -1,40 +0,0 @@ -[^\S ]+/s', - '/[^\S ]+\', - '<', - '\\1' - ]; - - if (preg_match("/\/i", $html)) { - $html = preg_replace($search, $replace, $html); - } - - $html .= PHP_EOL . ''; - $value['html'] = $html; - - parent::set($key, $value, $minutes); - - } - -} - -Kirby::plugin('getkirby/compressor', [ - 'cacheTypes' => [ - 'compressor' => CompressorCache::class - ] -]); diff --git a/site/plugins/keycdn/index.php b/site/plugins/keycdn/index.php deleted file mode 100644 index 87f8a45178..0000000000 --- a/site/plugins/keycdn/index.php +++ /dev/null @@ -1,95 +0,0 @@ -mediaUrl(); - } - - $path = Url::path($file); - return option('keycdn.domain') . '/' . $path . $query; -} - - -Kirby::plugin('getkirby/keycdn', [ - 'components' => [ - 'url' => function (App $kirby, $path, $options): string { - - static $original; - - if (preg_match('!assets!', $path)) { - $path = Cachebuster::path($path); - - if (option('keycdn', false) !== false) { - return option('keycdn.domain') . '/' . $path; - } - } - - if ($original === null) { - $original = $kirby->nativeComponent('url'); - } - - return $original($kirby, $path, $options); - }, - 'file::version' => function (App $kirby, $file, $options) { - - static $original; - - if (option('keycdn', false) !== false) { - $url = keycdn($file, $options); - - return new FileVersion([ - 'modifications' => $options, - 'original' => $file, - 'root' => $file->root(), - 'url' => $url, - ]); - } - - if ($original === null) { - $original = $kirby->nativeComponent('file::version'); - } - - return $original($kirby, $file, $options); - }, - 'file::url' => function (App $kirby, $file): string { - - static $original; - - if ($file->type() === 'image') { - return keycdn($file); - } - - if ($original === null) { - $original = $kirby->nativeComponent('file::url'); - } - - return $original($kirby, $file); - } - ] -]); diff --git a/site/plugins/layout/helpers.php b/site/plugins/layout/helpers.php new file mode 100755 index 0000000000..402c7ff66c --- /dev/null +++ b/site/plugins/layout/helpers.php @@ -0,0 +1,21 @@ + __DIR__ . '/src/Layout.php', + 'kirby\\layout\\slots' => __DIR__ . '/src/Slots.php', + 'kirby\\layout\\template' => __DIR__ . '/src/Template.php', +]); + +Kirby::plugin('getkirby/layout', [ + 'components' => [ + 'template' => function (Kirby $kirby, string $name, string $type = 'html', string $defaultType = 'html') { + return new Kirby\Layout\Template($name, $type, $defaultType); + }, + ] +]); diff --git a/site/plugins/layout/src/Layout.php b/site/plugins/layout/src/Layout.php new file mode 100755 index 0000000000..5c5d7e4082 --- /dev/null +++ b/site/plugins/layout/src/Layout.php @@ -0,0 +1,26 @@ +data = array_merge($kirby->data, Layout::$data); + } + + static public function render(array $data = []): string + { + Slots::render(); + return Tpl::load(kirby()->root('site') . '/layouts/' . static::$name . '.php', $data); + } +} diff --git a/site/plugins/layout/src/Slots.php b/site/plugins/layout/src/Slots.php new file mode 100755 index 0000000000..5917384ee2 --- /dev/null +++ b/site/plugins/layout/src/Slots.php @@ -0,0 +1,44 @@ + $name, + 'content' => null, + ]; + } + + static public function end() + { + $slotName = array_pop(static::$started); + $content = ob_get_contents(); + ob_end_clean(); + + if (static::$render === true) { + echo static::$slots[$slotName]['content'] ?? $content; + } else { + static::$slots[$slotName]['content'] = $content; + } + } +} diff --git a/site/plugins/layout/src/Template.php b/site/plugins/layout/src/Template.php new file mode 100755 index 0000000000..5cff8d1108 --- /dev/null +++ b/site/plugins/layout/src/Template.php @@ -0,0 +1,32 @@ +file(), $data); + + if (Layout::$name === null) { + return $template; + } + + // set the default content slot if no slots exist + if (empty(Slots::$slots) === true) { + Slots::$slots['content'] = [ + 'name' => 'content', + 'content' => $template + ]; + } + + return Layout::render($data); + } +} diff --git a/site/plugins/maki/components.php b/site/plugins/maki/components.php deleted file mode 100755 index 3349a59e9a..0000000000 --- a/site/plugins/maki/components.php +++ /dev/null @@ -1,11 +0,0 @@ - function (Kirby $kirby, string $text = null) { - static $maki; - - $maki = $maki ?? new Kirby\Maki\Maki(); - - return @$maki->text($text); - } -]; diff --git a/site/plugins/maki/composer.json b/site/plugins/maki/composer.json deleted file mode 100644 index 995301123c..0000000000 --- a/site/plugins/maki/composer.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "kirby/maki", - "autoload": { - "psr-4": { - "Kirby\\Maki\\": "src/" - } - }, - "require": {} -} diff --git a/site/plugins/maki/hooks.php b/site/plugins/maki/hooks.php deleted file mode 100755 index 2190105bb4..0000000000 --- a/site/plugins/maki/hooks.php +++ /dev/null @@ -1,82 +0,0 @@ - [ - - // BOXES - function (string $text = null, array $data = []) { - return preg_replace_callback('!<(warning|info)>(.*)<\/(warning|info)>!siU', function (array $matches) use ($data) { - - // box type - $type = $matches[1]; - - // icon - $icon = icon($type, true, ['aria-hidden' => 'true']); - - // title - $title = ucfirst($type); - $header = Html::p(['' . $title . ':'], [ - 'id' => $id = uniqid(), - 'class' => 'screen-reader-text' - ]); - - // content - $text = $this->kirbytext($matches[2], $data); - - return Html::aside([$icon, $header, $text], [ - 'class' => $type, - 'aria-labelledby' => $id - ]); - }, $text); - }, - - ], - - // Look for tags that contain type definitions, such as - // string or `string`and colorize them. If inline - // code contains a class name, also add a link to the class in - // the reference. - 'kirbytags:after' => function(string $text = null, array $data = []) { - - // $text = preg_replace_callback('!(.*)!siU', function($match) { - // return formatDatatype($match[1]); - // }, $text); - - // Now handled by the Maki plugin. - // $text = preg_replace_callback('!`([a-z_]+)`!iU', function($match) { - // return formatDatatype($match[1]); - // }, $text); - - return $text; - }, - 'kirbytags:after' => function(string $text = null, array $data = []) { - - // SINCE - return preg_replace_callback('!(.*)!siU', function($match) use ($data) { - // Prepare comparison to current version - $versions = explode('.', $match[1]); - $current = explode('.', $this->version()); - - $block = '
'; - $block .= 'Since ' . version($match[1], '%s') . ''; - $block .= $this->kirbytext($match[2], $data); - $block .= '
'; - - return $block; - - }, $text); - - } -]; diff --git a/site/plugins/maki/index.php b/site/plugins/maki/index.php deleted file mode 100644 index c4c174cf7e..0000000000 --- a/site/plugins/maki/index.php +++ /dev/null @@ -1,9 +0,0 @@ - include __DIR__ . '/components.php', - 'hooks' => include __DIR__ . '/hooks.php', - 'tags' => include __DIR__ . '/tags.php', -]); diff --git a/site/plugins/maki/src/FileSystem.php b/site/plugins/maki/src/FileSystem.php deleted file mode 100644 index 0b921964c8..0000000000 --- a/site/plugins/maki/src/FileSystem.php +++ /dev/null @@ -1,183 +0,0 @@ - '/^gulpfile.js$/i', - 'readme' => '/^(readme|license)\.?/i', - 'javascript' => ['js'], - 'css' => ['css'], - 'html' => ['html', 'htm', 'xhtml'], - 'font' => ['woff', 'woff2', 'ttf', 'otf', 'eot'], - 'code' => ['json'], - 'yaml' => ['yaml'], - 'markdown' => ['md', 'mdown', 'markdown'], - 'git' => ['git', 'gitattributes', 'gitignore', 'gitmodules'], - 'php' => ['php'], - 'yaml' => ['yml'], - 'text' => ['txt'], - ]; - - protected static function getIcon($icon): string - { - return icon($icon, true); - } - - protected static function getIconByFilename($filename): string - { - - $extension = F::extension($filename); - $icon = F::type($filename); - - foreach (static::$types as $type => $extensions) { - if ((is_string($extensions) && preg_match($extensions, $filename)) || (is_array($extensions) && in_array($extension, $extensions))) { - $icon = $type; - break; - } - } - - return static::getIcon($icon ?? 'file'); - } - - public static function parse($text): string - { - return static::renderBlock(static::parseBlock($text)); - } - - // Source: http://stackoverflow.com/a/8882181 - protected static function parseBlock($text): array - { - - $indentation = ' '; - - $result = []; - $path = []; - - foreach (explode("\n", $text) as $line) { - // get depth and label - $depth = 0; - - while (substr($line, 0, strlen($indentation)) === $indentation) { - $depth += 1; - $line = substr($line, strlen($indentation)); - } - - // truncate path if needed - while ($depth < sizeof($path)) { - array_pop($path); - } - - // keep label (at depth) - $path[$depth] = $line; - - // traverse path and add label to result - $parent =& $result; - - foreach ($path as $depth => $key) { - if (!isset($parent[$key])) { - $parent[$line] = array(); - break; - } - - $parent =& $parent[$key]; - } - } - - // return - return $result; - } - - protected static function renderBlock($files): string - { - $html = ''; - $html .= '
    '; - - foreach ($files as $filename => $children) { - - $hasChildren = count($children) > 0; - $isFolder = Str::endsWith($filename, '/'); - - if ($isFolder) { - $icon = $hasChildren ? 'folder-expanded' : 'folder-collapsed'; - $icon = static::getIcon($icon); - $filename = preg_replace('/\/$/', '', $filename); - } elseif(in_array($filename, ['...', '…'])) { - $icon = ''; - } else { - $icon = static::getIconByFilename($filename); - } - - $class = []; - - if (empty($icon)) { - $class[] = 'has-no-icon'; - } - - if ($hasChildren) { - $class[] = 'has-children'; - } - - $html .= ' 0) ? ' class="' . implode(' ', $class) . '"' : '') . '>'; - $html .= "{$icon}{$filename}"; - - if ($hasChildren) { - $html .= static::renderBlock($children); - } - - $html .= ''; - } - - $html .= '
'; - - return $html; - - } - -} - -// ```filesystem -// content/ -// 1-projects/ -// project-a/ -// .git -// .gitattributes -// archive.zip -// css.css -// file.unknown -// font.eot -// font.otf -// font.ttf -// font.woff -// font.woff2 -// gulpfile.js -// html.html -// image-1.jpg -// image-2.jpg -// image-3.jpg -// js.js -// json.json -// markdown.md -// markdown.mdown -// php.php -// project-data.xls -// project-info.pdf -// project.txt -// readme.md -// LICENSE -// some-audio.mp3 -// some-video.mp4 -// xml.xml -// yaml.yml -// project-b/ -// ... -// 2-about/ -// ``` diff --git a/site/plugins/maki/src/Glossary.php b/site/plugins/maki/src/Glossary.php deleted file mode 100644 index 1d1e274fc9..0000000000 --- a/site/plugins/maki/src/Glossary.php +++ /dev/null @@ -1,38 +0,0 @@ -entry()->value(function ($value) { - return str_replace('(glossary:', '(glossary-nested:', $value); - })->kt(); - } - - public static function entry(string $term) - { - return page('docs/glossary/' . $term); - } - - public static function missingTerm(string $term): string - { - return Html::span('⚠️ Glossary term “' . $term .'” not found.', [ - 'style' => 'background: rgba(255,0,0,.05); color: red; padding: 0 .25em', - ]); - } - - public static function url($entry) - { - return $entry->parent()->url() . '/#' . $entry->slug(); - } - -} - diff --git a/site/plugins/maki/src/Maki.php b/site/plugins/maki/src/Maki.php deleted file mode 100644 index a2e94d6cee..0000000000 --- a/site/plugins/maki/src/Maki.php +++ /dev/null @@ -1,184 +0,0 @@ -setBreaksEnabled(true); - } - - /** - * An extended version of Parsedown’s codeblock handler, - * offering the possibility of adding a caption (e.g. filename) - * to codeblocks. - */ - protected function blockFencedCode($Line) - { - $marker = $Line['text'][0]; - - // Match opener - - $openerLength = strspn($Line['text'], $marker); - - if ($openerLength < 3) - { - return; - } - - $infostring = trim(str_replace("\t", ' ', substr($Line['text'], $openerLength)), ' '); - - if (strpos($infostring, ' ') === false && strpos($infostring, '`') !== false) - { - // abort parsing of block, if code block does not - // have a caption, but language string contains - // a backtick to match the behavior of vanilla - // Parsedown. - return; - } - - $infostring = explode(' ', $infostring, 2); - $language = $infostring[0]; - - if(sizeof($infostring) === 2) { - // Block with caption - $caption = $infostring[1]; - - $openChar = $caption[0]; - - if($openChar === '"' || $openChar === '"') { - $captionLength = strlen($caption); - $lastChar = $caption[$captionLenght - 1]; - - if($lastChar === $openChar) { - // Remove quotes surrounding caption - $caption = substr($caption, 1, $captionLength - 2); - } - } else { - // If caption was not wrapped in quotes, - // just drop it. - $caption = ''; - } - } else { - // Block without caption - $caption = ''; - } - - // Compose the code block - - $Element = [ - 'name' => 'code', - 'text' => '', - ]; - - if ($language !== '') { - $Element['attributes'] = [ - 'class' => "language-{$language}" - ]; - } - - - $Block = [ - 'char' => $marker, - 'caption' => $caption, - 'openerLength' => $openerLength, - 'language' => $language, - 'element' => [ - 'name' => 'pre', - 'element' => $Element, - 'attributes' => [ - 'class' => 'code', - ], - // 'handler' => 'element', - ], - ]; - - return $Block; - } - - /** - * Extended version of the final block handler, which - * adds support for filysystem code blocks, which - */ - protected function blockFencedCodeComplete($Block) - { - switch ($Block['language']) { - case 'filesystem': - $Block['element'] = [ - 'name' => !empty($Block['caption']) ? 'div' : 'figure', - 'attributes' => ['class' => 'filesystem'], - 'rawHtml' => FileSystem::parse($Block['element']['element']['text']), - ]; - break; - case 'kirbycontent': - $Block['element']['element']['text'] = KirbyContent::parse($Block['element']['element']['text']); - break; - default: - $text = $Block['element']['element']['text']; - $text = str_replace(['(', ')', '(\\'], ['(', ')', '('], $text); - $Block['element']['element']['text'] = trim($text); - } - - if($Block['language'] !== 'filesystem' && !empty($Block['caption'])) { - - $Block['element'] = [ - 'name' => 'figure', - 'attributes' => [ - 'class' => 'codeblock-figure', - ], - 'element' => [ - 'elements' => [ - [ - 'name' => 'figcaption', - 'text' => htmlspecialchars($Block['caption']), - ], - $Block['element'], - ], - ], - ]; - } - - return $Block; - } - - protected function blockTable($Line, array $Block = null) - { - $Block = parent::blockTable($Line, $Block); - - return $Block; - } - - protected function blockTableComplete($Block) - { - $Block = [ - 'element' => [ - 'name' => 'div', - 'attributes' => [ - 'class' => 'table-wrap', - ], - 'elements' => [$Block['element']], - ], - ]; - - return $Block; - } - - // Highlight data types in inline code - protected function inlineCode($Excerpt) - { - $Excerpt = parent::inlineCode($Excerpt); - - if ($Excerpt !== null) { - return array_merge($Excerpt, [ - 'element' => [ - 'rawHtml' => formatDatatype(htmlspecialchars($Excerpt['element']['text'])), - ], - ]); - } - } -} diff --git a/site/plugins/maki/tags.php b/site/plugins/maki/tags.php deleted file mode 100755 index ae59677d96..0000000000 --- a/site/plugins/maki/tags.php +++ /dev/null @@ -1,373 +0,0 @@ - $prop) { - - if ($attr === 'value') { - continue; - } - - if (is_callable($prop) === false) { - continue; - } - - $reflection = new ReflectionFunction($prop); - $parameter = $reflection->getParameters()[0] ?? null; - $comment = null; - - try { - $default = $parameter->getDefaultValue(); - } catch (Exception $e) { - $default = null; - } - - if ($docComment = $reflection->getDocComment()) { - try { - $docBlock = new DocBlock($docComment); - $comment = trim($docBlock->getSummary()); - $comment = str_replace(PHP_EOL, ' ', $excerpt); - - if ($comment === '/') { - $comment = null; - } - - } catch (Throwable $e) { - - } - } - - if (is_array($default) === true) { - $default = '[]'; - } - - if ($default === true) { - $default = 'true'; - } - - if ($default === false) { - $default = 'false'; - } - - $table[$attr] = [ - 'prop' => $attr, - 'required' => $parameter->isOptional() !== true, - 'type' => $parameter->getType() ? $parameter->getType()->getName() : null, - 'default' => $default, - 'comment' => $comment, - ]; - - } - - ksort($table); - - return $table; - -} - -return [ - - // API FIELDS TABLE - 'api-fields' => [ - 'html' => function ($tag) { - $fields = array_keys($tag->kirby()->api()->models()[$tag->value]['fields'] ?? []); - - if (empty($fields) === true) { - return ''; - } - - $fields = array_map(function ($field) { - return '`' . $field . '`'; - }, $fields); - - return '- ' . implode(PHP_EOL . '- ', $fields); - } - ], - - // ARROW LINK - 'arrow-link' => [ - 'attr' => [ - 'text', - 'direction', - ], - 'html' => function ($tag) { - return snippet('arrow-link', [ - 'link' => $tag->value, - 'text' => $tag->text, - 'direction' => $tag->direction, - ], true); - } - ], - - // CTA - 'cta' => [ - 'attr' => [ - 'text', - 'icon' - ], - 'html' => function ($tag) { - return snippet('cta', [ - 'link' => $tag->value, - 'text' => $tag->text, - 'icon' => $tag->icon - ], true); - } - ], - - // CHEATSHEET SECTION IMPORT - 'reference' => [ - 'html' => function ($tag) { - if ($page = page('docs/reference/' . $tag->value())) { - return snippet('cheatsheet', ['methods' => $page->children()->listed()], true); - } - } - ], - - // DOCS - 'docs' => [ - 'attr' => [ - 'field' - ], - 'html' => function ($tag) { - - $snippet = snippet('docs/' . $tag->value, [ - 'page' => $tag->parent(), - 'field' => $tag->attr('field') - ], true); - - return kirbytext($snippet); - } - ], - - // FIELD OPTIONS TABLE - 'field-options' => [ - 'html' => function ($tag) { - - $type = $tag->value; - $definition = Field::setup($type); - $props = $definition['props'] ?? []; - $table = componentOptions($props); - - return snippet('field-options', ['rows' => $table], true); - - } - ], - - // GLOSSARY - 'glossary' => [ - 'attr' => [ - 'text' - ], - 'html' => function ($tag) { - - if ($entry = Glossary::entry($tag->value)) { - - $content = Glossary::content($entry); - $headline = Html::a(Glossary::url($entry), $entry->title()); - $tooltip = Html::div([$headline], ['class' => 'bold -mb:small']) . $content; - - return Html::span($tag->text ?? $entry->title(), ['data-tooltip' => $tooltip]); - } - - return Glossary::missingTerm($tag->value); - - } - ], - - // NESTED GLOSSARY - 'glossary-nested' => [ - 'attr' => [ - 'text', - ], - 'html' => function ($tag) { - if ($entry = Glossary::entry($tag->value)) { - return Html::a(Glossary::url($entry), $tag->text ?? $entry->title()); - } - - return Glossary::missingTerm($tag->value); - } - ], - - // PAGES GRID - 'pages' => [ - 'html' => function ($tag) { - $pages = Str::query($tag->value, [ - 'page' => $tag->parent(), - 'site' => site(), - ]); - - return snippet('pages', ['pages' => $pages], true); - } - ], - - // CUSTOM IMAGES - 'picture' => [ - 'attr' => [ - 'alt', - 'caption', - 'class', - 'height', - 'imgclass', - 'link', - 'linkclass', - 'rel', - 'size', - 'target', - 'text', - 'title', - 'width' - ], - 'html' => function ($tag) { - - if ($tag->file = $tag->file($tag->value)) { - $tag->src = $tag->file->url(); - $tag->alt = $tag->alt ?? $tag->file->alt()->or(' ')->value(); - $tag->title = $tag->title ?? $tag->file->title()->value(); - $tag->caption = $tag->caption ?? $tag->file->caption()->value(); - $tag->ratio = rtrim(rtrim(number_format($tag->file->height() / $tag->file->width() * 100, 10, '.', ''), '0'), '.'); - } else { - $tag->src = Url::to($tag->value); - } - - $link = function ($img) { - if (empty($tag->link) === true) { - return $img; - } - - return Html::a($tag->link === 'self' ? $tag->src : $tag->link, [$img], [ - 'rel' => $tag->rel, - 'class' => trim('link-reset ' . $tag->linkclass), - 'target' => $tag->target - ]); - }; - - $image = Html::img($tag->src, [ - 'width' => $tag->width, - 'height' => $tag->height, - 'class' => $tag->imgclass, - 'title' => $tag->title, - 'alt' => $tag->alt ?? ' ' - ]); - - if ($tag->file) { - $placeholder = Html::span('', [ - 'class' => 'img-ratio-placeholder', - 'style' => "padding-top: {$tag->ratio}%;", - ]); - - $wrapperWidth = $tag->width ?? $tag->file->width(); - $wrapperAttr = ['class' => 'img-wrap']; - - if (in_array($tag->size, ['banner', 'large']) === false) { - $wrapperAttr['style'] = "max-width: {$wrapperWidth}px;"; - } - - $image = Html::span([$placeholder, $image], $wrapperAttr); - } - - return Html::figure([ $link($image) ], $tag->caption, [ - 'class' => trim($tag->class . ' figure -size:' . $tag->size) - ]); - } - ], - - // SCREENSHOT - 'screenshot' => [ - 'attr' => [ - 'alt', - 'caption', - 'class', - 'height', - 'imgclass', - 'link', - 'linkclass', - 'rel', - 'device', - 'target', - 'text', - 'title', - 'width' - ], - 'html' => function ($tag) { - - if ($tag->file = $tag->file($tag->value)) { - $tag->src = $tag->file->resize(1200)->url(); - $tag->alt = $tag->alt ?? $tag->file->alt()->or(' ')->value(); - $tag->title = $tag->title ?? $tag->file->title()->value(); - $tag->caption = $tag->caption ?? $tag->file->caption()->value(); - $tag->ratio = rtrim(rtrim(number_format($tag->file->height() / $tag->file->width() * 100, 10, '.', ''), '0'), '.'); - } else { - $tag->src = Url::to($tag->value); - } - - $link = function ($img) { - if (empty($tag->link) === true) { - return $img; - } - - return Html::a($tag->link === 'self' ? $tag->src : $tag->link, [$img], [ - 'rel' => $tag->rel, - 'class' => trim('link-reset ' . $tag->linkclass), - 'target' => $tag->target - ]); - }; - - $image = Html::img($tag->src, [ - 'width' => $tag->width, - 'height' => $tag->height, - 'class' => $tag->imgclass, - 'title' => $tag->title, - 'alt' => $tag->alt ?? ' ' - ]); - - if ($tag->file) { - $placeholder = Html::span('', [ - 'class' => 'img-ratio-placeholder', - 'style' => "padding-top: {$tag->ratio}%;", - ]); - - $wrapperWidth = $tag->width ?? $tag->file->width(); - $wrapperAttr = ['class' => 'img-wrap']; - - $wrapperAttr['style'] = "max-width: {$wrapperWidth}px;"; - - $image = Html::span([$placeholder, $image], $wrapperAttr); - } - - return Html::figure([ $link($image) ], $tag->caption, [ - 'class' => trim($tag->class . 'screenshot ' . $tag->device) - ]); - } - ], - - // SECTION OPTIONS TABLE - 'section-options' => [ - 'html' => function ($tag) { - - $type = $tag->value; - $definition = Section::setup($type); - $props = $definition['props'] ?? []; - $table = componentOptions($props); - - return snippet('field-options', ['rows' => $table], true); - - } - ], - -]; diff --git a/site/plugins/maki/vendor/autoload.php b/site/plugins/maki/vendor/autoload.php deleted file mode 100644 index fd4d3b51d6..0000000000 --- a/site/plugins/maki/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - private $classMapAuthoritative = false; - private $missingClasses = array(); - private $apcuPrefix; - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath.'\\'; - if (isset($this->prefixDirsPsr4[$search])) { - foreach ($this->prefixDirsPsr4[$search] as $dir) { - $length = $this->prefixLengthsPsr4[$first][$search]; - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/site/plugins/maki/vendor/composer/LICENSE b/site/plugins/maki/vendor/composer/LICENSE deleted file mode 100644 index f27399a042..0000000000 --- a/site/plugins/maki/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -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/site/plugins/maki/vendor/composer/autoload_classmap.php b/site/plugins/maki/vendor/composer/autoload_classmap.php deleted file mode 100644 index 7a91153b0d..0000000000 --- a/site/plugins/maki/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,9 +0,0 @@ - array($baseDir . '/src'), -); diff --git a/site/plugins/maki/vendor/composer/autoload_real.php b/site/plugins/maki/vendor/composer/autoload_real.php deleted file mode 100644 index 55a74c04d4..0000000000 --- a/site/plugins/maki/vendor/composer/autoload_real.php +++ /dev/null @@ -1,52 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInit20ea64c7e9650e8e24eef0d43602ec22::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - return $loader; - } -} diff --git a/site/plugins/maki/vendor/composer/autoload_static.php b/site/plugins/maki/vendor/composer/autoload_static.php deleted file mode 100644 index 554afa2152..0000000000 --- a/site/plugins/maki/vendor/composer/autoload_static.php +++ /dev/null @@ -1,31 +0,0 @@ - - array ( - 'Kirby\\Maki\\' => 11, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'Kirby\\Maki\\' => - array ( - 0 => __DIR__ . '/../..' . '/src', - ), - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit20ea64c7e9650e8e24eef0d43602ec22::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit20ea64c7e9650e8e24eef0d43602ec22::$prefixDirsPsr4; - - }, null, ClassLoader::class); - } -} diff --git a/site/plugins/maki/vendor/composer/installed.json b/site/plugins/maki/vendor/composer/installed.json deleted file mode 100644 index fe51488c70..0000000000 --- a/site/plugins/maki/vendor/composer/installed.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/site/plugins/meta/README.md b/site/plugins/meta/README.md index d378388096..08c32a73da 100644 --- a/site/plugins/meta/README.md +++ b/site/plugins/meta/README.md @@ -1,87 +1,131 @@ -# Metadata Plugin for getkirby.com +# Meta plugin for getkirby.com -This plugins handles the generation of meta tags for search engines, social networks, -browsers and beyond. +This plugins handles the generation of meta tags for search engines, social networks, browsers and beyond. ## How it works -The plugin tries looks for metadata from a pages content file (e.g. article.txt) by -the corrsponding key. If the page does not contain the specific field, it looks in -the pagel model, if it provides a `metadata()` method, that returns an array or metadata -fields. If that also fails, it will fall back to default metadata, as stored in the -`site.txt` file at the top-level of the content directory. - -That way, every page will always be able to serve default values, even if the specific -page or its model does not contain information like e.g. a thumbnail or a dedicated -description. +The plugin looks for metadata in a page's content file (e.g. article.txt). If the page does not contain the specific field, it checks if the page model provides a `metadata()` method returning an arraywith corresponding data. If that also fails, it falls back to default metadata stored in the `site.txt`. ## Available keys -**Description:** The description field is used for search engines as a plain meta tag -and additionally added as an OpenGraph meta tag, which is used by social media networks -like e.g. Facebook or Twitter. +**Description:** The description field is used for search engines as a plain meta tag and additionally added as an OpenGraph meta tag, which is used by social media networks like e.g. Facebook or Twitter. -**Thumbnail:** The thumbnail for sharing the page in a social network. If defining a -custom thumbnail for a page, you should make sure to also add a text file containing -an `alt` text for the corresponding image, because it is also used by social networks. +**Thumbnail:** The thumbnail for sharing the page in a social network. See below for all options. -**Twittercard:** Defaults to the value set in `site.txt` and is "summary_large_image" -by default. Set this to "summary", if you don’t want to display a large preview image. +**Twittercard:** Is "summary_large_image" by default. Set this to "summary", if you don’t want to display a large preview image. -**Robots:** Generates the "robots" meta tag, that gives specifix instructions to crawlers. -By default, this tag is not preset, unless a default value is defined in `site.txt`. -Use a value, that you would also use if you wrote the markup directly (e.g. `noindex, nofollow`) +**Robots:** Generates the "robots" meta tag, that gives specifix instructions to crawlers. By default, this tag is not preset, unless a default value is defined in `site.txt`. Use a value, that you would also use if you wrote the markup directly (e.g. `noindex, nofollow`) -**Title and Ogtitle:** By default, the metadata plugin will use the page’s `title` field. You can override this by defining an `ogtitle` field for a specific page. The `ogtitle` will -then be used for OpenGraph metadata instead of the page title. +**Title and Ogtitle:** By default, the metadata plugin will use the page’s `title` field. You can override this by defining an `ogtitle` field for a specific page. The `ogtitle` will then be used for OpenGraph metadata instead of the page title. **Twittersite:** The twitter account, which the site belongs to. **Twittercreator:** The twitter account, who created the current page. -**Priority:** The priority for telling search engines about the importance -of pages of your site. Must be a float value between 0.0 and 1.0. This value will -not fall back to `site.txt`, but rather use 0.5 as default, if not explicit -priority was found in the page’s content or returned by its model. +**Priority:** The priority for telling search engines about the importance of pages of your site. Must be a float value between 0.0 and 1.0. This value will not fall back to `site.txt`, but rather use 0.5 as default. -**Changefreq:** Optional parameter, telling search engines how often a page changes. -Possible values can be found in the (sitemaps protocol specification)[https://www.sitemaps.org/protocol.html]. +**Changefreq:** Tells search engines how often a page changes. Possible values can be found in the (sitemaps protocol specification)[https://www.sitemaps.org/protocol.html]. ## Using page models to automatically generate meta data -You might not want to enter all meta data manually, so page models are your friend. This holds -especially true for pages, where you don’t want to Copy existing fields or where an -excerpt of the actual page content would not be suitable for generating meta data. +Page models can be useful, if you do not want to enter all meta data manually. -The following example adds a `metadata()` method to all Kosmos episodes, that takes -care of generating useful metadata, if a Kosmos issue is shared in a social network and -also provides an automatically generated description for search engines. All keys returned -by the `metadata()` method must be lowercase. Any arry item can be a value of a closure, -that will be called on the `$page` object, so you can use `$this` within the closure to -refer to the current page. +The following example adds a `metadata()` method to all Kosmos episodes, that takes care of generating useful metadata. All keys returned by the `metadata()` method must be lowercase. -You can still override values (e.g. `description`) by adding a descriptiokn field to -an episode’s `issue.txt` file if you want to customize any of these values. +You can still override values (e.g. `description`) by adding a description field to an episode’s `issue.txt` file if you want to customize any of these values. ```php -class IssuePage extends Page +class KosmosIssuePage extends Page { public function metadata(): array { return [ - 'description' => function () { - return 'Read issue no. ' . $this->uid() . ' of our montly newsletter online.'; - }, - 'thumbnail' => function() { - return $this->image(); - }, + 'description' => 'Read issue no. ' . $this->uid() . ' of our montly newsletter online.', 'ogtitle' => 'Kirby Kosmos Episode ' . $this->uid(), ]; } } ``` -## Debug View +## Thumbnail + +This plugin also provides automatic generated thumbnails for e.g. social networks. By default every page gets an automatic thumbnail. You can switch this off: + +``` +Thumbnail: false +``` + +```php +public function metadata(): array +{ + return [ + 'thumbnail' => false + ]; +} +``` + +Another option is to define a custom thumbnail for the page/page model: + +``` +OgImage: assets.png +``` + +```php +public function metadata(): array +{ + return [ + 'ogimage' => $this->image() + ]; +} +``` + +The autogenerated thumbnails have some defaults for the `lead` and `title` text string: + +- `lead`: bradcrumb of parents' page titles. If none, `The CMS` +- `title`: the page's title -You can get an overview of the meta data assigned to pages by visiting . The debug page is only accessible, when Kirby’s `debug` option is set to true. +You can also modiy these per page or page model: + +``` +Thumbnail: + - + lead: Check out our + title: Amazing sale +``` + +```php +public function metadata(): array +{ + return [ + 'thumbnail' => [ + 'lead' => 'Reference / Class', + 'title' => $this->name() + ] + ]; +} +``` + +The autogenerated thumbnail can also optionally include an image: + +``` +Thumbnail: assets.png +``` + +``` +Thumbnail: + - + lead: The CMS + image: assets.png +``` + +```php +public function metadata(): array +{ + return [ + 'thumbnail' => [ + 'image' => $this->image() + ] + ]; +} +``` diff --git a/site/plugins/meta/composer.json b/site/plugins/meta/composer.json deleted file mode 100644 index 0d798b69aa..0000000000 --- a/site/plugins/meta/composer.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "require": { - }, - "autoload": { - "psr-4": { - "Kirby\\Meta\\": "src/" - } - } -} diff --git a/site/plugins/meta/helpers.php b/site/plugins/meta/helpers.php deleted file mode 100644 index 2df156ec58..0000000000 --- a/site/plugins/meta/helpers.php +++ /dev/null @@ -1,7 +0,0 @@ - __DIR__ . '/src/PageMeta.php', + 'kirby\\meta\\sitemeta' => __DIR__ . '/src/SiteMeta.php' +]); Kirby::plugin('kirby/meta', [ - - 'options' => [ - 'templatesInclude' => [], - 'pagesInclude' => [], - 'pagesExclude' => [], - ], - 'routes' => [ - [ - 'pattern' => 'meta-debug', - 'action' => function () { - - if (option('debug') !== true) { - $this->next(); - } - - return Page::factory([ - 'slug' => 'meta-debug', - 'template' => 'meta-debug', - 'model' => 'meta-debug', - 'content' => [ - 'title' => 'Metadata debug', - ], - ]); - }, - ], - [ - 'pattern' => 'meta-check-page', - 'action' => function () { - if (option('debug') !== true) { - $this->next(); - } - - $id = get('id'); - $baseUrl = url(); - - if (empty($id) === null) { - return Response::json("Empty ID parameter.", 500); - } - - if (($p = page($id)) === null) { - return Response::json("The page with $id could not be found.", 500); - } - - // intercept redirects, so the link checker always returns - // a 200 status code. - $handleRedirect = function () use ($baseUrl) { - if (in_array(http_response_code(), [301, 302, 303, 304, 307])) { - $target = ''; - foreach(headers_list() as $header) { - if (Str::contains($header, ':') === false) { - continue; - } - - list($key, $value) = explode(':', $header, 2); - - if (strtolower($key) === 'location') { - $target = str_replace($baseUrl, '', trim($value)); - break; - } - } - - header_remove('location'); - Header::success(); - echo Response::json([ - 'type' => 'redirect', - 'message' => "Links where not checked, because page is a redirect to:\n$target", - ], 200); - } - }; - header_register_callback($handleRedirect); - register_shutdown_function($handleRedirect); - - - $html = $p->render(); - - $brokenLinks = []; - - try { - $doc = new DOMDocument(); - $doc->validateOnParse = true; - libxml_use_internal_errors(true); - $doc->loadHTML($html); - libxml_clear_errors(); - - $elements = iterator_to_array($doc->getElementsByTagName('a')); - - foreach ($elements as $item) { - $href = $item->getAttribute('href'); - - if (empty($href) === true || $href === '#') { - continue; - } - - if (Str::contains($href, '#') === true) { - // anchor link - - list($targetUrl, $targetId) = explode('#', $href); - - if (empty($targetUrl) === true || $targetUrl === $p->url()) { - $targetEl = $doc->getElementById($targetId); - } else { - // only evaluate same-page anchor links for now. - continue; - } - - if ($targetEl === null) { - // broken anchor link - $brokenLinks[] = "Broken anchor link: {$href}"; - } - - continue; - - } else { - - if (Str::startsWith($href, '/')) { - $href = $baseUrl . $href; - } - - if (Str::startsWith($href, $baseUrl) === false) { - // skip external links - continue; - } - - if (Str::contains(pathinfo($href, PATHINFO_BASENAME), '.')) { - // skip links to files - continue; - } - - $id = trim(parse_url($href, PHP_URL_PATH), '/'); - - if (empty($id) === true) { - // skip links to homepage - continue; - } - - if (page($id) === null) { - // target page does not exist - $brokenLinks[] = $id; - } - } - } - } catch (Exception $e) { - return Response::json([ - 'type' => 'page', - 'message' => $e->getMessage(), - ], 500); - } - - return Response::json([ - 'type' => 'page', - 'message' => sizeof($brokenLinks) > 0 ? "This page contains some broken links: \n- " . implode("\n- ", $brokenLinks): null, - 'brokenLinks' => $brokenLinks, - ], 200); - }, - ], [ 'pattern' => 'robots.txt', 'method' => 'ALL', 'action' => function () { - $robots = 'User-agent: *' . PHP_EOL; - $robots .= 'Allow: /' . PHP_EOL; - $robots .= 'Sitemap: ' . url('sitemap.xml'); - - return kirby() - ->response() - ->type('text') - ->body($robots); + return SiteMeta::robots(); }, ], [ 'pattern' => 'sitemap.xml', 'action' => function () { - - $sitemap = []; - $templatesWhitelist = option('kirby.meta.templatesInclude', []); - $pagesWhitelist = option('kirby.meta.pagesInclude', []); - $pagesBlacklist = option('kirby.meta.pagesExclude', []); - - $blacklistPattern = '!^(?:' . implode('|', $pagesBlacklist) . ')$!i'; - - $cache = kirby()->cache('pages'); - $cacheId = 'sitemap.xml'; - - if (!$sitemap = $cache->get($cacheId)) { - - $sitemap[] = ''; - $sitemap[] = ''; - - foreach (site()->index() as $item) { - - if (in_array($item->intendedTemplate()->name(), $templatesWhitelist) === false && in_array($item->id(), $pagesWhitelist) === false) { - continue; - } - - if (preg_match($blacklistPattern, $item->id())) { - continue; - } - - $meta = $item->meta(); - - $sitemap[] = ''; - $sitemap[] = ' ' . Xml::encode($item->url()) . ''; - $sitemap[] = ' ' . number_format($meta->priority(), 1, '.', '') . ''; - - $changefreq = $meta->changefreq(); - if ($changefreq->isNotEmpty()) { - $sitemap[] = ' ' . $changefreq . ''; - } - - $sitemap[] = ''; - } - - $sitemap[] = ''; - $sitemap = implode(PHP_EOL, $sitemap); - - $cache->set($cacheId, $sitemap); - } - - return new Response($sitemap, 'application/xml'); + return SiteMeta::sitemap(); } ], [ 'pattern' => 'open-search.xml', 'action' => function () { - return new Response('' . PHP_EOL . - '' . PHP_EOL . - ' ' . site()->title()->xml() . '' . PHP_EOL . - ' Search the Kirby website and documentation.' . PHP_EOL . - ' UTF-8' . PHP_EOL . - ' ' . url('favicon.ico') . '' . PHP_EOL . - ' ' . (new File(kirby()->root('index') . '/opensearch.png'))->base64() . '' . PHP_EOL . - ' ' . PHP_EOL . - ' ' . PHP_EOL . - ' ' . Xml::encode(url('search')) . '' . PHP_EOL . - '', - 'application/opensearchdescription+xml'); + return SiteMeta::search(); + }, + ], + [ + 'pattern' => '(:all)/opengraph.png', + 'action' => function (string $id) { + return PageMeta::renderThumbnail($id); }, ] ], - 'pageMethods' => [ 'meta' => function () { return new PageMeta($this); }, - ], + 'metaLead' => function ($root = null, $fallback = null) { + $crumbs = $this->parents()->flip(); - 'pageModels' => [ - 'meta-debug' => 'Kirby\\Meta\\Models\\MetaDebugPage', - ], + if ($root !== null) { + $crumbs = $crumbs->not($root->parents()); + } + + $lead = implode(' / ', $crumbs->toArray(function ($p) { + return (string)$p->title(); + })); + + if (empty($lead) === true) { + $lead = $fallback; + } - 'templates' => [ - 'meta-debug' => __DIR__ . '/templates/meta-debug.php', + return $lead; + } ] ]); diff --git a/site/plugins/meta/src/Models/MetaDebugPage.php b/site/plugins/meta/src/Models/MetaDebugPage.php deleted file mode 100644 index 1dd4914d25..0000000000 --- a/site/plugins/meta/src/Models/MetaDebugPage.php +++ /dev/null @@ -1,15 +0,0 @@ - 'noindex, nofollow', - ]; - } -} \ No newline at end of file diff --git a/site/plugins/meta/src/PageMeta.php b/site/plugins/meta/src/PageMeta.php index 68f5135269..c37ae3092b 100644 --- a/site/plugins/meta/src/PageMeta.php +++ b/site/plugins/meta/src/PageMeta.php @@ -1,9 +1,16 @@ page = $page; - if (method_exists($this->page, 'metadata')) { + // Get metadata from page model + if (method_exists($this->page, 'metadata') === true) { $this->metadata = $this->page->metadata(); } } public function __call($name, $arguments) { - $name = strtolower($name); - - $prefix = 'hasown'; - - if (strpos($name, $prefix) === 0) { - return $this->get(substr($name, strlen($prefix)), false)->isNotEmpty(); - } - - return $this->get($name); + return $this->get(strtolower($name)); } - public function get(string $key, bool $fallback = true): Field + public function get(string $key, bool $fallback = false): Field { - $key = strtolower($key); - + // From content file... + $key = strtolower($key); $field = $this->page->content()->get($key); - if ($field->exists()) { + if ($field->exists() === true) { return $field; } + // From page model... if (array_key_exists($key, $this->metadata) === true) { - $value = $this->metadata[$key]; - if (is_callable($value) === true) { - $result = $value->call($this->page); - - if (is_a($result, Kirby\Cms\Field::class)) { - return $result; - } - - return new Field($this->page, $key, $result); - } - - return new Field($this->page, $key, $value); + return new Field($this->page, $key, $this->metadata[$key]); } + // From site as fallback... if ($fallback === true) { - $siteContent = site()->content(); + $fallback = site()->content()->get($key); - if ($siteContent->get($key)->exists()) { - return $siteContent->get($key); + if ($fallback->exists()) { + return $fallback; } } return new Field($this->page, $key, null); } - public function getFile(string $key, bool $fallback = true): ?File - { - $key = strtolower($key); - - $field = $this->page->content()->get($key); - - if ($field->exists() && ($file = $field->toFile())) { - return $file; - } - - if (array_key_exists($key, $this->metadata) === true) { - $value = $this->metadata[$key]; - if (is_callable($value) === true) { - $value = $value->call($this->page); - } - - if (is_a($value, File::class) === true) { - return $value; - } - - if (is_a($value, Field::class) === true) { - return $value->toFile(); - } - - if (is_string($value) === true) { - return $this->page->file($value); - } - } - - if ($fallback === true) { - return site()->content()->get($key)->toFile(); - } - - return null; - } - - public function hasOwnThumbnail(): bool - { - return $this->getFile('thumbnail', false) !== null; - } - public function jsonld(): string { $html = []; - $json = [ '@context' => 'https://schema.org', '@graph' => [ @@ -123,7 +72,7 @@ public function jsonld(): string '@type' => 'Organization', 'name' => 'Kirby', 'url' => url(), - 'logo' => url('kirby-signet.svg'), + 'logo' => url('/assets/images/kirby-signet.svg'), 'sameAs' => [ 'https://twitter.com/getkirby', 'https://instagram.com/getkirby', @@ -143,39 +92,29 @@ public function jsonld(): string ], ]; - $html[] = ''; - - return implode(PHP_EOL, $html) . PHP_EOL; + return Tpl::load(__DIR__ . '/templates/json.php', compact('json')); } public function opensearch(): string { return Html::tag('link', null, [ - 'rel' => 'search', - 'type' => 'application/opensearchdescription+xml', + 'rel' => 'search', + 'type' => 'application/opensearchdescription+xml', 'title' => site()->title(), - 'href' => url('open-search.xml'), + 'href' => url('/open-search.xml'), ]) . PHP_EOL; } public function priority(): float { - $priority = $this->get('priority', false)->value(); - - if (empty($priority) === true) { - $priority = 0.5; - } - - return (float) min(1, max(0, $priority)); + $priority = $this->get('priority')->or(0.5); + return (float)min(1, max(0, $priority)); } public function robots(): string { - $html = []; - - $robots = $this->get('robots'); + $html = []; + $robots = $this->get('robots', true); if ($robots->isNotEmpty()) { $html[] = Html::tag('meta', null, [ @@ -196,76 +135,268 @@ public function social(): string { $html = []; $meta = []; - $opengraph = []; + $og = []; $site = site(); // Basic OpenGraph tags - $opengraph['og:site_name'] = $site->title()->value(); - $opengraph['og:url'] = $this->page->url(); - $opengraph['og:type'] = 'website'; - - - $opengraph['og:title'] = $this->get('ogtitle')->or($this->page->title()); + $og['og:site_name'] = $site->title()->value(); + $og['og:url'] = $this->page->url(); + $og['og:type'] = 'website'; + $og['og:title'] = $this->get('ogtitle')->or($this->page->title()); // Meta and OpenGraph description - $description = $this->get('description'); - + $description = $this->get('description', true); if ($description->isNotEmpty()) { - $opengraph['og:description'] = $description->excerpt(200); - $meta['description'] = $description->excerpt(160); + $og['og:description'] = $description->excerpt(200); + $meta['description'] = $description->excerpt(160); } - $twitterCard = $this->get('twittercard'); + $twitterCard = $this->get('twittercard', true); if ($twitterCard->isNotEmpty()) { $meta['twitter:card'] = $twitterCard->value(); } // Image - if ($thumbnail = $this->getFile('thumbnail')) { - $opengraph['og:image'] = $thumbnail->url(); + if ($thumbnail = $this->thumbnail()) { + $og['og:image'] = url($thumbnail->url()); if ($thumbnail->alt()->isNotEmpty()) { - $opengraph['og:image:alt'] = $thumbnail->alt()->value(); - } - } else { - if ($meta['twitter:card'] === 'summary_large_image') { - $meta['twitter:card'] = 'summary'; + $og['og:image:alt'] = $thumbnail->alt()->value(); } + } else if ($meta['twitter:card'] === 'summary_large_image') { + $meta['twitter:card'] = 'summary'; } // Twitter settings - $twitterSite = $this->get('twittersite'); + $twitterSite = $this->get('twittersite', true); if ($twitterSite->isNotEmpty()) { $meta['twitter:site'] = $twitterSite->value(); } - $twitterCreator = $this->get('twittercreator'); + $twitterCreator = $this->get('twittercreator', true); if ($twitterCreator->isNotEmpty()) { $meta['twitter:creator'] = $twitterCreator->value(); } - // Generate Meta Tags - foreach($meta as $name => $content): - $html[] = Html::tag('meta', null, [ - 'name' => $name, - 'content' => $content, - ]); - endforeach; + return Tpl::load(__DIR__ . '/templates/social.php', compact('meta', 'og')); + } - // Generate Opengraph Tags - foreach($opengraph as $prop => $content): - $html[] = Html::tag('meta', null, [ - 'property' => $prop, - 'content' => $content, - ]); - endforeach; + public function thumbnail(): ?File + { + // Overrule auto-generated image if custom one is set: + // In content file... + $custom = $this->page->content()->get('ogimage'); - return implode(PHP_EOL, $html) . PHP_EOL; + if ($custom->exists() && ($image = $custom->toFile())) { + return $image; + } + + // In page model... + if ($this->metadata['ogimage'] ?? null) { + return $this->metadata['ogimage']; + } + + // Otherwise go with auto-generated image + return new File([ + 'filename' => 'og:image', + 'url' => '/' . $this->page->id() . '/opengraph.png' + ]); } - public function thumbnail(bool $fallback = true): ?File + public static function renderThumbnail(string $id) { - return $this->getFile('thumbnail', $fallback); + // Get page for which the thumbnail should be generated + $page = page(urldecode($id)); + + if ($page === null) { + return null; + } + + $data = []; + + // Get data from page model + if (method_exists($page, 'metadata') === true) { + $data = $page->metadata()['thumbnail'] ?? []; + } + + // Get data from content file + if ($page->thumbnail()->exists()) { + $yaml = $page->thumbnail()->yaml()[0]; + + /** + * thumnail: image.png + */ + if (is_string($yaml) === true) { + $data['image'] = $yaml; + + /** + * thumnail: + * - + * lead: Something interesting + * image: image.png + */ + } else { + $data = array_merge($data, $yaml); + } + + // If image is still a string and not a file object yet, + // try to find image in the page's files + if ($data['image'] ?? null) { + if (is_string($data['image']) === true) { + $image = $page->file($data['image']); + + if ($image === null) { + $image = new Asset('assets/icons/' . $data['image']); + } + + $data['image'] = $image; + } + } + } + + // Create canvas + $canvas = imagecreatetruecolor(1200, 628); + + // Define colors and fonts + $black = imagecolorallocate($canvas, 0, 0, 0); + $gray = imagecolorallocate($canvas, 119, 119, 119); + $white = imagecolorallocate($canvas, 255, 255, 255); + $yellow = imagecolorallocate($canvas, 253, 197, 0); + + $sans = __DIR__ . '/assets/Inter-Regular.otf'; + $bold = __DIR__ . '/assets/Inter-Bold.otf'; + $mono = __DIR__ . '/assets/RobotoMono.ttf'; + + // Add background + $width = 1200; + $height = 628; + imagefilledrectangle($canvas, 0, 0, $width, $height, $white); + + // Margin and initial y coordinate + $margin = $y = 60; + + // Lead text + [$x, $y] = imagettftext( + $canvas, + $size = 28, + 0, + $margin, + $y += $size, + $gray, + $mono, + $data['lead'] ?? $page->metaLead(null, 'The CMS') + ); + + // Line + $y += 25; + imagesetthickness($canvas, 4); + imageline($canvas, $x, $y, $width - $margin, $y, $black); + + // Title text + $title = $data['title'] ?? $page->title(); + $length = strlen($title); + $size = $length < 12 ? 74 : ($length < 24 ? 64 : 58); + $title = wordwrap($title, $size > 60 ? 20 : 25, "\n"); + $lines = substr_count($title, "\n") + 1; + + [$x, $y] = imagettftext( + $canvas, + $size, + 0, + $margin - 5, + $y += $size + 45, + $black, + $sans, + $title + ); + $y += $margin; + + // Logo + $logo = imagecreatefrompng(__DIR__ . '/assets/logo.png'); + imagecopyresampled( + $canvas, + $logo, + $width - $margin - imagesx($logo), + $height - $margin - 10 - imagesy($logo), + 0, + 0, + imagesx($logo), + imagesy($logo), + imagesx($logo), + imagesy($logo) + ); + + // Image or domain + if ($image = $data['image'] ?? null) { + + $image = url($image->url()); + + // Convert SVG to image string + if (strpos(pathinfo($image)['extension'], 'svg') !== false) { + + $im = new Imagick(); + $box = 280 - ($lines * 50); + $svg = file_get_contents($image); + $im->setResolution(460, 460); + $im->readImageBlob($svg); + $im->setImageFormat('jpeg'); + $im->resizeImage($box, $box, imagick::FILTER_LANCZOS, 1); + $data = $im->getImageBlob(); + $image = imagecreatefromstring($data); + $y = $height - imagesy($image) - $margin - 10; + + // Load other formats as image string via curl + } else { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $image); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); + $data = curl_exec($ch); + curl_close($ch); + $image = imagecreatefromstring($data); + } + + // Set size (auto with max-width) + $w = imagesx($image); + $max = $width - (3 * $margin) - imagesx($logo); + if ($w > $max) $w = $max; + $h = (imagesy($image) / imagesx($image)) * $w; + imagecopyresampled( + $canvas, + $image, + $margin, + $y, + 0, + 0, + $w, + $h, + imagesx($image), + imagesy($image) + ); + + } else { + $y = $height - $margin - 15; + imagesetthickness($canvas, 3); + imageline($canvas, $x - 5, $y, 342, $y, $yellow); + imagettftext( + $canvas, + 32, + 0, + $margin, + $y -= 5, + $black, + $bold, + 'getkirby.com' + ); + } + + // Render + ob_start(); + imagepng($canvas); + $body = ob_get_clean(); + imagedestroy($canvas); + + return new Response($body, 'image/png'); } } diff --git a/site/plugins/meta/src/SiteMeta.php b/site/plugins/meta/src/SiteMeta.php new file mode 100644 index 0000000000..f7c2b88b6a --- /dev/null +++ b/site/plugins/meta/src/SiteMeta.php @@ -0,0 +1,79 @@ +response() + ->type('text') + ->body($robots); + } + + public static function search(): Response + { + return new Response( + Tpl::load(__DIR__ . '/templates/search.php'), + 'application/opensearchdescription+xml' + ); + } + + public static function sitemap(): Response + { + $sitemap = []; + $cache = kirby()->cache('pages'); + $id = 'sitemap.xml'; + + if (!$sitemap = $cache->get($id)) { + $sitemap[] = ''; + $sitemap[] = ''; + + $templates = option('meta.exclude.templates', []); + $pages = option('meta.exclude.pages', []); + $exclude = '!^(?:' . implode('|', $pages) . ')$!i'; + + foreach (site()->index() as $item) { + + if (in_array($item->intendedTemplate()->name(), $templates) === true) { + continue; + } + + if (preg_match($exclude, $item->id())) { + continue; + } + + $meta = $item->meta(); + + $sitemap[] = ''; + $sitemap[] = ' ' . Xml::encode($item->url()) . ''; + $sitemap[] = ' ' . number_format($meta->priority(), 1, '.', '') . ''; + + $changefreq = $meta->changefreq(); + if ($changefreq->isNotEmpty()) { + $sitemap[] = ' ' . $changefreq . ''; + } + + $sitemap[] = ''; + } + + $sitemap[] = ''; + $sitemap = implode(PHP_EOL, $sitemap); + + $cache->set($id, $sitemap); + } + + return new Response($sitemap, 'application/xml'); + } +} diff --git a/site/plugins/meta/src/assets/Inter-Bold.otf b/site/plugins/meta/src/assets/Inter-Bold.otf new file mode 100644 index 0000000000..ed9019a5ac Binary files /dev/null and b/site/plugins/meta/src/assets/Inter-Bold.otf differ diff --git a/site/plugins/meta/src/assets/Inter-Regular.otf b/site/plugins/meta/src/assets/Inter-Regular.otf new file mode 100644 index 0000000000..e94fa45416 Binary files /dev/null and b/site/plugins/meta/src/assets/Inter-Regular.otf differ diff --git a/site/plugins/meta/src/assets/RobotoMono.ttf b/site/plugins/meta/src/assets/RobotoMono.ttf new file mode 100644 index 0000000000..d2b4746196 Binary files /dev/null and b/site/plugins/meta/src/assets/RobotoMono.ttf differ diff --git a/site/plugins/meta/src/assets/logo.png b/site/plugins/meta/src/assets/logo.png new file mode 100644 index 0000000000..d3e76729fd Binary files /dev/null and b/site/plugins/meta/src/assets/logo.png differ diff --git a/site/plugins/meta/src/templates/json.php b/site/plugins/meta/src/templates/json.php new file mode 100644 index 0000000000..1424127827 --- /dev/null +++ b/site/plugins/meta/src/templates/json.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/site/plugins/meta/src/templates/search.php b/site/plugins/meta/src/templates/search.php new file mode 100644 index 0000000000..073705980e --- /dev/null +++ b/site/plugins/meta/src/templates/search.php @@ -0,0 +1,11 @@ +' ?> + + title()->xml() ?> + Search the Kirby website and documentation. + UTF-8 + + root('index') . '/assets/images/opensearch.png'))->base64() ?> + + + + diff --git a/site/plugins/meta/src/templates/social.php b/site/plugins/meta/src/templates/social.php new file mode 100644 index 0000000000..109cdf23c6 --- /dev/null +++ b/site/plugins/meta/src/templates/social.php @@ -0,0 +1,7 @@ + $content): ?> + + + + $content): ?> + + diff --git a/site/plugins/meta/templates/meta-debug.php b/site/plugins/meta/templates/meta-debug.php deleted file mode 100644 index e8d9d03138..0000000000 --- a/site/plugins/meta/templates/meta-debug.php +++ /dev/null @@ -1,194 +0,0 @@ - - -
-
- 'center']) ?> -
- - - -
-

- - - - - - - - - - - - - - - - index() as $item) { - - if ($item->template()->name() === 'link') { - continue; - } - - $meta = $item->meta(); - - echo ''; - echo ''; - echo ''; - - echo ''; - - echo ''; - - echo ''; - - - echo ''; - - - echo ''; - - echo ''; - echo ''; - - $thumbnail = $meta->thumbnail(); - echo ''; - - echo ''; // ' . ($thumbnail !== null && $thumbnail->alt()->isNotEmpty() ? '✅' : '❌') . ' 🔸 - - echo ''; - - echo ''; - echo ''; - echo ''; - } - - ?> - -
TemplateOpengraph titleDescriptionThumbnailHas own descriptionHas own thumbnailThumbnail alt textAll links working
' . $item->title()->link() . ' ' . $item->id() . '
' . $item->template()->name() . '' . $meta->ogtitle()->html() . '' . $meta->description()->html() . '' . $meta->thumbnail() . '' . ($meta->hasOwnDescription() ? '✅' : '❌') . '' . ($meta->hasOwnThumbnail() ? '✅' : '❌') . '' . ($thumbnail !== null && $thumbnail->alt()->isNotEmpty() ? '✅' : '❌') . '
-
-
-
- - - diff --git a/site/plugins/meta/vendor/autoload.php b/site/plugins/meta/vendor/autoload.php deleted file mode 100644 index d3920d7204..0000000000 --- a/site/plugins/meta/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - private $classMapAuthoritative = false; - private $missingClasses = array(); - private $apcuPrefix; - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/site/plugins/meta/vendor/composer/LICENSE b/site/plugins/meta/vendor/composer/LICENSE deleted file mode 100644 index f27399a042..0000000000 --- a/site/plugins/meta/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -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/site/plugins/meta/vendor/composer/autoload_classmap.php b/site/plugins/meta/vendor/composer/autoload_classmap.php deleted file mode 100644 index 7a91153b0d..0000000000 --- a/site/plugins/meta/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,9 +0,0 @@ - array($baseDir . '/src'), -); diff --git a/site/plugins/meta/vendor/composer/autoload_real.php b/site/plugins/meta/vendor/composer/autoload_real.php deleted file mode 100644 index 2ae1efd118..0000000000 --- a/site/plugins/meta/vendor/composer/autoload_real.php +++ /dev/null @@ -1,52 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInitade09ce9d062c82730be7ca76e9dfdd1::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - return $loader; - } -} diff --git a/site/plugins/meta/vendor/composer/autoload_static.php b/site/plugins/meta/vendor/composer/autoload_static.php deleted file mode 100644 index e88c5ed4e1..0000000000 --- a/site/plugins/meta/vendor/composer/autoload_static.php +++ /dev/null @@ -1,31 +0,0 @@ - - array ( - 'Kirby\\Meta\\' => 11, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'Kirby\\Meta\\' => - array ( - 0 => __DIR__ . '/../..' . '/src', - ), - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInitade09ce9d062c82730be7ca76e9dfdd1::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInitade09ce9d062c82730be7ca76e9dfdd1::$prefixDirsPsr4; - - }, null, ClassLoader::class); - } -} diff --git a/site/plugins/meta/vendor/composer/installed.json b/site/plugins/meta/vendor/composer/installed.json deleted file mode 100644 index fe51488c70..0000000000 --- a/site/plugins/meta/vendor/composer/installed.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/site/plugins/redirects/index.php b/site/plugins/redirects/index.php index 2cea033808..12c8c3f185 100644 --- a/site/plugins/redirects/index.php +++ b/site/plugins/redirects/index.php @@ -6,10 +6,10 @@ * Plugin creates redirect routes (using the `go()` helper) that only * take over if no actual page/route has been matched. * - * The rredirects get defined in `site/config/redirects.php` in an array + * Redirects are defined in `site/config/redirects.php` as an array * with the old pattern as key and the target page/URL as value. Placeholders * can be used in the key and referenced via $1, $2, $3 in the target string. - * Instead of a target string, a callback function returning that stirng can + * Instead of a target string, a callback function returning that string can * also be used. * * @author Nico Hoffmann diff --git a/site/plugins/search/composer.json b/site/plugins/search/composer.json new file mode 100644 index 0000000000..adf03dafdf --- /dev/null +++ b/site/plugins/search/composer.json @@ -0,0 +1,14 @@ +{ + "name": "getkirby/search", + "autoload": { + "psr-4": { + "Kirby\\Search\\": "src/" + } + }, + "require": { + "algolia/algoliasearch-client-php": "^2.7.3" + }, + "config": { + "optimize-autoloader": true + } +} diff --git a/site/plugins/search/composer.lock b/site/plugins/search/composer.lock new file mode 100644 index 0000000000..0b6b705267 --- /dev/null +++ b/site/plugins/search/composer.lock @@ -0,0 +1,247 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "082e34cf1fd35f522ffad893ab73b0ae", + "packages": [ + { + "name": "algolia/algoliasearch-client-php", + "version": "2.7.3", + "source": { + "type": "git", + "url": "https://github.com/algolia/algoliasearch-client-php.git", + "reference": "142a382e4649db0cb64d9eb8893872f1a4ba8dd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/algolia/algoliasearch-client-php/zipball/142a382e4649db0cb64d9eb8893872f1a4ba8dd3", + "reference": "142a382e4649db0cb64d9eb8893872f1a4ba8dd3", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^5.3 || ^7.0 || ^8.0", + "psr/http-message": "^1.0", + "psr/log": "^1.0", + "psr/simple-cache": "^1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0", + "fzaninotto/faker": "^1.8", + "julienbourdeau/phpunit": "4.8.37", + "symfony/yaml": "^2.0 || ^4.0" + }, + "suggest": { + "guzzlehttp/guzzle": "If you prefer to use Guzzle HTTP client instead of the Http Client implementation provided by the package" + }, + "bin": [ + "bin/algolia-doctor" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-2.0": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Algolia\\AlgoliaSearch\\": "src/" + }, + "files": [ + "src/Http/Psr7/functions.php", + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Algolia Team", + "email": "contact@algolia.com" + } + ], + "description": "Algolia Search API Client for PHP", + "keywords": [ + "algolia", + "api", + "client", + "php", + "search" + ], + "support": { + "issues": "https://github.com/algolia/algoliasearch-client-php/issues", + "source": "https://github.com/algolia/algoliasearch-client-php/tree/2.7.3" + }, + "time": "2020-12-22T11:27:03+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.0.0" +} diff --git a/site/plugins/search/index.php b/site/plugins/search/index.php new file mode 100644 index 0000000000..cf62550270 --- /dev/null +++ b/site/plugins/search/index.php @@ -0,0 +1,13 @@ + + * @author Nico Hoffmann + * @license MIT + * @link https://getkirby.com + */ +class Index +{ + + /** + * Singleton class instance + * + * @var \Kirby\Algolia\Index + */ + public static $instance; + + /** + * Algolia client instance + * + * @var \Algolia\AlgoliaSearch\SearchClient + */ + protected $algolia; + + /** + * Algolia index + */ + protected $index; + + /** + * Config settings + * + * @var array + */ + protected $options = []; + + /** + * Class constructor + */ + public function __construct() + { + $this->options = option('search.algolia', []); + + if (isset($this->options['app'], $this->options['key']) === false) { + throw new Exception('Please set your Algolia API credentials in the Kirby configuration.'); + } + + $this->algolia = Algolia::create( + $this->options['app'], + $this->options['key'] + ); + + $this->index = $this->algolia->initIndex($this->options['index']); + } + + /** + * Returns a singleton instance of the Algolia class + * + * @return \Kirby\Algolia\Search + */ + public static function instance(): self + { + return static::$instance = static::$instance ?? new static; + } + + /** + * Sends a search query to Algolia and returns + * a paginated collection of results + * + * @param string $query Search query + * @param int $page Pagination page to return (starts at 1, not 0!) + * @param array $options Search parameters to override the default settings + * See https://www.algolia.com/doc/api-client/methods/search/ + * @return \Kirby\Algolia\Results + */ + public function search(string $query = null, int $page = 1, array $options = []): Results + { + $defaults = $this->options['options'] ?? []; + $options = array_merge($defaults, $options); + + // Set the page parameter + // Algolia uses zero based page indexes while + // Kirby's pagination starts at 1 + $options['page'] = $page ? $page - 1 : 0; + + // Get results response + $response = $this->index->search($query, $options); + + // Return collection of the results + return Results::from($response); + } + + /** + * Indexes everything and replaces the current index + * + * Uses atomical re-indexing: + * https://www.algolia.com/doc/api-reference/api-methods/replace-all-objects/ + */ + public function index() + { + $pages = site()->index()->filter([$this, 'isIndexable']); + $objects = $pages->map([$this, 'format']); + $this->index->replaceAllObjects($objects); + } + + /** + * Checks if a specific page should be included in the Algolia index + * Uses the configuration option algolia.templates + * + * @param Page $page Kirby page + * @return boolean + */ + public function isIndexable(Page $page) + { + $templates = $this->options['templates'] ?? []; + $pageTemplate = $page->intendedTemplate()->name(); + + // Quickly whitelist simple definitions + // Example: array('project') + if (in_array($pageTemplate, $templates, true)) { + return true; + } + + // Sort out pages whose template is not defined + if (!isset($templates[$pageTemplate])) { + return false; + } + + $template = $templates[$pageTemplate]; + + // Check if the template is defined as a boolean + // Example: array('project' => true, 'contact' => false) + if (is_bool($template)) { + return $template; + } + + // Skip every value that is not a boolean or array for consistency + if (!is_array($template)) { + return false; + } + + // Check for the custom filter function + // Example: array('project' => array('filter' => function($page) {...})) + if (isset($template['filter'])) { + $filter = $template['filter']; + if (is_callable($filter) && !call_user_func($filter, $page)) { + return false; + } + } + + // No rule was violated, the page is indexable + return true; + } + + /** + * Converts a page into a data array for Algolia + * Uses the configuration options algolia.fields and algolia.templates + * + * @param \Kirby\Cms\Page $page + * @return array + */ + public function format(Page $page) + { + $fields = $this->options['fields'] ?? ['url', 'intendedTemplate']; + $templates = $this->options['templates'] ?? []; + $pageTemplate = $page->intendedTemplate()->name(); + + // Merge fields with the default fields and make array structure consistent + if (isset($templates[$pageTemplate]['fields'])) { + $fields = array_merge( + static::cleanUpFields($fields), + static::cleanUpFields($templates[$pageTemplate]['fields']) + ); + } else { + $fields = static::cleanUpFields($fields); + } + + // Build resulting data array + $data = ['objectID' => $page->id()]; + + foreach ($fields as $name => $operation) { + if (is_callable($operation)) { + // Custom function + $data[$name] = call_user_func($operation, $page); + } elseif(is_string($operation)) { + // Field method without parameters + $result = $page->$name(); + + if(is_a($result, Field::class) === false) { + $result = new Field($page, $name, $result); + } + + $result = $result->$operation(); + + // Make sure that the result is not an object + $data[$name] = (is_object($result))? (string)$result : $result; + } elseif(is_array($operation)) { + // Field method with parameters + $result = $page->$name(); + + // Skip invalid definitions + if(!isset($operation[0])) { + $data[$name] = (string)$result; + continue; + } + + if(!($result instanceof Field)) { + $result = new Field($page, $name, $result); + } + + $parameters = array_slice($operation, 1); + $operation = $operation[0]; + $result = call_user_func_array(array($result, $operation), $parameters); + + // Make sure that the result is not an object + $data[$name] = (is_object($result))? (string)$result : $result; + } else { + // No or invalid operation, convert to string + $data[$name] = (string)$page->$name(); + } + } + + return $data; + } + + /** + * Returns the number of indexable pages + * + * @return int + */ + public function objectCount() { + return site()->index()->filter()->count(); + } + + /** + * Makes an array of fields and operations consistent + * for formatPage() + * + * @param array $fields + * @return array + */ + protected static function cleanUpFields($fields) { + $result = array(); + + foreach($fields as $name => $operation) { + // Make sure the name is always the key, even if no operation was given + if(is_int($name)) { + $name = $operation; + $operation = null; + } + + $result[$name] = $operation; + } + + // Make sure that the fields are sorted alphabetically for consistence + ksort($result); + return $result; + } +} diff --git a/site/plugins/search/src/Results.php b/site/plugins/search/src/Results.php new file mode 100644 index 0000000000..ef4ec5be64 --- /dev/null +++ b/site/plugins/search/src/Results.php @@ -0,0 +1,36 @@ + + * @license MIT + * @link https://getkirby.com + */ +class Results extends Collection +{ + + static public function from(array $response): self + { + // Convert the hits to Obj objects + $hits = array_map(function ($hit) { + return new Obj($hit); + }, $response['hits']); + + $results = new static($hits); + $results->pagination = new Pagination([ + 'page' => ($response['page'] ?? 0) + 1, + 'total' => $response['nbHits'] ?? 0, + 'limit' => $response['hitsPerPage'] ?? 20, + ]); + + return $results; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/Dockerfile b/site/plugins/search/vendor/algolia/algoliasearch-client-php/Dockerfile new file mode 100644 index 0000000000..32de2db766 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/Dockerfile @@ -0,0 +1,18 @@ +# Dockerfile +FROM php:7.4.1-fpm + +RUN apt-get update -y \ + && apt-get install -y --no-install-recommends \ + wget \ + zip \ + unzip \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install Composer +COPY --from=composer /usr/bin/composer /usr/bin/composer + +WORKDIR /app +ADD . /app/ + +RUN composer install diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/autoload.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/autoload.php new file mode 100644 index 0000000000..d9b2926970 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/autoload.php @@ -0,0 +1,76 @@ + 'psr/http-message/src/', + 'Psr\\Log\\' => 'psr/log/Psr/Log/', + 'Psr\\SimpleCache\\' => 'psr/simple-cache/src/', + ); + + $base_dir = __DIR__.'/vendor/'; + + foreach ($prefixes as $prefix => $subdir) { + $len = strlen($prefix); + if (0 !== strncmp($prefix, $class, $len)) { + continue; + } + + $relative_class = substr($class, $len); + + $file = $base_dir.$subdir.str_replace('\\', '/', $relative_class).'.php'; + + if (file_exists($file)) { + require $file; + } + } +}); diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/bin/algolia-doctor b/site/plugins/search/vendor/algolia/algoliasearch-client-php/bin/algolia-doctor new file mode 100755 index 0000000000..2a93a80454 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/bin/algolia-doctor @@ -0,0 +1,83 @@ +#!/usr/bin/env php +checkPhpVersion(); +$doc->checkExtensionRequirements(); +$doc->checkSerializeParam(); +$doc->checkHttpClient(); +$doc->checkCurlAsynchDNS(); + +exit($doc->exitCode); + +class AlgoliaDoctor +{ + public $exitCode = 0; + + public function checkPhpVersion() + { + if (PHP_VERSION_ID < 50300) { + echo 'Unfortunately your version of PHP is too old. Consider upgrading to PHP 7+.'; + $this->exitCode = 1; + } + } + + public function checkExtensionRequirements() + { + if (!function_exists('curl_init')) { + echo 'AlgoliaSearch requires the CURL PHP extension.'; + $this->exitCode = 1; + } + if (!function_exists('json_decode')) { + echo 'AlgoliaSearch requires the JSON PHP extension.'; + $this->exitCode = 1; + } + if (!function_exists('mb_strtolower')) { + echo 'AlgoliaSearch requires the MBSTRING PHP extension.'; + $this->exitCode = 1; + } + } + + public function checkSerializeParam() + { + if (PHP_VERSION_ID > 70100 && '-1' !== ini_get('serialize_precision')) { + echo ' +When using PHP 7.1+, you must set the "serialize_precision" ini settings to -1. +See https://github.com/algolia/algoliasearch-client-php/issues/365 +'; + $this->exitCode = 1; + } + } + + public function checkHttpClient() + { + if (PHP_VERSION_ID > 50500 && !class_exists('GuzzleHttp\Client')) { + echo " +You're using a recent enough version of PHP to use the Guzzle Http library. +It's highly recommended to use Guzzle. +Install it via `composer require guzzlehttp/guzzle` and it will be used automatically. +"; + } + } + + public function checkCurlAsynchDNS() + { + // See https://github.com/algolia/algoliasearch-client-php/pull/109/files#r114370030 + $curlVersion = curl_version(); + $hasAsynchDNS = $curlVersion['features'] & (1 << 7); + + if (!$hasAsynchDNS) { + echo ' +cURL AsynchDSN feature is disabled. Please compile your libcurl with ARES enabled +to avoid potential issues with DNS resolution. +'; + } + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/bin/install-dependencies-without-composer b/site/plugins/search/vendor/algolia/algoliasearch-client-php/bin/install-dependencies-without-composer new file mode 100755 index 0000000000..a18b7b2479 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/bin/install-dependencies-without-composer @@ -0,0 +1,82 @@ +#!/usr/bin/env php + 'https://github.com/php-fig/http-message/archive/master.zip', + 'psr/log' => 'https://github.com/php-fig/log/archive/master.zip', + 'psr/simple-cache' => 'https://github.com/php-fig/simple-cache/archive/master.zip', +); + +if (!class_exists('ZipArchive') || !function_exists('curl_init')) { + echo "\nZipArchive and Curl are required to execute this script.\n"; + exit(50); +} + +if (is_dir($vendorDir)) { + passthru('rm -rf '.$vendorDir.'/*'); +} else { + passthru('mkdir '.$vendorDir); +} + +$tmpZip = $vendorDir.'/tmp.zip'; +foreach ($dependencies as $name => $zipUrl) { + $dest = $vendorDir.'/'.$name; + passthru('mkdir -p '.$dest); + + downloadZipFile($zipUrl, $tmpZip); + extractZipFile($tmpZip, $dest); +} + +passthru('rm -rf '.$tmpZip); + +echo "\nDependencies are downloaded inside the $vendorDir folder."; +echo "\nRequire the autoload.php file at the root folder to start using the lib.\n"; + +exit (0); + +function downloadZipFile($url, $destinationFilePath) { + $fp = fopen($destinationFilePath, 'w+'); + $ch = curl_init($url); + +// curl_setopt($ch, CURLOPT_VERBOSE, true); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); + curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); + curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); + curl_setopt($ch, CURLOPT_FILE, $fp); + + $exec = curl_exec($ch); + + curl_close($ch); + fclose($fp); + + if (false === $exec) { + echo curl_error(); + exit(51); + } +} + +function extractZipFile($zipFileName, $destinationFolderPath) { + $folderName = basename($destinationFolderPath).'-master'; + $tmpFolder = dirname($zipFileName); + $zip = new ZipArchive; + $opened = $zip->open($zipFileName); + + if (true !== $opened) { + echo "\nCouldn't open $zipFileName\n"; + echo $zip->getStatusString(); + exit(52); + } + + $zip->extractTo($tmpFolder); + $zip->close(); + + rename($tmpFolder.'/'.$folderName, $destinationFolderPath); +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/AccountClient.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/AccountClient.php new file mode 100644 index 0000000000..06d1c99ebe --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/AccountClient.php @@ -0,0 +1,40 @@ +getAppId() === $destIndex->getAppId()) { + throw new \InvalidArgumentException('If both index are on the same app, please use SearchClient::copyIndex method instead.'); + } + + try { + $destIndex->getSettings(); + + throw new \InvalidArgumentException('Destination index already exists. Please delete it before copying index across applications.'); + } catch (NotFoundException $e) { + // All good + } + + $allResponses = array(); + + $settings = $srcIndex->getSettings(); + $allResponses[] = $destIndex->setSettings($settings); + + $synonymsIterator = $srcIndex->browseSynonyms(); + $allResponses[] = $destIndex->saveSynonyms($synonymsIterator); + + $objectsIterator = $srcIndex->browseObjects(); + $allResponses[] = $destIndex->saveObjects($objectsIterator); + + $rulesIterator = $srcIndex->browseRules(); + $allResponses[] = $destIndex->saveRules($rulesIterator); + + return new MultiResponse($allResponses); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Algolia.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Algolia.php new file mode 100644 index 0000000000..40f31a26bb --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Algolia.php @@ -0,0 +1,118 @@ +api = $api; + $this->config = $config; + } + + public static function create($appId = null, $apiKey = null, $region = null) + { + return static::createWithConfig(AnalyticsConfig::create($appId, $apiKey, $region)); + } + + public static function createWithConfig(AnalyticsConfig $config) + { + $config = clone $config; + + if ($hosts = $config->getHosts()) { + $clusterHosts = ClusterHosts::create($hosts); + } else { + $clusterHosts = ClusterHosts::createForAnalytics($config->getRegion()); + } + + $apiWrapper = new ApiWrapper( + Algolia::getHttpClient(), + $config, + $clusterHosts + ); + + return new static($apiWrapper, $config); + } + + /** + * Get a paginated list of AB Test from the API. + * + * @param array|\Algolia\AlgoliaSearch\RequestOptions\RequestOptions $requestOptions + * + * @return array + */ + public function getABTests($requestOptions = array()) + { + return $this->api->read('GET', api_path('/2/abtests'), $requestOptions); + } + + /** + * Get an AB Test. + * + * @param int $abTestID Id of the AB Test to retrieve + * @param array|\Algolia\AlgoliaSearch\RequestOptions\RequestOptions $requestOptions + * + * @return array + * + * @throws \Algolia\AlgoliaSearch\Exceptions\AlgoliaException + */ + public function getABTest($abTestID, $requestOptions = array()) + { + if (!$abTestID) { + throw new AlgoliaException('Cannot retrieve ABTest because the abtestID is invalid.'); + } + + return $this->api->read('GET', api_path('/2/abtests/%s', $abTestID)); + } + + /** + * Create new AB Test. + * + * @param array $abTest + * @param array|\Algolia\AlgoliaSearch\RequestOptions\RequestOptions $requestOptions + * + * @return array Information about the creation like TaskID and date + */ + public function addABTest($abTest, $requestOptions = array()) + { + return $this->api->write('POST', api_path('/2/abtests'), $abTest, $requestOptions); + } + + /** + * Stop a running AB Test. + * + * @param int $abTestID + * @param array|\Algolia\AlgoliaSearch\RequestOptions\RequestOptions $requestOptions + * + * @return array + * + * @throws \Algolia\AlgoliaSearch\Exceptions\AlgoliaException + */ + public function stopABTest($abTestID, $requestOptions = array()) + { + if (!$abTestID) { + throw new AlgoliaException('Cannot retrieve ABTest because the abtestID is invalid.'); + } + + return $this->api->write('POST', api_path('/2/abtests/%s', $abTestID), array(), $requestOptions); + } + + /** + * Delete an AB Test. + * + * @param int $abTestID + * @param array|\Algolia\AlgoliaSearch\RequestOptions\RequestOptions $requestOptions + * + * @return array + * + * @throws \Algolia\AlgoliaSearch\Exceptions\AlgoliaException + */ + public function deleteABTest($abTestID, $requestOptions = array()) + { + if (!$abTestID) { + throw new AlgoliaException('Cannot retrieve ABTest because the abtestID is invalid.'); + } + + return $this->api->write('DELETE', api_path('/2/abtests/%s', $abTestID), array(), $requestOptions); + } + + public function custom($method, $path, $requestOptions = array(), $hosts = null) + { + return $this->api->send($method, $path, $requestOptions, $hosts); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Cache/FileCacheDriver.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Cache/FileCacheDriver.php new file mode 100644 index 0000000000..0c5098491f --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Cache/FileCacheDriver.php @@ -0,0 +1,117 @@ +directory = rtrim($directory, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + } + + /** + * {@inheritdoc} + */ + public function get($key, $default = null) + { + if (!$this->has($key)) { + return $default; + } + + return file_get_contents($this->getFilenameFromKey($key)); + } + + /** + * {@inheritdoc} + */ + public function set($key, $value, $ttl = null) + { + return file_put_contents($this->getFilenameFromKey($key), $value); + } + + /** + * {@inheritdoc} + */ + public function delete($key) + { + return @unlink($this->getFilenameFromKey($key)); + } + + /** + * {@inheritdoc} + */ + public function clear() + { + $result = true; + foreach (glob($this->directory.self::PREFIX.'*') as $file) { + $result &= @unlink($file); + } + + return $result; + } + + /** + * {@inheritdoc} + */ + public function getMultiple($keys, $default = null) + { + $result = array(); + foreach ($keys as $key) { + $result[$key] = $this->get($key, $default); + } + + return $result; + } + + /** + * {@inheritdoc} + */ + public function setMultiple($values, $ttl = null) + { + $result = true; + foreach ($values as $key => $value) { + $result &= $this->set($key, $value, $ttl); + } + + return $result; + } + + /** + * {@inheritdoc} + */ + public function deleteMultiple($keys) + { + $result = true; + foreach ($keys as $key) { + $result &= $this->delete($key); + } + + return $result; + } + + /** + * {@inheritdoc} + */ + public function has($key) + { + return file_exists($this->getFilenameFromKey($key)); + } + + /** + * @param string $key + * + * @return string + */ + private function getFilenameFromKey($key) + { + $name = $this->directory.self::PREFIX.$key; + + return str_replace('\\', '-', $name); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Cache/NullCacheDriver.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Cache/NullCacheDriver.php new file mode 100644 index 0000000000..b947ae9c61 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Cache/NullCacheDriver.php @@ -0,0 +1,78 @@ +getDefaultConfig(); + + $this->config = $config; + } + + public function getDefaultConfig() + { + return array( + 'appId' => '', + 'apiKey' => '', + 'hosts' => null, + 'readTimeout' => $this->defaultReadTimeout, + 'writeTimeout' => $this->defaultWriteTimeout, + 'connectTimeout' => $this->defaultConnectTimeout, + 'defaultHeaders' => array(), + ); + } + + public function getAppId() + { + return $this->config['appId']; + } + + public function setAppId($appId) + { + $this->config['appId'] = $appId; + + return $this; + } + + public function getApiKey() + { + return $this->config['apiKey']; + } + + public function setApiKey($apiKey) + { + $this->config['apiKey'] = $apiKey; + + return $this; + } + + public function getHosts() + { + return $this->config['hosts']; + } + + public function setHosts($hosts) + { + $this->config['hosts'] = $hosts; + + return $this; + } + + public function getReadTimeout() + { + return $this->config['readTimeout']; + } + + public function setReadTimeout($readTimeout) + { + $this->config['readTimeout'] = $readTimeout; + + return $this; + } + + public function getWriteTimeout() + { + return $this->config['writeTimeout']; + } + + public function setWriteTimeout($writeTimeout) + { + $this->config['writeTimeout'] = $writeTimeout; + + return $this; + } + + public function getConnectTimeout() + { + return $this->config['connectTimeout']; + } + + public function setConnectTimeout($connectTimeout) + { + $this->config['connectTimeout'] = $connectTimeout; + + return $this; + } + + public function getDefaultHeaders() + { + return $this->config['defaultHeaders']; + } + + public function setDefaultHeaders(array $defaultHeaders) + { + $this->config['defaultHeaders'] = $defaultHeaders; + + return $this; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/AnalyticsConfig.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/AnalyticsConfig.php new file mode 100644 index 0000000000..73a4ea0c29 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/AnalyticsConfig.php @@ -0,0 +1,29 @@ + null !== $appId ? $appId : getenv('ALGOLIA_APP_ID'), + 'apiKey' => null !== $apiKey ? $apiKey : getenv('ALGOLIA_API_KEY'), + 'region' => null !== $region ? $region : 'us', + ); + + return new static($config); + } + + public function setRegion($region) + { + $this->config['region'] = $region; + + return $this; + } + + public function getRegion() + { + return $this->config['region']; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/InsightsConfig.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/InsightsConfig.php new file mode 100644 index 0000000000..59c805cc9f --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/InsightsConfig.php @@ -0,0 +1,29 @@ + null !== $appId ? $appId : getenv('ALGOLIA_APP_ID'), + 'apiKey' => null !== $apiKey ? $apiKey : getenv('ALGOLIA_API_KEY'), + 'region' => null !== $region ? $region : 'us', + ); + + return new static($config); + } + + public function setRegion($region) + { + $this->config['region'] = $region; + + return $this; + } + + public function getRegion() + { + return $this->config['region']; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/PlacesConfig.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/PlacesConfig.php new file mode 100644 index 0000000000..8bf0384b1c --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/PlacesConfig.php @@ -0,0 +1,16 @@ + $appId, + 'apiKey' => $apiKey, + ); + + return new static($config); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/RecommendationConfig.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/RecommendationConfig.php new file mode 100644 index 0000000000..fe36399a3b --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/RecommendationConfig.php @@ -0,0 +1,29 @@ + null !== $appId ? $appId : getenv('ALGOLIA_APP_ID'), + 'apiKey' => null !== $apiKey ? $apiKey : getenv('ALGOLIA_API_KEY'), + 'region' => null !== $region ? $region : 'us', + ); + + return new self($config); + } + + public function getRegion() + { + return $this->config['region']; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/SearchConfig.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/SearchConfig.php new file mode 100644 index 0000000000..516cec5892 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Config/SearchConfig.php @@ -0,0 +1,82 @@ + null !== $appId ? $appId : getenv('ALGOLIA_APP_ID'), + 'apiKey' => null !== $apiKey ? $apiKey : getenv('ALGOLIA_API_KEY'), + ); + + return new static($config); + } + + public function getDefaultConfig() + { + return array( + 'appId' => '', + 'apiKey' => '', + 'hosts' => null, + 'readTimeout' => $this->defaultReadTimeout, + 'writeTimeout' => $this->defaultWriteTimeout, + 'connectTimeout' => $this->defaultConnectTimeout, + 'waitTaskTimeBeforeRetry' => $this->defaultWaitTaskTimeBeforeRetry, + 'defaultHeaders' => array(), + 'defaultForwardToReplicas' => null, + 'batchSize' => 1000, + ); + } + + public function getWaitTaskTimeBeforeRetry() + { + return $this->config['waitTaskTimeBeforeRetry']; + } + + public function setWaitTaskTimeBeforeRetry($time) + { + if (!is_numeric($time)) { + throw new \InvalidArgumentException('Time before retry must be a numeric value'); + } + + $this->config['waitTaskTimeBeforeRetry'] = $time; + + return $this; + } + + public function getDefaultForwardToReplicas() + { + return $this->config['defaultForwardToReplicas']; + } + + public function setDefaultForwardToReplicas($default) + { + if (!is_bool($default)) { + throw new \InvalidArgumentException('Default configuration for ForwardToReplicas must be a boolean'); + } + + $this->config['defaultForwardToReplicas'] = $default; + + return $this; + } + + public function getBatchSize() + { + return $this->config['batchSize']; + } + + public function setBatchSize($batchSize) + { + if (!is_int($batchSize) || $batchSize < 1) { + throw new \InvalidArgumentException('Batch size must be an integer greater than 0'); + } + + $this->config['batchSize'] = $batchSize; + + return $this; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Exceptions/AlgoliaException.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Exceptions/AlgoliaException.php new file mode 100644 index 0000000000..0334990688 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Exceptions/AlgoliaException.php @@ -0,0 +1,7 @@ +request = $request; + + return $this; + } + + public function getRequest() + { + return $this->request; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Exceptions/RetriableException.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Exceptions/RetriableException.php new file mode 100644 index 0000000000..71ff5d4b09 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Exceptions/RetriableException.php @@ -0,0 +1,7 @@ +client = $client ?: static::buildClient(); + } + + public function sendRequest(RequestInterface $request, $timeout, $connectTimeout) + { + try { + $response = $this->client->send($request, array( + 'timeout' => $timeout, + 'connect_timeout' => $connectTimeout, + )); + } catch (GuzzleRequestException $e) { + if ($e->hasResponse()) { + return $e->getResponse(); + } else { + return new Response( + 0, + array(), + null, + '1.1', + $e->getMessage() + ); + } + } + + return $response; + } + + private static function buildClient(array $config = array()) + { + $handlerStack = new HandlerStack(\GuzzleHttp\choose_handler()); + $handlerStack->push(Middleware::prepareBody(), 'prepare_body'); + $config = array_merge(array('handler' => $handlerStack), $config); + + return new GuzzleClient($config); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/HttpClientInterface.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/HttpClientInterface.php new file mode 100644 index 0000000000..1e4985365d --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/HttpClientInterface.php @@ -0,0 +1,24 @@ +curlOptions = $curlOptions; + } + + public function sendRequest(RequestInterface $request, $timeout, $connectTimeout) + { + $curlHandle = curl_init(); + + // set curl options + try { + foreach ($this->curlOptions as $curlOption => $optionValue) { + curl_setopt($curlHandle, constant($curlOption), $optionValue); + } + } catch (\Exception $e) { + $this->invalidOptions($this->curlOptions, $e->getMessage()); + } + + $curlHeaders = array(); + foreach ($request->getHeaders() as $key => $values) { + $curlHeaders[] = $key.': '.implode(',', $values); + } + + curl_setopt($curlHandle, CURLOPT_HTTPHEADER, $curlHeaders); + + curl_setopt($curlHandle, CURLOPT_USERAGENT, implode(',', $request->getHeader('User-Agent'))); + //Return the output instead of printing it + curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curlHandle, CURLOPT_FAILONERROR, true); + curl_setopt($curlHandle, CURLOPT_ENCODING, ''); + curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, 2); + // TODO: look into cert +// curl_setopt($curlHandle, CURLOPT_CAINFO, $this->caInfoPath); + + curl_setopt($curlHandle, CURLOPT_URL, (string) $request->getUri()); + $version = curl_version(); + if (version_compare($version['version'], '7.16.2', '>=') && $connectTimeout < 1) { + curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT_MS, $connectTimeout * 1000); + curl_setopt($curlHandle, CURLOPT_TIMEOUT_MS, $timeout * 1000); + } else { + curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT, $connectTimeout); + curl_setopt($curlHandle, CURLOPT_TIMEOUT, $timeout); + } + + // The problem is that on (Li|U)nix, when libcurl uses the standard name resolver, + // a SIGALRM is raised during name resolution which libcurl thinks is the timeout alarm. + curl_setopt($curlHandle, CURLOPT_NOSIGNAL, 1); + curl_setopt($curlHandle, CURLOPT_FAILONERROR, false); + + $method = $request->getMethod(); + if ('GET' === $method) { + curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'GET'); + curl_setopt($curlHandle, CURLOPT_HTTPGET, true); + curl_setopt($curlHandle, CURLOPT_POST, false); + } else { + if ('POST' === $method) { + $body = (string) $request->getBody(); + curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt($curlHandle, CURLOPT_POST, true); + curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $body); + } elseif ('DELETE' === $method) { + curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'DELETE'); + curl_setopt($curlHandle, CURLOPT_POST, false); + } elseif ('PUT' === $method) { + $body = (string) $request->getBody(); + curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'PUT'); + curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $body); + curl_setopt($curlHandle, CURLOPT_POST, true); + } + } + $mhandle = $this->getMHandle($curlHandle); + + // Do all the processing. + $running = null; + do { + $mrc = curl_multi_exec($mhandle, $running); + } while (CURLM_CALL_MULTI_PERFORM == $mrc); + + while ($running && CURLM_OK == $mrc) { + if (-1 == curl_multi_select($mhandle, 0.1)) { + usleep(100); + } + do { + $mrc = curl_multi_exec($mhandle, $running); + } while (CURLM_CALL_MULTI_PERFORM == $mrc); + } + + $statusCode = (int) curl_getinfo($curlHandle, CURLINFO_HTTP_CODE); + $responseBody = curl_multi_getcontent($curlHandle); + $error = curl_error($curlHandle); + + $this->releaseMHandle($curlHandle); + curl_close($curlHandle); + + return new Response($statusCode, array(), $responseBody, '1.1', $error); + } + + private function getMHandle($curlHandle) + { + if (!is_resource($this->curlMHandle)) { + $this->curlMHandle = curl_multi_init(); + } + curl_multi_add_handle($this->curlMHandle, $curlHandle); + + return $this->curlMHandle; + } + + private function releaseMHandle($curlHandle) + { + curl_multi_remove_handle($this->curlMHandle, $curlHandle); + } + + private function invalidOptions(array $curlOptions = array(), $errorMsg = '') + { + throw new \OutOfBoundsException(sprintf('AlgoliaSearch curloptions options keys are invalid. %s given. error message : %s', json_encode($curlOptions), $errorMsg)); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/BufferStream.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/BufferStream.php new file mode 100644 index 0000000000..419726b6c9 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/BufferStream.php @@ -0,0 +1,141 @@ +hwm = $hwm; + } + + public function __toString() + { + return $this->getContents(); + } + + public function getContents() + { + $buffer = $this->buffer; + $this->buffer = ''; + + return $buffer; + } + + public function close() + { + $this->buffer = ''; + } + + public function detach() + { + $this->close(); + } + + public function getSize() + { + return strlen($this->buffer); + } + + public function isReadable() + { + return true; + } + + public function isWritable() + { + return true; + } + + public function isSeekable() + { + return false; + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + throw new \RuntimeException('Cannot seek a BufferStream'); + } + + public function eof() + { + return 0 === strlen($this->buffer); + } + + public function tell() + { + throw new \RuntimeException('Cannot determine the position of a BufferStream'); + } + + /** + * Reads data from the buffer. + */ + public function read($length) + { + $currentLength = strlen($this->buffer); + + if ($length >= $currentLength) { + // No need to slice the buffer because we don't have enough data. + $result = $this->buffer; + $this->buffer = ''; + } else { + // Slice up the result to provide a subset of the buffer. + $result = substr($this->buffer, 0, $length); + $this->buffer = substr($this->buffer, $length); + } + + return $result; + } + + /** + * Writes data to the buffer. + */ + public function write($string) + { + $this->buffer .= $string; + + // TODO: What should happen here? + if (strlen($this->buffer) >= $this->hwm) { + return false; + } + + return strlen($string); + } + + public function getMetadata($key = null) + { + if ('hwm' == $key) { + return $this->hwm; + } + + return $key ? null : array(); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/PumpStream.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/PumpStream.php new file mode 100644 index 0000000000..30f2298a75 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/PumpStream.php @@ -0,0 +1,169 @@ +source = $source; + $this->size = isset($options['size']) ? $options['size'] : null; + $this->metadata = isset($options['metadata']) ? $options['metadata'] : array(); + $this->buffer = new BufferStream(); + } + + public function __toString() + { + try { + return copy_to_string($this); + } catch (\Exception $e) { + return ''; + } + } + + public function close() + { + $this->detach(); + } + + public function detach() + { + $this->tellPos = false; + $this->source = null; + } + + public function getSize() + { + return $this->size; + } + + public function tell() + { + return $this->tellPos; + } + + public function eof() + { + return !$this->source; + } + + public function isSeekable() + { + return false; + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + throw new \RuntimeException('Cannot seek a PumpStream'); + } + + public function isWritable() + { + return false; + } + + public function write($string) + { + throw new \RuntimeException('Cannot write to a PumpStream'); + } + + public function isReadable() + { + return true; + } + + public function read($length) + { + $data = $this->buffer->read($length); + $readLen = strlen($data); + $this->tellPos += $readLen; + $remaining = $length - $readLen; + + if ($remaining) { + $this->pump($remaining); + $data .= $this->buffer->read($remaining); + $this->tellPos += strlen($data) - $readLen; + } + + return $data; + } + + public function getContents() + { + $result = ''; + while (!$this->eof()) { + $result .= $this->read(1000000); + } + + return $result; + } + + public function getMetadata($key = null) + { + if (!$key) { + return $this->metadata; + } + + return isset($this->metadata[$key]) ? $this->metadata[$key] : null; + } + + private function pump($length) + { + if ($this->source) { + do { + $data = call_user_func($this->source, $length); + if (false === $data || null === $data) { + $this->source = null; + + return; + } + $this->buffer->write($data); + $length -= strlen($data); + } while ($length > 0); + } + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Request.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Request.php new file mode 100644 index 0000000000..d7d1db719d --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Request.php @@ -0,0 +1,306 @@ + array of values */ + private $headers = array(); + + /** @var array Map of lowercase header name => original name at registration */ + private $headerNames = array(); + + /** @var string */ + private $protocol = '1.1'; + + /** @var StreamInterface */ + private $stream; + + /** + * @param string $method HTTP method + * @param string|UriInterface $uri URI + * @param array $headers Request headers + * @param string|resource|StreamInterface|null $body Request body + * @param string $version Protocol version + */ + public function __construct( + $method, + $uri, + array $headers = array(), + $body = null, + $version = '1.1' + ) { + if (!($uri instanceof UriInterface)) { + $uri = new Uri($uri); + } + + $this->method = strtoupper($method); + $this->uri = $uri; + $this->setHeaders($headers); + $this->protocol = $version; + + if (!$this->hasHeader('Host')) { + $this->updateHostFromUri(); + } + + if ('' !== $body && null !== $body) { + $this->stream = stream_for($body); + } + } + + public function getRequestTarget() + { + if (null !== $this->requestTarget) { + return $this->requestTarget; + } + + $target = $this->uri->getPath(); + if ('' == $target) { + $target = '/'; + } + if ('' != $this->uri->getQuery()) { + $target .= '?'.$this->uri->getQuery(); + } + + return $target; + } + + public function withRequestTarget($requestTarget) + { + if (preg_match('#\s#', $requestTarget)) { + throw new InvalidArgumentException('Invalid request target provided; cannot contain whitespace'); + } + + $new = clone $this; + $new->requestTarget = $requestTarget; + + return $new; + } + + public function getMethod() + { + return $this->method; + } + + public function withMethod($method) + { + $new = clone $this; + $new->method = strtoupper($method); + + return $new; + } + + public function getUri() + { + return $this->uri; + } + + public function withUri(UriInterface $uri, $preserveHost = false) + { + if ($uri === $this->uri) { + return $this; + } + + $new = clone $this; + $new->uri = $uri; + + if (!$preserveHost) { + $new->updateHostFromUri(); + } + + return $new; + } + + private function updateHostFromUri() + { + $host = $this->uri->getHost(); + + if ('' == $host) { + return; + } + + if (null !== ($port = $this->uri->getPort())) { + $host .= ':'.$port; + } + + if (isset($this->headerNames['host'])) { + $header = $this->headerNames['host']; + } else { + $header = 'Host'; + $this->headerNames['host'] = 'Host'; + } + // Ensure Host is the first header. + // See: http://tools.ietf.org/html/rfc7230#section-5.4 + $this->headers = array($header => array($host)) + $this->headers; + } + + public function getProtocolVersion() + { + return $this->protocol; + } + + public function withProtocolVersion($version) + { + if ($this->protocol === $version) { + return $this; + } + $new = clone $this; + $new->protocol = $version; + + return $new; + } + + public function getHeaders() + { + return $this->headers; + } + + public function hasHeader($header) + { + return isset($this->headerNames[strtolower($header)]); + } + + public function getHeader($header) + { + $header = strtolower($header); + if (!isset($this->headerNames[$header])) { + return array(); + } + $header = $this->headerNames[$header]; + + return $this->headers[$header]; + } + + public function getHeaderLine($header) + { + return implode(', ', $this->getHeader($header)); + } + + public function withHeader($header, $value) + { + if (!is_array($value)) { + $value = array($value); + } + $value = $this->trimHeaderValues($value); + $normalized = strtolower($header); + $new = clone $this; + if (isset($new->headerNames[$normalized])) { + unset($new->headers[$new->headerNames[$normalized]]); + } + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + + return $new; + } + + public function withAddedHeader($header, $value) + { + if (!is_array($value)) { + $value = array($value); + } + $value = $this->trimHeaderValues($value); + $normalized = strtolower($header); + $new = clone $this; + if (isset($new->headerNames[$normalized])) { + $header = $this->headerNames[$normalized]; + $new->headers[$header] = array_merge($this->headers[$header], $value); + } else { + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + } + + return $new; + } + + public function withoutHeader($header) + { + $normalized = strtolower($header); + if (!isset($this->headerNames[$normalized])) { + return $this; + } + $header = $this->headerNames[$normalized]; + $new = clone $this; + unset($new->headers[$header], $new->headerNames[$normalized]); + + return $new; + } + + public function getBody() + { + if (!$this->stream) { + $this->stream = stream_for(''); + } + + return $this->stream; + } + + public function withBody(StreamInterface $body) + { + if ($body === $this->stream) { + return $this; + } + $new = clone $this; + $new->stream = $body; + + return $new; + } + + private function setHeaders(array $headers) + { + $this->headerNames = $this->headers = array(); + foreach ($headers as $header => $value) { + if (!is_array($value)) { + $value = array($value); + } + $value = $this->trimHeaderValues($value); + $normalized = strtolower($header); + if (isset($this->headerNames[$normalized])) { + $header = $this->headerNames[$normalized]; + $this->headers[$header] = array_merge($this->headers[$header], $value); + } else { + $this->headerNames[$normalized] = $header; + $this->headers[$header] = $value; + } + } + } + + /** + * Trims whitespace from the header values. + * + * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. + * + * header-field = field-name ":" OWS field-value OWS + * OWS = *( SP / HTAB ) + * + * @param string[] $values Header values + * + * @return string[] Trimmed header values + * + * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 + */ + private function trimHeaderValues(array $values) + { + return array_map(function ($value) { + return trim($value, " \t"); + }, $values); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Response.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Response.php new file mode 100644 index 0000000000..e44aea91c8 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Response.php @@ -0,0 +1,312 @@ + array of values */ + private $headers = array(); + + /** @var array Map of lowercase header name => original name at registration */ + private $headerNames = array(); + + /** @var string */ + private $protocol = '1.1'; + + /** @var StreamInterface */ + private $stream; + + /** @var array Map of standard HTTP status code/reason phrases */ + private static $phrases = array( + 100 => 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-status', + 208 => 'Already Reported', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 306 => 'Switch Proxy', + 307 => 'Temporary Redirect', + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Time-out', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Large', + 415 => 'Unsupported Media Type', + 416 => 'Requested range not satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Unordered Collection', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 451 => 'Unavailable For Legal Reasons', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Time-out', + 505 => 'HTTP Version not supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 511 => 'Network Authentication Required', + ); + + /** @var string */ + private $reasonPhrase = ''; + + /** @var int */ + private $statusCode = 200; + + /** + * @param int $status Status code + * @param array $headers Response headers + * @param string|resource|StreamInterface|null $body Response body + * @param string $version Protocol version + * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) + */ + public function __construct( + $status = 200, + array $headers = array(), + $body = null, + $version = '1.1', + $reason = null + ) { + $this->statusCode = (int) $status; + + if ('' !== $body && null !== $body) { + $this->stream = stream_for($body); + } + + $this->setHeaders($headers); + if ('' == $reason && isset(self::$phrases[$this->statusCode])) { + $this->reasonPhrase = self::$phrases[$this->statusCode]; + } else { + $this->reasonPhrase = (string) $reason; + } + + $this->protocol = $version; + } + + public function getStatusCode() + { + return $this->statusCode; + } + + public function getReasonPhrase() + { + return $this->reasonPhrase; + } + + public function withStatus($code, $reasonPhrase = '') + { + $new = clone $this; + $new->statusCode = (int) $code; + if ('' == $reasonPhrase && isset(self::$phrases[$new->statusCode])) { + $reasonPhrase = self::$phrases[$new->statusCode]; + } + $new->reasonPhrase = $reasonPhrase; + + return $new; + } + + public function getProtocolVersion() + { + return $this->protocol; + } + + public function withProtocolVersion($version) + { + if ($this->protocol === $version) { + return $this; + } + + $new = clone $this; + $new->protocol = $version; + + return $new; + } + + public function getHeaders() + { + return $this->headers; + } + + public function hasHeader($header) + { + return isset($this->headerNames[strtolower($header)]); + } + + public function getHeader($header) + { + $header = strtolower($header); + + if (!isset($this->headerNames[$header])) { + return array(); + } + + $header = $this->headerNames[$header]; + + return $this->headers[$header]; + } + + public function getHeaderLine($header) + { + return implode(', ', $this->getHeader($header)); + } + + public function withHeader($header, $value) + { + if (!is_array($value)) { + $value = array($value); + } + + $value = $this->trimHeaderValues($value); + $normalized = strtolower($header); + + $new = clone $this; + if (isset($new->headerNames[$normalized])) { + unset($new->headers[$new->headerNames[$normalized]]); + } + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + + return $new; + } + + public function withAddedHeader($header, $value) + { + if (!is_array($value)) { + $value = array($value); + } + + $value = $this->trimHeaderValues($value); + $normalized = strtolower($header); + + $new = clone $this; + if (isset($new->headerNames[$normalized])) { + $header = $this->headerNames[$normalized]; + $new->headers[$header] = array_merge($this->headers[$header], $value); + } else { + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + } + + return $new; + } + + public function withoutHeader($header) + { + $normalized = strtolower($header); + + if (!isset($this->headerNames[$normalized])) { + return $this; + } + + $header = $this->headerNames[$normalized]; + + $new = clone $this; + unset($new->headers[$header], $new->headerNames[$normalized]); + + return $new; + } + + public function getBody() + { + if (!$this->stream) { + $this->stream = stream_for(''); + } + + return $this->stream; + } + + public function withBody(StreamInterface $body) + { + if ($body === $this->stream) { + return $this; + } + + $new = clone $this; + $new->stream = $body; + + return $new; + } + + private function setHeaders(array $headers) + { + $this->headerNames = $this->headers = array(); + foreach ($headers as $header => $value) { + if (!is_array($value)) { + $value = array($value); + } + + $value = $this->trimHeaderValues($value); + $normalized = strtolower($header); + if (isset($this->headerNames[$normalized])) { + $header = $this->headerNames[$normalized]; + $this->headers[$header] = array_merge($this->headers[$header], $value); + } else { + $this->headerNames[$normalized] = $header; + $this->headers[$header] = $value; + } + } + } + + /** + * Trims whitespace from the header values. + * + * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. + * + * header-field = field-name ":" OWS field-value OWS + * OWS = *( SP / HTAB ) + * + * @param string[] $values Header values + * + * @return string[] Trimmed header values + * + * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 + */ + private function trimHeaderValues(array $values) + { + return array_map(function ($value) { + return trim($value, " \t"); + }, $values); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Stream.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Stream.php new file mode 100644 index 0000000000..27f0b6eb7a --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Stream.php @@ -0,0 +1,278 @@ + array( + 'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true, + 'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true, + 'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true, + 'x+t' => true, 'c+t' => true, 'a+' => true, + ), + 'write' => array( + 'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true, + 'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true, + 'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true, + 'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true, + ), + ); + + /** + * This constructor accepts an associative array of options. + * + * - size: (int) If a read stream would otherwise have an indeterminate + * size, but the size is known due to foreknowledge, then you can + * provide that size, in bytes. + * - metadata: (array) Any additional metadata to return when the metadata + * of the stream is accessed. + * + * @param resource $stream stream resource to wrap + * @param array $options associative array of options + * + * @throws \InvalidArgumentException if the stream is not a stream resource + */ + public function __construct($stream, $options = array()) + { + if (!is_resource($stream)) { + throw new \InvalidArgumentException('Stream must be a resource'); + } + + if (isset($options['size'])) { + $this->size = $options['size']; + } + + $this->customMetadata = isset($options['metadata']) + ? $options['metadata'] + : array(); + + $this->stream = $stream; + $meta = stream_get_meta_data($this->stream); + $this->seekable = $meta['seekable']; + $this->readable = isset(self::$readWriteHash['read'][$meta['mode']]); + $this->writable = isset(self::$readWriteHash['write'][$meta['mode']]); + $this->uri = $this->getMetadata('uri'); + } + + /** + * Closes the stream when the destructed. + */ + public function __destruct() + { + $this->close(); + } + + public function __toString() + { + try { + $this->seek(0); + + return (string) stream_get_contents($this->stream); + } catch (\Exception $e) { + return ''; + } + } + + public function getContents() + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + $contents = stream_get_contents($this->stream); + + if (false === $contents) { + throw new \RuntimeException('Unable to read stream contents'); + } + + return $contents; + } + + public function close() + { + if (isset($this->stream)) { + if (is_resource($this->stream)) { + fclose($this->stream); + } + $this->detach(); + } + } + + public function detach() + { + if (!isset($this->stream)) { + return null; + } + + $result = $this->stream; + unset($this->stream); + $this->size = $this->uri = null; + $this->readable = $this->writable = $this->seekable = false; + + return $result; + } + + public function getSize() + { + if (null !== $this->size) { + return $this->size; + } + + if (!isset($this->stream)) { + return null; + } + + // Clear the stat cache if the stream has a URI + if ($this->uri) { + clearstatcache(true, $this->uri); + } + + $stats = fstat($this->stream); + if (isset($stats['size'])) { + $this->size = $stats['size']; + + return $this->size; + } + + return null; + } + + public function isReadable() + { + return $this->readable; + } + + public function isWritable() + { + return $this->writable; + } + + public function isSeekable() + { + return $this->seekable; + } + + public function eof() + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + return feof($this->stream); + } + + public function tell() + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + $result = ftell($this->stream); + + if (false === $result) { + throw new \RuntimeException('Unable to determine stream position'); + } + + return $result; + } + + public function rewind() + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET) + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->seekable) { + throw new \RuntimeException('Stream is not seekable'); + } + if (-1 === fseek($this->stream, $offset, $whence)) { + throw new \RuntimeException('Unable to seek to stream position '.$offset.' with whence '.var_export($whence, true)); + } + } + + public function read($length) + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->readable) { + throw new \RuntimeException('Cannot read from non-readable stream'); + } + if ($length < 0) { + throw new \RuntimeException('Length parameter cannot be negative'); + } + + if (0 === $length) { + return ''; + } + + $string = fread($this->stream, $length); + if (false === $string) { + throw new \RuntimeException('Unable to read from stream'); + } + + return $string; + } + + public function write($string) + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->writable) { + throw new \RuntimeException('Cannot write to a non-writable stream'); + } + + // We can't know the size after writing anything + $this->size = null; + $result = fwrite($this->stream, $string); + + if (false === $result) { + throw new \RuntimeException('Unable to write to stream'); + } + + return $result; + } + + public function getMetadata($key = null) + { + if (!isset($this->stream)) { + return $key ? null : array(); + } elseif (!$key) { + return $this->customMetadata + stream_get_meta_data($this->stream); + } elseif (isset($this->customMetadata[$key])) { + return $this->customMetadata[$key]; + } + + $meta = stream_get_meta_data($this->stream); + + return isset($meta[$key]) ? $meta[$key] : null; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Uri.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Uri.php new file mode 100644 index 0000000000..63b14cc736 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/Uri.php @@ -0,0 +1,710 @@ + 80, + 'https' => 443, + 'ftp' => 21, + 'gopher' => 70, + 'nntp' => 119, + 'news' => 119, + 'telnet' => 23, + 'tn3270' => 23, + 'imap' => 143, + 'pop' => 110, + 'ldap' => 389, + ); + + private static $charUnreserved = 'a-zA-Z0-9_\-\.~'; + + private static $charSubDelims = '!\$&\'\(\)\*\+,;='; + + private static $replaceQuery = array('=' => '%3D', '&' => '%26'); + + /** @var string Uri scheme. */ + private $scheme = ''; + + /** @var string Uri user info. */ + private $userInfo = ''; + + /** @var string Uri host. */ + private $host = ''; + + /** @var int|null Uri port. */ + private $port; + + /** @var string Uri path. */ + private $path = ''; + + /** @var string Uri query string. */ + private $query = ''; + + /** @var string Uri fragment. */ + private $fragment = ''; + + /** + * @param string $uri URI to parse + */ + public function __construct($uri = '') + { + // weak type check to also accept null until we can add scalar type hints + if ('' != $uri) { + $parts = parse_url($uri); + if (false === $parts) { + throw new \InvalidArgumentException("Unable to parse URI: $uri"); + } + $this->applyParts($parts); + } + } + + public function __toString() + { + return self::composeComponents( + $this->scheme, + $this->getAuthority(), + $this->path, + $this->query, + $this->fragment + ); + } + + /** + * Composes a URI reference string from its various components. + * + * Usually this method does not need to be called manually but instead is used indirectly via + * `Psr\Http\Message\UriInterface::__toString`. + * + * PSR-7 UriInterface treats an empty component the same as a missing component as + * getQuery(), getFragment() etc. always return a string. This explains the slight + * difference to RFC 3986 Section 5.3. + * + * Another adjustment is that the authority separator is added even when the authority is missing/empty + * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with + * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But + * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to + * that format). + * + * @param string $scheme + * @param string $authority + * @param string $path + * @param string $query + * @param string $fragment + * + * @return string + * + * @see https://tools.ietf.org/html/rfc3986#section-5.3 + */ + public static function composeComponents($scheme, $authority, $path, $query, $fragment) + { + $uri = ''; + + // weak type checks to also accept null until we can add scalar type hints + if ('' != $scheme) { + $uri .= $scheme.':'; + } + + if ('' != $authority || 'file' === $scheme) { + $uri .= '//'.$authority; + } + + $uri .= $path; + + if ('' != $query) { + $uri .= '?'.$query; + } + + if ('' != $fragment) { + $uri .= '#'.$fragment; + } + + return $uri; + } + + /** + * Whether the URI has the default port of the current scheme. + * + * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used + * independently of the implementation. + * + * @return bool + */ + public static function isDefaultPort(UriInterface $uri) + { + return null === $uri->getPort() + || (isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]); + } + + /** + * Whether the URI is absolute, i.e. it has a scheme. + * + * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true + * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative + * to another URI, the base URI. Relative references can be divided into several forms: + * - network-path references, e.g. '//example.com/path' + * - absolute-path references, e.g. '/path' + * - relative-path references, e.g. 'subpath' + * + * @return bool + * + * @see Uri::isNetworkPathReference + * @see Uri::isAbsolutePathReference + * @see Uri::isRelativePathReference + * @see https://tools.ietf.org/html/rfc3986#section-4 + */ + public static function isAbsolute(UriInterface $uri) + { + return '' !== $uri->getScheme(); + } + + /** + * Whether the URI is a network-path reference. + * + * A relative reference that begins with two slash characters is termed an network-path reference. + * + * @return bool + * + * @see https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isNetworkPathReference(UriInterface $uri) + { + return '' === $uri->getScheme() && '' !== $uri->getAuthority(); + } + + /** + * Whether the URI is a absolute-path reference. + * + * A relative reference that begins with a single slash character is termed an absolute-path reference. + * + * @return bool + * + * @see https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isAbsolutePathReference(UriInterface $uri) + { + $path = $uri->getPath(); + + return '' === $uri->getScheme() + && '' === $uri->getAuthority() + && isset($path[0]) + && '/' === $path[0]; + } + + /** + * Whether the URI is a relative-path reference. + * + * A relative reference that does not begin with a slash character is termed a relative-path reference. + * + * @return bool + * + * @see https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isRelativePathReference(UriInterface $uri) + { + $path = $uri->getPath(); + + return '' === $uri->getScheme() + && '' === $uri->getAuthority() + && (!isset($path[0]) || '/' !== $path[0]); + } + + /** + * Whether the URI is a same-document reference. + * + * A same-document reference refers to a URI that is, aside from its fragment + * component, identical to the base URI. When no base URI is given, only an empty + * URI reference (apart from its fragment) is considered a same-document reference. + * + * @param UriInterface $uri The URI to check + * @param UriInterface|null $base An optional base URI to compare against + * + * @return bool + * + * @see https://tools.ietf.org/html/rfc3986#section-4.4 + */ + public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null) + { + if (null !== $base) { + $uri = UriResolver::resolve($base, $uri); + + return ($uri->getScheme() === $base->getScheme()) + && ($uri->getAuthority() === $base->getAuthority()) + && ($uri->getPath() === $base->getPath()) + && ($uri->getQuery() === $base->getQuery()); + } + + return '' === $uri->getScheme() && '' === $uri->getAuthority() && '' === $uri->getPath() && '' === $uri->getQuery(); + } + + /** + * Removes dot segments from a path and returns the new path. + * + * @param string $path + * + * @return string + * + * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead. + * @see UriResolver::removeDotSegments + */ + public static function removeDotSegments($path) + { + return UriResolver::removeDotSegments($path); + } + + /** + * Converts the relative URI into a new URI that is resolved against the base URI. + * + * @param UriInterface $base Base URI + * @param string|UriInterface $rel Relative URI + * + * @return UriInterface + * + * @deprecated since version 1.4. Use UriResolver::resolve instead. + * @see UriResolver::resolve + */ + public static function resolve(UriInterface $base, $rel) + { + if (!($rel instanceof UriInterface)) { + $rel = new self($rel); + } + + return UriResolver::resolve($base, $rel); + } + + /** + * Creates a new URI with a specific query string value removed. + * + * Any existing query string values that exactly match the provided key are + * removed. + * + * @param uriInterface $uri URI to use as a base + * @param string $key query string key to remove + * + * @return UriInterface + */ + public static function withoutQueryValue(UriInterface $uri, $key) + { + $current = $uri->getQuery(); + if ('' === $current) { + return $uri; + } + + $decodedKey = rawurldecode($key); + $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) { + $parts = explode('=', $part); + + return rawurldecode($parts[0]) !== $decodedKey; + }); + + return $uri->withQuery(implode('&', $result)); + } + + /** + * Creates a new URI with a specific query string value. + * + * Any existing query string values that exactly match the provided key are + * removed and replaced with the given key value pair. + * + * A value of null will set the query string key without a value, e.g. "key" + * instead of "key=value". + * + * @param UriInterface $uri URI to use as a base + * @param string $key key to set + * @param string|null $value Value to set + * + * @return UriInterface + */ + public static function withQueryValue(UriInterface $uri, $key, $value) + { + $current = $uri->getQuery(); + + if ('' === $current) { + $result = array(); + } else { + $decodedKey = rawurldecode($key); + $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) { + $parts = explode('=', $part); + + return rawurldecode($parts[0]) !== $decodedKey; + }); + } + + // Query string separators ("=", "&") within the key or value need to be encoded + // (while preventing double-encoding) before setting the query string. All other + // chars that need percent-encoding will be encoded by withQuery(). + $key = strtr($key, self::$replaceQuery); + + if (null !== $value) { + $result[] = $key.'='.strtr($value, self::$replaceQuery); + } else { + $result[] = $key; + } + + return $uri->withQuery(implode('&', $result)); + } + + /** + * Creates a URI from a hash of `parse_url` components. + * + * @return UriInterface + * + * @see http://php.net/manual/en/function.parse-url.php + * + * @throws \InvalidArgumentException if the components do not form a valid URI + */ + public static function fromParts(array $parts) + { + $uri = new self(); + $uri->applyParts($parts); + $uri->validateState(); + + return $uri; + } + + public function getScheme() + { + return $this->scheme; + } + + public function getAuthority() + { + $authority = $this->host; + if ('' !== $this->userInfo) { + $authority = $this->userInfo.'@'.$authority; + } + + if (null !== $this->port) { + $authority .= ':'.$this->port; + } + + return $authority; + } + + public function getUserInfo() + { + return $this->userInfo; + } + + public function getHost() + { + return $this->host; + } + + public function getPort() + { + return $this->port; + } + + public function getPath() + { + return $this->path; + } + + public function getQuery() + { + return $this->query; + } + + public function getFragment() + { + return $this->fragment; + } + + public function withScheme($scheme) + { + $scheme = $this->filterScheme($scheme); + + if ($this->scheme === $scheme) { + return $this; + } + + $new = clone $this; + $new->scheme = $scheme; + $new->removeDefaultPort(); + $new->validateState(); + + return $new; + } + + public function withUserInfo($user, $password = null) + { + $info = $user; + if ('' != $password) { + $info .= ':'.$password; + } + + if ($this->userInfo === $info) { + return $this; + } + + $new = clone $this; + $new->userInfo = $info; + $new->validateState(); + + return $new; + } + + public function withHost($host) + { + $host = $this->filterHost($host); + + if ($this->host === $host) { + return $this; + } + + $new = clone $this; + $new->host = $host; + $new->validateState(); + + return $new; + } + + public function withPort($port) + { + $port = $this->filterPort($port); + + if ($this->port === $port) { + return $this; + } + + $new = clone $this; + $new->port = $port; + $new->removeDefaultPort(); + $new->validateState(); + + return $new; + } + + public function withPath($path) + { + $path = $this->filterPath($path); + + if ($this->path === $path) { + return $this; + } + + $new = clone $this; + $new->path = $path; + $new->validateState(); + + return $new; + } + + public function withQuery($query) + { + $query = $this->filterQueryAndFragment($query); + + if ($this->query === $query) { + return $this; + } + + $new = clone $this; + $new->query = $query; + + return $new; + } + + public function withFragment($fragment) + { + $fragment = $this->filterQueryAndFragment($fragment); + + if ($this->fragment === $fragment) { + return $this; + } + + $new = clone $this; + $new->fragment = $fragment; + + return $new; + } + + /** + * Apply parse_url parts to a URI. + * + * @param array $parts array of parse_url parts to apply + */ + private function applyParts(array $parts) + { + $this->scheme = isset($parts['scheme']) + ? $this->filterScheme($parts['scheme']) + : ''; + $this->userInfo = isset($parts['user']) ? $parts['user'] : ''; + $this->host = isset($parts['host']) + ? $this->filterHost($parts['host']) + : ''; + $this->port = isset($parts['port']) + ? $this->filterPort($parts['port']) + : null; + $this->path = isset($parts['path']) + ? $this->filterPath($parts['path']) + : ''; + $this->query = isset($parts['query']) + ? $this->filterQueryAndFragment($parts['query']) + : ''; + $this->fragment = isset($parts['fragment']) + ? $this->filterQueryAndFragment($parts['fragment']) + : ''; + if (isset($parts['pass'])) { + $this->userInfo .= ':'.$parts['pass']; + } + + $this->removeDefaultPort(); + } + + /** + * @param string $scheme + * + * @return string + * + * @throws \InvalidArgumentException if the scheme is invalid + */ + private function filterScheme($scheme) + { + if (!is_string($scheme)) { + throw new \InvalidArgumentException('Scheme must be a string'); + } + + return strtolower($scheme); + } + + /** + * @param string $host + * + * @return string + * + * @throws \InvalidArgumentException if the host is invalid + */ + private function filterHost($host) + { + if (!is_string($host)) { + throw new \InvalidArgumentException('Host must be a string'); + } + + return strtolower($host); + } + + /** + * @param int|null $port + * + * @return int|null + * + * @throws \InvalidArgumentException if the port is invalid + */ + private function filterPort($port) + { + if (null === $port) { + return null; + } + + $port = (int) $port; + if (1 > $port || 0xffff < $port) { + throw new \InvalidArgumentException(sprintf('Invalid port: %d. Must be between 1 and 65535', $port)); + } + + return $port; + } + + private function removeDefaultPort() + { + if (null !== $this->port && self::isDefaultPort($this)) { + $this->port = null; + } + } + + /** + * Filters the path of a URI. + * + * @param string $path + * + * @return string + * + * @throws \InvalidArgumentException if the path is invalid + */ + private function filterPath($path) + { + if (!is_string($path)) { + throw new \InvalidArgumentException('Path must be a string'); + } + + return preg_replace_callback( + '/(?:[^'.self::$charUnreserved.self::$charSubDelims.'%:@\/]++|%(?![A-Fa-f0-9]{2}))/', + array($this, 'rawurlencodeMatchZero'), + $path + ); + } + + /** + * Filters the query string or fragment of a URI. + * + * @param string $str + * + * @return string + * + * @throws \InvalidArgumentException if the query or fragment is invalid + */ + private function filterQueryAndFragment($str) + { + if (!is_string($str)) { + throw new \InvalidArgumentException('Query and fragment must be a string'); + } + + return preg_replace_callback( + '/(?:[^'.self::$charUnreserved.self::$charSubDelims.'%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/', + array($this, 'rawurlencodeMatchZero'), + $str + ); + } + + private function rawurlencodeMatchZero(array $match) + { + return rawurlencode($match[0]); + } + + private function validateState() + { + if ('' === $this->host && ('http' === $this->scheme || 'https' === $this->scheme)) { + $this->host = self::HTTP_DEFAULT_HOST; + } + + if ('' === $this->getAuthority()) { + if (0 === strpos($this->path, '//')) { + throw new \InvalidArgumentException('The path of a URI without an authority must not start with two slashes "//"'); + } + $parts = explode('/', $this->path, 2); + if ('' === $this->scheme && false !== strpos($parts[0], ':')) { + throw new \InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon'); + } + } elseif (isset($this->path[0]) && '/' !== $this->path[0]) { + @trigger_error( + 'The path of a URI with an authority must start with a slash "/" or be empty. Automagically fixing the URI '. + 'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.', + E_USER_DEPRECATED + ); + $this->path = '/'.$this->path; + //throw new \InvalidArgumentException('The path of a URI with an authority must start with a slash "/" or be empty'); + } + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/UriResolver.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/UriResolver.php new file mode 100644 index 0000000000..46b228e964 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/UriResolver.php @@ -0,0 +1,227 @@ +getScheme()) { + return $rel->withPath(self::removeDotSegments($rel->getPath())); + } + + if ('' != $rel->getAuthority()) { + $targetAuthority = $rel->getAuthority(); + $targetPath = self::removeDotSegments($rel->getPath()); + $targetQuery = $rel->getQuery(); + } else { + $targetAuthority = $base->getAuthority(); + if ('' === $rel->getPath()) { + $targetPath = $base->getPath(); + $targetQuery = '' != $rel->getQuery() ? $rel->getQuery() : $base->getQuery(); + } else { + $path = $rel->getPath(); + if ('/' === $path[0]) { + $targetPath = $rel->getPath(); + } else { + if ('' != $targetAuthority && '' === $base->getPath()) { + $targetPath = '/'.$rel->getPath(); + } else { + $lastSlashPos = strrpos($base->getPath(), '/'); + if (false === $lastSlashPos) { + $targetPath = $rel->getPath(); + } else { + $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1).$rel->getPath(); + } + } + } + $targetPath = self::removeDotSegments($targetPath); + $targetQuery = $rel->getQuery(); + } + } + + return new Uri(Uri::composeComponents( + $base->getScheme(), + $targetAuthority, + $targetPath, + $targetQuery, + $rel->getFragment() + )); + } + + /** + * Returns the target URI as a relative reference from the base URI. + * + * This method is the counterpart to resolve(): + * + * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) + * + * One use-case is to use the current request URI as base URI and then generate relative links in your documents + * to reduce the document size or offer self-contained downloadable document archives. + * + * $base = new Uri('http://example.com/a/b/'); + * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. + * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. + * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. + * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. + * + * This method also accepts a target that is already relative and will try to relativize it further. Only a + * relative-path reference will be returned as-is. + * + * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well + * + * @param UriInterface $base Base URI + * @param UriInterface $target Target URI + * + * @return UriInterface The relative URI reference + */ + public static function relativize(UriInterface $base, UriInterface $target) + { + if ('' !== $target->getScheme() && + ($base->getScheme() !== $target->getScheme() || '' === $target->getAuthority() && '' !== $base->getAuthority()) + ) { + return $target; + } + + if (Uri::isRelativePathReference($target)) { + // As the target is already highly relative we return it as-is. It would be possible to resolve + // the target with `$target = self::resolve($base, $target);` and then try make it more relative + // by removing a duplicate query. But let's not do that automatically. + return $target; + } + + if ('' !== $target->getAuthority() && $base->getAuthority() !== $target->getAuthority()) { + return $target->withScheme(''); + } + + // We must remove the path before removing the authority because if the path starts with two slashes, the URI + // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also + // invalid. + $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); + + if ($base->getPath() !== $target->getPath()) { + return $emptyPathUri->withPath(self::getRelativePath($base, $target)); + } + + if ($base->getQuery() === $target->getQuery()) { + // Only the target fragment is left. And it must be returned even if base and target fragment are the same. + return $emptyPathUri->withQuery(''); + } + + // If the base URI has a query but the target has none, we cannot return an empty path reference as it would + // inherit the base query component when resolving. + if ('' === $target->getQuery()) { + $segments = explode('/', $target->getPath()); + $lastSegment = end($segments); + + return $emptyPathUri->withPath('' === $lastSegment ? './' : $lastSegment); + } + + return $emptyPathUri; + } + + private static function getRelativePath(UriInterface $base, UriInterface $target) + { + $sourceSegments = explode('/', $base->getPath()); + $targetSegments = explode('/', $target->getPath()); + array_pop($sourceSegments); + $targetLastSegment = array_pop($targetSegments); + foreach ($sourceSegments as $i => $segment) { + if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { + unset($sourceSegments[$i], $targetSegments[$i]); + } else { + break; + } + } + $targetSegments[] = $targetLastSegment; + $relativePath = str_repeat('../', count($sourceSegments)).implode('/', $targetSegments); + + // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". + // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used + // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. + $pathParts = explode('/', $relativePath, 2); + if ('' === $relativePath || false !== strpos($pathParts[0], ':')) { + $relativePath = "./$relativePath"; + } elseif ('/' === $relativePath[0]) { + if ('' != $base->getAuthority() && '' === $base->getPath()) { + // In this case an extra slash is added by resolve() automatically. So we must not add one here. + $relativePath = ".$relativePath"; + } else { + $relativePath = "./$relativePath"; + } + } + + return $relativePath; + } + + private function __construct() + { + // cannot be instantiated + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/functions.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/functions.php new file mode 100644 index 0000000000..05c50f3df5 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Http/Psr7/functions.php @@ -0,0 +1,82 @@ +valid()) { + return false; + } + $result = $resource->current(); + $resource->next(); + + return $result; + }, $options); + } elseif (method_exists($resource, '__toString')) { + return stream_for((string) $resource, $options); + } + + break; + case 'NULL': + return new Stream(fopen('php://temp', 'r+'), $options); + } + if (is_callable($resource)) { + return new PumpStream($resource, $options); + } + + throw new \InvalidArgumentException('Invalid resource type: '.gettype($resource)); +} + +/** + * @internal + */ +function copy_to_string(StreamInterface $stream, $maxLen = -1) +{ + $buffer = ''; + if (-1 === $maxLen) { + while (!$stream->eof()) { + $buf = $stream->read(1048576); + // Using a loose equality here to match on '' and false. + if (null == $buf) { + break; + } + $buffer .= $buf; + } + + return $buffer; + } + $len = 0; + while (!$stream->eof() && $len < $maxLen) { + $buf = $stream->read($maxLen - $len); + // Using a loose equality here to match on '' and false. + if (null == $buf) { + break; + } + $buffer .= $buf; + $len = strlen($buffer); + } + + return $buffer; +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Insights/UserInsightsClient.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Insights/UserInsightsClient.php new file mode 100644 index 0000000000..62c5330203 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Insights/UserInsightsClient.php @@ -0,0 +1,137 @@ +client = $client; + $this->userToken = $userToken; + } + + public function clickedFilters($eventName, $indexName, $filters, $requestOptions = array()) + { + return $this->clicked(array('filters' => $filters), $eventName, $indexName, $requestOptions); + } + + public function clickedObjectIDs($eventName, $indexName, $objectIDs, $requestOptions = array()) + { + return $this->clicked(array('objectIDs' => $objectIDs), $eventName, $indexName, $requestOptions); + } + + public function clickedObjectIDsAfterSearch($eventName, $indexName, $objectIDs, $positions, $queryID, $requestOptions = array()) + { + $event = array( + 'objectIDs' => $objectIDs, + 'positions' => $positions, + 'queryID' => $queryID, + ); + + return $this->clicked($event, $eventName, $indexName, $requestOptions); + } + + private function clicked($event, $eventName, $indexName, $requestOptions) + { + $event = array_merge($event, array( + 'eventType' => 'click', + 'eventName' => $eventName, + 'index' => $indexName, + )); + + return $this->sendEvent($event, $requestOptions); + } + + public function convertedFilters($eventName, $indexName, $filters, $requestOptions = array()) + { + return $this->converted(array('filters' => $filters), $eventName, $indexName, $requestOptions); + } + + public function convertedObjectIDs($eventName, $indexName, $objectIDs, $requestOptions = array()) + { + return $this->converted(array('objectIDs' => $objectIDs), $eventName, $indexName, $requestOptions); + } + + public function convertedObjectIDsAfterSearch($eventName, $indexName, $objectIDs, $queryID, $requestOptions = array()) + { + $event = array( + 'objectIDs' => $objectIDs, + 'queryID' => $queryID, + ); + + return $this->converted($event, $eventName, $indexName, $requestOptions); + } + + private function converted($event, $eventName, $indexName, $requestOptions) + { + $event = array_merge($event, array( + 'eventType' => 'conversion', + 'eventName' => $eventName, + 'index' => $indexName, + )); + + return $this->sendEvent($event, $requestOptions); + } + + public function viewedFilters($eventName, $indexName, $filters, $requestOptions = array()) + { + $event = array( + 'filters' => $filters, + ); + + return $this->viewed($event, $eventName, $indexName, $requestOptions); + } + + public function viewedObjectIDs($eventName, $indexName, $objectIDs, $requestOptions = array()) + { + $event = array( + 'objectIDs' => $objectIDs, + ); + + return $this->viewed($event, $eventName, $indexName, $requestOptions); + } + + private function viewed($event, $eventName, $indexName, $requestOptions) + { + $event = array_merge($event, array( + 'eventType' => 'view', + 'eventName' => $eventName, + 'index' => $indexName, + )); + + return $this->sendEvent($event, $requestOptions); + } + + private function sendEvent($event, $requestOptions = array()) + { + return $this->client->sendEvent($this->reformatEvent($event), $requestOptions); + } + + private function reformatEvent($e) + { + if (isset($e['objectIDs']) && !is_array($e['objectIDs'])) { + $e['objectIDs'] = array($e['objectIDs']); + } + + if (isset($e['filters']) && !is_array($e['filters'])) { + $e['filters'] = array($e['filters']); + } + + if (isset($e['positions']) && !is_array($e['positions'])) { + $e['positions'] = array($e['positions']); + } + + $e['userToken'] = $this->userToken; + + return $e; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/InsightsClient.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/InsightsClient.php new file mode 100644 index 0000000000..db53a50e96 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/InsightsClient.php @@ -0,0 +1,71 @@ +api = $api; + $this->config = $config; + } + + public static function create($appId = null, $apiKey = null, $region = null) + { + $config = InsightsConfig::create($appId, $apiKey, $region); + + return static::createWithConfig($config); + } + + public static function createWithConfig(InsightsConfig $config) + { + $config = clone $config; + + if ($hosts = $config->getHosts()) { + // If a list of hosts was passed, we ignore the cache + $clusterHosts = ClusterHosts::create($hosts); + } else { + $clusterHosts = ClusterHosts::createForInsights($config->getRegion()); + } + + $apiWrapper = new ApiWrapper( + Algolia::getHttpClient(), + $config, + $clusterHosts + ); + + return new static($apiWrapper, $config); + } + + public function user($userToken) + { + return new UserInsightsClient($this, $userToken); + } + + public function sendEvent($event, $requestOptions = array()) + { + return $this->sendEvents(array($event), $requestOptions); + } + + public function sendEvents($events, $requestOptions = array()) + { + $payload = array('events' => $events); + + return $this->api->write('POST', api_path('/1/events'), $payload, $requestOptions); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/AbstractAlgoliaIterator.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/AbstractAlgoliaIterator.php new file mode 100644 index 0000000000..0782849461 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/AbstractAlgoliaIterator.php @@ -0,0 +1,128 @@ +indexName = $indexName; + $this->api = $api; + $this->requestOptions = $requestOptions + array( + 'hitsPerPage' => 1000, + ); + + $this->fetchNextPage(); + } + + /** + * Return the current element. + * + * @return array + */ + public function current() + { + $hit = $this->response['hits'][$this->batchKey]; + + return $this->formatHit($hit); + } + + /** + * Move forward to next element. + */ + public function next() + { + $this->key++; + $this->batchKey++; + if ($this->valid()) { + return; + } + + $this->fetchNextPage(); + } + + /** + * Return the key of the current element. + * + * @return int + */ + public function key() + { + return $this->key; + } + + /** + * Checks if current position is valid. If the current position + * is not valid, we call Algolia' API to load more results + * until it's the last page. + * + * @return bool the return value will be casted to boolean and then evaluated. + * Returns true on success or false on failure + */ + public function valid() + { + return isset($this->response['hits'][$this->batchKey]); + } + + /** + * Rewind the Iterator to the first element. + */ + public function rewind() + { + if (0 !== $this->key) { + $this->key = 0; + $this->batchKey = 0; + $this->page = 0; + $this->response = null; + $this->fetchNextPage(); + } + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/ObjectIterator.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/ObjectIterator.php new file mode 100644 index 0000000000..3d22525fb4 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/ObjectIterator.php @@ -0,0 +1,47 @@ +response['cursor']) ? $this->response['cursor'] : null; + } + + /** + * Exporting objects (records) doesn't use the search function but the + * browse method, no client-side formatting is required. + * + * @return array the exact same $hit + */ + protected function formatHit(array $hit) + { + return $hit; + } + + protected function fetchNextPage() + { + if (is_array($this->response) && !isset($this->response['cursor'])) { + return; + } + + $cursor = array(); + if (isset($this->response['cursor'])) { + $cursor['cursor'] = $this->response['cursor']; + } + + $this->response = $this->api->read( + 'POST', + Helpers::apiPath('/1/indexes/%s/browse', $this->indexName), + array_merge( + $this->requestOptions, + $cursor + ) + ); + + $this->batchKey = 0; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/RuleIterator.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/RuleIterator.php new file mode 100644 index 0000000000..361b801d4a --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/RuleIterator.php @@ -0,0 +1,34 @@ +response) && $this->key >= $this->response['nbHits']) { + return; + } + + $this->response = $this->api->read( + 'POST', + Helpers::apiPath('/1/indexes/%s/rules/search', $this->indexName), + array_merge( + $this->requestOptions, + array('page' => $this->page) + ) + ); + + $this->batchKey = 0; + $this->page++; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/SynonymIterator.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/SynonymIterator.php new file mode 100644 index 0000000000..acb8268a84 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Iterators/SynonymIterator.php @@ -0,0 +1,34 @@ +response) && $this->key >= $this->response['nbHits']) { + return; + } + + $this->response = $this->api->read( + 'POST', + Helpers::apiPath('/1/indexes/%s/synonyms/search', $this->indexName), + array_merge( + $this->requestOptions, + array('page' => $this->page) + ) + ); + + $this->batchKey = 0; + $this->page++; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Log/DebugLogger.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Log/DebugLogger.php new file mode 100644 index 0000000000..27db1d0e41 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Log/DebugLogger.php @@ -0,0 +1,57 @@ + $level, + 'message' => $message, + 'context' => $context, + ); + + if (function_exists('dump')) { + dump($logMessage); + } else { + var_dump($logMessage); + } + } + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/PlacesClient.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/PlacesClient.php new file mode 100644 index 0000000000..2047dda987 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/PlacesClient.php @@ -0,0 +1,83 @@ +api = $api; + $this->config = $config; + } + + public static function create($appId = null, $apiKey = null) + { + $config = PlacesConfig::create($appId, $apiKey); + + return static::createWithConfig($config); + } + + public static function createWithConfig(PlacesConfig $config) + { + $config = clone $config; + + $cacheKey = sprintf('%s-clusterHosts-%s', __CLASS__, $config->getAppId()); + + if ($hosts = $config->getHosts()) { + // If a list of hosts was passed, we ignore the cache + $clusterHosts = ClusterHosts::create($hosts); + } elseif (false === ($clusterHosts = ClusterHosts::createFromCache($cacheKey))) { + // We'll try to restore the ClusterHost from cache, if we cannot + // we create a new instance and set the cache key + $clusterHosts = ClusterHosts::createForPlaces() + ->setCacheKey($cacheKey); + } + + $apiWrapper = new ApiWrapper( + Algolia::getHttpClient(), + $config, + $clusterHosts + ); + + return new static($apiWrapper, $config); + } + + public function search($query, $requestOptions = array()) + { + $query = (string) $query; + + if (is_array($requestOptions)) { + $requestOptions['query'] = $query; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addBodyParameter('query', $query); + } + + return $this->api->read('POST', api_path('/1/places/query'), $requestOptions); + } + + public function getObject($objectID, $requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/places/%s', $objectID), $requestOptions); + } + + public function custom($method, $path, $requestOptions = array(), $hosts = null) + { + return $this->api->send($method, $path, $requestOptions, $hosts); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RecommendationClient.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RecommendationClient.php new file mode 100644 index 0000000000..4d82dadce1 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RecommendationClient.php @@ -0,0 +1,88 @@ +api = $api; + $this->config = $config; + } + + /** + * @param string|null $appId + * @param string|null $apiKey + * @param string|null $region + * + * @return RecommendationClient + */ + public static function create($appId = null, $apiKey = null, $region = null) + { + $config = RecommendationConfig::create($appId, $apiKey, $region); + + return static::createWithConfig($config); + } + + /** + * @return RecommendationClient + */ + public static function createWithConfig(RecommendationConfig $config) + { + $config = clone $config; + + if ($hosts = $config->getHosts()) { + // If a list of hosts was passed, we ignore the cache + $clusterHosts = ClusterHosts::create($hosts); + } else { + $clusterHosts = ClusterHosts::createForRecommendation($config->getRegion()); + } + + $apiWrapper = new ApiWrapper( + Algolia::getHttpClient(), + $config, + $clusterHosts + ); + + return new self($apiWrapper, $config); + } + + /** + * @param array|RequestOptions $requestOptions + * + * @return array + */ + public function getPersonalizationStrategy($requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/strategies/personalization'), $requestOptions); + } + + /** + * @param array $strategy + * @param array|RequestOptions $requestOptions + * + * @return array + */ + public function setPersonalizationStrategy($strategy, $requestOptions = array()) + { + return $this->api->write('POST', api_path('/1/strategies/personalization'), $strategy, $requestOptions); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RequestOptions/RequestOptions.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RequestOptions/RequestOptions.php new file mode 100644 index 0000000000..16500f0b80 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RequestOptions/RequestOptions.php @@ -0,0 +1,368 @@ +{$name} = $options[$name]; + } + } + + $this->readTimeout = $options['readTimeout']; + $this->writeTimeout = $options['writeTimeout']; + $this->connectTimeout = $options['connectTimeout']; + } + + /** + * Get the HTTP headers to add to the request. + * + * @return array List of name/value pairs + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Add a header to the list. If a value already exists for that name, it will be overwritten. + * + * @param string $name Name of the header + * @param string $value Value of the header + * + * @return $this + */ + public function addHeader($name, $value) + { + $this->headers[$name] = $value; + + return $this; + } + + /** + * @param $headers + * + * @return $this + */ + public function addHeaders($headers) + { + $this->headers = array_merge($this->headers, $headers); + + return $this; + } + + /** + * Add a new header to the list if there is no value already set. + * + * @param string $name Name of the header + * @param string $value Value of the header + * + * @return $this + */ + public function addDefaultHeader($name, $value) + { + if (!isset($this->headers[$name])) { + $this->headers[$name] = $value; + } + + return $this; + } + + /** + * Add the headers passed if the value isn't already set. + * + * @param array $headers List of header name/value pairs + * + * @return $this + */ + public function addDefaultHeaders($headers) + { + foreach ($headers as $name => $value) { + $this->addDefaultHeader($name, $value); + } + + return $this; + } + + /** + * Replace all existing headers with the given name/value pairs. + * + * @param array $headers List of header name/value pairs + * + * @return $this + */ + public function setHeaders($headers) + { + $this->headers = $headers; + + return $this; + } + + /** + * @return array List of name/value query parameters + */ + public function getQueryParameters() + { + return $this->query; + } + + /** + * @return string URL-encoded query string + */ + public function getBuiltQueryParameters() + { + return Helpers::buildQuery($this->query); + } + + /** + * Add a query parameter. If a value already exists for that name, it will be overwritten. + * + * @param string $name + * @param string $value + * + * @return $this + */ + public function addQueryParameter($name, $value) + { + $this->query[$name] = $value; + + return $this; + } + + /** + * Add a list of query parameters name/value pairs. + * If a value already exists for a name, it will be overwritten. + * + * @param $parameters + * + * @return $this + */ + public function addQueryParameters($parameters) + { + $this->query = array_merge($this->query, $parameters); + + return $this; + } + + /** + * Add a query parameter if it isn't already set. + * + * @param string $name Name of the query parameter + * @param string $value Value of the query parameter + * + * @return $this + */ + public function addDefaultQueryParameter($name, $value) + { + if (!isset($this->query[$name])) { + $this->query[$name] = $value; + } + + return $this; + } + + /** + * Add parameters if they aren't already set. + * + * @param array $queryParameters Query parameters name/value pairs + * + * @return $this + */ + public function addDefaultQueryParameters($queryParameters) + { + foreach ($queryParameters as $name => $value) { + $this->addDefaultQueryParameter($name, $value); + } + + return $this; + } + + /** + * Replace all existing query parameters with the given name/value pairs. + * + * @param array $queryParameters + * + * @return $this + */ + public function setQueryParameters($queryParameters) + { + $this->query = $queryParameters; + + return $this; + } + + /** + * Get HTTP body to add. + * + * @return array + */ + public function getBody() + { + return $this->body; + } + + /** + * Add a body parameter. If a value already exists for that name, it will be overwritten. + * + * @param string $name + * @param mixed $value + * + * @return $this + */ + public function addBodyParameter($name, $value) + { + $this->body[$name] = $value; + + return $this; + } + + /** + * Add parameters if they aren't already set. + * + * @param array $parameters Body parameters name/value pairs + * + * @return $this + */ + public function addBodyParameters($parameters) + { + $this->body = array_merge($this->body, $parameters); + + return $this; + } + + /** + * Add a body parameter if it isn't already set. + * + * @param string $name Name of the query parameter + * @param string $value Value of the query parameter + * + * @return $this + */ + public function addDefaultBodyParameter($name, $value) + { + if (!isset($this->body[$name])) { + $this->body[$name] = $value; + } + + return $this; + } + + /** + * Add parameters if they aren't already set. + * + * @param array $parameters Body parameters name/value pairs + * + * @return $this + */ + public function addDefaultBodyParameters($parameters) + { + foreach ($parameters as $name => $value) { + $this->addDefaultBodyParameter($name, $value); + } + + return $this; + } + + /** + * Replace all existing body parameters with the given name/value pairs. + * + * @param $body + * + * @return $this + */ + public function setBody($body) + { + $this->body = $body; + + return $this; + } + + /** + * Get timeout for read operations. + * + * @return int Timeout in seconds + */ + public function getReadTimeout() + { + return $this->readTimeout; + } + + /** + * Set timeout for read operations. + * + * @param int $readTimeout Timeout in seconds + * + * @return $this + */ + public function setReadTimeout($readTimeout) + { + $this->readTimeout = $readTimeout; + + return $this; + } + + /** + * Get timeout for write operations. + * + * @return int Timeout in seconds + */ + public function getWriteTimeout() + { + return $this->writeTimeout; + } + + /** + * Set timeout for write operations. + * + * @param int $writeTimeout Timeout in seconds + * + * @return $this + */ + public function setWriteTimeout($writeTimeout) + { + $this->writeTimeout = $writeTimeout; + + return $this; + } + + /** + * Get connect timeout. + * + * @return int Connect timeout in seconds + */ + public function getConnectTimeout() + { + return $this->connectTimeout; + } + + /** + * Set connect timeout. + * + * @param $connectTimeout Connect timeout in seconds + * + * @return $this + */ + public function setConnectTimeout($connectTimeout) + { + $this->connectTimeout = $connectTimeout; + + return $this; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RequestOptions/RequestOptionsFactory.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RequestOptions/RequestOptionsFactory.php new file mode 100644 index 0000000000..575eee473a --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RequestOptions/RequestOptionsFactory.php @@ -0,0 +1,132 @@ +config = $config; + } + + /** + * @param \Algolia\AlgoliaSearch\RequestOptions\RequestOptions|array $options + * @param array $defaults + * + * @return \Algolia\AlgoliaSearch\RequestOptions\RequestOptions + */ + public function create($options, $defaults = array()) + { + if (is_array($options)) { + $options += $defaults; + $options = $this->format($options); + $options = $this->normalize($options); + + $options = new RequestOptions($options); + } elseif ($options instanceof RequestOptions) { + $defaults = $this->create($defaults); + $options->addDefaultHeaders($defaults->getHeaders()); + $options->addDefaultQueryParameters($defaults->getQueryParameters()); + $options->addDefaultBodyParameters($defaults->getBody()); + } else { + throw new \InvalidArgumentException('RequestOptions can only be created from array or from RequestOptions object'); + } + + return $options->addDefaultHeaders($this->config->getDefaultHeaders()); + } + + public function createBodyLess($options, $defaults = array()) + { + $options = $this->create($options, $defaults); + + return $options + ->addQueryParameters($options->getBody()) + ->setBody(array()); + } + + private function normalize($options) + { + $normalized = array( + 'headers' => array( + 'X-Algolia-Application-Id' => $this->config->getAppId(), + 'X-Algolia-API-Key' => $this->config->getApiKey(), + 'User-Agent' => UserAgent::get(), + 'Content-Type' => 'application/json', + ), + 'query' => array(), + 'body' => array(), + 'readTimeout' => $this->config->getReadTimeout(), + 'writeTimeout' => $this->config->getWriteTimeout(), + 'connectTimeout' => $this->config->getConnectTimeout(), + ); + + foreach ($options as $optionName => $value) { + $type = $this->getOptionType($optionName); + + if (in_array($type, array('readTimeout', 'writeTimeout', 'connectTimeout'))) { + $normalized[$type] = $value; + } else { + $normalized[$type][$optionName] = $value; + } + } + + return $normalized; + } + + private function format($options) + { + foreach ($options as $name => $value) { + if (in_array($name, array('attributesToRetrieve', 'type'), true)) { + if (is_array($value)) { + $options[$name] = implode(',', $value); + } + } + } + + return $options; + } + + private function getOptionType($optionName) + { + if ($this->isValidHeaderName($optionName)) { + return 'headers'; + } elseif (in_array($optionName, $this->validQueryParameters, true)) { + return 'query'; + } elseif (in_array($optionName, array('connectTimeout', 'readTimeout', 'writeTimeout'), true)) { + return $optionName; + } else { + return 'body'; + } + } + + private function isValidHeaderName($name) + { + if (preg_match('/^X-[a-zA-Z-]+/', $name)) { + return true; + } + + if (in_array($name, $this->validHeaders, true)) { + return true; + } + + return false; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/AbstractResponse.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/AbstractResponse.php new file mode 100644 index 0000000000..3150a76d95 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/AbstractResponse.php @@ -0,0 +1,53 @@ +apiResponse; + } + + /** + * {@inheritdoc} + */ + public function offsetExists($offset) + { + return isset($this->apiResponse[$offset]); + } + + /** + * {@inheritdoc} + */ + public function offsetGet($offset) + { + return $this->apiResponse[$offset]; + } + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $value) + { + $this->apiResponse[$offset] = $value; + } + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset) + { + unset($this->apiResponse[$offset]); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/AddApiKeyResponse.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/AddApiKeyResponse.php new file mode 100644 index 0000000000..d90c876bc1 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/AddApiKeyResponse.php @@ -0,0 +1,54 @@ +apiResponse = $apiResponse; + $this->client = $client; + $this->config = $config; + } + + public function wait($requestOptions = array()) + { + if (!isset($this->client)) { + return $this; + } + + $key = $this->apiResponse['key']; + $retry = 1; + $time = $this->config->getWaitTaskTimeBeforeRetry(); + + do { + try { + $this->client->getApiKey($key, $requestOptions); + + unset($this->client, $this->config); + + return $this; + } catch (NotFoundException $e) { + // Try again + } + + $retry++; + $factor = ceil($retry / 10); + usleep($factor * $time); // 0.1 second + } while (true); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/BatchIndexingResponse.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/BatchIndexingResponse.php new file mode 100644 index 0000000000..e741b44f3d --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/BatchIndexingResponse.php @@ -0,0 +1,73 @@ +apiResponse = array_values($apiResponse); // Ensure there aren't any keys + $this->index = $index; + } + + public function wait($requestOptions = array()) + { + if (isset($this->index)) { + foreach ($this->apiResponse as $response) { + $this->index->waitTask($response['taskID'], $requestOptions); + } + unset($this->index); + } + + return $this; + } + + /** + * Count response for the operations. Because indexing objects + * is always split in batches, the apiResponse property and an + * array of response from the API. + * + * @return number of response from the API (number of batches sent) + */ + public function count() + { + return count($this->apiResponse); + } + + public function current() + { + return $this->apiResponse[$this->key]; + } + + public function next() + { + $this->key++; + } + + public function key() + { + return $this->key; + } + + public function valid() + { + return isset($this->apiResponse[$this->key]); + } + + public function rewind() + { + $this->key = 0; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/DeleteApiKeyResponse.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/DeleteApiKeyResponse.php new file mode 100644 index 0000000000..0ea45b1da0 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/DeleteApiKeyResponse.php @@ -0,0 +1,57 @@ +apiResponse = $apiResponse; + $this->client = $client; + $this->config = $config; + $this->key = $key; + } + + public function wait($requestOptions = array()) + { + if (!isset($this->client)) { + return $this; + } + + $retry = 1; + $time = $this->config->getWaitTaskTimeBeforeRetry(); + + do { + try { + $this->client->getApiKey($this->key, $requestOptions); + } catch (NotFoundException $e) { + unset($this->client, $this->config); + + return $this; + } + + $retry++; + $factor = ceil($retry / 10); + usleep($factor * $time); // 0.1 second + } while (true); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/IndexingResponse.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/IndexingResponse.php new file mode 100644 index 0000000000..dcf3b697dc --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/IndexingResponse.php @@ -0,0 +1,29 @@ +apiResponse = $apiResponse; + $this->index = $index; + } + + public function wait($requestOptions = array()) + { + if (isset($this->index)) { + $this->index->waitTask($this->apiResponse['taskID'], $requestOptions); + unset($this->index); + } + + return $this; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/MultiResponse.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/MultiResponse.php new file mode 100644 index 0000000000..fc42c0aa14 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/MultiResponse.php @@ -0,0 +1,52 @@ +apiResponse = $responses; + } + + public function wait($requestOptions = array()) + { + foreach ($this->apiResponse as $response) { + $response->wait(); + } + + return $this; + } + + public function count() + { + return count($this->apiResponse); + } + + public function current() + { + return $this->apiResponse[$this->key]; + } + + public function next() + { + $this->key++; + } + + public function key() + { + return $this->key; + } + + public function valid() + { + return isset($this->apiResponse[$this->key]); + } + + public function rewind() + { + $this->key = 0; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/MultipleIndexBatchIndexingResponse.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/MultipleIndexBatchIndexingResponse.php new file mode 100644 index 0000000000..1e44d88c1c --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/MultipleIndexBatchIndexingResponse.php @@ -0,0 +1,34 @@ +apiResponse = $apiResponse; + $this->client = $client; + } + + public function wait($requestOptions = array()) + { + if (!isset($this->client)) { + return $this; + } + + foreach ($this->apiResponse['taskID'] as $indexName => $taskId) { + $this->client->waitTask($indexName, $taskId, $requestOptions); + } + + unset($this->client); + + return $this; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/NullResponse.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/NullResponse.php new file mode 100644 index 0000000000..2fc75db001 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/NullResponse.php @@ -0,0 +1,16 @@ +apiResponse = array(); + } + + public function wait($requestOptions = array()) + { + return $this; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/RestoreApiKeyResponse.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/RestoreApiKeyResponse.php new file mode 100644 index 0000000000..dfe02baf19 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/RestoreApiKeyResponse.php @@ -0,0 +1,67 @@ +apiResponse = $apiResponse; + $this->client = $client; + $this->config = $config; + $this->key = $key; + } + + /** + * {@inheritdoc} + */ + public function wait($requestOptions = array()) + { + if (!isset($this->client)) { + return $this; + } + + $retry = 1; + $time = $this->config->getWaitTaskTimeBeforeRetry(); + + do { + try { + $this->client->getApiKey($this->key, $requestOptions); + + unset($this->client, $this->config); + + return $this; + } catch (NotFoundException $e) { + // Try again + } + + $retry++; + $factor = ceil($retry / 10); + usleep($factor * $time); // 0.1 second + } while (true); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/UpdateApiKeyResponse.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/UpdateApiKeyResponse.php new file mode 100644 index 0000000000..15d667cf94 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Response/UpdateApiKeyResponse.php @@ -0,0 +1,86 @@ +apiResponse = $apiResponse; + $this->client = $client; + $this->config = $config; + $this->keyParams = $this->filterOnlyKeyParams($requestOptions); + } + + public function wait($requestOptions = array()) + { + if (!isset($this->client)) { + return $this; + } + + $key = $this->apiResponse['key']; + $retry = 1; + $time = $this->config->getWaitTaskTimeBeforeRetry(); + + do { + try { + $this->client->getApiKey($key, $requestOptions); + + if ($this->isKeyUpdated($key, $this->keyParams)) { + unset($this->client, $this->config); + + return $this; + } + } catch (NotFoundException $e) { + // Try again + } + + $retry++; + $factor = ceil($retry / 10); + usleep($factor * $time); // 0.1 second + } while (true); + } + + private function isKeyUpdated($key, $keyParams) + { + $upToDate = true; + foreach ($keyParams as $param => $value) { + if (isset($key[$param])) { + $upToDate &= ($key[$param] == $value); + } + } + + return $upToDate; + } + + private function filterOnlyKeyParams($requestOptions) + { + $validKeyParams = array( + 'acl', 'indexes', 'referers', + 'restrictSources', 'queryParameters', 'description', + 'validity', 'maxQueriesPerIPPerHour', 'maxHitsPerQuery', + ); + + return array_intersect_key($requestOptions, array_flip($validKeyParams)); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/ApiWrapper.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/ApiWrapper.php new file mode 100644 index 0000000000..6c8f1a0a42 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/ApiWrapper.php @@ -0,0 +1,269 @@ +http = $http; + $this->config = $config; + $this->clusterHosts = $clusterHosts; + $this->requestOptionsFactory = $RqstOptsFactory ?: new RequestOptionsFactory($config); + $this->logger = $logger ?: Algolia::getLogger(); + if (defined('JSON_UNESCAPED_UNICODE')) { + // `JSON_UNESCAPED_UNICODE` is introduced in PHP 5.4.0 + $this->jsonOptions = JSON_UNESCAPED_UNICODE; + } + } + + public function read($method, $path, $requestOptions = array(), $defaultRequestOptions = array()) + { + if ('GET' === strtoupper($method)) { + $requestOptions = $this->requestOptionsFactory->createBodyLess($requestOptions, $defaultRequestOptions); + } else { + $requestOptions = $this->requestOptionsFactory->create($requestOptions, $defaultRequestOptions); + } + + return $this->request( + $method, + $path, + $requestOptions, + $this->clusterHosts->read(), + $requestOptions->getReadTimeout() + ); + } + + public function write($method, $path, $data = array(), $requestOptions = array(), $defaultRequestOptions = array()) + { + if ('DELETE' === strtoupper($method)) { + $requestOptions = $this->requestOptionsFactory->createBodyLess($requestOptions, $defaultRequestOptions); + $data = array(); + } else { + $requestOptions = $this->requestOptionsFactory->create($requestOptions, $defaultRequestOptions); + } + + return $this->request( + $method, + $path, + $requestOptions, + $this->clusterHosts->write(), + $requestOptions->getWriteTimeout(), + $data + ); + } + + public function send($method, $path, $requestOptions = array(), $hosts = null) + { + $requestOptions = $this->requestOptionsFactory->create($requestOptions); + + if (null === $hosts) { + $hosts = $this->clusterHosts->write(); + } elseif (!is_array($hosts)) { + $hosts = array($hosts); + } + + return $this->request( + $method, + $path, + $requestOptions, + $hosts, + $requestOptions->getWriteTimeout() + ); + } + + private function request($method, $path, RequestOptions $requestOptions, $hosts, $timeout, $data = array()) + { + $uri = $this->createUri($path) + ->withQuery($requestOptions->getBuiltQueryParameters()) + ->withScheme('https'); + + $body = array_merge($data, $requestOptions->getBody()); + + $logParams = array( + 'body' => $body, + 'headers' => $requestOptions->getHeaders(), + 'method' => $method, + 'query' => $requestOptions->getQueryParameters(), + ); + + $retry = 1; + foreach ($hosts as $host) { + $uri = $uri->withHost($host); + $request = null; + $logParams['retryNumber'] = $retry; + $logParams['host'] = (string) $uri; + + try { + $request = $this->createRequest( + $method, + $uri, + $requestOptions->getHeaders(), + $body + ); + + $this->log(LogLevel::DEBUG, 'Sending request.', $logParams); + + $response = $this->http->sendRequest( + $request, + $timeout * $retry, + $requestOptions->getConnectTimeout() * $retry + ); + + $responseBody = $this->handleResponse($response, $request); + + $logParams['response'] = $responseBody; + $this->log(LogLevel::DEBUG, 'Response received.', $logParams); + + return $responseBody; + } catch (RetriableException $e) { + $this->log(LogLevel::DEBUG, 'Host failed.', array_merge($logParams, array( + 'description' => $e->getMessage(), + ))); + + $this->clusterHosts->failed($host); + } catch (BadRequestException $e) { + unset($logParams['body'], $logParams['headers']); + $logParams['description'] = $e->getMessage(); + $this->log(LogLevel::WARNING, 'Bad request.', $logParams); + + throw $e; + } catch (\Exception $e) { + unset($logParams['body'], $logParams['headers']); + $logParams['description'] = $e->getMessage(); + $this->log(LogLevel::ERROR, 'Generic error.', $logParams); + + throw $e; + } + + $retry++; + } + + throw new UnreachableException(); + } + + private function handleResponse(ResponseInterface $response, RequestInterface $request) + { + $body = (string) $response->getBody(); + $statusCode = $response->getStatusCode(); + + if (0 === $statusCode || ($statusCode >= 100 && $statusCode < 200) || $statusCode >= 500) { + $reason = $response->getReasonPhrase(); + + if (null === $response->getReasonPhrase() || '' === $response->getReasonPhrase()) { + $reason = $statusCode >= 500 ? 'Internal Server Error' : 'Unreachable Host'; + } + + throw new RetriableException('Retriable failure on '.$request->getUri()->getHost().': '.$reason, $statusCode); + } + + $responseArray = Helpers::json_decode($body, true); + + if (404 == $statusCode) { + throw new NotFoundException($responseArray['message'], $statusCode); + } elseif ($statusCode >= 400) { + throw new BadRequestException($responseArray['message'], $statusCode); + } elseif (2 != (int) ($statusCode / 100)) { + throw new AlgoliaException($statusCode.': '.$body, $statusCode); + } + + return $responseArray; + } + + private function createUri($uri) + { + if ($uri instanceof UriInterface) { + return $uri; + } elseif (is_string($uri)) { + return new Uri($uri); + } + + throw new \InvalidArgumentException('URI must be a string or UriInterface'); + } + + private function createRequest( + $method, + $uri, + array $headers = array(), + $body = null, + $protocolVersion = '1.1' + ) { + if (is_array($body)) { + // Send an empty body instead of "[]" in case there are + // no content/params to send + if (empty($body)) { + $body = ''; + } else { + $body = \json_encode($body, $this->jsonOptions); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException('json_encode error: '.json_last_error_msg()); + } + } + } + + return new Request($method, $uri, $headers, $body, $protocolVersion); + } + + /** + * @param string $level + * @param string $message + */ + private function log($level, $message, array $context = array()) + { + $this->logger->log($level, 'Algolia API client: '.$message, $context); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/ApiWrapperInterface.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/ApiWrapperInterface.php new file mode 100644 index 0000000000..7e93f80343 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/ApiWrapperInterface.php @@ -0,0 +1,12 @@ +read = $read; + $this->write = $write; + } + + public static function create($read, $write = null) + { + if (null === $write) { + $write = $read; + } + + if (is_string($read)) { + $read = array($read => 0); + } + + if (is_string($write)) { + $write = array($write => 0); + } + + if (array_values($read) === $read) { + $read = array_fill_keys($read, 0); + } + + if (array_values($write) === $write) { + $write = array_fill_keys($write, 0); + } + + return new static(HostCollection::create($read), HostCollection::create($write)); + } + + public static function createFromAppId($applicationId) + { + $read = $write = array( + $applicationId.'-1.algolianet.com' => 0, + $applicationId.'-2.algolianet.com' => 0, + $applicationId.'-3.algolianet.com' => 0, + ); + + $read[$applicationId.'-dsn.algolia.net'] = 10; + $write[$applicationId.'.algolia.net'] = 10; + + return static::create($read, $write); + } + + public static function createForPlaces() + { + $read = $write = array( + 'places-1.algolianet.com' => 0, + 'places-2.algolianet.com' => 0, + 'places-3.algolianet.com' => 0, + ); + + $read['places-dsn.algolia.net'] = 10; + $write['places.algolia.net'] = 10; + + return static::create($read, $write); + } + + public static function createForAnalytics($region) + { + return static::create('analytics.'.$region.'.algolia.com'); + } + + public static function createForInsights($region) + { + return static::create('insights.'.$region.'.algolia.io'); + } + + public static function createForRecommendation($region) + { + return static::create('recommendation.'.$region.'.algolia.com'); + } + + public static function createFromCache($cacheKey) + { + if (!Algolia::isCacheEnabled()) { + return false; + } + + if (!Algolia::getCache()->has($cacheKey)) { + return false; + } + + return @unserialize(Algolia::getCache()->get($cacheKey)); + } + + public function read() + { + return $this->getUrls('read'); + } + + public function write() + { + return $this->getUrls('write'); + } + + public function failed($host) + { + $this->read->markAsDown($host); + $this->write->markAsDown($host); + + $this->updateCache(); + + return $this; + } + + public function reset() + { + $this->read->reset(); + $this->write->reset(); + + return $this; + } + + public function shuffle() + { + $this->read->shuffle(); + $this->write->shuffle(); + + return $this; + } + + /** + * Sets the cache key to save the state of the ClusterHosts. + * + * @param string $cacheKey + * + * @return $this + */ + public function setCacheKey($cacheKey) + { + $this->cacheKey = $cacheKey; + + return $this; + } + + private function getUrls($type) + { + $urls = $this->{$type}->getUrls(); + $lashHashName = 'last'.ucfirst($type).'Hash'; + + if (Algolia::isCacheEnabled()) { + $hash = sha1(implode('-', $urls)); + if ($hash !== $this->{$lashHashName}) { + $this->updateCache(); + } + $this->{$lashHashName} = $hash; + } + + return $urls; + } + + private function updateCache() + { + if (null !== $this->cacheKey && Algolia::isCacheEnabled()) { + Algolia::getCache()->set($this->cacheKey, serialize($this)); + } + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/Host.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/Host.php new file mode 100644 index 0000000000..d7685487ce --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/Host.php @@ -0,0 +1,65 @@ +url = $url; + $this->priority = $priority; + } + + public function getUrl() + { + return $this->url; + } + + public function getPriority() + { + return $this->priority; + } + + public function isUp() + { + if (!$this->up) { + $this->resetIfExpired(); + } + + return $this->up; + } + + public function markAsDown() + { + $this->up = false; + $this->lastCheck = time(); + } + + public function reset() + { + $this->up = true; + $this->lastCheck = null; + } + + private function resetIfExpired() + { + $expired = $this->lastCheck + self::TTL < time(); + + if ($expired) { + $this->reset(); + } + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/HostCollection.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/HostCollection.php new file mode 100644 index 0000000000..a8191484fb --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/RetryStrategy/HostCollection.php @@ -0,0 +1,85 @@ +hosts = $hosts; + + $this->shuffle(); + } + + public static function create(array $urlsWithPriority) + { + $hosts = array(); + foreach ($urlsWithPriority as $url => $priority) { + $hosts[] = new Host($url, $priority); + } + + return new static($hosts); + } + + public function get() + { + // We pass the result through array_values because sometimes + // we need to make sure you can access the first element + // via $result[0] + return array_values(array_filter($this->hosts, function (Host $host) { + return $host->isUp(); + })); + } + + public function getUrls() + { + return array_map(function (Host $host) { + return $host->getUrl(); + }, $this->get()); + } + + public function markAsDown($hostKey) + { + array_map(function (Host $host) use ($hostKey) { + if ($host->getUrl() === $hostKey) { + $host->markAsDown(); + } + }, $this->hosts); + } + + public function shuffle() + { + if (shuffle($this->hosts)) { + $this->sort(); + } + + return $this; + } + + public function reset() + { + foreach ($this->hosts as $host) { + $host->reset(); + } + + return $this; + } + + private function sort() + { + usort($this->hosts, function (Host $a, Host $b) { + $prioA = $a->getPriority(); + $prioB = $b->getPriority(); + if ($prioA == $prioB) { + return 0; + } + + return ($prioA > $prioB) ? -1 : 1; + }); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/SearchClient.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/SearchClient.php new file mode 100644 index 0000000000..20a08a0037 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/SearchClient.php @@ -0,0 +1,453 @@ +api = $apiWrapper; + $this->config = $config; + } + + public static function get() + { + if (!static::$client) { + static::$client = static::create(); + } + + return static::$client; + } + + public static function create($appId = null, $apiKey = null) + { + return static::createWithConfig(SearchConfig::create($appId, $apiKey)); + } + + public static function createWithConfig(SearchConfig $config) + { + $config = clone $config; + + $cacheKey = sprintf('%s-clusterHosts-%s', __CLASS__, $config->getAppId()); + + if ($hosts = $config->getHosts()) { + // If a list of hosts was passed, we ignore the cache + $clusterHosts = ClusterHosts::create($hosts); + } elseif (false === ($clusterHosts = ClusterHosts::createFromCache($cacheKey))) { + // We'll try to restore the ClusterHost from cache, if we cannot + // we create a new instance and set the cache key + $clusterHosts = ClusterHosts::createFromAppId($config->getAppId()) + ->setCacheKey($cacheKey); + } + + $apiWrapper = new ApiWrapper( + Algolia::getHttpClient(), + $config, + $clusterHosts + ); + + return new static($apiWrapper, $config); + } + + public function initIndex($indexName) + { + return new SearchIndex($indexName, $this->api, $this->config); + } + + public function getAppId() + { + return $this->config->getAppId(); + } + + public function moveIndex($srcIndexName, $newIndexName, $requestOptions = array()) + { + $response = $this->api->write( + 'POST', + api_path('/1/indexes/%s/operation', $srcIndexName), + array( + 'operation' => 'move', + 'destination' => $newIndexName, + ), + $requestOptions + ); + + return new IndexingResponse($response, $this->initIndex($srcIndexName)); + } + + public function copyIndex($srcIndexName, $destIndexName, $requestOptions = array()) + { + $response = $this->api->write( + 'POST', + api_path('/1/indexes/%s/operation', $srcIndexName), + array( + 'operation' => 'copy', + 'destination' => $destIndexName, + ), + $requestOptions + ); + + return new IndexingResponse($response, $this->initIndex($srcIndexName)); + } + + public function copySettings($srcIndexName, $destIndexName, $requestOptions = array()) + { + if (is_array($requestOptions)) { + $requestOptions['scope'] = array('settings'); + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addBodyParameter('scope', array('settings')); + } + + return $this->copyIndex($srcIndexName, $destIndexName, $requestOptions); + } + + public function copySynonyms($srcIndexName, $destIndexName, $requestOptions = array()) + { + if (is_array($requestOptions)) { + $requestOptions['scope'] = array('synonyms'); + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addBodyParameter('scope', array('synonyms')); + } + + return $this->copyIndex($srcIndexName, $destIndexName, $requestOptions); + } + + public function copyRules($srcIndexName, $destIndexName, $requestOptions = array()) + { + if (is_array($requestOptions)) { + $requestOptions['scope'] = array('rules'); + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addBodyParameter('scope', array('rules')); + } + + return $this->copyIndex($srcIndexName, $destIndexName, $requestOptions); + } + + public function isAlive($requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/isalive'), $requestOptions); + } + + public function multipleQueries($queries, $requestOptions = array()) + { + if (is_array($requestOptions)) { + $requestOptions['requests'] = $queries; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addBodyParameter('requests', $queries); + } + + return $this->api->read( + 'POST', + api_path('/1/indexes/*/queries'), + $requestOptions + ); + } + + public function multipleBatch($operations, $requestOptions = array()) + { + $response = $this->api->write( + 'POST', + api_path('/1/indexes/*/batch'), + array('requests' => $operations), + $requestOptions + ); + + return new MultipleIndexBatchIndexingResponse($response, $this); + } + + public function multipleGetObjects($requests, $requestOptions = array()) + { + if (is_array($requestOptions)) { + $requestOptions['requests'] = $requests; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addBodyParameter('requests', $requests); + } + + return $this->api->read( + 'POST', + api_path('/1/indexes/*/objects'), + $requestOptions + ); + } + + public function listIndices($requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/indexes/'), $requestOptions); + } + + public function listApiKeys($requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/keys'), $requestOptions); + } + + public function getApiKey($key, $requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/keys/%s', $key), $requestOptions); + } + + public function addApiKey($acl, $requestOptions = array()) + { + $acl = array('acl' => $acl); + + $response = $this->api->write('POST', api_path('/1/keys'), $acl, $requestOptions); + + return new AddApiKeyResponse($response, $this, $this->config); + } + + public function updateApiKey($key, $requestOptions = array()) + { + $response = $this->api->write('PUT', api_path('/1/keys/%s', $key), array(), $requestOptions); + + return new UpdateApiKeyResponse($response, $this, $this->config, $requestOptions); + } + + public function deleteApiKey($key, $requestOptions = array()) + { + $response = $this->api->write('DELETE', api_path('/1/keys/%s', $key), array(), $requestOptions); + + return new DeleteApiKeyResponse($response, $this, $this->config, $key); + } + + public function restoreApiKey($key, $requestOptions = array()) + { + $response = $this->api->write('POST', api_path('/1/keys/%s/restore', $key), array(), $requestOptions); + + return new RestoreApiKeyResponse($response, $this, $this->config, $key); + } + + public static function generateSecuredApiKey($parentApiKey, $restrictions) + { + $urlEncodedRestrictions = Helpers::buildQuery($restrictions); + + $content = hash_hmac('sha256', $urlEncodedRestrictions, $parentApiKey).$urlEncodedRestrictions; + + return base64_encode($content); + } + + /** + * @deprecated endpoint will be deprecated + * @see RecommendationClient + */ + public function getPersonalizationStrategy($requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/recommendation/personalization/strategy'), $requestOptions); + } + + /** + * @deprecated endpoint will be deprecated + * @see RecommendationClient + */ + public function setPersonalizationStrategy($strategy, $requestOptions = array()) + { + $apiResponse = $this->api->write( + 'POST', + api_path('1/recommendation/personalization/strategy'), + $strategy, + $requestOptions + ); + + return $apiResponse; + } + + public function searchUserIds($query, $requestOptions = array()) + { + $query = (string) $query; + + if (is_array($requestOptions)) { + $requestOptions['query'] = $query; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addBodyParameter('query', $query); + } + + return $this->api->read('POST', api_path('/1/clusters/mapping/search'), $requestOptions); + } + + public function listClusters($requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/clusters'), $requestOptions); + } + + public function listUserIds($requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/clusters/mapping'), $requestOptions); + } + + public function getUserId($userId, $requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/clusters/mapping/%s', $userId), $requestOptions); + } + + /** + * @deprecated since 2.6.1, use getTopUserIds instead. + */ + public function getTopUserId($requestOptions = array()) + { + return $this->getTopUserIds($requestOptions); + } + + /** + * Get the top 10 userIDs with the highest number of records per cluster. + * + * @param array $requestOptions + * + * @return array + */ + public function getTopUserIds($requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/clusters/mapping/top'), $requestOptions); + } + + public function assignUserId($userId, $clusterName, $requestOptions = array()) + { + if (is_array($requestOptions)) { + $requestOptions['X-Algolia-User-ID'] = $userId; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addHeader('X-Algolia-User-ID', $userId); + } + + return $this->api->write( + 'POST', + api_path('/1/clusters/mapping'), + array( + 'cluster' => $clusterName, + ), + $requestOptions + ); + } + + /** + * Assign multiple userIds to the given cluster name. + * + * @param array $userIds + * @param string $clusterName + * @param array $requestOptions + * + * @return array + */ + public function assignUserIds($userIds, $clusterName, $requestOptions = array()) + { + return $this->api->write( + 'POST', + api_path('/1/clusters/mapping/batch'), + array( + 'users' => $userIds, + 'cluster' => $clusterName, + ), + $requestOptions + ); + } + + public function removeUserId($userId, $requestOptions = array()) + { + if (is_array($requestOptions)) { + $requestOptions['X-Algolia-User-ID'] = $userId; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addHeader('X-Algolia-User-ID', $userId); + } + + return $this->api->write( + 'DELETE', + api_path('/1/clusters/mapping'), + array(), + $requestOptions + ); + } + + public function getLogs($requestOptions = array()) + { + return $this->api->read('GET', api_path('/1/logs'), $requestOptions); + } + + public function getTask($indexName, $taskId, $requestOptions = array()) + { + $index = $this->initIndex($indexName); + + return $index->getTask($taskId, $requestOptions); + } + + public function waitTask($indexName, $taskId, $requestOptions = array()) + { + $index = $this->initIndex($indexName); + + $index->waitTask($taskId, $requestOptions); + } + + public function custom($method, $path, $requestOptions = array(), $hosts = null) + { + return $this->api->send($method, $path, $requestOptions, $hosts); + } + + /** + * Returns the time the given securedAPIKey remains valid in seconds. + * + * @param string $securedAPIKey the key to check + * + * @return int remaining validity in seconds + * + * @throws ValidUntilNotFoundException + */ + public static function getSecuredApiKeyRemainingValidity($securedAPIKey) + { + $decodedKey = base64_decode($securedAPIKey); + $regex = '/validUntil=(\d+)/'; + preg_match($regex, $decodedKey, $matches); + + if (0 === count($matches)) { + throw new ValidUntilNotFoundException("The SecuredAPIKey doesn't have a validUntil parameter."); + } + + $validUntil = (int) $matches[1]; + + return $validUntil - time(); + } + + /** + * Get cluster pending (migrating, creating, deleting) mapping state. Query cluster pending mapping status and get cluster mappings. + * + * @param array $requestOptions + * + * @return array + */ + public function hasPendingMappings($requestOptions = array()) + { + if (isset($requestOptions['retrieveMappings']) + && true === $requestOptions['retrieveMappings']) { + if (is_array($requestOptions)) { + $requestOptions['getClusters'] = true; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addQueryParameter('getClusters', true); + } + } + + return $this->api->read( + 'GET', + api_path('/1/clusters/mapping/pending'), + $requestOptions + ); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/SearchIndex.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/SearchIndex.php new file mode 100644 index 0000000000..07f65a538b --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/SearchIndex.php @@ -0,0 +1,775 @@ +indexName = $indexName; + $this->api = $apiWrapper; + $this->config = $config; + } + + public function getIndexName() + { + return $this->indexName; + } + + public function getAppId() + { + return $this->config->getAppId(); + } + + public function search($query, $requestOptions = array()) + { + $query = (string) $query; + + if (is_array($requestOptions)) { + $requestOptions['query'] = $query; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addBodyParameter('query', $query); + } + + return $this->api->read('POST', api_path('/1/indexes/%s/query', $this->indexName), $requestOptions); + } + + /** + * @deprecated Please use searchForFacetValues instead + */ + public function searchForFacetValue($facetName, $facetQuery, $requestOptions = array()) + { + return $this->searchForFacetValues($facetName, $facetQuery, $requestOptions); + } + + public function searchForFacetValues($facetName, $facetQuery, $requestOptions = array()) + { + if (is_array($requestOptions)) { + $requestOptions['facetQuery'] = $facetQuery; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addBodyParameter('facetQuery', $facetQuery); + } + + return $this->api->read( + 'POST', + api_path('/1/indexes/%s/facets/%s/query', $this->indexName, $facetName), + $requestOptions + ); + } + + public function getSettings($requestOptions = array()) + { + if (is_array($requestOptions)) { + $requestOptions['getVersion'] = 2; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addQueryParameter('getVersion', 2); + } + + return $this->api->read( + 'GET', + api_path('/1/indexes/%s/settings', $this->indexName), + $requestOptions + ); + } + + public function setSettings($settings, $requestOptions = array()) + { + $default = array(); + if (is_bool($fwd = $this->config->getDefaultForwardToReplicas())) { + $default['forwardToReplicas'] = $fwd; + } + + $response = $this->api->write( + 'PUT', + api_path('/1/indexes/%s/settings', $this->indexName), + $settings, + $requestOptions, + $default + ); + + return new IndexingResponse($response, $this); + } + + public function getObject($objectId, $requestOptions = array()) + { + return $this->api->read( + 'GET', + api_path('/1/indexes/%s/%s', $this->indexName, $objectId), + $requestOptions + ); + } + + public function getObjects($objectIds, $requestOptions = array()) + { + if (is_array($requestOptions)) { + $attributesToRetrieve = ''; + if (isset($requestOptions['attributesToRetrieve'])) { + $attributesToRetrieve = $requestOptions['attributesToRetrieve']; + unset($requestOptions['attributesToRetrieve']); + } + + $request = array(); + foreach ($objectIds as $id) { + $req = array( + 'indexName' => $this->indexName, + 'objectID' => (string) $id, + ); + + if ($attributesToRetrieve) { + $req['attributesToRetrieve'] = $attributesToRetrieve; + } + + $request[] = $req; + } + + $requestOptions['requests'] = $request; + } + + return $this->api->read( + 'POST', + api_path('/1/indexes/*/objects'), + $requestOptions + ); + } + + public function saveObject($object, $requestOptions = array()) + { + return $this->saveObjects(array($object), $requestOptions); + } + + public function saveObjects($objects, $requestOptions = array()) + { + if (isset($requestOptions['autoGenerateObjectIDIfNotExist']) + && $requestOptions['autoGenerateObjectIDIfNotExist']) { + unset($requestOptions['autoGenerateObjectIDIfNotExist']); + + return $this->addObjects($objects, $requestOptions); + } + + if (isset($requestOptions['objectIDKey']) && $requestOptions['objectIDKey']) { + $objects = Helpers::mapObjectIDs($requestOptions['objectIDKey'], $objects); + unset($requestOptions['objectIDKey']); + } + + try { + return $this->splitIntoBatches('updateObject', $objects, $requestOptions); + } catch (MissingObjectId $e) { + $message = "\nAll objects must have an unique objectID (like a primary key) to be valid.\n\n"; + $message .= "If your batch has a unique identifier but isn't called objectID,\n"; + $message .= "you can map it automatically using `saveObjects(\$objects, ['objectIDKey' => 'primary'])`\n\n"; + $message .= "Algolia is also able to generate objectIDs automatically but *it's not recommended*.\n"; + $message .= "To do it, use `['autoGenerateObjectIDIfNotExist' => true] on the request options parameter`\n\n"; + + throw new MissingObjectId($message); + } + } + + protected function addObjects($objects, $requestOptions = array()) + { + return $this->splitIntoBatches('addObject', $objects, $requestOptions); + } + + public function partialUpdateObject($object, $requestOptions = array()) + { + return $this->partialUpdateObjects(array($object), $requestOptions); + } + + public function partialUpdateObjects($objects, $requestOptions = array()) + { + $action = 'partialUpdateObjectNoCreate'; + + if (isset($requestOptions['createIfNotExists']) && $requestOptions['createIfNotExists']) { + $action = 'partialUpdateObject'; + unset($requestOptions['createIfNotExists']); + } + + return $this->splitIntoBatches($action, $objects, $requestOptions); + } + + public function replaceAllObjects($objects, $requestOptions = array()) + { + $safe = isset($requestOptions['safe']) && $requestOptions['safe']; + unset($requestOptions['safe']); + + $tmpName = $this->indexName.'_tmp_'.uniqid('php_', true); + $tmpIndex = new static($tmpName, $this->api, $this->config); + + // Copy all index resources from production index + $copyResponse = $this->copyTo($tmpIndex->getIndexName(), array( + 'scope' => array('settings', 'synonyms', 'rules'), + )); + + if ($safe) { + $copyResponse->wait(); + } + + // Send records (batched automatically) + $batchResponse = $tmpIndex->saveObjects($objects, $requestOptions); + + if ($safe) { + $batchResponse->wait(); + } + + // Move temporary index to production + $moveResponse = $this->moveFrom($tmpName); + + if ($safe) { + $moveResponse->wait(); + } + + return new MultiResponse(array($copyResponse, $batchResponse, $moveResponse)); + } + + public function deleteObject($objectId, $requestOptions = array()) + { + return $this->deleteObjects(array($objectId), $requestOptions); + } + + public function deleteObjects($objectIds, $requestOptions = array()) + { + $objects = array_map(function ($id) { + return array('objectID' => $id); + }, $objectIds); + + return $this->splitIntoBatches('deleteObject', $objects, $requestOptions); + } + + public function deleteBy($filters, $requestOptions = array()) + { + $response = $this->api->write( + 'POST', + api_path('/1/indexes/%s/deleteByQuery', $this->indexName), + $filters, + $requestOptions + ); + + return new IndexingResponse($response, $this); + } + + public function clearObjects($requestOptions = array()) + { + $response = $this->api->write( + 'POST', + api_path('/1/indexes/%s/clear', $this->indexName), + array(), + $requestOptions + ); + + return new IndexingResponse($response, $this); + } + + public function batch($requests, $requestOptions = array()) + { + $response = $this->rawBatch($requests, $requestOptions); + + return new IndexingResponse($response, $this); + } + + protected function rawBatch($requests, $requestOptions = array()) + { + return $this->api->write( + 'POST', + api_path('/1/indexes/%s/batch', $this->indexName), + array('requests' => $requests), + $requestOptions + ); + } + + protected function splitIntoBatches($action, $objects, $requestOptions = array()) + { + $allResponses = array(); + $batch = array(); + $batchSize = $this->config->getBatchSize(); + $count = 0; + + foreach ($objects as $object) { + $batch[] = $object; + $count++; + + if ($count === $batchSize) { + if ('addObject' !== $action) { + Helpers::ensureObjectID($batch, 'All objects must have an unique objectID (like a primary key) to be valid.'); + } + $allResponses[] = $this->rawBatch(Helpers::buildBatch($batch, $action), $requestOptions); + $batch = array(); + $count = 0; + } + } + + if ('addObject' !== $action) { + Helpers::ensureObjectID($batch, 'All objects must have an unique objectID (like a primary key) to be valid.'); + } + + // If not calls were made previously, not objects are passed + // so we return a NullResponse + // If there are already responses and something left in the + // batch, we send it. + if (empty($allResponses) && empty($batch)) { + return new NullResponse(); + } elseif (!empty($batch)) { + $allResponses[] = $this->rawBatch(Helpers::buildBatch($batch, $action), $requestOptions); + } + + return new BatchIndexingResponse($allResponses, $this); + } + + public function browseObjects($requestOptions = array()) + { + return new ObjectIterator($this->indexName, $this->api, $requestOptions); + } + + public function searchSynonyms($query, $requestOptions = array()) + { + $query = (string) $query; + + if (is_array($requestOptions)) { + $requestOptions['query'] = $query; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addBodyParameter('query', $query); + } + + return $this->api->read( + 'POST', + api_path('/1/indexes/%s/synonyms/search', $this->indexName), + $requestOptions + ); + } + + public function getSynonym($objectId, $requestOptions = array()) + { + return $this->api->read( + 'GET', + api_path('/1/indexes/%s/synonyms/%s', $this->indexName, $objectId), + $requestOptions + ); + } + + public function saveSynonym($synonym, $requestOptions = array()) + { + return $this->saveSynonyms(array($synonym), $requestOptions); + } + + public function saveSynonyms($synonyms, $requestOptions = array()) + { + $default = array(); + if (is_bool($fwd = $this->config->getDefaultForwardToReplicas())) { + $default['forwardToReplicas'] = $fwd; + } + + if ($synonyms instanceof \Iterator) { + $iteratedOver = array(); + foreach ($synonyms as $r) { + $iteratedOver[] = $r; + } + $synonyms = $iteratedOver; + } + + if (empty($synonyms)) { + return new NullResponse(); + } + + Helpers::ensureObjectID($synonyms, 'All synonyms must have an unique objectID to be valid'); + + $response = $this->api->write( + 'POST', + api_path('/1/indexes/%s/synonyms/batch', $this->indexName), + $synonyms, + $requestOptions, + $default + ); + + return new IndexingResponse($response, $this); + } + + public function replaceAllSynonyms($synonyms, $requestOptions = array()) + { + if (is_array($requestOptions)) { + $requestOptions['replaceExistingSynonyms'] = true; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addQueryParameter('replaceExistingSynonyms', true); + } + + return $this->saveSynonyms($synonyms, $requestOptions); + } + + public function deleteSynonym($objectId, $requestOptions = array()) + { + $default = array(); + if (is_bool($fwd = $this->config->getDefaultForwardToReplicas())) { + $default['forwardToReplicas'] = $fwd; + } + + $response = $this->api->write( + 'DELETE', + api_path('/1/indexes/%s/synonyms/%s', $this->indexName, $objectId), + array(), + $requestOptions, + $default + ); + + return new IndexingResponse($response, $this); + } + + public function clearSynonyms($requestOptions = array()) + { + $default = array(); + if (is_bool($fwd = $this->config->getDefaultForwardToReplicas())) { + $default['forwardToReplicas'] = $fwd; + } + + $response = $this->api->write( + 'POST', + api_path('/1/indexes/%s/synonyms/clear', $this->indexName), + array(), + $requestOptions, + $default + ); + + return new IndexingResponse($response, $this); + } + + public function browseSynonyms($requestOptions = array()) + { + return new SynonymIterator($this->indexName, $this->api, $requestOptions); + } + + public function searchRules($query, $requestOptions = array()) + { + $query = (string) $query; + + if (is_array($requestOptions)) { + $requestOptions['query'] = $query; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addBodyParameter('query', $query); + } + + return $this->api->read( + 'POST', + api_path('/1/indexes/%s/rules/search', $this->indexName), + $requestOptions + ); + } + + public function getRule($objectId, $requestOptions = array()) + { + return $this->api->read( + 'GET', + api_path('/1/indexes/%s/rules/%s', $this->indexName, $objectId), + $requestOptions + ); + } + + public function saveRule($rule, $requestOptions = array()) + { + return $this->saveRules(array($rule), $requestOptions); + } + + public function saveRules($rules, $requestOptions = array()) + { + $default = array(); + if (is_bool($fwd = $this->config->getDefaultForwardToReplicas())) { + $default['forwardToReplicas'] = $fwd; + } + + if ($rules instanceof \Iterator) { + $iteratedOver = array(); + foreach ($rules as $r) { + $iteratedOver[] = $r; + } + $rules = $iteratedOver; + } + + if (empty($rules)) { + return new NullResponse(); + } + + Helpers::ensureObjectID($rules, 'All rules must have an unique objectID to be valid'); + + /* + * If consequence `params` is an array without keys, we are going to remove it + * from the payload of the rule. Otherwise the transporter layer will serialize + * `params` to an empty array [] instead of an empty object {} making an invalid + * rule on the engine side. + */ + foreach ($rules as $key => $rule) { + if (isset($rule['consequence']) && empty($rule['consequence']['params'])) { + unset($rules[$key]['consequence']['params']); + } + } + + $response = $this->api->write( + 'POST', + api_path('/1/indexes/%s/rules/batch', $this->indexName), + $rules, + $requestOptions, + $default + ); + + return new IndexingResponse($response, $this); + } + + public function replaceAllRules($rules, $requestOptions = array()) + { + if (is_array($requestOptions)) { + $requestOptions['clearExistingRules'] = true; + } elseif ($requestOptions instanceof RequestOptions) { + $requestOptions->addQueryParameter('clearExistingRules', true); + } + + return $this->saveRules($rules, $requestOptions); + } + + public function deleteRule($objectId, $requestOptions = array()) + { + $default = array(); + if (is_bool($fwd = $this->config->getDefaultForwardToReplicas())) { + $default['forwardToReplicas'] = $fwd; + } + + $response = $this->api->write( + 'DELETE', + api_path('/1/indexes/%s/rules/%s', $this->indexName, $objectId), + array(), + $requestOptions, + $default + ); + + return new IndexingResponse($response, $this); + } + + public function clearRules($requestOptions = array()) + { + $default = array(); + if (is_bool($fwd = $this->config->getDefaultForwardToReplicas())) { + $default['forwardToReplicas'] = $fwd; + } + + $response = $this->api->write( + 'POST', + api_path('/1/indexes/%s/rules/clear', $this->indexName), + array(), + $requestOptions, + $default + ); + + return new IndexingResponse($response, $this); + } + + public function browseRules($requestOptions = array()) + { + return new RuleIterator($this->indexName, $this->api, $requestOptions); + } + + public function getTask($taskId, $requestOptions = array()) + { + if (!$taskId) { + throw new \InvalidArgumentException('taskID cannot be empty'); + } + + return $this->api->read( + 'GET', + api_path('/1/indexes/%s/task/%s', $this->indexName, $taskId), + $requestOptions + ); + } + + public function waitTask($taskId, $requestOptions = array()) + { + $retry = 1; + $time = $this->config->getWaitTaskTimeBeforeRetry(); + + do { + $res = $this->getTask($taskId, $requestOptions); + + if ('published' === $res['status']) { + return; + } + + $retry++; + $factor = ceil($retry / 10); + usleep($factor * $time); // 0.1 second + } while (true); + } + + public function custom($method, $path, $requestOptions = array(), $hosts = null) + { + return $this->api->send($method, $path, $requestOptions, $hosts); + } + + public function delete($requestOptions = array()) + { + $response = $this->api->write( + 'DELETE', + api_path('/1/indexes/%s', $this->indexName), + array(), + $requestOptions + ); + + return new IndexingResponse($response, $this); + } + + /** + * Check whether an index exists or not. + * + * @param array|RequestOptions $requestOptions array of options or RequestOptions object + * + * @return bool + */ + public function exists($requestOptions = array()) + { + try { + $this->getSettings($requestOptions); + } catch (NotFoundException $exception) { + return false; + } + + return true; + } + + /** + * Find object by the given $callback. + * Options can be passed in $requestOptions body: + * - query (string): pass a query + * - paginate (bool): choose if you want to iterate through all the + * documents (true) or only the first page (false). Default is true. + * + * Usage: + * + * $index->findObject( + * function($object) { return $object['objectID'] === 'foo'; }, + * array( + * 'query' => 'bar', + * 'paginate' => false, + * 'hitsPerPage' => 50, + * ) + * ); + * + * @param callable $callback The callback used to find the object + * Takes an array as parameter and returns a boolean + * @param array|RequestOptions $requestOptions array of options or RequestOptions object + * + * @return array + * + * @throws ObjectNotFoundException + */ + public function findObject($callback, $requestOptions = array()) + { + $query = ''; + $paginate = true; + $page = 0; + $requestOptionsFactory = new RequestOptionsFactory($this->config); + + if (is_array($requestOptions)) { + if (array_key_exists('query', $requestOptions)) { + $query = $requestOptions['query']; + unset($requestOptions['query']); + } + + if (array_key_exists('paginate', $requestOptions)) { + $paginate = $requestOptions['paginate']; + unset($requestOptions['paginate']); + } + } + + $requestOptions = $requestOptionsFactory->create($requestOptions); + + while (true) { + $requestOptions->addBodyParameter('page', $page); + + $result = $this->search($query, $requestOptions); + foreach ($result['hits'] as $key => $hit) { + if ($callback($hit)) { + return array( + 'object' => $hit, + 'position' => $key, + 'page' => $page, + ); + } + } + + $hasNextPage = $page + 1 < $result['nbPages']; + if (!$paginate || !$hasNextPage) { + throw new ObjectNotFoundException('Object not found'); + } + + $page++; + } + } + + /** + * Retrieve the given object position in a set of results. + * + * @param array $result The set of results you want to iterate in + * @param string $objectID The objectID you want to find + * + * @return int + */ + public static function getObjectPosition($result, $objectID) + { + foreach ($result['hits'] as $key => $hit) { + if ($hit['objectID'] === $objectID) { + return $key; + } + } + + return -1; + } + + private function copyTo($tmpIndexName, $requestOptions = array()) + { + $apiResponse = $this->api->write( + 'POST', + api_path('/1/indexes/%s/operation', $this->indexName), + array( + 'operation' => 'copy', + 'destination' => $tmpIndexName, + ), + $requestOptions + ); + + return new IndexingResponse($apiResponse, $this); + } + + private function moveFrom($tmpIndexName, $requestOptions = array()) + { + $apiResponse = $this->api->write( + 'POST', + api_path('/1/indexes/%s/operation', $tmpIndexName), + array( + 'operation' => 'move', + 'destination' => $this->indexName, + ), + $requestOptions + ); + + return new IndexingResponse($apiResponse, $this); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Support/Helpers.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Support/Helpers.php new file mode 100644 index 0000000000..39abc53ab2 --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Support/Helpers.php @@ -0,0 +1,129 @@ + ['one', 'two']] is + * turned into key[1]=one&key[2]=two. Algolia will not understand key[x]. + * It should be turned into key=['one','two'] (before being url_encoded). + * + * @return string The urlencoded query string to send to Algolia + */ + public static function buildQuery(array $args) + { + if (!$args) { + return ''; + } + + $args = array_map(function ($value) { + if (is_array($value)) { + return json_encode($value); + } elseif (is_bool($value)) { + return $value ? 'true' : 'false'; + } else { + return $value; + } + }, $args); + + return http_build_query($args); + } + + public static function buildBatch($items, $action) + { + return array_map(function ($item) use ($action) { + return array( + 'action' => $action, + 'body' => $item, + ); + }, $items); + } + + public static function ensureObjectID($objects, $message = 'ObjectID is required to add a record, a synonym or a query rule.') + { + // In case a single objects is passed + if (isset($objects['objectID'])) { + return; + } + + // In case multiple objects are passed + foreach ($objects as $object) { + if (!isset($object['objectID']) && !isset($object['body']['objectID'])) { + throw new MissingObjectId($message); + } + } + } + + /** + * Wrapper for json_decode that throws when an error occurs. + * + * This function is extracted from Guzzlehttp/Guzzle package which is not + * compatible with PHP 5.3 so the client cannot always use it. + * + * @param string $json JSON data to parse + * @param bool $assoc when true, returned objects will be converted + * into associative arrays + * @param int $depth user specified recursion depth + * + * @return mixed + * + * @throws \InvalidArgumentException if the JSON cannot be decoded + * + * @see http://www.php.net/manual/en/function.json-decode.php + */ + public static function json_decode($json, $assoc = false, $depth = 512) + { + $data = \json_decode($json, $assoc, $depth); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException('json_decode error: '.json_last_error_msg()); + } + + return $data; + } + + public static function mapObjectIDs($objectIDKey, $objects) + { + return array_map(function ($object) use ($objectIDKey) { + if (!isset($object[$objectIDKey])) { + throw new MissingObjectId("At least one object is missing the required $objectIDKey key: ".json_encode($object)); + } + $object['objectID'] = $object[$objectIDKey]; + + return $object; + }, $objects); + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Support/UserAgent.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Support/UserAgent.php new file mode 100644 index 0000000000..638e5a9fce --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/Support/UserAgent.php @@ -0,0 +1,59 @@ + $version) { + $ua[] = $segment.' ('.$version.')'; + } + + return implode('; ', $ua); + } + + private static function getDefaultSegments() + { + $segments = array(); + + $segments['Algolia for PHP'] = Algolia::VERSION; + $segments['PHP'] = rtrim(str_replace(PHP_EXTRA_VERSION, '', PHP_VERSION), '-'); + if (defined('HHVM_VERSION')) { + $segments['HHVM'] = HHVM_VERSION; + } + if (interface_exists('\GuzzleHttp\ClientInterface')) { + if (defined('\GuzzleHttp\ClientInterface::VERSION')) { + $segments['Guzzle'] = \GuzzleHttp\ClientInterface::VERSION; + } else { + $segments['Guzzle'] = \GuzzleHttp\ClientInterface::MAJOR_VERSION; + } + } + + return $segments; + } +} diff --git a/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/functions.php b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/functions.php new file mode 100644 index 0000000000..1190a7b8fa --- /dev/null +++ b/site/plugins/search/vendor/algolia/algoliasearch-client-php/src/functions.php @@ -0,0 +1,8 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/site/plugins/search/vendor/composer/InstalledVersions.php b/site/plugins/search/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000000..3b85cd02cf --- /dev/null +++ b/site/plugins/search/vendor/composer/InstalledVersions.php @@ -0,0 +1,255 @@ + + array ( + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'aliases' => + array ( + ), + 'reference' => 'f0918468ade52e2388f889b720c566edb1920c51', + 'name' => 'getkirby/search', + ), + 'versions' => + array ( + 'algolia/algoliasearch-client-php' => + array ( + 'pretty_version' => '2.7.3', + 'version' => '2.7.3.0', + 'aliases' => + array ( + ), + 'reference' => '142a382e4649db0cb64d9eb8893872f1a4ba8dd3', + ), + 'getkirby/search' => + array ( + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'aliases' => + array ( + ), + 'reference' => 'f0918468ade52e2388f889b720c566edb1920c51', + ), + 'psr/http-message' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', + ), + 'psr/log' => + array ( + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc', + ), + 'psr/simple-cache' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', + ), + ), +); + + + + + + + +public static function getInstalledPackages() +{ +return array_keys(self::$installed['versions']); +} + + + + + + + + + +public static function isInstalled($packageName) +{ +return isset(self::$installed['versions'][$packageName]); +} + + + + + + + + + + + + + + +public static function satisfies(VersionParser $parser, $packageName, $constraint) +{ +$constraint = $parser->parseConstraints($constraint); +$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + +return $provided->matches($constraint); +} + + + + + + + + + + +public static function getVersionRanges($packageName) +{ +if (!isset(self::$installed['versions'][$packageName])) { +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + +$ranges = array(); +if (isset(self::$installed['versions'][$packageName]['pretty_version'])) { +$ranges[] = self::$installed['versions'][$packageName]['pretty_version']; +} +if (array_key_exists('aliases', self::$installed['versions'][$packageName])) { +$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['aliases']); +} +if (array_key_exists('replaced', self::$installed['versions'][$packageName])) { +$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['replaced']); +} +if (array_key_exists('provided', self::$installed['versions'][$packageName])) { +$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['provided']); +} + +return implode(' || ', $ranges); +} + + + + + +public static function getVersion($packageName) +{ +if (!isset(self::$installed['versions'][$packageName])) { +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + +if (!isset(self::$installed['versions'][$packageName]['version'])) { +return null; +} + +return self::$installed['versions'][$packageName]['version']; +} + + + + + +public static function getPrettyVersion($packageName) +{ +if (!isset(self::$installed['versions'][$packageName])) { +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + +if (!isset(self::$installed['versions'][$packageName]['pretty_version'])) { +return null; +} + +return self::$installed['versions'][$packageName]['pretty_version']; +} + + + + + +public static function getReference($packageName) +{ +if (!isset(self::$installed['versions'][$packageName])) { +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + +if (!isset(self::$installed['versions'][$packageName]['reference'])) { +return null; +} + +return self::$installed['versions'][$packageName]['reference']; +} + + + + + +public static function getRootPackage() +{ +return self::$installed['root']; +} + + + + + + + +public static function getRawData() +{ +return self::$installed; +} + + + + + + + + + + + + + + + + + + + +public static function reload($data) +{ +self::$installed = $data; +} +} diff --git a/site/plugins/search/vendor/composer/autoload_classmap.php b/site/plugins/search/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000000..8972f9fe6c --- /dev/null +++ b/site/plugins/search/vendor/composer/autoload_classmap.php @@ -0,0 +1,94 @@ + $vendorDir . '/algolia/algoliasearch-client-php/src/AccountClient.php', + 'Algolia\\AlgoliaSearch\\Algolia' => $vendorDir . '/algolia/algoliasearch-client-php/src/Algolia.php', + 'Algolia\\AlgoliaSearch\\AnalyticsClient' => $vendorDir . '/algolia/algoliasearch-client-php/src/AnalyticsClient.php', + 'Algolia\\AlgoliaSearch\\Cache\\FileCacheDriver' => $vendorDir . '/algolia/algoliasearch-client-php/src/Cache/FileCacheDriver.php', + 'Algolia\\AlgoliaSearch\\Cache\\NullCacheDriver' => $vendorDir . '/algolia/algoliasearch-client-php/src/Cache/NullCacheDriver.php', + 'Algolia\\AlgoliaSearch\\Config\\AbstractConfig' => $vendorDir . '/algolia/algoliasearch-client-php/src/Config/AbstractConfig.php', + 'Algolia\\AlgoliaSearch\\Config\\AnalyticsConfig' => $vendorDir . '/algolia/algoliasearch-client-php/src/Config/AnalyticsConfig.php', + 'Algolia\\AlgoliaSearch\\Config\\InsightsConfig' => $vendorDir . '/algolia/algoliasearch-client-php/src/Config/InsightsConfig.php', + 'Algolia\\AlgoliaSearch\\Config\\PlacesConfig' => $vendorDir . '/algolia/algoliasearch-client-php/src/Config/PlacesConfig.php', + 'Algolia\\AlgoliaSearch\\Config\\RecommendationConfig' => $vendorDir . '/algolia/algoliasearch-client-php/src/Config/RecommendationConfig.php', + 'Algolia\\AlgoliaSearch\\Config\\SearchConfig' => $vendorDir . '/algolia/algoliasearch-client-php/src/Config/SearchConfig.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\AlgoliaException' => $vendorDir . '/algolia/algoliasearch-client-php/src/Exceptions/AlgoliaException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\BadRequestException' => $vendorDir . '/algolia/algoliasearch-client-php/src/Exceptions/BadRequestException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\CannotWaitException' => $vendorDir . '/algolia/algoliasearch-client-php/src/Exceptions/CannotWaitException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\MissingObjectId' => $vendorDir . '/algolia/algoliasearch-client-php/src/Exceptions/MissingObjectId.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\NotFoundException' => $vendorDir . '/algolia/algoliasearch-client-php/src/Exceptions/NotFoundException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\ObjectNotFoundException' => $vendorDir . '/algolia/algoliasearch-client-php/src/Exceptions/ObjectNotFoundException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\RequestException' => $vendorDir . '/algolia/algoliasearch-client-php/src/Exceptions/RequestException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\RetriableException' => $vendorDir . '/algolia/algoliasearch-client-php/src/Exceptions/RetriableException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\UnreachableException' => $vendorDir . '/algolia/algoliasearch-client-php/src/Exceptions/UnreachableException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\ValidUntilNotFoundException' => $vendorDir . '/algolia/algoliasearch-client-php/src/Exceptions/ValidUntilNotFoundException.php', + 'Algolia\\AlgoliaSearch\\Http\\Guzzle6HttpClient' => $vendorDir . '/algolia/algoliasearch-client-php/src/Http/Guzzle6HttpClient.php', + 'Algolia\\AlgoliaSearch\\Http\\HttpClientInterface' => $vendorDir . '/algolia/algoliasearch-client-php/src/Http/HttpClientInterface.php', + 'Algolia\\AlgoliaSearch\\Http\\Php53HttpClient' => $vendorDir . '/algolia/algoliasearch-client-php/src/Http/Php53HttpClient.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\BufferStream' => $vendorDir . '/algolia/algoliasearch-client-php/src/Http/Psr7/BufferStream.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\PumpStream' => $vendorDir . '/algolia/algoliasearch-client-php/src/Http/Psr7/PumpStream.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\Request' => $vendorDir . '/algolia/algoliasearch-client-php/src/Http/Psr7/Request.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\Response' => $vendorDir . '/algolia/algoliasearch-client-php/src/Http/Psr7/Response.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\Stream' => $vendorDir . '/algolia/algoliasearch-client-php/src/Http/Psr7/Stream.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\Uri' => $vendorDir . '/algolia/algoliasearch-client-php/src/Http/Psr7/Uri.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\UriResolver' => $vendorDir . '/algolia/algoliasearch-client-php/src/Http/Psr7/UriResolver.php', + 'Algolia\\AlgoliaSearch\\InsightsClient' => $vendorDir . '/algolia/algoliasearch-client-php/src/InsightsClient.php', + 'Algolia\\AlgoliaSearch\\Insights\\UserInsightsClient' => $vendorDir . '/algolia/algoliasearch-client-php/src/Insights/UserInsightsClient.php', + 'Algolia\\AlgoliaSearch\\Iterators\\AbstractAlgoliaIterator' => $vendorDir . '/algolia/algoliasearch-client-php/src/Iterators/AbstractAlgoliaIterator.php', + 'Algolia\\AlgoliaSearch\\Iterators\\ObjectIterator' => $vendorDir . '/algolia/algoliasearch-client-php/src/Iterators/ObjectIterator.php', + 'Algolia\\AlgoliaSearch\\Iterators\\RuleIterator' => $vendorDir . '/algolia/algoliasearch-client-php/src/Iterators/RuleIterator.php', + 'Algolia\\AlgoliaSearch\\Iterators\\SynonymIterator' => $vendorDir . '/algolia/algoliasearch-client-php/src/Iterators/SynonymIterator.php', + 'Algolia\\AlgoliaSearch\\Log\\DebugLogger' => $vendorDir . '/algolia/algoliasearch-client-php/src/Log/DebugLogger.php', + 'Algolia\\AlgoliaSearch\\PlacesClient' => $vendorDir . '/algolia/algoliasearch-client-php/src/PlacesClient.php', + 'Algolia\\AlgoliaSearch\\RecommendationClient' => $vendorDir . '/algolia/algoliasearch-client-php/src/RecommendationClient.php', + 'Algolia\\AlgoliaSearch\\RequestOptions\\RequestOptions' => $vendorDir . '/algolia/algoliasearch-client-php/src/RequestOptions/RequestOptions.php', + 'Algolia\\AlgoliaSearch\\RequestOptions\\RequestOptionsFactory' => $vendorDir . '/algolia/algoliasearch-client-php/src/RequestOptions/RequestOptionsFactory.php', + 'Algolia\\AlgoliaSearch\\Response\\AbstractResponse' => $vendorDir . '/algolia/algoliasearch-client-php/src/Response/AbstractResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\AddApiKeyResponse' => $vendorDir . '/algolia/algoliasearch-client-php/src/Response/AddApiKeyResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\BatchIndexingResponse' => $vendorDir . '/algolia/algoliasearch-client-php/src/Response/BatchIndexingResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\DeleteApiKeyResponse' => $vendorDir . '/algolia/algoliasearch-client-php/src/Response/DeleteApiKeyResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\IndexingResponse' => $vendorDir . '/algolia/algoliasearch-client-php/src/Response/IndexingResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\MultiResponse' => $vendorDir . '/algolia/algoliasearch-client-php/src/Response/MultiResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\MultipleIndexBatchIndexingResponse' => $vendorDir . '/algolia/algoliasearch-client-php/src/Response/MultipleIndexBatchIndexingResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\NullResponse' => $vendorDir . '/algolia/algoliasearch-client-php/src/Response/NullResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\RestoreApiKeyResponse' => $vendorDir . '/algolia/algoliasearch-client-php/src/Response/RestoreApiKeyResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\UpdateApiKeyResponse' => $vendorDir . '/algolia/algoliasearch-client-php/src/Response/UpdateApiKeyResponse.php', + 'Algolia\\AlgoliaSearch\\RetryStrategy\\ApiWrapper' => $vendorDir . '/algolia/algoliasearch-client-php/src/RetryStrategy/ApiWrapper.php', + 'Algolia\\AlgoliaSearch\\RetryStrategy\\ApiWrapperInterface' => $vendorDir . '/algolia/algoliasearch-client-php/src/RetryStrategy/ApiWrapperInterface.php', + 'Algolia\\AlgoliaSearch\\RetryStrategy\\ClusterHosts' => $vendorDir . '/algolia/algoliasearch-client-php/src/RetryStrategy/ClusterHosts.php', + 'Algolia\\AlgoliaSearch\\RetryStrategy\\Host' => $vendorDir . '/algolia/algoliasearch-client-php/src/RetryStrategy/Host.php', + 'Algolia\\AlgoliaSearch\\RetryStrategy\\HostCollection' => $vendorDir . '/algolia/algoliasearch-client-php/src/RetryStrategy/HostCollection.php', + 'Algolia\\AlgoliaSearch\\SearchClient' => $vendorDir . '/algolia/algoliasearch-client-php/src/SearchClient.php', + 'Algolia\\AlgoliaSearch\\SearchIndex' => $vendorDir . '/algolia/algoliasearch-client-php/src/SearchIndex.php', + 'Algolia\\AlgoliaSearch\\Support\\Helpers' => $vendorDir . '/algolia/algoliasearch-client-php/src/Support/Helpers.php', + 'Algolia\\AlgoliaSearch\\Support\\UserAgent' => $vendorDir . '/algolia/algoliasearch-client-php/src/Support/UserAgent.php', + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'Kirby\\Search\\Index' => $baseDir . '/src/Index.php', + 'Kirby\\Search\\Results' => $baseDir . '/src/Results.php', + 'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', + 'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', + 'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', + 'Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php', + 'Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php', + 'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', + 'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', + 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.php', + 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php', + 'Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', + 'Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', + 'Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', +); diff --git a/site/plugins/search/vendor/composer/autoload_files.php b/site/plugins/search/vendor/composer/autoload_files.php new file mode 100644 index 0000000000..ad94bd7fc6 --- /dev/null +++ b/site/plugins/search/vendor/composer/autoload_files.php @@ -0,0 +1,11 @@ + $vendorDir . '/algolia/algoliasearch-client-php/src/Http/Psr7/functions.php', + '6783aef8c489bbc166eee2536fe605d5' => $vendorDir . '/algolia/algoliasearch-client-php/src/functions.php', +); diff --git a/site/plugins/maki/vendor/composer/autoload_namespaces.php b/site/plugins/search/vendor/composer/autoload_namespaces.php similarity index 100% rename from site/plugins/maki/vendor/composer/autoload_namespaces.php rename to site/plugins/search/vendor/composer/autoload_namespaces.php diff --git a/site/plugins/search/vendor/composer/autoload_psr4.php b/site/plugins/search/vendor/composer/autoload_psr4.php new file mode 100644 index 0000000000..87aa9b3242 --- /dev/null +++ b/site/plugins/search/vendor/composer/autoload_psr4.php @@ -0,0 +1,14 @@ + array($vendorDir . '/psr/simple-cache/src'), + 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), + 'Kirby\\Search\\' => array($baseDir . '/src'), + 'Algolia\\AlgoliaSearch\\' => array($vendorDir . '/algolia/algoliasearch-client-php/src'), +); diff --git a/site/plugins/search/vendor/composer/autoload_real.php b/site/plugins/search/vendor/composer/autoload_real.php new file mode 100644 index 0000000000..aac5cde864 --- /dev/null +++ b/site/plugins/search/vendor/composer/autoload_real.php @@ -0,0 +1,75 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInitd55d81fc665b9fa16948bcd7595bede4::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInitd55d81fc665b9fa16948bcd7595bede4::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequired55d81fc665b9fa16948bcd7595bede4($fileIdentifier, $file); + } + + return $loader; + } +} + +function composerRequired55d81fc665b9fa16948bcd7595bede4($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + } +} diff --git a/site/plugins/search/vendor/composer/autoload_static.php b/site/plugins/search/vendor/composer/autoload_static.php new file mode 100644 index 0000000000..b6112a85b1 --- /dev/null +++ b/site/plugins/search/vendor/composer/autoload_static.php @@ -0,0 +1,151 @@ + __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Http/Psr7/functions.php', + '6783aef8c489bbc166eee2536fe605d5' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/functions.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'P' => + array ( + 'Psr\\SimpleCache\\' => 16, + 'Psr\\Log\\' => 8, + 'Psr\\Http\\Message\\' => 17, + ), + 'K' => + array ( + 'Kirby\\Search\\' => 13, + ), + 'A' => + array ( + 'Algolia\\AlgoliaSearch\\' => 22, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Psr\\SimpleCache\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/simple-cache/src', + ), + 'Psr\\Log\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', + ), + 'Psr\\Http\\Message\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/http-message/src', + ), + 'Kirby\\Search\\' => + array ( + 0 => __DIR__ . '/../..' . '/src', + ), + 'Algolia\\AlgoliaSearch\\' => + array ( + 0 => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src', + ), + ); + + public static $classMap = array ( + 'Algolia\\AlgoliaSearch\\AccountClient' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/AccountClient.php', + 'Algolia\\AlgoliaSearch\\Algolia' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Algolia.php', + 'Algolia\\AlgoliaSearch\\AnalyticsClient' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/AnalyticsClient.php', + 'Algolia\\AlgoliaSearch\\Cache\\FileCacheDriver' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Cache/FileCacheDriver.php', + 'Algolia\\AlgoliaSearch\\Cache\\NullCacheDriver' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Cache/NullCacheDriver.php', + 'Algolia\\AlgoliaSearch\\Config\\AbstractConfig' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Config/AbstractConfig.php', + 'Algolia\\AlgoliaSearch\\Config\\AnalyticsConfig' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Config/AnalyticsConfig.php', + 'Algolia\\AlgoliaSearch\\Config\\InsightsConfig' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Config/InsightsConfig.php', + 'Algolia\\AlgoliaSearch\\Config\\PlacesConfig' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Config/PlacesConfig.php', + 'Algolia\\AlgoliaSearch\\Config\\RecommendationConfig' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Config/RecommendationConfig.php', + 'Algolia\\AlgoliaSearch\\Config\\SearchConfig' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Config/SearchConfig.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\AlgoliaException' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Exceptions/AlgoliaException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\BadRequestException' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Exceptions/BadRequestException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\CannotWaitException' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Exceptions/CannotWaitException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\MissingObjectId' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Exceptions/MissingObjectId.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\NotFoundException' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Exceptions/NotFoundException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\ObjectNotFoundException' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Exceptions/ObjectNotFoundException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\RequestException' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Exceptions/RequestException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\RetriableException' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Exceptions/RetriableException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\UnreachableException' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Exceptions/UnreachableException.php', + 'Algolia\\AlgoliaSearch\\Exceptions\\ValidUntilNotFoundException' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Exceptions/ValidUntilNotFoundException.php', + 'Algolia\\AlgoliaSearch\\Http\\Guzzle6HttpClient' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Http/Guzzle6HttpClient.php', + 'Algolia\\AlgoliaSearch\\Http\\HttpClientInterface' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Http/HttpClientInterface.php', + 'Algolia\\AlgoliaSearch\\Http\\Php53HttpClient' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Http/Php53HttpClient.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\BufferStream' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Http/Psr7/BufferStream.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\PumpStream' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Http/Psr7/PumpStream.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\Request' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Http/Psr7/Request.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\Response' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Http/Psr7/Response.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\Stream' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Http/Psr7/Stream.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\Uri' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Http/Psr7/Uri.php', + 'Algolia\\AlgoliaSearch\\Http\\Psr7\\UriResolver' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Http/Psr7/UriResolver.php', + 'Algolia\\AlgoliaSearch\\InsightsClient' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/InsightsClient.php', + 'Algolia\\AlgoliaSearch\\Insights\\UserInsightsClient' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Insights/UserInsightsClient.php', + 'Algolia\\AlgoliaSearch\\Iterators\\AbstractAlgoliaIterator' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Iterators/AbstractAlgoliaIterator.php', + 'Algolia\\AlgoliaSearch\\Iterators\\ObjectIterator' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Iterators/ObjectIterator.php', + 'Algolia\\AlgoliaSearch\\Iterators\\RuleIterator' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Iterators/RuleIterator.php', + 'Algolia\\AlgoliaSearch\\Iterators\\SynonymIterator' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Iterators/SynonymIterator.php', + 'Algolia\\AlgoliaSearch\\Log\\DebugLogger' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Log/DebugLogger.php', + 'Algolia\\AlgoliaSearch\\PlacesClient' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/PlacesClient.php', + 'Algolia\\AlgoliaSearch\\RecommendationClient' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/RecommendationClient.php', + 'Algolia\\AlgoliaSearch\\RequestOptions\\RequestOptions' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/RequestOptions/RequestOptions.php', + 'Algolia\\AlgoliaSearch\\RequestOptions\\RequestOptionsFactory' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/RequestOptions/RequestOptionsFactory.php', + 'Algolia\\AlgoliaSearch\\Response\\AbstractResponse' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Response/AbstractResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\AddApiKeyResponse' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Response/AddApiKeyResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\BatchIndexingResponse' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Response/BatchIndexingResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\DeleteApiKeyResponse' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Response/DeleteApiKeyResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\IndexingResponse' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Response/IndexingResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\MultiResponse' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Response/MultiResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\MultipleIndexBatchIndexingResponse' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Response/MultipleIndexBatchIndexingResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\NullResponse' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Response/NullResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\RestoreApiKeyResponse' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Response/RestoreApiKeyResponse.php', + 'Algolia\\AlgoliaSearch\\Response\\UpdateApiKeyResponse' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Response/UpdateApiKeyResponse.php', + 'Algolia\\AlgoliaSearch\\RetryStrategy\\ApiWrapper' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/RetryStrategy/ApiWrapper.php', + 'Algolia\\AlgoliaSearch\\RetryStrategy\\ApiWrapperInterface' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/RetryStrategy/ApiWrapperInterface.php', + 'Algolia\\AlgoliaSearch\\RetryStrategy\\ClusterHosts' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/RetryStrategy/ClusterHosts.php', + 'Algolia\\AlgoliaSearch\\RetryStrategy\\Host' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/RetryStrategy/Host.php', + 'Algolia\\AlgoliaSearch\\RetryStrategy\\HostCollection' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/RetryStrategy/HostCollection.php', + 'Algolia\\AlgoliaSearch\\SearchClient' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/SearchClient.php', + 'Algolia\\AlgoliaSearch\\SearchIndex' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/SearchIndex.php', + 'Algolia\\AlgoliaSearch\\Support\\Helpers' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Support/Helpers.php', + 'Algolia\\AlgoliaSearch\\Support\\UserAgent' => __DIR__ . '/..' . '/algolia/algoliasearch-client-php/src/Support/UserAgent.php', + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'Kirby\\Search\\Index' => __DIR__ . '/../..' . '/src/Index.php', + 'Kirby\\Search\\Results' => __DIR__ . '/../..' . '/src/Results.php', + 'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', + 'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', + 'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', + 'Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php', + 'Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php', + 'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', + 'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', + 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.php', + 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php', + 'Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', + 'Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', + 'Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInitd55d81fc665b9fa16948bcd7595bede4::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitd55d81fc665b9fa16948bcd7595bede4::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitd55d81fc665b9fa16948bcd7595bede4::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/site/plugins/search/vendor/composer/installed.php b/site/plugins/search/vendor/composer/installed.php new file mode 100644 index 0000000000..df9b49cf6f --- /dev/null +++ b/site/plugins/search/vendor/composer/installed.php @@ -0,0 +1,60 @@ + + array ( + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'aliases' => + array ( + ), + 'reference' => 'f0918468ade52e2388f889b720c566edb1920c51', + 'name' => 'getkirby/search', + ), + 'versions' => + array ( + 'algolia/algoliasearch-client-php' => + array ( + 'pretty_version' => '2.7.3', + 'version' => '2.7.3.0', + 'aliases' => + array ( + ), + 'reference' => '142a382e4649db0cb64d9eb8893872f1a4ba8dd3', + ), + 'getkirby/search' => + array ( + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'aliases' => + array ( + ), + 'reference' => 'f0918468ade52e2388f889b720c566edb1920c51', + ), + 'psr/http-message' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', + ), + 'psr/log' => + array ( + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc', + ), + 'psr/simple-cache' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', + ), + ), +); diff --git a/site/plugins/search/vendor/composer/platform_check.php b/site/plugins/search/vendor/composer/platform_check.php new file mode 100644 index 0000000000..7621d4ff97 --- /dev/null +++ b/site/plugins/search/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ += 50300)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 5.3.0". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/site/plugins/search/vendor/psr/http-message/src/MessageInterface.php b/site/plugins/search/vendor/psr/http-message/src/MessageInterface.php new file mode 100644 index 0000000000..dd46e5ec81 --- /dev/null +++ b/site/plugins/search/vendor/psr/http-message/src/MessageInterface.php @@ -0,0 +1,187 @@ +getHeaders() as $name => $values) { + * echo $name . ": " . implode(", ", $values); + * } + * + * // Emit headers iteratively: + * foreach ($message->getHeaders() as $name => $values) { + * foreach ($values as $value) { + * header(sprintf('%s: %s', $name, $value), false); + * } + * } + * + * While header names are not case-sensitive, getHeaders() will preserve the + * exact case in which headers were originally specified. + * + * @return string[][] Returns an associative array of the message's headers. Each + * key MUST be a header name, and each value MUST be an array of strings + * for that header. + */ + public function getHeaders(); + + /** + * Checks if a header exists by the given case-insensitive name. + * + * @param string $name Case-insensitive header field name. + * @return bool Returns true if any header names match the given header + * name using a case-insensitive string comparison. Returns false if + * no matching header name is found in the message. + */ + public function hasHeader($name); + + /** + * Retrieves a message header value by the given case-insensitive name. + * + * This method returns an array of all the header values of the given + * case-insensitive header name. + * + * If the header does not appear in the message, this method MUST return an + * empty array. + * + * @param string $name Case-insensitive header field name. + * @return string[] An array of string values as provided for the given + * header. If the header does not appear in the message, this method MUST + * return an empty array. + */ + public function getHeader($name); + + /** + * Retrieves a comma-separated string of the values for a single header. + * + * This method returns all of the header values of the given + * case-insensitive header name as a string concatenated together using + * a comma. + * + * NOTE: Not all header values may be appropriately represented using + * comma concatenation. For such headers, use getHeader() instead + * and supply your own delimiter when concatenating. + * + * If the header does not appear in the message, this method MUST return + * an empty string. + * + * @param string $name Case-insensitive header field name. + * @return string A string of values as provided for the given header + * concatenated together using a comma. If the header does not appear in + * the message, this method MUST return an empty string. + */ + public function getHeaderLine($name); + + /** + * Return an instance with the provided value replacing the specified header. + * + * While header names are case-insensitive, the casing of the header will + * be preserved by this function, and returned from getHeaders(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new and/or updated header and value. + * + * @param string $name Case-insensitive header field name. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withHeader($name, $value); + + /** + * Return an instance with the specified header appended with the given value. + * + * Existing values for the specified header will be maintained. The new + * value(s) will be appended to the existing list. If the header did not + * exist previously, it will be added. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new header and/or value. + * + * @param string $name Case-insensitive header field name to add. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withAddedHeader($name, $value); + + /** + * Return an instance without the specified header. + * + * Header resolution MUST be done without case-sensitivity. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that removes + * the named header. + * + * @param string $name Case-insensitive header field name to remove. + * @return static + */ + public function withoutHeader($name); + + /** + * Gets the body of the message. + * + * @return StreamInterface Returns the body as a stream. + */ + public function getBody(); + + /** + * Return an instance with the specified message body. + * + * The body MUST be a StreamInterface object. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return a new instance that has the + * new body stream. + * + * @param StreamInterface $body Body. + * @return static + * @throws \InvalidArgumentException When the body is not valid. + */ + public function withBody(StreamInterface $body); +} diff --git a/site/plugins/search/vendor/psr/http-message/src/RequestInterface.php b/site/plugins/search/vendor/psr/http-message/src/RequestInterface.php new file mode 100644 index 0000000000..a96d4fd636 --- /dev/null +++ b/site/plugins/search/vendor/psr/http-message/src/RequestInterface.php @@ -0,0 +1,129 @@ +getQuery()` + * or from the `QUERY_STRING` server param. + * + * @return array + */ + public function getQueryParams(); + + /** + * Return an instance with the specified query string arguments. + * + * These values SHOULD remain immutable over the course of the incoming + * request. They MAY be injected during instantiation, such as from PHP's + * $_GET superglobal, or MAY be derived from some other value such as the + * URI. In cases where the arguments are parsed from the URI, the data + * MUST be compatible with what PHP's parse_str() would return for + * purposes of how duplicate query parameters are handled, and how nested + * sets are handled. + * + * Setting query string arguments MUST NOT change the URI stored by the + * request, nor the values in the server params. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated query string arguments. + * + * @param array $query Array of query string arguments, typically from + * $_GET. + * @return static + */ + public function withQueryParams(array $query); + + /** + * Retrieve normalized file upload data. + * + * This method returns upload metadata in a normalized tree, with each leaf + * an instance of Psr\Http\Message\UploadedFileInterface. + * + * These values MAY be prepared from $_FILES or the message body during + * instantiation, or MAY be injected via withUploadedFiles(). + * + * @return array An array tree of UploadedFileInterface instances; an empty + * array MUST be returned if no data is present. + */ + public function getUploadedFiles(); + + /** + * Create a new instance with the specified uploaded files. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated body parameters. + * + * @param array $uploadedFiles An array tree of UploadedFileInterface instances. + * @return static + * @throws \InvalidArgumentException if an invalid structure is provided. + */ + public function withUploadedFiles(array $uploadedFiles); + + /** + * Retrieve any parameters provided in the request body. + * + * If the request Content-Type is either application/x-www-form-urlencoded + * or multipart/form-data, and the request method is POST, this method MUST + * return the contents of $_POST. + * + * Otherwise, this method may return any results of deserializing + * the request body content; as parsing returns structured content, the + * potential types MUST be arrays or objects only. A null value indicates + * the absence of body content. + * + * @return null|array|object The deserialized body parameters, if any. + * These will typically be an array or object. + */ + public function getParsedBody(); + + /** + * Return an instance with the specified body parameters. + * + * These MAY be injected during instantiation. + * + * If the request Content-Type is either application/x-www-form-urlencoded + * or multipart/form-data, and the request method is POST, use this method + * ONLY to inject the contents of $_POST. + * + * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of + * deserializing the request body content. Deserialization/parsing returns + * structured data, and, as such, this method ONLY accepts arrays or objects, + * or a null value if nothing was available to parse. + * + * As an example, if content negotiation determines that the request data + * is a JSON payload, this method could be used to create a request + * instance with the deserialized parameters. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated body parameters. + * + * @param null|array|object $data The deserialized body data. This will + * typically be in an array or object. + * @return static + * @throws \InvalidArgumentException if an unsupported argument type is + * provided. + */ + public function withParsedBody($data); + + /** + * Retrieve attributes derived from the request. + * + * The request "attributes" may be used to allow injection of any + * parameters derived from the request: e.g., the results of path + * match operations; the results of decrypting cookies; the results of + * deserializing non-form-encoded message bodies; etc. Attributes + * will be application and request specific, and CAN be mutable. + * + * @return array Attributes derived from the request. + */ + public function getAttributes(); + + /** + * Retrieve a single derived request attribute. + * + * Retrieves a single derived request attribute as described in + * getAttributes(). If the attribute has not been previously set, returns + * the default value as provided. + * + * This method obviates the need for a hasAttribute() method, as it allows + * specifying a default value to return if the attribute is not found. + * + * @see getAttributes() + * @param string $name The attribute name. + * @param mixed $default Default value to return if the attribute does not exist. + * @return mixed + */ + public function getAttribute($name, $default = null); + + /** + * Return an instance with the specified derived request attribute. + * + * This method allows setting a single derived request attribute as + * described in getAttributes(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated attribute. + * + * @see getAttributes() + * @param string $name The attribute name. + * @param mixed $value The value of the attribute. + * @return static + */ + public function withAttribute($name, $value); + + /** + * Return an instance that removes the specified derived request attribute. + * + * This method allows removing a single derived request attribute as + * described in getAttributes(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that removes + * the attribute. + * + * @see getAttributes() + * @param string $name The attribute name. + * @return static + */ + public function withoutAttribute($name); +} diff --git a/site/plugins/search/vendor/psr/http-message/src/StreamInterface.php b/site/plugins/search/vendor/psr/http-message/src/StreamInterface.php new file mode 100644 index 0000000000..f68f391269 --- /dev/null +++ b/site/plugins/search/vendor/psr/http-message/src/StreamInterface.php @@ -0,0 +1,158 @@ + + * [user-info@]host[:port] + * + * + * If the port component is not set or is the standard port for the current + * scheme, it SHOULD NOT be included. + * + * @see https://tools.ietf.org/html/rfc3986#section-3.2 + * @return string The URI authority, in "[user-info@]host[:port]" format. + */ + public function getAuthority(); + + /** + * Retrieve the user information component of the URI. + * + * If no user information is present, this method MUST return an empty + * string. + * + * If a user is present in the URI, this will return that value; + * additionally, if the password is also present, it will be appended to the + * user value, with a colon (":") separating the values. + * + * The trailing "@" character is not part of the user information and MUST + * NOT be added. + * + * @return string The URI user information, in "username[:password]" format. + */ + public function getUserInfo(); + + /** + * Retrieve the host component of the URI. + * + * If no host is present, this method MUST return an empty string. + * + * The value returned MUST be normalized to lowercase, per RFC 3986 + * Section 3.2.2. + * + * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 + * @return string The URI host. + */ + public function getHost(); + + /** + * Retrieve the port component of the URI. + * + * If a port is present, and it is non-standard for the current scheme, + * this method MUST return it as an integer. If the port is the standard port + * used with the current scheme, this method SHOULD return null. + * + * If no port is present, and no scheme is present, this method MUST return + * a null value. + * + * If no port is present, but a scheme is present, this method MAY return + * the standard port for that scheme, but SHOULD return null. + * + * @return null|int The URI port. + */ + public function getPort(); + + /** + * Retrieve the path component of the URI. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * Normally, the empty path "" and absolute path "/" are considered equal as + * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically + * do this normalization because in contexts with a trimmed base path, e.g. + * the front controller, this difference becomes significant. It's the task + * of the user to handle both "" and "/". + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.3. + * + * As an example, if the value should include a slash ("/") not intended as + * delimiter between path segments, that value MUST be passed in encoded + * form (e.g., "%2F") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.3 + * @return string The URI path. + */ + public function getPath(); + + /** + * Retrieve the query string of the URI. + * + * If no query string is present, this method MUST return an empty string. + * + * The leading "?" character is not part of the query and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.4. + * + * As an example, if a value in a key/value pair of the query string should + * include an ampersand ("&") not intended as a delimiter between values, + * that value MUST be passed in encoded form (e.g., "%26") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.4 + * @return string The URI query string. + */ + public function getQuery(); + + /** + * Retrieve the fragment component of the URI. + * + * If no fragment is present, this method MUST return an empty string. + * + * The leading "#" character is not part of the fragment and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.5. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.5 + * @return string The URI fragment. + */ + public function getFragment(); + + /** + * Return an instance with the specified scheme. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified scheme. + * + * Implementations MUST support the schemes "http" and "https" case + * insensitively, and MAY accommodate other schemes if required. + * + * An empty scheme is equivalent to removing the scheme. + * + * @param string $scheme The scheme to use with the new instance. + * @return static A new instance with the specified scheme. + * @throws \InvalidArgumentException for invalid or unsupported schemes. + */ + public function withScheme($scheme); + + /** + * Return an instance with the specified user information. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified user information. + * + * Password is optional, but the user information MUST include the + * user; an empty string for the user is equivalent to removing user + * information. + * + * @param string $user The user name to use for authority. + * @param null|string $password The password associated with $user. + * @return static A new instance with the specified user information. + */ + public function withUserInfo($user, $password = null); + + /** + * Return an instance with the specified host. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified host. + * + * An empty host value is equivalent to removing the host. + * + * @param string $host The hostname to use with the new instance. + * @return static A new instance with the specified host. + * @throws \InvalidArgumentException for invalid hostnames. + */ + public function withHost($host); + + /** + * Return an instance with the specified port. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified port. + * + * Implementations MUST raise an exception for ports outside the + * established TCP and UDP port ranges. + * + * A null value provided for the port is equivalent to removing the port + * information. + * + * @param null|int $port The port to use with the new instance; a null value + * removes the port information. + * @return static A new instance with the specified port. + * @throws \InvalidArgumentException for invalid ports. + */ + public function withPort($port); + + /** + * Return an instance with the specified path. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified path. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * If the path is intended to be domain-relative rather than path relative then + * it must begin with a slash ("/"). Paths not starting with a slash ("/") + * are assumed to be relative to some base path known to the application or + * consumer. + * + * Users can provide both encoded and decoded path characters. + * Implementations ensure the correct encoding as outlined in getPath(). + * + * @param string $path The path to use with the new instance. + * @return static A new instance with the specified path. + * @throws \InvalidArgumentException for invalid paths. + */ + public function withPath($path); + + /** + * Return an instance with the specified query string. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified query string. + * + * Users can provide both encoded and decoded query characters. + * Implementations ensure the correct encoding as outlined in getQuery(). + * + * An empty query string value is equivalent to removing the query string. + * + * @param string $query The query string to use with the new instance. + * @return static A new instance with the specified query string. + * @throws \InvalidArgumentException for invalid query strings. + */ + public function withQuery($query); + + /** + * Return an instance with the specified URI fragment. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified URI fragment. + * + * Users can provide both encoded and decoded fragment characters. + * Implementations ensure the correct encoding as outlined in getFragment(). + * + * An empty fragment value is equivalent to removing the fragment. + * + * @param string $fragment The fragment to use with the new instance. + * @return static A new instance with the specified fragment. + */ + public function withFragment($fragment); + + /** + * Return the string representation as a URI reference. + * + * Depending on which components of the URI are present, the resulting + * string is either a full URI or relative reference according to RFC 3986, + * Section 4.1. The method concatenates the various components of the URI, + * using the appropriate delimiters: + * + * - If a scheme is present, it MUST be suffixed by ":". + * - If an authority is present, it MUST be prefixed by "//". + * - The path can be concatenated without delimiters. But there are two + * cases where the path has to be adjusted to make the URI reference + * valid as PHP does not allow to throw an exception in __toString(): + * - If the path is rootless and an authority is present, the path MUST + * be prefixed by "/". + * - If the path is starting with more than one "/" and no authority is + * present, the starting slashes MUST be reduced to one. + * - If a query is present, it MUST be prefixed by "?". + * - If a fragment is present, it MUST be prefixed by "#". + * + * @see http://tools.ietf.org/html/rfc3986#section-4.1 + * @return string + */ + public function __toString(); +} diff --git a/site/plugins/search/vendor/psr/log/Psr/Log/AbstractLogger.php b/site/plugins/search/vendor/psr/log/Psr/Log/AbstractLogger.php new file mode 100644 index 0000000000..90e721af2d --- /dev/null +++ b/site/plugins/search/vendor/psr/log/Psr/Log/AbstractLogger.php @@ -0,0 +1,128 @@ +log(LogLevel::EMERGENCY, $message, $context); + } + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function alert($message, array $context = array()) + { + $this->log(LogLevel::ALERT, $message, $context); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function critical($message, array $context = array()) + { + $this->log(LogLevel::CRITICAL, $message, $context); + } + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function error($message, array $context = array()) + { + $this->log(LogLevel::ERROR, $message, $context); + } + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function warning($message, array $context = array()) + { + $this->log(LogLevel::WARNING, $message, $context); + } + + /** + * Normal but significant events. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function notice($message, array $context = array()) + { + $this->log(LogLevel::NOTICE, $message, $context); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function info($message, array $context = array()) + { + $this->log(LogLevel::INFO, $message, $context); + } + + /** + * Detailed debug information. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function debug($message, array $context = array()) + { + $this->log(LogLevel::DEBUG, $message, $context); + } +} diff --git a/site/plugins/search/vendor/psr/log/Psr/Log/InvalidArgumentException.php b/site/plugins/search/vendor/psr/log/Psr/Log/InvalidArgumentException.php new file mode 100644 index 0000000000..67f852d1db --- /dev/null +++ b/site/plugins/search/vendor/psr/log/Psr/Log/InvalidArgumentException.php @@ -0,0 +1,7 @@ +logger = $logger; + } +} diff --git a/site/plugins/search/vendor/psr/log/Psr/Log/LoggerInterface.php b/site/plugins/search/vendor/psr/log/Psr/Log/LoggerInterface.php new file mode 100644 index 0000000000..2206cfde41 --- /dev/null +++ b/site/plugins/search/vendor/psr/log/Psr/Log/LoggerInterface.php @@ -0,0 +1,125 @@ +log(LogLevel::EMERGENCY, $message, $context); + } + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function alert($message, array $context = array()) + { + $this->log(LogLevel::ALERT, $message, $context); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function critical($message, array $context = array()) + { + $this->log(LogLevel::CRITICAL, $message, $context); + } + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function error($message, array $context = array()) + { + $this->log(LogLevel::ERROR, $message, $context); + } + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function warning($message, array $context = array()) + { + $this->log(LogLevel::WARNING, $message, $context); + } + + /** + * Normal but significant events. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function notice($message, array $context = array()) + { + $this->log(LogLevel::NOTICE, $message, $context); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function info($message, array $context = array()) + { + $this->log(LogLevel::INFO, $message, $context); + } + + /** + * Detailed debug information. + * + * @param string $message + * @param array $context + * + * @return void + */ + public function debug($message, array $context = array()) + { + $this->log(LogLevel::DEBUG, $message, $context); + } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + * + * @return void + * + * @throws \Psr\Log\InvalidArgumentException + */ + abstract public function log($level, $message, array $context = array()); +} diff --git a/site/plugins/search/vendor/psr/log/Psr/Log/NullLogger.php b/site/plugins/search/vendor/psr/log/Psr/Log/NullLogger.php new file mode 100644 index 0000000000..c8f7293b1c --- /dev/null +++ b/site/plugins/search/vendor/psr/log/Psr/Log/NullLogger.php @@ -0,0 +1,30 @@ +logger) { }` + * blocks. + */ +class NullLogger extends AbstractLogger +{ + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + * + * @return void + * + * @throws \Psr\Log\InvalidArgumentException + */ + public function log($level, $message, array $context = array()) + { + // noop + } +} diff --git a/site/plugins/search/vendor/psr/simple-cache/src/CacheException.php b/site/plugins/search/vendor/psr/simple-cache/src/CacheException.php new file mode 100644 index 0000000000..eba53815c0 --- /dev/null +++ b/site/plugins/search/vendor/psr/simple-cache/src/CacheException.php @@ -0,0 +1,10 @@ + value pairs. Cache keys that do not exist or are stale will have $default as value. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $keys is neither an array nor a Traversable, + * or if any of the $keys are not a legal value. + */ + public function getMultiple($keys, $default = null); + + /** + * Persists a set of key => value pairs in the cache, with an optional TTL. + * + * @param iterable $values A list of key => value pairs for a multiple-set operation. + * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and + * the driver supports TTL then the library may set a default value + * for it or let the driver take care of that. + * + * @return bool True on success and false on failure. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $values is neither an array nor a Traversable, + * or if any of the $values are not a legal value. + */ + public function setMultiple($values, $ttl = null); + + /** + * Deletes multiple cache items in a single operation. + * + * @param iterable $keys A list of string-based keys to be deleted. + * + * @return bool True if the items were successfully removed. False if there was an error. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $keys is neither an array nor a Traversable, + * or if any of the $keys are not a legal value. + */ + public function deleteMultiple($keys); + + /** + * Determines whether an item is present in the cache. + * + * NOTE: It is recommended that has() is only to be used for cache warming type purposes + * and not to be used within your live applications operations for get/set, as this method + * is subject to a race condition where your has() will return true and immediately after, + * another script can remove it making the state of your app out of date. + * + * @param string $key The cache item key. + * + * @return bool + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if the $key string is not a legal value. + */ + public function has($key); +} diff --git a/site/plugins/search/vendor/psr/simple-cache/src/InvalidArgumentException.php b/site/plugins/search/vendor/psr/simple-cache/src/InvalidArgumentException.php new file mode 100644 index 0000000000..6a9524a20c --- /dev/null +++ b/site/plugins/search/vendor/psr/simple-cache/src/InvalidArgumentException.php @@ -0,0 +1,13 @@ +=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.6" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-2.x": "2.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" - ] + "phpDocumentor\\Reflection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -58,38 +53,45 @@ "reflection", "static analysis" ], - "time": "2017-09-11T18:02:19+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "3.3.2", + "version": "5.2.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2" + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bf329f6c1aadea3299f08ee804682b7c45b326a2", - "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", - "webmozart/assert": "^1.0" + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^4.4" + "mockery/mockery": "~1.3.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -100,44 +102,49 @@ { "name": "Mike van Riel", "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-10T14:09:06+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + }, + "time": "2020-09-03T19:13:55+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "0.4.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", "shasum": "" }, "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" + "ext-tokenizer": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -150,35 +157,118 @@ "email": "me@mikevanriel.com" } ], - "time": "2017-07-14T14:27:02+00:00" + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + }, + "time": "2020-09-17T18:55:26+00:00" }, { - "name": "webmozart/assert", - "version": "1.3.0", + "name": "symfony/polyfill-ctype", + "version": "v1.22.1", "source": { "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": ">=7.1" }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" + "suggest": { + "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1" }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-07T16:49:33+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "type": "library", "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -200,7 +290,11 @@ "check", "validate" ], - "time": "2018-01-29T19:49:41+00:00" + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.9.1" + }, + "time": "2020-07-08T17:02:28+00:00" } ], "packages-dev": [], @@ -210,5 +304,6 @@ "prefer-stable": false, "prefer-lowest": false, "platform": [], - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "2.0.0" } diff --git a/site/plugins/site/extensions/components.php b/site/plugins/site/extensions/components.php new file mode 100644 index 0000000000..70ef311561 --- /dev/null +++ b/site/plugins/site/extensions/components.php @@ -0,0 +1,17 @@ + function (App $kirby, string $text = null, array $options = [], bool $inline = false) { + static $parser; + $parser = $parser ?? new Marsdown(); + + if ($inline === true) { + return @$parser->line($text); + } + + return @$parser->text($text); + }, +]; \ No newline at end of file diff --git a/site/plugins/site/extensions/fieldMethods.php b/site/plugins/site/extensions/fieldMethods.php new file mode 100755 index 0000000000..e29e7a20e3 --- /dev/null +++ b/site/plugins/site/extensions/fieldMethods.php @@ -0,0 +1,25 @@ + function ($field, string $headline = 'h2') { + preg_match_all('!<' . $headline . '.*?>(.*?)!s', $field->kt()->value(), $matches); + + $headlines = new Collection; + + foreach ($matches[1] as $text) { + $headline = new Obj([ + 'id' => '#' . Str::slug(Str::unhtml($text)), + 'text' => trim(strip_tags($text)), + ]); + + $headlines->append($headline->id(), $headline); + } + + return $headlines; + }, + 'stripGlossary' => function ($field) { + return $field->value(function ($value) { + return str_replace('(glossary:', '(plain:', $value); + }); + } +]; diff --git a/site/plugins/site/extensions/pagesMethods.php b/site/plugins/site/extensions/pagesMethods.php new file mode 100755 index 0000000000..9b98672a81 --- /dev/null +++ b/site/plugins/site/extensions/pagesMethods.php @@ -0,0 +1,28 @@ + function () { + return $this->listed()->filter(function ($child) { + if ( + method_exists($child, 'isInternal') === true && + method_exists($child, 'isDeprecated') === true + ) { + return $child->isInternal() === false && + $child->isDeprecated() === false; + } + + return true; + }); + }, + 'referenced' => function () { + if (Cookie::get('getkirby$advanced') === 'yes') { + $pages = $this->listed(); + } else { + $pages = $this->filtered(); + } + + return $pages; + }, +]; diff --git a/site/plugins/site/extensions/tags.php b/site/plugins/site/extensions/tags.php new file mode 100755 index 0000000000..4bdbafb4c8 --- /dev/null +++ b/site/plugins/site/extensions/tags.php @@ -0,0 +1,263 @@ + [ + 'caption', + 'link', + 'title', + ], + 'html' => function ($tag) { + if ($file = $tag->file($tag->value)) { + return snippet('kirbytext/image', [ + 'file' => $file, + 'link' => empty($tag->link) ? null : ($tag->link === 'self' ? $file->url() : $tag->link), + 'caption' => $tag->caption ?? $file->caption()->value() + ], true); + } + } +]; + +$tags['screencast'] = [ + 'attr' => [ + 'title', + 'text', + ], + 'html' => function ($tag) { + return snippet('kirbytext/screencast', [ + 'url' => $tag->value, + 'title' => $tag->title ?? null, + 'text' => $tag->text ?? null + ], true); + } +]; + +$tags['glossary'] = [ + 'attr' => ['text'], + 'html' => function ($tag) { + if ($term = page('docs/glossary/' . $tag->value)) { + $title = $term->entry()->stripGlossary()->kti(); + + return '' . ($tag->text ?? $term->title()) . ''; + } + } +]; + +$tags['reference'] = [ + 'html' => function ($tag) { + if ($page = page('docs/reference/' . $tag->value())) { + return snippet('kirbytext/reference', [ + 'entries' => $page->children()->listed() + ], true); + } + } +]; + +/** + * For internal usage + */ + +$tags['properties'] = [ + 'attr' => [ + 'class', + 'title', + 'intro' + ], + 'html' => function ($tag) { + $name = $tag->value ?? '$props'; + + if ($tag->class) { + $page = ReferenceClassPage::findByName($tag->class); + } else { + $page = $tag->parent(); + } + + if ($page) { + return snippet('templates/reference/entry/parameters', [ + 'title' => $tag->title ?? false, + 'intro' => $tag->intro ?? false, + 'rows' => $page->properties(), + 'defaults' => false + ], true); + } + } +]; + + +$tags['plain'] = [ + 'attr' => ['text'], + 'html' => function ($tag) { + return $tag->text ?? $tag->value; + } +]; + +/** +* (docs: some-snippet) +* +* Injects shared doc snippets rom site/docs +*/ +$tags['docs'] = [ + 'attr' => [ + 'field' + ], + 'html' => function ($tag) { + $file = $tag->kirby()->root('site') . '/docs/' . $tag->value . '.php'; + + if (file_exists($file) === false) { + return; + } + + $snippet = Tpl::load($file, [ + 'page' => $tag->parent(), + 'field' => $tag->attr('field') + ]); + + return kirbytext($snippet, [ + 'parent' => $tag->parent() + ]); + } +]; + + + + + +// @todo All the following should be refactored, but this requires +// content file changes, so we wait + +/** + * Fetch prop definitions from Fields and Sections + * and create an options table for it. + * + * @param array $definition + * @return array + * @todo refactor/deprecate + */ +function componentOptions(array $props) { + + $table = []; + + foreach ($props as $attr => $prop) { + + if ($attr === 'value') { + continue; + } + + if (is_callable($prop) === false) { + continue; + } + + $reflection = new ReflectionFunction($prop); + $parameter = $reflection->getParameters()[0] ?? null; + $comment = null; + + try { + $default = $parameter->getDefaultValue(); + } catch (Exception $e) { + $default = null; + } + + if ($docComment = $reflection->getDocComment()) { + try { + $docBlock = new DocBlock($docComment); + $comment = trim($docBlock->getSummary()); + $comment = str_replace(PHP_EOL, ' ', $comment); + + if ($comment === '/') { + $comment = null; + } + + } catch (Throwable $e) { + } + } + + if (is_array($default) === true) { + $default = '[]'; + } + + if ($default === true) { + $default = 'true'; + } + + if ($default === false) { + $default = 'false'; + } + + $table[$attr] = [ + 'name' => $attr, + 'required' => $parameter->isOptional() !== true, + 'type' => $parameter->getType() ? $parameter->getType()->getName() : null, + 'default' => $default, + 'description' => $comment, + ]; + + } + + ksort($table); + + return $table; + +} + +$tags['api-fields'] = [ + 'html' => function ($tag) { + $models = $tag->kirby()->api()->models(); + $model = $models[$tag->value] ?? []; + $fields = array_keys($model['fields'] ?? []); + + if (empty($fields) === true) { + return ''; + } + + $fields = array_map(function ($field) { + return '`' . $field . '`'; + }, $fields); + + return '- ' . implode(PHP_EOL . '- ', $fields); + } +]; + +$tags['field-options'] = [ + 'html' => function ($tag) { + $type = $tag->value; + $definition = Field::setup($type); + $props = $definition['props'] ?? []; + $table = componentOptions($props); + + return snippet('templates/reference/entry/parameters', [ + 'title' => false, + 'rows' => $table + ], true); + } +]; + +$tags['section-options'] = [ + 'html' => function ($tag) { + $type = $tag->value; + $definition = Section::setup($type); + $props = $definition['props'] ?? []; + $table = componentOptions($props); + + return snippet('templates/reference/entry/parameters', [ + 'title' => false, + 'rows' => $table + ], true); + } +]; + +return $tags; diff --git a/site/plugins/site/fieldMethods.php b/site/plugins/site/fieldMethods.php deleted file mode 100755 index f34d4fabe9..0000000000 --- a/site/plugins/site/fieldMethods.php +++ /dev/null @@ -1,79 +0,0 @@ - function ($field, $headlines = 'h2|h3') { - - $headlinesPattern = is_array($headlines) ? implode('|', $headlines) : $headlines; - - $lastH2 = null; - - // add anchors to headlines - $field->value = preg_replace_callback('!<(' . $headlinesPattern . ')>(.*?)!s', function ($match) use (&$lastH2) { - $id = Str::slug(Str::unhtml($match[2])); - - if ($match[1] === 'h3') { - $id = $lastH2 . '__' . $id; - } else { - $lastH2 = $id; - } - - return '<' . $match[1] . ' id="' . $id . '">' . $match[2] . ''; - }, $field->value); - - return $field; - }, - - 'future' => function ($field) { - return version_compare(Kirby::version(), $field->value, '<'); - }, - - 'headlines' => function($field, $headline = 'h2') { - - preg_match_all('!<' . $headline . '.*?>(.*?)!s', $field->kt()->value(), $matches); - - $headlines = new Collection; - - foreach ($matches[1] as $text) { - $headline = new Obj([ - 'id' => $id = '#' . Str::slug(Str::unhtml($text)), - 'url' => $id, - 'text' => trim(strip_tags($text)), - ]); - - $headlines->append($headline->url(), $headline); - } - - return $headlines; - - }, - - 'replace' => function ($field, $replace) { - $field->value = Str::template($field->value(), $replace); - - return $field; - }, - - 'structureHeadlines' => function ($field, $fieldName = 'title') { - - $sections = $field->toStructure(); - $headlines = new Collection; - - foreach($sections as $item) { - $title = $item->{$fieldName}()->value(); - $headline = new Obj([ - 'url' => '#' . Str::slug(Str::unhtml($title)), - 'text' => trim(strip_tags($title)), - ]); - - $headlines->append($headline->url(), $headline); - } - - return $headlines; - }, - - 'version' => function ($field, $format = '%s') { - return $field->isEmpty() ? '' : version($field->value(), $format); - } - -]; diff --git a/site/plugins/site/helpers.php b/site/plugins/site/helpers.php deleted file mode 100755 index c513286a50..0000000000 --- a/site/plugins/site/helpers.php +++ /dev/null @@ -1,219 +0,0 @@ - $name) { - $icons[$i] = pathinfo($name, PATHINFO_FILENAME); - } - - return $icons; -} - -function cheatsheetAdvanced($page) -{ - if (param('advanced') !== 'true') { - return Html::a($page->url() . '/advanced:true', 'Advanced view ›'); - } - - return Html::a($page->url(), 'Simple view ›'); -} - -function formatRequired($required) { - return $required ? '*' : ''; -} - -function csv(string $file): array -{ - - $lines = file($file); - $lines[0] = str_replace("\xEF\xBB\xBF", '', $lines[0]); - - $csv = array_map('str_getcsv', $lines); - - array_walk($csv, function(&$a) use ($csv) { - $a = array_combine($csv[0], $a); - }); - - array_shift($csv); - - return $csv; -} - -function iconRoot($name) -{ - return __DIR__ . '/icons/' . $name . '.svg'; -} - -function formatDatatype(?string $type = null): ?string -{ - $builtinDatatypes = [ - 'string', - 'int', - 'float', - 'bool', - 'array', - 'object', - 'mixed', - 'null', - ]; - - if(empty($type) === true) { - return ''; - } - - if (preg_match('/^[^\\a-z0-9_]+$/iu', $type) === 1) { - // any tyype containing at least one whitespace or any character - // that cannot be part of a datatype, just return a plain - // code element. - return "{$type}"; - } - - if (Str::contains($type, '|')) { - // Multiple datatypes - $types = explode('|', $type); - - if (in_array('', $types)) { - // Don’t process code blocks, that contain empty elements - return "{$type}"; - } - - $types = array_map(function ($value) { - return formatDatatype($value); - }, $types); - - return implode('|', $types); - } - - if (in_array($type, $builtinDatatypes) === true) { - // Atomic PHP datatype - return Html::tag('code', $type, [ - 'class' => "type type-{$type}", - ]); - } - - if (preg_match('/^[A-Z]/', $type) === 1) { - // Assume, it’s a class name - - if ($lookup = referenceLookup($type)) { - // Namespaced class name, look whether it’s a Kirby classs - return "url()}\">{$type}"; - } else if (class_exists($type) === true && (new ReflectionClass($type))->getName() === $type) { - // Some class that exists in PHP in the global namespace. The - // seconds check is done to ensure correct case, as `class_exists()`` - // is not case-sensitive. - return Html::tag('code', $type, [ - 'class' => "type type-class", - ]); - } - } - - // Probably a code example (not a datatype), just return a plain code tag. - return "{$type}"; -} - -function formatDefault(?string $value = null): string -{ - return is_null($value) === false ? formatDatatype($value) : ''; -} - -// Load an icon from SVG sprite -function icon(string $name, bool $return = false, array $attr = null) -{ - - $iconRoot = iconRoot($name); - - if (file_exists($iconRoot) === true) { - - $icon = trim(file_get_contents($iconRoot)); - - if ($attr !== null) { - // replace attributes on `` tag if $attr param is set. - $xml = simplexml_load_string($icon); - $originalAttr = $xml->attributes(); - $newAttr = []; - - foreach ($originalAttr as $name => $value) { - $newAttr[(string) $name] = (string) $value; - } - - $newAttr = array_merge($newAttr, $attr); - - if (isset($originalAttr['class']) && isset($attr['class'])) { - // class attribute is merged, rather than overridden - $newAttr['class'] = trim("{$originalAttr['class']} {$attr['class']}"); - } - - $icon = preg_replace('/^]+)>/sU', '', $icon); - } - - } else { - $icon = ''; - } - - if ($return === true) { - return $icon; - } - - echo $icon; - -} - -function referenceLookup(string $class) -{ - if (option('referenceLookup') === false) { - return false; - } - - $roots = [ - 'docs/reference/objects', - 'docs/reference/tools', - 'docs/reference/@' - ]; - - foreach ($roots as $root) { - $index = page($root)->index(); - if ($page = $index->filterBy('class', $class)->first()) { - return $page; - } - } -} - -function parseObjectReference(string $string, string $parent): string -{ - return kirbytext(preg_replace_callback("|\`(.*)\`|", function ($matches) use ($parent) { - $matches[1] = Str::trim($matches[1], '()'); - $namespace = Str::split($matches[1], '\\'); - - - if (count($namespace) === 1) { - $class = Str::split($parent, '\\'); - $class[2] = Str::before($namespace[0], '::'); - $class = implode('\\', $class); - $method = Str::after($namespace[0], '::'); - } else { - $class = Str::before($matches[1], '::'); - $method = Str::after($matches[1], '::'); - } - - if ($obj = referenceLookup($class)) { - if ($method = $obj->find(Str::kebab($method))) { - return Html::a($method->url(), $matches[0]); - } - } - - return $matches[0]; - - }, $string)); -} - -function version(string $version, string $format): string -{ - return Html::a(option('github') . '/kirby/releases/tag/' . $version, sprintf($format, $version)); -} diff --git a/site/plugins/site/helpers/html.php b/site/plugins/site/helpers/html.php new file mode 100755 index 0000000000..b2956ab936 --- /dev/null +++ b/site/plugins/site/helpers/html.php @@ -0,0 +1,60 @@ + $type]) : null; +} + +function icon($name) +{ + return svg('assets/icons/' . $name . '.svg'); +} + +function img($file, array $props = []) +{ + if (!$file) { + return; + } + + if (empty($props['src']) === true) { + $src = $file->url(); + } else { + $src = $file->thumb($props['src'])->url(); + } + + if (empty($props['srcset']) === true) { + $srcset = null; + } else { + $srcset = $file->srcset($props['srcset']); + } + + if (($props['lazy'] ?? true) === true) { + $loading = 'lazy'; + } else { + $loading = null; + } + + return ' $props['alt'] ?? '', + 'class' => $props['class'] ?? null, + 'loading' => $loading, + 'src' => $src, + 'srcset' => $srcset, + ]) . '>'; +} + +function json(array $data, bool $pretty = true) { + if ($pretty === true) { + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } + + return json_encode($data); +} + +function version(string $version, string $format = '%s'): string +{ + return Html::a( + option('github') . '/kirby/releases/tag/' . $version, + sprintf($format, $version) + ); +} diff --git a/site/plugins/site/helpers/reference.php b/site/plugins/site/helpers/reference.php new file mode 100644 index 0000000000..4524b7d5c4 --- /dev/null +++ b/site/plugins/site/helpers/reference.php @@ -0,0 +1,31 @@ +customField(); + } + + if (is_a($value, 'Kirby\Cms\Field') === false) { + $value = page()->customField()->value($value); + } + + return $value; +} \ No newline at end of file diff --git a/site/plugins/site/icons/algolia.svg b/site/plugins/site/icons/algolia.svg deleted file mode 100644 index 674ff08f49..0000000000 --- a/site/plugins/site/icons/algolia.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/analytics.svg b/site/plugins/site/icons/analytics.svg deleted file mode 100644 index cf523b8798..0000000000 --- a/site/plugins/site/icons/analytics.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/archive.svg b/site/plugins/site/icons/archive.svg deleted file mode 100644 index 3f34874ed8..0000000000 --- a/site/plugins/site/icons/archive.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/arrow-big-left.svg b/site/plugins/site/icons/arrow-big-left.svg deleted file mode 100644 index c18e577477..0000000000 --- a/site/plugins/site/icons/arrow-big-left.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/arrow-big-right.svg b/site/plugins/site/icons/arrow-big-right.svg deleted file mode 100644 index 76d8438931..0000000000 --- a/site/plugins/site/icons/arrow-big-right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/arrow-left.svg b/site/plugins/site/icons/arrow-left.svg deleted file mode 100755 index 89221ea832..0000000000 --- a/site/plugins/site/icons/arrow-left.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/arrow-right.svg b/site/plugins/site/icons/arrow-right.svg deleted file mode 100755 index 06f8838b15..0000000000 --- a/site/plugins/site/icons/arrow-right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/audio.svg b/site/plugins/site/icons/audio.svg deleted file mode 100644 index 00a74f7130..0000000000 --- a/site/plugins/site/icons/audio.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/bug.svg b/site/plugins/site/icons/bug.svg deleted file mode 100644 index d2745fbb15..0000000000 --- a/site/plugins/site/icons/bug.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/cart.svg b/site/plugins/site/icons/cart.svg deleted file mode 100644 index e3344e4c48..0000000000 --- a/site/plugins/site/icons/cart.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/check.svg b/site/plugins/site/icons/check.svg deleted file mode 100644 index 2c0a7e690c..0000000000 --- a/site/plugins/site/icons/check.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/chevron-left.svg b/site/plugins/site/icons/chevron-left.svg deleted file mode 100644 index cd97d1170b..0000000000 --- a/site/plugins/site/icons/chevron-left.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/chevron-right.svg b/site/plugins/site/icons/chevron-right.svg deleted file mode 100644 index 2c5bb3a279..0000000000 --- a/site/plugins/site/icons/chevron-right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/code.svg b/site/plugins/site/icons/code.svg deleted file mode 100644 index 4d83cefe20..0000000000 --- a/site/plugins/site/icons/code.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/composer.svg b/site/plugins/site/icons/composer.svg deleted file mode 100644 index 7642f61986..0000000000 --- a/site/plugins/site/icons/composer.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/copy.svg b/site/plugins/site/icons/copy.svg deleted file mode 100644 index 06aba17472..0000000000 --- a/site/plugins/site/icons/copy.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/css.svg b/site/plugins/site/icons/css.svg deleted file mode 100644 index 79ab1983d8..0000000000 --- a/site/plugins/site/icons/css.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/discord.svg b/site/plugins/site/icons/discord.svg deleted file mode 100644 index b9ef9da83f..0000000000 --- a/site/plugins/site/icons/discord.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/document.svg b/site/plugins/site/icons/document.svg deleted file mode 100644 index 2c0dbca51c..0000000000 --- a/site/plugins/site/icons/document.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/download.svg b/site/plugins/site/icons/download.svg deleted file mode 100644 index c4df98805e..0000000000 --- a/site/plugins/site/icons/download.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/file.svg b/site/plugins/site/icons/file.svg deleted file mode 100644 index ec32efc2a6..0000000000 --- a/site/plugins/site/icons/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/folder-collapsed.svg b/site/plugins/site/icons/folder-collapsed.svg deleted file mode 100644 index c626ef6947..0000000000 --- a/site/plugins/site/icons/folder-collapsed.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/folder-expanded.svg b/site/plugins/site/icons/folder-expanded.svg deleted file mode 100644 index 324da746d9..0000000000 --- a/site/plugins/site/icons/folder-expanded.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/font.svg b/site/plugins/site/icons/font.svg deleted file mode 100644 index e99834164c..0000000000 --- a/site/plugins/site/icons/font.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/forms.svg b/site/plugins/site/icons/forms.svg deleted file mode 100644 index c247c80123..0000000000 --- a/site/plugins/site/icons/forms.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/git.svg b/site/plugins/site/icons/git.svg deleted file mode 100644 index cc2c0d22d5..0000000000 --- a/site/plugins/site/icons/git.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/github.svg b/site/plugins/site/icons/github.svg deleted file mode 100755 index cb6a5f9658..0000000000 --- a/site/plugins/site/icons/github.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/globe.svg b/site/plugins/site/icons/globe.svg deleted file mode 100644 index f74c94302e..0000000000 --- a/site/plugins/site/icons/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/guide.svg b/site/plugins/site/icons/guide.svg deleted file mode 100644 index b204a1c1a6..0000000000 --- a/site/plugins/site/icons/guide.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/gulpfile.svg b/site/plugins/site/icons/gulpfile.svg deleted file mode 100644 index 2106d3263d..0000000000 --- a/site/plugins/site/icons/gulpfile.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/html.svg b/site/plugins/site/icons/html.svg deleted file mode 100644 index 979d423781..0000000000 --- a/site/plugins/site/icons/html.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/image.svg b/site/plugins/site/icons/image.svg deleted file mode 100644 index 44030045cb..0000000000 --- a/site/plugins/site/icons/image.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/info.svg b/site/plugins/site/icons/info.svg deleted file mode 100644 index 89ca7a2e8d..0000000000 --- a/site/plugins/site/icons/info.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/instagram.svg b/site/plugins/site/icons/instagram.svg deleted file mode 100644 index f04679a632..0000000000 --- a/site/plugins/site/icons/instagram.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/integration.svg b/site/plugins/site/icons/integration.svg deleted file mode 100644 index 47af373f3a..0000000000 --- a/site/plugins/site/icons/integration.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/javascript.svg b/site/plugins/site/icons/javascript.svg deleted file mode 100644 index 1a5f19e408..0000000000 --- a/site/plugins/site/icons/javascript.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/keycdn.svg b/site/plugins/site/icons/keycdn.svg deleted file mode 100644 index 732278c660..0000000000 --- a/site/plugins/site/icons/keycdn.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/link.svg b/site/plugins/site/icons/link.svg deleted file mode 100644 index 5a2ace3f5c..0000000000 --- a/site/plugins/site/icons/link.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/list.svg b/site/plugins/site/icons/list.svg deleted file mode 100644 index d6063609e4..0000000000 --- a/site/plugins/site/icons/list.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/lock.svg b/site/plugins/site/icons/lock.svg deleted file mode 100644 index b95b642ad5..0000000000 --- a/site/plugins/site/icons/lock.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/love.svg b/site/plugins/site/icons/love.svg deleted file mode 100644 index 84b2b0752e..0000000000 --- a/site/plugins/site/icons/love.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/markdown.svg b/site/plugins/site/icons/markdown.svg deleted file mode 100644 index d1497a8af2..0000000000 --- a/site/plugins/site/icons/markdown.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/panel.svg b/site/plugins/site/icons/panel.svg deleted file mode 100644 index f59da41f7f..0000000000 --- a/site/plugins/site/icons/panel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/paragraph.svg b/site/plugins/site/icons/paragraph.svg deleted file mode 100644 index 87f6e8bf9e..0000000000 --- a/site/plugins/site/icons/paragraph.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/performance.svg b/site/plugins/site/icons/performance.svg deleted file mode 100644 index 9904091516..0000000000 --- a/site/plugins/site/icons/performance.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/php.svg b/site/plugins/site/icons/php.svg deleted file mode 100644 index cb9bc1646c..0000000000 --- a/site/plugins/site/icons/php.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/readme.svg b/site/plugins/site/icons/readme.svg deleted file mode 100644 index 8b7d1dec16..0000000000 --- a/site/plugins/site/icons/readme.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/sass.svg b/site/plugins/site/icons/sass.svg deleted file mode 100644 index 96640eb926..0000000000 --- a/site/plugins/site/icons/sass.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/search.svg b/site/plugins/site/icons/search.svg deleted file mode 100644 index 09f965713c..0000000000 --- a/site/plugins/site/icons/search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/seo.svg b/site/plugins/site/icons/seo.svg deleted file mode 100644 index d9dfe33f4f..0000000000 --- a/site/plugins/site/icons/seo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/star-outline.svg b/site/plugins/site/icons/star-outline.svg deleted file mode 100644 index 8f955125ed..0000000000 --- a/site/plugins/site/icons/star-outline.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/star.svg b/site/plugins/site/icons/star.svg deleted file mode 100644 index 256b4f9ea7..0000000000 --- a/site/plugins/site/icons/star.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/text.svg b/site/plugins/site/icons/text.svg deleted file mode 100644 index 20a70715d4..0000000000 --- a/site/plugins/site/icons/text.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/twitter.svg b/site/plugins/site/icons/twitter.svg deleted file mode 100755 index 0f751f59a9..0000000000 --- a/site/plugins/site/icons/twitter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/user.svg b/site/plugins/site/icons/user.svg deleted file mode 100644 index e899da821b..0000000000 --- a/site/plugins/site/icons/user.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/video.svg b/site/plugins/site/icons/video.svg deleted file mode 100644 index 8e1e7659e1..0000000000 --- a/site/plugins/site/icons/video.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/wand.svg b/site/plugins/site/icons/wand.svg deleted file mode 100644 index 4d81b7a41b..0000000000 --- a/site/plugins/site/icons/wand.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/warning.svg b/site/plugins/site/icons/warning.svg deleted file mode 100644 index 3bc158a814..0000000000 --- a/site/plugins/site/icons/warning.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/yaml.svg b/site/plugins/site/icons/yaml.svg deleted file mode 100644 index 44e71ed4bb..0000000000 --- a/site/plugins/site/icons/yaml.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/icons/youtube.svg b/site/plugins/site/icons/youtube.svg deleted file mode 100644 index 969aa21b47..0000000000 --- a/site/plugins/site/icons/youtube.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/plugins/site/index.php b/site/plugins/site/index.php index 36e62659c0..dd422e36d7 100644 --- a/site/plugins/site/index.php +++ b/site/plugins/site/index.php @@ -1,10 +1,16 @@ include __DIR__ . '/fieldMethods.php', - 'pageModels' => include __DIR__ . '/pageModels.php', - 'pagesMethods' => include __DIR__ . '/pagesMethods.php', +require __DIR__ . '/helpers/html.php'; +require __DIR__ . '/helpers/reference.php'; + +class_alias('Kirby\\Types\\Type', 'Type'); + +Kirby::plugin('getkirby/site', [ + 'components' => include __DIR__ . '/extensions/components.php', + 'fieldMethods' => include __DIR__ . '/extensions/fieldMethods.php', + 'pagesMethods' => include __DIR__ . '/extensions/pagesMethods.php', + 'tags' => include __DIR__ . '/extensions/tags.php' ]); + \ No newline at end of file diff --git a/site/plugins/site/pageModels.php b/site/plugins/site/pageModels.php deleted file mode 100755 index 34a2f95f1b..0000000000 --- a/site/plugins/site/pageModels.php +++ /dev/null @@ -1,35 +0,0 @@ - 'Kirby\\Site\\Models\\ChangeLogPage', - 'reference-class' => 'Kirby\\Site\\Models\\ReferenceClassPage', - 'reference-article' => 'Kirby\\Site\\Models\\ReferenceArticlePage', - 'reference-section' => 'Kirby\\Site\\Models\\ReferenceSectionPage', - 'code' => 'Kirby\\Site\\Models\\CodePage', - 'reference-component' => 'Kirby\\Site\\Models\\ReferenceComponentPage', - 'cookbook' => 'Kirby\\Site\\Models\\CookbookPage', - 'reference-endpoint' => 'Kirby\\Site\\Models\\ReferenceEndpointPage', - 'reference-endpoints' => 'Kirby\\Site\\Models\\ReferenceEndpointsPage', - 'reference-extensions' => 'Kirby\\Site\\Models\\ReferenceExtensionsPage', - 'reference-fieldmethod' => 'Kirby\\Site\\Models\\ReferenceFieldMethodPage', - 'reference-fieldmethods' => 'Kirby\\Site\\Models\\ReferenceFieldMethodsPage', - 'guide' => 'Kirby\\Site\\Models\\GuidePage', - 'reference-helper' => 'Kirby\\Site\\Models\\ReferenceHelperPage', - 'reference-hook' => 'Kirby\\Site\\Models\\ReferenceHookPage', - 'reference-hooks' => 'Kirby\\Site\\Models\\ReferenceHooksPage', - 'reference-icon' => 'Kirby\\Site\\Models\\ReferenceIconPage', - 'reference-icons' => 'Kirby\\Site\\Models\\ReferenceIconsPage', - 'kosmos-issue' => 'Kirby\\Site\\Models\\KosmosIssuePage', - 'reference-kirbytag' => 'Kirby\\Site\\Models\\ReferenceKirbyTagPage', - 'reference-classmethod' => 'Kirby\\Site\\Models\\ReferenceClassMethodPage', - 'reference-packages' => 'Kirby\\Site\\Models\\ReferencePackagesPage', - 'cookbook-recipe' => 'Kirby\\Site\\Models\\CookbookRecipePage', - 'reference-root' => 'Kirby\\Site\\Models\\ReferenceRootPage', - 'reference-roots' => 'Kirby\\Site\\Models\\ReferenceRootsPage', - 'reference-ui' => 'Kirby\\Site\\Models\\ReferenceUiPage', - 'reference-url' => 'Kirby\\Site\\Models\\ReferenceUrlPage', - 'reference-urls' => 'Kirby\\Site\\Models\\ReferenceUrlsPage', - 'reference-validator' => 'Kirby\\Site\\Models\\ReferenceValidatorPage', - 'reference-validators' => 'Kirby\\Site\\Models\\ReferenceValidatorsPage', - 'voice' => 'Kirby\\Site\\Models\\VoicePage', -]; diff --git a/site/plugins/site/pagesMethods.php b/site/plugins/site/pagesMethods.php deleted file mode 100755 index 6cecf9f840..0000000000 --- a/site/plugins/site/pagesMethods.php +++ /dev/null @@ -1,27 +0,0 @@ - function () { - if (Cookie::get('getkirby_advanced') === 'yes') { - $pages = $this->listed(); - } else { - $pages = $this->simple(); - } - - return $pages->sortBy('isMagic', 'desc', 'slug', 'asc'); - }, - - 'hasAdvanced' => function () { - return $this->listed()->count() !== $this->simple()->count(); - }, - - 'simple' => function () { - return $this->listed()->filter(function ($p) { - if (method_exists($p, 'isInternal') && method_exists($p, 'isDeprecated')) { - return !$p->isInternal() && !$p->isDeprecated(); - } - return true; - }); - } -]; diff --git a/site/plugins/site/src/CodeBlock/FileSystem.php b/site/plugins/site/src/CodeBlock/FileSystem.php new file mode 100644 index 0000000000..cba2d29f52 --- /dev/null +++ b/site/plugins/site/src/CodeBlock/FileSystem.php @@ -0,0 +1,189 @@ + '/^(readme|license)\.?/i', + 'javascript' => ['js'], + 'css' => ['css'], + 'html' => ['html', 'htm', 'xhtml'], + 'font' => ['woff', 'woff2', 'ttf', 'otf', 'eot'], + 'code' => ['json'], + 'yaml' => ['yaml'], + 'markdown' => ['md', 'mdown', 'markdown'], + 'git' => ['git', 'gitattributes', 'gitignore', 'gitmodules'], + 'php' => ['php'], + 'yaml' => ['yml'], + 'text' => ['txt'], + ]; + + protected static function getIconByFilename($filename): ?string + { + if (in_array($filename, ['...', '…'])) { + return null; + } + + $extension = F::extension($filename); + $icon = F::type($filename); + + foreach (static::$types as $type => $extensions) { + if ( + ( + is_string($extensions) === true && + preg_match($extensions, $filename) + ) || ( + is_array($extensions) === true && + in_array($extension, $extensions) + ) + ) { + $icon = $type; + break; + } + } + + return $icon ?? 'file'; + } + + public static function parse($text): string + { + return static::renderBlock(static::parseBlock($text)); + } + + // Source: http://stackoverflow.com/a/8882181 + protected static function parseBlock($text): array + { + + $indentation = ' '; + + $result = []; + $path = []; + + foreach (explode("\n", $text) as $line) { + // get depth and label + $depth = 0; + + while (substr($line, 0, strlen($indentation)) === $indentation) { + $depth += 1; + $line = substr($line, strlen($indentation)); + } + + // truncate path if needed + while ($depth < sizeof($path)) { + array_pop($path); + } + + // keep label (at depth) + $path[$depth] = $line; + + // traverse path and add label to result + $parent =& $result; + + foreach ($path as $depth => $key) { + if (!isset($parent[$key])) { + $parent[$line] = array(); + break; + } + + $parent =& $parent[$key]; + } + } + + // return + return $result; + } + + protected static function renderLabel(string $name, ?string $type = null): string + { + $html = ''; + if ($type !== null) { + $html .= icon($type); + } + $html .= $name; + $html .= ''; + + return $html; + } + + protected static function renderBlock($files, $level = 0): string + { + $html = '
    '; + + foreach ($files as $filename => $children) { + + $hasChildren = count($children) > 0; + $isFolder = Str::endsWith($filename, '/'); + $icon = static::getIconByFilename($filename); + + $html .= '
  • '; + + if ($isFolder) { + $filename = preg_replace('/\/$/', '', $filename); + $icon = $hasChildren ? 'folder-expanded' : 'folder-collapsed'; + + if ($hasChildren) { + $html .= '
    '; + $html .= '' . static::renderLabel($filename, $icon) . ''; + $html .= static::renderBlock($children, $level + 1); + $html .= '
    '; + continue; + } + + } + + $html .= static::renderLabel($filename, $icon); + $html .= '
  • '; + + } + + $html .= '
'; + + return $html; + + } + +} + +// ```filesystem +// content/ +// 1-projects/ +// project-a/ +// .git +// .gitattributes +// archive.zip +// css.css +// file.unknown +// font.eot +// font.otf +// font.ttf +// font.woff +// font.woff2 +// html.html +// image-1.jpg +// image-2.jpg +// image-3.jpg +// js.js +// json.json +// markdown.md +// markdown.mdown +// php.php +// project-data.xls +// project-info.pdf +// project.txt +// readme.md +// LICENSE +// some-audio.mp3 +// some-video.mp4 +// xml.xml +// yaml.yml +// project-b/ +// ... +// 2-about/ +// ``` diff --git a/site/plugins/maki/src/KirbyContent.php b/site/plugins/site/src/CodeBlock/KirbyContent.php similarity index 92% rename from site/plugins/maki/src/KirbyContent.php rename to site/plugins/site/src/CodeBlock/KirbyContent.php index 621e450420..7204c2e76a 100644 --- a/site/plugins/maki/src/KirbyContent.php +++ b/site/plugins/site/src/CodeBlock/KirbyContent.php @@ -1,9 +1,6 @@ BlockTypes['<'] = ['Box'] + $this->BlockTypes['<']; + $this->BlockTypes['('] = ['Columns']; + + $this->setBreaksEnabled(true); + } + + protected function parseAttributes($input) + { + $dom = new DomDocument(); + $dom->loadHtml(""); + $attributes = []; + foreach ($dom->documentElement->attributes as $name => $attr) { + $attributes[$name] = $attr->value; + } + return $attributes; + } + + protected function blockColumns($Line, $Block = null) + { + if ($Line['text'] !== '(columns…)') { + return; + } + + return [ + 'columns' => [ + 'html' => null + ] + ]; + } + + protected function blockColumnsContinue($Line, $Block) + { + if ($Block['complete'] ?? false) { + return; + } + + if ($Line['text'] === '(…columns)') { + $Block['complete'] = true; + } else { + $Block['columns']['html'] .= "\n\n" . $Line['body']; + } + + return $Block; + } + + protected function blockColumnsComplete($Block) + { + $columns = Str::split($Block['columns']['html'], '++++'); + + return [ + 'element' => [ + 'name' => 'div', + 'attributes' => [ + 'class' => 'columns', + 'style' => '--columns: 2; --gap: 3rem' + ], + 'rawHtml' => snippet('kirbytext/columns', [ + 'columns' => $columns + ], true), + ] + ]; + } + + /** + * Parse Kirby's text boxes + */ + protected function blockBox($Line, $Block = null) + { + if (preg_match('!<(success|info|warning|alert|since)(.*?)>!', $Line['text'], $matches)) { + + $type = strtolower($matches[1]); + $Block = [ + 'box' => [ + 'type' => $type, + 'html' => null, + 'attrs' => $this->parseAttributes($matches[2]) + ], + ]; + + // if the block is just across a single line + if (preg_match('!$!', $Line['text'])) { + $html = $Line['body']; + $html = preg_replace('!^<' . $type . '.*?>(.*)$!', '$1', $html); + + $Block['complete'] = true; + $Block['box']['html'] = $html; + } + + return $Block; + } + + return; + } + + /** + * Add lines to the boxes + */ + protected function blockBoxContinue($Line, $Block) + { + if ($Block['complete'] ?? false) { + return; + } + + if ($Line['text'] === '') { + $Block['complete'] = true; + } else { + $Block['box']['html'] .= "\n" . str_repeat(' ', $Line['indent']) . $Line['text']; + } + + return $Block; + } + + /** + * Finalize the boxes + */ + protected function blockBoxComplete($Block) + { + $attrs = $Block['box']['attrs'] ?? []; + $text = $Block['box']['html'] ?? ''; + $type = $Block['box']['type'] ?? 'box'; + + if ($type === 'since') { + return [ + 'element' => [ + 'name' => 'details', + 'rawHtml' => snippet('kirbytext/since', [ + 'text' => $text, + 'version' => $attrs['v'] ?? null + ], true), + 'attributes' => [ + 'class' => 'since list-none', + 'open' => true + ] + ] + ]; + } + + return [ + 'element' => [ + 'name' => 'aside', + 'rawHtml' => snippet('kirbytext/box', [ + 'type' => $type, + 'text' => $text, + ], true), + 'attributes' => [ + 'class' => 'box box--' . $type + ] + ] + ]; + } + + /** + * An extended version of Parsedown’s codeblock handler, + * offering the possibility of adding a caption (e.g. filename) + * to codeblocks. + */ + protected function blockFencedCode($Line) + { + $marker = $Line['text'][0]; + + // Match opener + $openerLength = strspn($Line['text'], $marker); + + if ($openerLength < 3) { + return; + } + + $infostring = trim(str_replace("\t", ' ', substr($Line['text'], $openerLength)), ' '); + + if (strpos($infostring, ' ') === false && strpos($infostring, '`') !== false) { + // abort parsing of block, if code block does not + // have a caption, but language string contains + // a backtick to match the behavior of vanilla + // Parsedown. + return; + } + + $infostring = explode(' ', $infostring, 2); + $language = $infostring[0]; + + if (sizeof($infostring) === 2) { + // Block with caption + $caption = $infostring[1]; + $openChar = $caption[0]; + + if ($openChar === '"') { + $captionLength = strlen($caption); + $lastChar = $caption[$captionLength - 1]; + + if ($lastChar === $openChar) { + // Remove quotes surrounding caption + $caption = substr($caption, 1, $captionLength - 2); + } + } else { + // If caption was not wrapped in quotes, + // just drop it. + $caption = ''; + } + } else { + // Block without caption + $caption = ''; + } + + // Compose the code block + $Element = [ + 'name' => 'code', + 'text' => '', + ]; + + if ($language !== '') { + $Element['attributes'] = [ + 'class' => "language-{$language}" + ]; + } + + return [ + 'char' => $marker, + 'caption' => $caption, + 'openerLength' => $openerLength, + 'language' => $language, + 'element' => [ + 'name' => 'pre', + 'element' => $Element + ], + ]; + } + + /** + * Extended version of the final block handler, which + * adds support for filysystem code blocks, which + */ + protected function blockFencedCodeComplete($Block) + { + switch ($Block['language']) { + case 'filesystem': + $Block['element'] = [ + 'name' => !empty($Block['caption']) ? 'div' : 'figure', + 'attributes' => ['class' => 'filesystem'], + 'rawHtml' => FileSystem::parse($Block['element']['element']['text']), + ]; + break; + case 'kirbycontent': + $Block['element']['element']['text'] = KirbyContent::parse($Block['element']['element']['text']); + break; + default: + $text = $Block['element']['element']['text']; + $text = str_replace(['(', ')', '(\\'], ['(', ')', '('], $text); + $Block['element']['element']['text'] = trim($text); + } + + if ($Block['language'] !== 'filesystem') { + + if (empty($Block['caption']) === true) { + $elements = [$Block['element']]; + } else { + $elements = [ + [ + 'name' => 'figcaption', + 'text' => htmlspecialchars($Block['caption']), + ], + $Block['element'] + ]; + } + + $Block['element'] = [ + 'name' => 'figure', + 'attributes' => [ + 'class' => 'code', + ], + 'element' => [ + 'elements' => $elements + ], + ]; + } + + return $Block; + } + + protected function blockHeader($Line) + { + $Block = parent::blockHeader($Line); + + if (!$Block) return; + + $slug = Str::slug(Str::unhtml($Block['element']['handler']['argument'])); + $level = $Block['element']['name']; + + switch ($level) { + case 'h2': + $this->lastH2 = $slug; + break; + case 'h3': + $slug = $this->lastH2 . '__' . $slug; + break; + default: + return $Block; + break; + } + + return [ + 'element' => [ + 'name' => $level, + 'attributes' => [ + 'id' => $slug + ], + 'element' => [ + 'name' => 'a', + 'handler' => $Block['element']['handler'], + 'nonNestables' => ['Url', 'Link'], + 'attributes' => [ + 'href' => '#' . $slug + ] + ] + ] + ]; + } + + /** + * Wrap tables in a div + */ + protected function blockTableComplete($Block) + { + $Block = [ + 'element' => [ + 'name' => 'div', + 'attributes' => [ + 'class' => 'table', + ], + 'elements' => [$Block['element']], + ], + ]; + + return $Block; + } + + /** + * Highlight data types in inline code + */ + protected function inlineCode($Excerpt) + { + $Excerpt = parent::inlineCode($Excerpt); + + if ($Excerpt !== null) { + return array_merge($Excerpt, [ + 'element' => [ + 'nonNestables' => ['Code'], + 'handler' => [ + 'function' => 'inlineCodeHandler', + 'argument' => $Excerpt['element']['text'], + 'destination' => 'elements' + ] + ], + ]); + } + } + + protected function inlineCodeHandler($text, $nonNestables = []) + { + return [ + [ + 'rawHtml' => Type::format( + $text, + count(array_intersect(['Url', 'Link'], $nonNestables)) === 0 + ) + ] + ]; + } + +} diff --git a/site/plugins/site/src/Models/ChangeLogPage.php b/site/plugins/site/src/Models/ChangeLogPage.php deleted file mode 100644 index c5e1dde689..0000000000 --- a/site/plugins/site/src/Models/ChangeLogPage.php +++ /dev/null @@ -1,50 +0,0 @@ -changelog)) { - $this->changelog = $this->children()->listed()->flip(); - } - return $this->changelog; - } - - public function changelogPaginated() - { - if (is_null($this->paginated)) { - $this->paginated = $this->changelog()->paginate($this->perPage()); - } - return $this->paginated; - } - - /** - * Get the page number of a version entry - */ - public function getVersionPageNum($version) - { - $versions = $this->changelog(); - $i = 0; - - foreach($versions as $item) { - if ($item === $version) { - return floor($i / $this->perPage()) + 1; - } - $i++; - } - } - -} diff --git a/site/plugins/site/src/Models/CodePage.php b/site/plugins/site/src/Models/CodePage.php deleted file mode 100644 index f504b4198f..0000000000 --- a/site/plugins/site/src/Models/CodePage.php +++ /dev/null @@ -1,16 +0,0 @@ - 'noindex, nofollow', - ]; - } -} diff --git a/site/plugins/site/src/Models/CookbookPage.php b/site/plugins/site/src/Models/CookbookPage.php deleted file mode 100644 index 125305f80c..0000000000 --- a/site/plugins/site/src/Models/CookbookPage.php +++ /dev/null @@ -1,18 +0,0 @@ -index()->filter(function ($recipe) use ($category) { - return $recipe->parent()->slug() === $category || - in_array($category, $recipe->secondary()->split(',')); - }); - } - -} diff --git a/site/plugins/site/src/Models/CookbookRecipePage.php b/site/plugins/site/src/Models/CookbookRecipePage.php deleted file mode 100644 index 722f1132e2..0000000000 --- a/site/plugins/site/src/Models/CookbookRecipePage.php +++ /dev/null @@ -1,24 +0,0 @@ -parent()->parent()->find($category); - }, $this->secondary()->split(',')); - - return array_merge([$this->parent()], $secondary); - } - - public function isNew(): bool - { - return $this->published()->toDate('U') > (time() - 4500000); - } - -} diff --git a/site/plugins/site/src/Models/GuidePage.php b/site/plugins/site/src/Models/GuidePage.php deleted file mode 100644 index be017f92f2..0000000000 --- a/site/plugins/site/src/Models/GuidePage.php +++ /dev/null @@ -1,17 +0,0 @@ - 'summary', - 'description' => strip_tags($this->excerpt()->kirbytags()), - ]; - } - -} diff --git a/site/plugins/site/src/Models/KosmosIssuePage.php b/site/plugins/site/src/Models/KosmosIssuePage.php deleted file mode 100644 index f7c8b59863..0000000000 --- a/site/plugins/site/src/Models/KosmosIssuePage.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Read issue no. ' . $this->uid() . ' of our montly newsletter online.', - 'thumbnail' => $this->image(), - 'ogtitle' => 'Kirby Kosmos Episode ' . $this->uid(), - 'changefreq' => 'never', - ]; - } -} diff --git a/site/plugins/site/src/Models/ReferenceArticlePage.php b/site/plugins/site/src/Models/ReferenceArticlePage.php deleted file mode 100644 index 3ef8f4a0bb..0000000000 --- a/site/plugins/site/src/Models/ReferenceArticlePage.php +++ /dev/null @@ -1,17 +0,0 @@ - strip_tags($this->excerpt()->kirbytags()), - 'twittercard' => 'summary', - ]; - } -} diff --git a/site/plugins/site/src/Models/ReferenceClassMethodPage.php b/site/plugins/site/src/Models/ReferenceClassMethodPage.php deleted file mode 100644 index 8fe6d47388..0000000000 --- a/site/plugins/site/src/Models/ReferenceClassMethodPage.php +++ /dev/null @@ -1,161 +0,0 @@ -methodName() === '__construct') { - return $this->parent()->alias(); - } - - return new Field($this, 'alias', null); - } - - public function className(): string - { - return $this->parent()->className(); - } - - public function classNameShort(): string - { - return $this->parent()->classNameShort(); - } - - public function githubSource() - { - if ($reflection = $this->reflection()) { - $file = $reflection->getFileName(); - $path = Str::from($file, 'src/'); - - return option('github') . '/kirby/tree/' . App::version() . '/' . $path . '#L' . $this->line(); - } - } - - public function inheritedFrom() - { - if ($parent = $this->reflection()->getDeclaringClass()) { - if ($page = referenceLookup($parent->getName())) { - if ($page && $page->is($this->parent()) === false) { - return $page; - } - } - } - - return null; - } - - public function isMagic(): bool - { - return substr($this->slug(), 0, 2) === '__'; - } - - public function isStatic(): bool - { - return $this->reflection()->isStatic() === true; - } - - public function line(): int - { - if ($reflection = $this->reflection()) { - return $reflection->getStartLine(); - } - - return null; - } - - public function methodCall(): string - { - $methodCall = parent::methodCall(); - $classTitle = $this->parent()->classTitle(); - - if ($this->methodName() === '__construct') { - return 'new ' . $classTitle . Str::after($methodCall, $this->slug()); - } else if ($this->isStatic() === true) { - return $classTitle . '::' . $methodCall; - } else { - return '$' . strtolower($classTitle) . '->' . $methodCall; - } - } - - public function methodExists(): bool - { - return method_exists($this->className(), $this->methodName()); - } - - public function methodScope() - { - - $reflection = $this->reflection(); - - if (!$reflection) { - return null; - } - - if ($reflection->isPublic()) { - return 'public'; - } - - if ($reflection->isProtected()) { - return 'protected'; - } - - if ($reflection->isPrivate()) { - return 'private'; - } - - } - - public function parameters() - { - $parameters = parent::parameters(); - - foreach ($parameters as $key => $parameter) { - $parameters[$key]['type'] = $this->typeDefinition($parameter['type']); - } - - return $parameters; - } - - public function reflection() - { - if ($this->reflection !== null) { - return $this->reflection; - } - - if ($this->methodExists() === true) { - return $this->reflection = new ReflectionMethod($this->className(), $this->methodName()); - } - - return $this->reflection = false; - } - - public function title(): Field - { - if ($this->methodName() === '__construct') { - $title = 'new ' . $this->parent()->classTitle() . '()'; - } else if ($this->isStatic() === true) { - $title = $this->parent()->classTitle() . '::' . $this->methodName() . '()'; - } else { - $title = $this->parent()->title() . '->' . $this->methodName() . '()'; - } - - return parent::title()->value($title); - } - - protected function typeDefinition($type = null) - { - if ((string)$type === 'self') { - $type = $this->parent()->class(); - } - - return parent::typeDefinition($type); - } -} diff --git a/site/plugins/site/src/Models/ReferenceClassPage.php b/site/plugins/site/src/Models/ReferenceClassPage.php deleted file mode 100644 index ace8c00427..0000000000 --- a/site/plugins/site/src/Models/ReferenceClassPage.php +++ /dev/null @@ -1,206 +0,0 @@ -kirby()->root('kirby') . '/config/aliases.php'; - $alias = array_search($this->className(), $aliases); - return new Field($this, 'alias', $alias !== false ? $alias : null); - } - - public function children() - { - - if ($this->children !== null) { - return $this->children; - } - - if (!$this->reflection()) { - return $this->children = parent::children(); - } - - $methods = $this->reflection()->getMethods(); - $pages = parent::children(); - $children = []; - - foreach ($methods as $method) - { - if ($method->isPublic() === false) { - continue; - } - - $slug = Str::kebab($method->getName()); - $isMagic = substr($slug, 0, 1) === '_'; - $num = $isMagic ? null : 0; - - if ($slug === '__construct') { - $num = 0; - } - - if ($page = $pages->find($slug)) { - $content = $page->content()->toArray(); - } else { - $content = []; - } - - $children[] = [ - 'slug' => $slug, - 'model' => 'reference-classmethod', - 'template' => 'reference-classmethod', - 'parent' => $this, - 'content' => $content, - 'num' => $num - ]; - } - - - $pages = Pages::factory($children, $this) - ->filterBy('methodExists', true) - ->sortBy('slug'); - - return $this->children = $pages; - } - - public function classExists(): bool - { - return class_exists($this->className()) || trait_exists($this->className()); - - } - - public function classNameShort(): string - { - return $this->reflection()->getShortName(); - } - - public function className(): string - { - return $this->class()->value(); - } - - public function classTitle(): string - { - return $this->content()->get('title')->or($this->classNameShort())->value(); - } - - public function docBlock() - { - if ($this->docBlock !== null) { - return $this->docBlock; - } - - if ($reflection = $this->reflection()) { - return $this->docBlock = new DocBlock($reflection->getDocComment()); - } - - return $this->docBlock = false; - } - - public function excerpt(): Field - { - - $excerpt = null; - - if ($docBlock = $this->docBlock()) { - $excerpt = trim($docBlock->getSummary()); - $excerpt = str_replace(PHP_EOL, ' ', $excerpt); - - if ($excerpt === '/') { - $excerpt = null; - } - } - - if (empty($excerpt) === false) { - return new Field($this, 'excerpt', $excerpt); - } - - $fromContent = $this->content()->get('excerpt'); - - if ($fromContent->isNotEmpty()) { - return $fromContent; - } - - return new Field($this, 'excerpt', null); - } - - public function githubSource(): string - { - $path = str_replace('Kirby\\', '', $this->className()); - $path = str_replace('\\', '/', $path); - - return option('github') . '/kirby/tree/' . App::version() . '/src/' . $path . '.php'; - } - - public function isStatic() - { - return method_exists($this->className(), '__construct') === false; - } - - public function isTrait(): bool - { - if ($reflection = $this->reflection()) { - return $reflection->isTrait(); - } - - return false; - } - - public function metadata(): array - { - return [ - 'description' => strip_tags($this->excerpt()->kirbytags()), - 'twittercard' => 'summary', - ]; - } - - public function pathCrumb(): string - { - return $this->parent()->pathCrumb() . '\\' . Html::a($this->url(), $this->classNameShort(), ['class' => 'link-reset']); - } - - public function reflection() - { - if ($this->reflection !== null) { - return $this->reflection; - } - - if ($this->classExists() === true) { - return $this->reflection = new ReflectionClass($this->className()); - } - - return $this->reflection = false; - } - - public function title(): Field - { - $title = $this->classTitle(); - - if ($this->isStatic() === false) { - $title = '$' . strtolower($title); - } - - return parent::title()->value($title); - } - - public function traits() - { - if ($reflection = $this->reflection()) { - return $reflection->getTraits(); - } - } -} diff --git a/site/plugins/site/src/Models/ReferenceComponentPage.php b/site/plugins/site/src/Models/ReferenceComponentPage.php deleted file mode 100644 index bba52b2430..0000000000 --- a/site/plugins/site/src/Models/ReferenceComponentPage.php +++ /dev/null @@ -1,62 +0,0 @@ -components = $this->components ?? require $this->kirby()->root('kirby') . '/config/components.php'; - return $this->components[$this->methodName()] ?? false; - } - - public function githubSource() - { - return option('github') . '/kirby/tree/' . App::version() . '/config/components.php#L' . $this->line(); - } - - public function methodExists(): bool - { - return $this->component() !== false; - } - - public function methodName(): string - { - return $this->content()->get('methodName')->or($this->slug()); - } - - - public function reflection() - { - if ($this->reflection !== null) { - return $this->reflection; - } - - if ($this->methodExists() === true) { - return $this->reflection = new ReflectionFunction($this->component()); - } - - return $this->reflection = false; - } - - public function title(): Field - { - return $this->content()->get('title'); - } - - public function metadata(): array - { - return [ - 'twittercard' => 'summary', - 'description' => 'Documentation for the slug() . '> Vue component.', - ]; - } - -} diff --git a/site/plugins/site/src/Models/ReferenceEndpointPage.php b/site/plugins/site/src/Models/ReferenceEndpointPage.php deleted file mode 100644 index e1fd3ba0bc..0000000000 --- a/site/plugins/site/src/Models/ReferenceEndpointPage.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Documentation for the /api' . parent::title(). 'API endpoint.', - ]; - } - - public function request() - { - return $this->info() . ': ' . $this->title(); - } - - public function title(): Field - { - return parent::title()->value('/api' . parent::title()); - } - -} diff --git a/site/plugins/site/src/Models/ReferenceEndpointsPage.php b/site/plugins/site/src/Models/ReferenceEndpointsPage.php deleted file mode 100644 index e10feac6cf..0000000000 --- a/site/plugins/site/src/Models/ReferenceEndpointsPage.php +++ /dev/null @@ -1,17 +0,0 @@ - 'Documentation for ' . parent::title() . ' API endpoints.', - 'twittercard' => 'summary', - ]; - } -} diff --git a/site/plugins/site/src/Models/ReferenceExtensionsPage.php b/site/plugins/site/src/Models/ReferenceExtensionsPage.php deleted file mode 100644 index 356dfd20ed..0000000000 --- a/site/plugins/site/src/Models/ReferenceExtensionsPage.php +++ /dev/null @@ -1,17 +0,0 @@ - strip_tags($this->excerpt()->kirbytags()), - 'twittercard' => 'summary', - ]; - } -} diff --git a/site/plugins/site/src/Models/ReferenceFieldMethodPage.php b/site/plugins/site/src/Models/ReferenceFieldMethodPage.php deleted file mode 100644 index 743cb9e8c8..0000000000 --- a/site/plugins/site/src/Models/ReferenceFieldMethodPage.php +++ /dev/null @@ -1,96 +0,0 @@ -title()->value()); - } - - public function classNameShort(): Field - { - return new Field($this, 'classNameShort', 'Field'); - } - - public function githubSource() - { - if (is_a($this->reflection(), 'ReflectionMethod') === true) { - return option('github') . '/kirby/tree/' . App::version() . '/src/Cms/Field.php#L' . $this->line(); - } else { - return option('github') . '/kirby/tree/' . App::version() . '/config/methods.php#L' . $this->line(); - } - } - - public function line() - { - if ($reflection = $this->reflection()) { - return $reflection->getStartLine(); - } - - return null; - } - - public function methodCall(): string - { - $methodCall = parent::methodCall(); - $methodCall = '$field->' . $methodCall; - - return $methodCall; - } - - public function methodExists(): bool - { - return isset(Field::$methods[$this->methodName()]) || method_exists(Field::class, $this->methodName()); - } - - /** - * Remove the first parameter - * as this is always the parent Field - * and not useful for the docs - * - * @return array - */ - public function parameters() - { - return array_slice(parent::parameters(), 1); - } - - public function reflection() - { - if ($this->reflection !== null) { - return $this->reflection; - } - - if (isset(Field::$methods[$this->methodName()]) === true) { - return $this->reflection = new ReflectionFunction(Field::$methods[$this->methodName()]); - } - - if (method_exists(Field::class, $this->methodName()) === true) { - return $this->reflection = new ReflectionMethod(Field::class, $this->methodName()); - } - - return $this->reflection = false; - } - - protected function setReflection($reflection = null) - { - $this->reflection = $reflection; - return $this; - } - - public function title(): Field - { - return parent::title()->value('$field->' . $this->content()->get('title') . '()'); - } - -} diff --git a/site/plugins/site/src/Models/ReferenceFieldMethodsPage.php b/site/plugins/site/src/Models/ReferenceFieldMethodsPage.php deleted file mode 100644 index fd4a6dac47..0000000000 --- a/site/plugins/site/src/Models/ReferenceFieldMethodsPage.php +++ /dev/null @@ -1,80 +0,0 @@ -inventory()['children'], $this); - } - - public function children() - { - if ($this->children !== null) { - return $this->children; - } - - $methods = array_merge($this->getDynamicMethods(), $this->getNativeMethods()); - $children = []; - $subpages = $this->subpages(); - - foreach ($methods as $name => $reflection) { - - $slug = Str::kebab($name); - $page = $subpages->find($slug); - - $children[] = [ - 'slug' => $slug, - 'num' => 0, - 'template' => 'reference-fieldmethod', - 'model' => 'reference-fieldmethod', - 'reflection' => $reflection, - 'content' => [ - 'title' => $name, - 'excerpt' => $page ? $page->excerpt()->value() : null, - 'text' => $page ? $page->text()->value() : null - ] - ]; - } - - return $this->children = Pages::factory($children, $this)->sortBy('title', 'asc'); - } - - protected function getDynamicMethods() - { - $methods = (include $this->kirby()->root('kirby') . '/config/methods.php')($this->kirby()); - - foreach ($methods as $key => $function) { - $methods[$key] = new ReflectionFunction($function); - } - - return $methods; - } - - protected function getNativeMethods() - { - $methods = []; - $reflection = new ReflectionClass(Field::class); - - foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { - $name = $method->getName(); - - if (substr($name, 0, 1) !== '_') { - $methods[$name] = $method; - } - } - - return $methods; - } - -} diff --git a/site/plugins/site/src/Models/ReferenceHelperPage.php b/site/plugins/site/src/Models/ReferenceHelperPage.php deleted file mode 100644 index f270ca941d..0000000000 --- a/site/plugins/site/src/Models/ReferenceHelperPage.php +++ /dev/null @@ -1,303 +0,0 @@ -docBlock !== null) { - return $this->docBlock; - } - - if ($reflection = $this->reflection()) { - try { - return $this->docBlock = new DocBlock($reflection->getDocComment()); - } catch (Throwable $e) { - return $this->docBlock = false; - } - } - - return $this->docBlock = false; - } - - public function deprecated(): Field - { - if ($this->isDeprecated() == false) { - return parent::deprecated(); - } - - return new Field($this, 'deprecated', $this->methodDeprecated()->getVersion() . '|' . $this->methodDeprecated()->getDescription()); - } - - public function excerpt(): Field - { - - $excerpt = null; - - if ($docBlock = $this->docBlock()) { - $excerpt = trim($this->docBlock()->getSummary()); - $excerpt = str_replace(PHP_EOL, ' ', $excerpt); - - if ($excerpt === '/') { - $excerpt = null; - } - } - - if (empty($excerpt) === false) { - return new Field($this, 'excerpt', $excerpt); - } - - return $this->content()->get('excerpt'); - } - - public function githubSource() - { - return option('github') . '/kirby/tree/' . App::version() . '/config/helpers.php#L' . $this->line(); - } - - public function isDeprecated(): bool - { - return is_null($this->methodDeprecated()) === false; - } - - public function isInternal(): bool - { - if ($docBlock = $this->docBlock()) { - return is_null($docBlock->getTag('internal')) === false; - } - return false; - } - - public function line() - { - if ($reflection = $this->reflection()) { - return $reflection->getStartLine(); - } - - return null; - } - - public function metadata(): array - { - return [ - 'description' => strip_tags($this->excerpt()->kirbytags()), - 'twittercard' => 'summary', - ]; - } - - public function methodCall(): string - { - if ($reflection = $this->reflection()) { - $parameters = array_column($this->parameters(), 'export'); - $parameters = empty($parameters) ? '' : implode(', ', $parameters); - - $call = $this->methodName() . '(' . $parameters . ')'; - - if ($return = $this->returnType()) { - $call .= ': ' . $return; - } - - return $call; - } - - return $this->slug(); - } - - public function methodDeprecated() - { - if ($docBlock = $this->docBlock()) { - return $docBlock->getTag('deprecated'); - } - } - - public function methodExists(): bool - { - return function_exists($this->slug()); - - } - - public function methodName(): string - { - return preg_replace_callback('!-([a-z])!', function ($matches) { - return strtoupper($matches[1]); - }, $this->slug()); - } - - public function methodSince() - { - if ($docBlock = $this->docBlock()) { - return $docBlock->getTag('since'); - } - } - - public function parameters() - { - if ($this->parameters !== null) { - return $this->parameters; - } - - $reflection = $this->reflection(); - $parameters = []; - - if (!$reflection) { - return $this->parameters = $parameters; - } - - foreach ($reflection->getParameters() as $parameter) { - - if ($docBlock = $this->docBlock()) { - $doc = $docBlock->getParameter($parameter->getName()); - } else { - $doc = null; - } - - if ($type = $parameter->getType()) { - $type = $type->getName(); - } else { - $type = $doc ? (string)$doc->getType(): null; - } - $name = $parameter->getName(); - $param = trim($type . ' $' . $name); - $default = null; - $optional = false; - - if ($parameter->isOptional() === true) { - - if ($parameter->isDefaultValueAvailable()) { - $default = $parameter->getDefaultValue(); - $default = var_export($default, true); - $default = str_replace('NULL', 'null', $default); - $default = str_replace('array (' . PHP_EOL . ')', '[ ]', $default); - } else { - $default = 'null'; - } - - $optional = true; - $param .= ' = ' . $default; - } - - $parameters[] = [ - 'docBlock' => $doc, - 'default' => $default, - 'description' => $doc ? $doc->getDescription() : null, - 'export' => $param, - 'name' => $name, - 'optional' => $optional, - 'type' => $this->typeDefinition($type) ?? 'mixed', - ]; - } - - return $this->parameters = $parameters; - } - - public function reflection() - { - if ($this->reflection !== null) { - return $this->reflection; - } - - if ($this->methodExists() === true) { - return $this->reflection = new ReflectionFunction($this->slug()); - } - - return $this->reflection = false; - } - - public function returnType() - { - if ($reflection = $this->reflection()) { - if ($reflection->hasReturnType() === true) { - $type = $reflection->getReturnType(); - - if ($type->allowsNull() === true) { - $type = $type . '|null'; - } - - return $this->typeDefinition($type); - } - - if ($docBlock = $this->docBlock()) { - if ($type = $docBlock->getReturnType()) { - $type = trim((string)$type->getType()); - return $this->typeDefinition($type); - } - } - } - - return null; - } - - public function throws() - { - if ($this->throws !== null) { - return $this->throws; - } - - $reflection = $this->reflection(); - $docBlock = $this->docBlock(); - $throws = []; - - if (!$reflection || !$docBlock) { - return $this->throws = $throws; - } - - foreach ($docBlock->getTagsByName('throws') as $doc) { - $throws[] = [ - 'description' => $doc->getDescription(), - 'type' => ltrim($doc->getType(), '\\'), - ]; - } - - return $this->throws = $throws; - } - - public function since(): Field - { - if ($since = $this->methodSince()) { - $since = $since->getVersion(); - return new Field($this, 'since', $since ?? null); - } - - return parent::since(); - - } - - public function title(): Field - { - return parent::title()->value($this->methodName() . '()'); - } - - protected function typeDefinition($type = null) - { - $classes = array_map(function ($class) { - return substr($class, 0, 1) === '\\' ? substr($class, 1) : $class; - }, explode('|', $type)); - - return implode('|', $classes); - } - - public function cheatsheetUrl($options = null): string - { - if (get('advanced') && ($this->isDeprecated() || $this->isInternal())) { - $options['query'] = 'advanced=true'; - } - return $this->url($options); - } - -} diff --git a/site/plugins/site/src/Models/ReferenceHookPage.php b/site/plugins/site/src/Models/ReferenceHookPage.php deleted file mode 100644 index b5dd638338..0000000000 --- a/site/plugins/site/src/Models/ReferenceHookPage.php +++ /dev/null @@ -1,47 +0,0 @@ -arguments(); - } - - public function example() - { - $tab = ' '; - $args = $this->arguments(); - - $example[] = '```php "/site/config/config.php"'; - $example[] = 'return ['; - $example[] = $tab . "'hooks' => ["; - $example[] = $tab . $tab . "'" . $this->title() . "' => function ($args) {"; - $example[] = $tab . $tab . $tab . '// your code goes here'; - - if ($this->type() == 'apply') { - $example[] = $tab . $tab . $tab . 'return ' . $this->content()->return() . ';'; - } - - $example[] = $tab . $tab . '}'; - $example[] = $tab . ']'; - $example[] = ']'; - $example[] = '```'; - - return parent::example()->value(implode(PHP_EOL, $example)); - - } - - public function metadata(): array - { - return [ - 'twittercard' => 'summary', - 'description' => 'Reference page for the hook ' . $this->title(), - ]; - } - -} diff --git a/site/plugins/site/src/Models/ReferenceHooksPage.php b/site/plugins/site/src/Models/ReferenceHooksPage.php deleted file mode 100644 index d171dd7dcf..0000000000 --- a/site/plugins/site/src/Models/ReferenceHooksPage.php +++ /dev/null @@ -1,51 +0,0 @@ -inventory()['children'], $this); - } - - public function children() - { - $children = array_map(function ($hook) { - - $slug = Str::slug($hook['Name']); - $page = $this->subpages()->find($slug); - - return [ - 'slug' => Str::slug($hook['Name']), - 'template' => 'reference-hook', - 'model' => 'reference-hook', - 'num' => 0, - 'content' => [ - 'title' => $hook['Name'], - 'arguments' => implode(', ', Str::split($hook['Arguments'])), - 'type' => $hook['Type'], - 'return' => $hook['Return'], - 'details' => $page ? $page->details()->value() : null - ] - ]; - }, csv($this->root() . '/hooks.csv')); - - return Pages::factory($children, $this); - } - - public function metadata(): array - { - return [ - 'twittercard' => 'summary', - 'description' => strip_tags($this->excerpt()->kirbytags()), - ]; - } - -} diff --git a/site/plugins/site/src/Models/ReferenceIconPage.php b/site/plugins/site/src/Models/ReferenceIconPage.php deleted file mode 100644 index 33b8430aac..0000000000 --- a/site/plugins/site/src/Models/ReferenceIconPage.php +++ /dev/null @@ -1,30 +0,0 @@ -slug()); - } - - public function excerpt(): Field - { - return new Field($this, 'excerpt', html('')); - } - - public function metadata(): array - { - return [ - 'twittercard' => 'summary', - 'ogtitle' => $this->slug() . ' icon', - 'description' => 'Preview of the ”' . $this->slug() . '“ icon.', - ]; - } -} diff --git a/site/plugins/site/src/Models/ReferenceIconsPage.php b/site/plugins/site/src/Models/ReferenceIconsPage.php deleted file mode 100644 index a460bdc282..0000000000 --- a/site/plugins/site/src/Models/ReferenceIconsPage.php +++ /dev/null @@ -1,44 +0,0 @@ - strip_tags($this->excerpt()->kirbytags()), - 'twittercard' => 'summary', - ]; - } - - public function svg() - { - return F::read($this->kirby()->root('panel') . '/dist/img/icons.svg'); - } - - public function children() - { - $svg = new SimpleXMLElement($this->svg()); - $children = []; - - foreach ($svg->defs->children() as $symbol) { - $children[] = [ - 'slug' => str_replace('icon-', '', $symbol->attributes()->id), - 'template' => 'reference-icon', - 'model' => 'reference-icon', - 'num' => 0 - ]; - } - - return Pages::factory($children, $this)->sortBy('slug'); - - } - -} diff --git a/site/plugins/site/src/Models/ReferenceKirbyTagPage.php b/site/plugins/site/src/Models/ReferenceKirbyTagPage.php deleted file mode 100644 index b659c44d46..0000000000 --- a/site/plugins/site/src/Models/ReferenceKirbyTagPage.php +++ /dev/null @@ -1,78 +0,0 @@ -reflection()) { - return KirbyTag::$types[$this->methodName()]['attr']; - } - - return []; - } - - public function excerpt(): Field - { - return $this->content()->get('excerpt'); - } - - public function githubSource() - { - return option('github') . '/kirby/tree/' . App::version() . '/config/tags.php#L' . $this->line(); - } - - public function metadata(): array - { - return array_merge(parent::metadata(), [ - 'ogtitle' => $this->title() . ' KirbyTag', - ]); - } - - public function line() - { - if ($reflection = $this->reflection()) { - $line = $reflection->getStartLine(); - $line -= 2; - - $attributes = $this->attributes(); - if (count($attributes) > 0) { - $line -= count($attributes) + 1; - } - - return $line; - } - - return null; - } - - public function methodExists(): bool - { - return isset(KirbyTag::$types[$this->methodName()]) === true; - } - - public function reflection() - { - if ($this->reflection !== null) { - return $this->reflection; - } - - if ($this->methodExists() === true) { - return $this->reflection = new ReflectionFunction(KirbyTag::$types[$this->methodName()]['html']); - } - - return $this->reflection = false; - } - - public function title(): Field - { - return new Field($this, 'title', '(' . $this->methodName() . ': …)'); - } - -} diff --git a/site/plugins/site/src/Models/ReferencePackagesPage.php b/site/plugins/site/src/Models/ReferencePackagesPage.php deleted file mode 100644 index 5b05ca723f..0000000000 --- a/site/plugins/site/src/Models/ReferencePackagesPage.php +++ /dev/null @@ -1,59 +0,0 @@ -children !== null) { - return $this->children; - } - - $pages = parent::children()->toArray(); - - foreach ($this->packages()->yaml() as $package) { - - $page = [ - 'slug' => Str::slug($package), - 'template' => 'link', - 'parent' => $this, - 'num' => null, - 'content' => [ - 'title' => ucfirst($package), - 'link' => 'docs/reference/@#' . Str::slug($package) - ] - ]; - - $children = []; - $dir = $this->kirby()->root() . '/../kirby/src'; - $classes = Dir::files($dir . '/' . $package); - - foreach ($classes as $class) { - $class = basename($class, ".php"); - - $children[] = [ - 'slug' => Str::slug($class), - 'model' => 'reference-class', - 'template' => 'reference-class', - 'num' => null, - 'content' => [ - 'class' => 'Kirby\\' . $package . '\\' . $class - ] - ]; - } - - $page['children'] = $children; - $pages[] = $page; - } - - return $this->children = Pages::factory($pages, $this); - } - -} diff --git a/site/plugins/site/src/Models/ReferenceRootPage.php b/site/plugins/site/src/Models/ReferenceRootPage.php deleted file mode 100644 index bb612955ef..0000000000 --- a/site/plugins/site/src/Models/ReferenceRootPage.php +++ /dev/null @@ -1,29 +0,0 @@ -value('$kirby->root(\'' . $this->slug() . '\')'); - } - - public function example(): Field - { - return parent::example()->value('```php' . PHP_EOL . 'root(\'' . $this->slug() . '\') ?>' . PHP_EOL . '```'); - } - - public function metadata(): array - { - return [ - 'twittercard' => 'summary', - 'description' => strip_tags($this->excerpt()->kirbytags()), - ]; - } - -} diff --git a/site/plugins/site/src/Models/ReferenceRootsPage.php b/site/plugins/site/src/Models/ReferenceRootsPage.php deleted file mode 100644 index 6f4c265d50..0000000000 --- a/site/plugins/site/src/Models/ReferenceRootsPage.php +++ /dev/null @@ -1,17 +0,0 @@ - strip_tags($this->excerpt()->kirbytags()), - 'twittercard' => 'summary', - ]; - } -} diff --git a/site/plugins/site/src/Models/ReferenceSectionPage.php b/site/plugins/site/src/Models/ReferenceSectionPage.php deleted file mode 100644 index 0b9ba068cd..0000000000 --- a/site/plugins/site/src/Models/ReferenceSectionPage.php +++ /dev/null @@ -1,17 +0,0 @@ - strip_tags($this->excerpt()->kirbytags()), - 'twittercard' => 'summary', - ]; - } -} diff --git a/site/plugins/site/src/Models/ReferenceUiPage.php b/site/plugins/site/src/Models/ReferenceUiPage.php deleted file mode 100644 index 089ca03d6f..0000000000 --- a/site/plugins/site/src/Models/ReferenceUiPage.php +++ /dev/null @@ -1,15 +0,0 @@ -value(html('slug() . '>')); - } - -} diff --git a/site/plugins/site/src/Models/ReferenceUrlPage.php b/site/plugins/site/src/Models/ReferenceUrlPage.php deleted file mode 100644 index 812031edc2..0000000000 --- a/site/plugins/site/src/Models/ReferenceUrlPage.php +++ /dev/null @@ -1,28 +0,0 @@ -value('$kirby->url(\'' . $this->slug() . '\')'); - } - - public function example(): Field - { - return parent::example()->value('```php' . PHP_EOL . 'url(\'' . $this->slug() . '\') ?>' . PHP_EOL . '```'); - } - - public function metadata(): array - { - return [ - 'twittercard' => 'summary', - 'description' => strip_tags($this->excerpt()->kirbytags()), - ]; - } -} diff --git a/site/plugins/site/src/Models/ReferenceUrlsPage.php b/site/plugins/site/src/Models/ReferenceUrlsPage.php deleted file mode 100644 index bc5b9a5104..0000000000 --- a/site/plugins/site/src/Models/ReferenceUrlsPage.php +++ /dev/null @@ -1,17 +0,0 @@ - strip_tags($this->excerpt()->kirbytags()), - 'twittercard' => 'summary', - ]; - } -} diff --git a/site/plugins/site/src/Models/ReferenceValidatorPage.php b/site/plugins/site/src/Models/ReferenceValidatorPage.php deleted file mode 100644 index 8e095da366..0000000000 --- a/site/plugins/site/src/Models/ReferenceValidatorPage.php +++ /dev/null @@ -1,49 +0,0 @@ -line(); - } - - public function methodCall(): string - { - $methodCall = parent::methodCall(); - $methodCall = 'V::' . $methodCall; - - return $methodCall; - } - - public function methodExists(): bool - { - return isset(V::$validators[$this->methodName()]); - } - - public function reflection() - { - if ($this->reflection !== null) { - return $this->reflection; - } - - if ($this->methodExists() === true) { - return $this->reflection = new ReflectionFunction(V::$validators[$this->methodName()]); - } - - return $this->reflection = false; - } - - public function title(): Field - { - return new Field($this, 'title', 'V::' . $this->methodName() . '()'); - } - -} diff --git a/site/plugins/site/src/Models/ReferenceValidatorsPage.php b/site/plugins/site/src/Models/ReferenceValidatorsPage.php deleted file mode 100644 index ea4219d5f9..0000000000 --- a/site/plugins/site/src/Models/ReferenceValidatorsPage.php +++ /dev/null @@ -1,47 +0,0 @@ - $validator) { - - $slug = Str::kebab($key); - - if ($page = $pages->find($slug)) { - $content = $page->content()->toArray(); - } else { - $content = [ - 'undocumented' => true, - ]; - } - - $children[] = [ - 'slug' => $slug, - 'num' => 0, - 'model' => 'reference-validator', - 'template' => 'reference-validator', - 'parent' => $this, - 'content' => $content - ]; - } - - return Pages::factory($children, $this); - } - -} diff --git a/site/plugins/site/src/Models/VoicePage.php b/site/plugins/site/src/Models/VoicePage.php deleted file mode 100644 index 21dd22b9dc..0000000000 --- a/site/plugins/site/src/Models/VoicePage.php +++ /dev/null @@ -1,48 +0,0 @@ -content()->url()->value(); - - if (empty($url)) { - return '@' . $this->username(); - } - - return Url::short($url); - } - - public function url($options = null): string - { - return $this->content()->url()->or('https://twitter.com/' . $this->username()); - } - - public function text() { - - $text = $this->content()->text(); - - // match twitter usenames - $text = preg_replace_callback('/(?<=^|[^\w])@([a-z0-9_]+)/i', function($matches) { - return Html::a("https://twitter.com/{$matches[1]}", $matches[0]); - }, $text); - - // match twitter hashtags - $text = preg_replace_callback('/(?<=^|[^\w])#([a-z0-9_]+)/i', function($matches) { - return Html::a("https://twitter.com/hashtag/{$matches[1]}", $matches[0]); - }, $text); - - // escape '*'' characters, so they’re not interpreted by markdown - $text = str_replace('*', '*', $text); - - // use KirbyText to convert URLs to links - return parent::text()->value($text)->kibytext(); - } - -} diff --git a/site/plugins/site/src/DocBlock.php b/site/plugins/site/src/Reference/DocBlock.php similarity index 93% rename from site/plugins/site/src/DocBlock.php rename to site/plugins/site/src/Reference/DocBlock.php index e6538533ab..d0595f0d76 100644 --- a/site/plugins/site/src/DocBlock.php +++ b/site/plugins/site/src/Reference/DocBlock.php @@ -1,6 +1,6 @@ instance, $method], $args); } - throw new Exception('Invalid doc block method'); + throw new Exception('Invalid doc block method: ' . $method); } } diff --git a/site/plugins/site/src/Reference/ReflectionPage.php b/site/plugins/site/src/Reference/ReflectionPage.php new file mode 100644 index 0000000000..879356013f --- /dev/null +++ b/site/plugins/site/src/Reference/ReflectionPage.php @@ -0,0 +1,381 @@ +reflection()) { + $parameters = array_column($this->parameters(), 'export'); + $parameters = empty($parameters) ? '' : implode(', ', $parameters); + + $call = $this->name() . '(' . $parameters . ')'; + + if ($return = $this->returnType()) { + $call .= ': ' . $return; + } + + return $call; + } + + return $this->slug(); + } + + /** + * Returns deprecation information + * + * @return \Kirby\Cms\Field + */ + public function deprecated(): Field + { + if ($docBlock = $this->docBlock()) { + if ($tag = $docBlock->getTag('deprecated')) { + $value = $tag->getVersion() . '|' . $tag->getDescription(); + return new Field($this, 'deprecated', $value); + } + } + + return parent::deprecated(); + } + + /** + * Gets the DocBlock information + * + * @return \Kirby\Reference\DocBlock|bool + */ + public function docBlock() + { + if ($this->docBlock !== null) { + return $this->docBlock; + } + + if ($reflection = $this->reflection()) { + try { + return $this->docBlock = new DocBlock($reflection->getDocComment()); + } catch (Throwable $e) { + return $this->docBlock = false; + } + } + + return $this->docBlock = false; + } + + /** + * Returns a description excerpt + * + * @return \Kirby\Cms\Field + */ + public function excerpt(): Field + { + $excerpt = null; + + // prefer excerpt defined in content file + if ($this->content()->has('excerpt')) { + return $this->content()->get('excerpt'); + } + + // otherwise try to get summary from DocBlock in code + if ($docBlock = $this->docBlock()) { + $excerpt = trim($docBlock->getSummary()); + $excerpt = str_replace(PHP_EOL, ' ', $excerpt); + + if ($excerpt === '/') { + $excerpt = null; + } + } + + return new Field($this, 'excerpt', $excerpt); + } + + /** + * Check if this has been deprecated + * + * @return boolean + */ + public function isDeprecated(): bool + { + return $this->deprecated()->isNotEmpty() === true; + } + + /** + * Check if this is marked as internal + * + * @return boolean + */ + public function isInternal(): bool + { + if ($docBlock = $this->docBlock()) { + return is_null($docBlock->getTag('internal')) === false; + } + + return false; + } + + public function isMutable(): bool + { + return strpos($this->returns(), '$this') !== false; + } + + public function isImmutable(): bool + { + return strpos($this->returns(), 'static') !== false || + strpos($this->returns(), 'self') !== false; + } + + /** + * Gets the line number where this starts in the code + * + * @return int|null + */ + public function line(): ?int + { + if ($reflection = $this->reflection()) { + return $reflection->getStartLine(); + } + + return null; + } + + public function metadata(): array + { + return [ + 'description' => strip_tags($this->excerpt()->kirbytags()), + 'thumbnail' => [ + 'lead' => $this->metaLead(page('docs/reference'), 'Reference') + ] + ]; + } + + /** + * Get the name of this entry + * + * @return string + */ + public function name(): string + { + return preg_replace_callback('!-([a-z])!', function ($matches) { + return strtoupper($matches[1]); + }, $this->slug()); + } + + /** + * Returns URL to the code on GitHub + * + * @return \Kirby\Cms\Field + */ + public function onGitHub(string $path = ''): Field + { + if ($line = $this->line()) { + $url = option('github') . '/kirby/tree/' . App::version(); + $url .= '/' . $path; + $url .= '#L' . $line; + } + + return field($url ?? null); + } + + /** + * Returns an array with all parameter info + * + * @return array + */ + public function parameters(): array + { + if ($this->parameters !== null) { + return $this->parameters; + } + + $reflection = $this->reflection(); + $parameters = []; + + if (!$reflection) { + return $this->parameters = $parameters; + } + + foreach ($reflection->getParameters() as $parameter) { + $name = $parameter->getName(); + + if ($docBlock = $this->docBlock()) { + $doc = $docBlock->getParameter($name); + } else { + $doc = null; + } + + if ($type = $parameter->getType()) { + $type = $type->getName(); + } elseif ($doc) { + $type = (string)$doc->getType(); + } + + $param = trim($type . ' $' . $name); + $default = null; + $optional = false; + + if ($parameter->isOptional() === true) { + + if ($parameter->isDefaultValueAvailable()) { + $default = $parameter->getDefaultValue(); + $default = var_export($default, true); + $default = str_replace('NULL', 'null', $default); + $default = str_replace('array (' . PHP_EOL . ')', '[ ]', $default); + } else { + $default = 'null'; + } + + $optional = true; + $param .= ' = ' . $default; + } + + $parameters[] = [ + 'name' => '$' . $name, + 'required' => $optional === false, + 'type' => Type::factory($type ?? 'mixed', $this), + 'default' => $default, + 'description' => $doc ? (string)$doc->getDescription() : null, + 'export' => $param + ]; + } + + return $this->parameters = $parameters; + } + + /** + * Creates the reflection object + */ + protected function reflection() + { + return $this->reflection = $this->reflection ?? $this->_reflection(); + } + + protected function _reflection() + { + return false; + } + + public function returns(): ?string + { + if ($this->returns !== false) { + return $this->returns; + } + + if ($reflection = $this->reflection()) { + // First, try to get return type from reflection + if ($reflection->hasReturnType() === true) { + $type = $reflection->getReturnType(); + $name = $type->getName(); + + if ($type->allowsNull() === true) { + $name = $name . '|null'; + } + + return $this->returns = $name; + } + + // Otherwise, check DocBlock for return type + if ($docBlock = $this->docBlock()) { + if ($type = $docBlock->getReturnType()) { + $type = trim((string)$type->getType()); + return $this->returns = $type; + } + } + } + + return $this->returns = null; + } + + + /** + * Returns a string of all return types + * + * @return string|null + */ + public function returnType(): ?string + { + if ($return = $this->returns()) { + return Type::factory($return, $this); + } + + return null; + } + + /** + * Returns in which version this entry was introduced + * + * @return \Kirby\Cms\Field + */ + public function since(): Field + { + if ($docBlock = $this->docBlock()) { + if ($tag = $docBlock->getTag('since')) { + $since = $tag->getVersion(); + return new Field($this, 'since', $since ?? null); + } + } + + return parent::since(); + } + + /** + * If a dedicated template exist, use it. + * Otherwise fall back to `reference-article` template. + * + * @return \Kirby\Cms\Template + */ + public function template(): Template + { + // If template exists, use it + if ($this->intendedTemplate() === parent::template()) { + return parent::template(); + } + + return $this->kirby()->template('reference-article'); + } + + /** + * Returns what exceptions can be thrown by this + * + * @return array + */ + public function throws(): array + { + if ($this->throws !== null) { + return $this->throws; + } + + $throws = []; + $reflection = $this->reflection(); + $docBlock = $this->docBlock(); + + if (!$reflection || !$docBlock) { + return $this->throws = $throws; + } + + foreach ($docBlock->getTagsByName('throws') as $doc) { + $throws[] = [ + 'description' => $doc->getDescription(), + 'type' => ltrim($doc->getType(), '\\'), + ]; + } + + return $this->throws = $throws; + } +} diff --git a/site/plugins/site/src/Reference/SectionPage.php b/site/plugins/site/src/Reference/SectionPage.php new file mode 100644 index 0000000000..9957c15447 --- /dev/null +++ b/site/plugins/site/src/Reference/SectionPage.php @@ -0,0 +1,43 @@ +children()->listed()->count() !== + $this->children()->filtered()->count(); + } + + /** + * Flag that this page should not show + * the secondary entries sidebar + * + * @return bool + */ + public function hasEntries(): bool + { + return false; + } + + /** + * If a dedicated template exist, use it. + * Otherwise fall back to `reference-section` template. + * + * @return \Kirby\Cms\Template + */ + public function template(): Template + { + // If template exists, use it + if ($this->intendedTemplate() === parent::template()) { + return parent::template(); + } + + return $this->kirby()->template('reference-section'); + } +} diff --git a/site/plugins/site/src/Types/Type.php b/site/plugins/site/src/Types/Type.php new file mode 100644 index 0000000000..6a08d877a3 --- /dev/null +++ b/site/plugins/site/src/Types/Type.php @@ -0,0 +1,185 @@ +–'; + } + + public static function factory(string $string, $model): string + { + $types = array_map(function ($type) use ($model) { + + if ($type === 'static' || $type === '$this') { + return $model->parent()->class(); + } + + if ($type === 'self') { + return $model->inheritedFrom() ?? $model->parent()->class(); + } + + return substr($type, 0, 1) === '\\' ? substr($type, 1) : $type; + + }, explode('|', $string)); + + return implode('|', array_unique($types)); + } + + /** + * Takes a type tring and wraps it in a tag with the + * matching CSS class. Also links to Reference for classes or + * class methods. Support multiple types separated by | as well. + * + * @param string|null $type + * @param bool $withLink should the tag be linked (if possible) or not + * @return string + */ + public static function format(?string $type = null, bool $withLink = true): string + { + if(empty($type) === true) { + return ''; + } + + // Any type containing at least one whitespace or any character + // that cannot be part of a datatype, just return a plain + // code element. + if (preg_match('/^[^\\a-z0-9_]+$/iu', $type) === 1) { + return "{$type}"; + } + + // Multiple datatypes + if (Str::contains($type, '|')) { + $types = explode('|', $type); + + // Don’t process code blocks, that contain empty elements + if (in_array('', $types) === true) { + return "{$type}"; + } + + $types = array_map(function ($t) use ($withLink) { + return static::format($t, $withLink); + }, $types); + + return implode('|', $types); + } + + $native = [ + 'string', + 'int', + 'float', + 'bool', + 'array', + 'object', + 'mixed', + 'null', + ]; + + // Native PHP datatype + if (in_array($type, $native) === true) { + return static::tag($type, $type); + } + + // Assume, it’s a class name + if (preg_match('/^[A-Z]/', $type) === 1) { + // Namespaced class name, look whether it’s a Kirby classs + if ($class = ReferenceClassPage::findByName($type)) { + return static::tag( + $type, + 'object', + $withLink ? $class->url() : null + ); + } + + // Some class that exists in PHP in the global namespace. The + // seconds check is done to ensure correct case, as `class_exists()` + // is not case-sensitive. + if ( + isset($url) === false && + class_exists($type) === true && + (new ReflectionClass($type))->getName() === $type + ) { + return static::tag($type, 'class'); + } + } + + // Probably a code example (not a datatype), + // just return a plain code tag + return static::tag($type); + } + + public static function parse(string $string, string $parent) + { + return kirbytextinline(preg_replace_callback("|\`(.*)\`|", function ($matches) use ($parent) { + $matches[1] = Str::trim($matches[1], '()'); + $namespace = Str::split($matches[1], '\\'); + + + + if (count($namespace) === 1) { + $class = Str::split($parent, '\\'); + $class[2] = Str::before($namespace[0], '::'); + $class = implode('\\', $class); + $method = Str::after($namespace[0], '::'); + + } else { + $class = Str::before($matches[1], '::'); + $method = Str::after($matches[1], '::'); + } + + if ($obj = ReferenceClassPage::findByName($class)) { + if ($method = $obj->find(Str::kebab($method))) { + return '' . $matches[0] . ''; + } + } + + return static::format($matches[0]); + + }, $string)); + } + + public static function required(bool $required) + { + if ($required) { + return '*'; + } + } + + protected static function tag(string $type, string $class = 'mixed', ?string $url = null): string + { + $tag = Html::tag('code', $type, [ + 'class' => static::class($class), + ]); + + if ($url) { + $tag = Html::a($url, [$tag], ['class' => 'type-link']); + } + + return $tag; + } +} diff --git a/site/plugins/site/vendor/autoload.php b/site/plugins/site/vendor/autoload.php index 7e47c665b1..9ecf0b56e3 100644 --- a/site/plugins/site/vendor/autoload.php +++ b/site/plugins/site/vendor/autoload.php @@ -4,4 +4,4 @@ require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInitcc5435cbf327c40cde5b4c79eafdff34::getLoader(); +return ComposerAutoloaderInit7735eedf59144eaf4d78690a66d8bbdf::getLoader(); diff --git a/site/plugins/site/vendor/composer/InstalledVersions.php b/site/plugins/site/vendor/composer/InstalledVersions.php index d76bba5bce..7e7d8a7f06 100644 --- a/site/plugins/site/vendor/composer/InstalledVersions.php +++ b/site/plugins/site/vendor/composer/InstalledVersions.php @@ -25,60 +25,69 @@ class InstalledVersions private static $installed = array ( 'root' => array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', 'aliases' => array ( ), - 'reference' => 'f39934134acf99f1066a94e5176b8d4ea5936c62', - 'name' => 'kirby/site', + 'reference' => '25f3685214da8f3eeaf14004e2758c809f418e3c', + 'name' => 'getkirby/site', ), 'versions' => array ( - 'kirby/site' => + 'getkirby/site' => array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', 'aliases' => array ( ), - 'reference' => 'f39934134acf99f1066a94e5176b8d4ea5936c62', + 'reference' => '25f3685214da8f3eeaf14004e2758c809f418e3c', ), 'phpdocumentor/reflection-common' => array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', + 'pretty_version' => '2.2.0', + 'version' => '2.2.0.0', 'aliases' => array ( ), - 'reference' => '21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6', + 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', ), 'phpdocumentor/reflection-docblock' => array ( - 'pretty_version' => '3.3.2', - 'version' => '3.3.2.0', + 'pretty_version' => '5.2.2', + 'version' => '5.2.2.0', 'aliases' => array ( ), - 'reference' => 'bf329f6c1aadea3299f08ee804682b7c45b326a2', + 'reference' => '069a785b2141f5bcf49f3e353548dc1cce6df556', ), 'phpdocumentor/type-resolver' => array ( - 'pretty_version' => '0.4.0', - 'version' => '0.4.0.0', + 'pretty_version' => '1.4.0', + 'version' => '1.4.0.0', 'aliases' => array ( ), - 'reference' => '9c977708995954784726e25d0cd1dddf4e65b0f7', + 'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0', + ), + 'symfony/polyfill-ctype' => + array ( + 'pretty_version' => 'v1.22.1', + 'version' => '1.22.1.0', + 'aliases' => + array ( + ), + 'reference' => 'c6c942b1ac76c82448322025e084cadc56048b4e', ), 'webmozart/assert' => array ( - 'pretty_version' => '1.3.0', - 'version' => '1.3.0.0', + 'pretty_version' => '1.9.1', + 'version' => '1.9.1.0', 'aliases' => array ( ), - 'reference' => '0df1908962e7a3071564e857d86874dad1ef204a', + 'reference' => 'bafc69caeb4d49c39fd0779086c03a3738cbb389', ), ), ); diff --git a/site/plugins/site/vendor/composer/autoload_classmap.php b/site/plugins/site/vendor/composer/autoload_classmap.php index b26f1b13b1..cf4899a25a 100644 --- a/site/plugins/site/vendor/composer/autoload_classmap.php +++ b/site/plugins/site/vendor/composer/autoload_classmap.php @@ -7,4 +7,94 @@ return array( 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'Kirby\\CodeBlock\\FileSystem' => $baseDir . '/src/CodeBlock/FileSystem.php', + 'Kirby\\CodeBlock\\KirbyContent' => $baseDir . '/src/CodeBlock/KirbyContent.php', + 'Kirby\\Marsdown\\Marsdown' => $baseDir . '/src/Marsdown/Marsdown.php', + 'Kirby\\Reference\\DocBlock' => $baseDir . '/src/Reference/DocBlock.php', + 'Kirby\\Reference\\ReflectionPage' => $baseDir . '/src/Reference/ReflectionPage.php', + 'Kirby\\Reference\\SectionPage' => $baseDir . '/src/Reference/SectionPage.php', + 'Kirby\\Types\\Type' => $baseDir . '/src/Types/Type.php', + 'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php', + 'Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', + 'Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', + 'phpDocumentor\\Reflection\\DocBlock' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock.php', + 'phpDocumentor\\Reflection\\DocBlockFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', + 'phpDocumentor\\Reflection\\DocBlockFactoryInterface' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', + 'phpDocumentor\\Reflection\\DocBlock\\Description' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', + 'phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', + 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', + 'phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', + 'phpDocumentor\\Reflection\\DocBlock\\TagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', + 'phpDocumentor\\Reflection\\Element' => $vendorDir . '/phpdocumentor/reflection-common/src/Element.php', + 'phpDocumentor\\Reflection\\Exception\\PcreException' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', + 'phpDocumentor\\Reflection\\File' => $vendorDir . '/phpdocumentor/reflection-common/src/File.php', + 'phpDocumentor\\Reflection\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-common/src/Fqsen.php', + 'phpDocumentor\\Reflection\\FqsenResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/FqsenResolver.php', + 'phpDocumentor\\Reflection\\Location' => $vendorDir . '/phpdocumentor/reflection-common/src/Location.php', + 'phpDocumentor\\Reflection\\Project' => $vendorDir . '/phpdocumentor/reflection-common/src/Project.php', + 'phpDocumentor\\Reflection\\ProjectFactory' => $vendorDir . '/phpdocumentor/reflection-common/src/ProjectFactory.php', + 'phpDocumentor\\Reflection\\PseudoType' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoType.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\False_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\True_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', + 'phpDocumentor\\Reflection\\Type' => $vendorDir . '/phpdocumentor/type-resolver/src/Type.php', + 'phpDocumentor\\Reflection\\TypeResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/TypeResolver.php', + 'phpDocumentor\\Reflection\\Types\\AbstractList' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', + 'phpDocumentor\\Reflection\\Types\\AggregatedType' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', + 'phpDocumentor\\Reflection\\Types\\Array_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Array_.php', + 'phpDocumentor\\Reflection\\Types\\Boolean' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Boolean.php', + 'phpDocumentor\\Reflection\\Types\\Callable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Callable_.php', + 'phpDocumentor\\Reflection\\Types\\ClassString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ClassString.php', + 'phpDocumentor\\Reflection\\Types\\Collection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Collection.php', + 'phpDocumentor\\Reflection\\Types\\Compound' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Compound.php', + 'phpDocumentor\\Reflection\\Types\\Context' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Context.php', + 'phpDocumentor\\Reflection\\Types\\ContextFactory' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', + 'phpDocumentor\\Reflection\\Types\\Expression' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Expression.php', + 'phpDocumentor\\Reflection\\Types\\Float_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Float_.php', + 'phpDocumentor\\Reflection\\Types\\Integer' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Integer.php', + 'phpDocumentor\\Reflection\\Types\\Intersection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Intersection.php', + 'phpDocumentor\\Reflection\\Types\\Iterable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', + 'phpDocumentor\\Reflection\\Types\\Mixed_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', + 'phpDocumentor\\Reflection\\Types\\Null_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Null_.php', + 'phpDocumentor\\Reflection\\Types\\Nullable' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Nullable.php', + 'phpDocumentor\\Reflection\\Types\\Object_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Object_.php', + 'phpDocumentor\\Reflection\\Types\\Parent_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Parent_.php', + 'phpDocumentor\\Reflection\\Types\\Resource_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Resource_.php', + 'phpDocumentor\\Reflection\\Types\\Scalar' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Scalar.php', + 'phpDocumentor\\Reflection\\Types\\Self_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Self_.php', + 'phpDocumentor\\Reflection\\Types\\Static_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Static_.php', + 'phpDocumentor\\Reflection\\Types\\String_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/String_.php', + 'phpDocumentor\\Reflection\\Types\\This' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/This.php', + 'phpDocumentor\\Reflection\\Types\\Void_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Void_.php', + 'phpDocumentor\\Reflection\\Utils' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Utils.php', ); diff --git a/site/plugins/site/vendor/composer/autoload_files.php b/site/plugins/site/vendor/composer/autoload_files.php new file mode 100644 index 0000000000..9cfb30aa32 --- /dev/null +++ b/site/plugins/site/vendor/composer/autoload_files.php @@ -0,0 +1,10 @@ + $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', +); diff --git a/site/plugins/site/vendor/composer/autoload_psr4.php b/site/plugins/site/vendor/composer/autoload_psr4.php index 5166398dca..17a9df572a 100644 --- a/site/plugins/site/vendor/composer/autoload_psr4.php +++ b/site/plugins/site/vendor/composer/autoload_psr4.php @@ -8,5 +8,6 @@ return array( 'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'), 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), - 'Kirby\\Site\\' => array($baseDir . '/src'), + 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), + 'Kirby\\' => array($baseDir . '/src'), ); diff --git a/site/plugins/site/vendor/composer/autoload_real.php b/site/plugins/site/vendor/composer/autoload_real.php index 99aaa33610..3e0a69bcf7 100644 --- a/site/plugins/site/vendor/composer/autoload_real.php +++ b/site/plugins/site/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInitcc5435cbf327c40cde5b4c79eafdff34 +class ComposerAutoloaderInit7735eedf59144eaf4d78690a66d8bbdf { private static $loader; @@ -24,15 +24,15 @@ public static function getLoader() require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInitcc5435cbf327c40cde5b4c79eafdff34', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit7735eedf59144eaf4d78690a66d8bbdf', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__))); - spl_autoload_unregister(array('ComposerAutoloaderInitcc5435cbf327c40cde5b4c79eafdff34', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit7735eedf59144eaf4d78690a66d8bbdf', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInitcc5435cbf327c40cde5b4c79eafdff34::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit7735eedf59144eaf4d78690a66d8bbdf::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { @@ -52,6 +52,24 @@ public static function getLoader() $loader->register(true); + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInit7735eedf59144eaf4d78690a66d8bbdf::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequire7735eedf59144eaf4d78690a66d8bbdf($fileIdentifier, $file); + } + return $loader; } } + +function composerRequire7735eedf59144eaf4d78690a66d8bbdf($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + } +} diff --git a/site/plugins/site/vendor/composer/autoload_static.php b/site/plugins/site/vendor/composer/autoload_static.php index fe831e1933..0f04fab58b 100644 --- a/site/plugins/site/vendor/composer/autoload_static.php +++ b/site/plugins/site/vendor/composer/autoload_static.php @@ -4,8 +4,12 @@ namespace Composer\Autoload; -class ComposerStaticInitcc5435cbf327c40cde5b4c79eafdff34 +class ComposerStaticInit7735eedf59144eaf4d78690a66d8bbdf { + public static $files = array ( + '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', + ); + public static $prefixLengthsPsr4 = array ( 'p' => array ( @@ -15,9 +19,13 @@ class ComposerStaticInitcc5435cbf327c40cde5b4c79eafdff34 array ( 'Webmozart\\Assert\\' => 17, ), + 'S' => + array ( + 'Symfony\\Polyfill\\Ctype\\' => 23, + ), 'K' => array ( - 'Kirby\\Site\\' => 11, + 'Kirby\\' => 6, ), ); @@ -32,7 +40,11 @@ class ComposerStaticInitcc5435cbf327c40cde5b4c79eafdff34 array ( 0 => __DIR__ . '/..' . '/webmozart/assert/src', ), - 'Kirby\\Site\\' => + 'Symfony\\Polyfill\\Ctype\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', + ), + 'Kirby\\' => array ( 0 => __DIR__ . '/../..' . '/src', ), @@ -40,14 +52,104 @@ class ComposerStaticInitcc5435cbf327c40cde5b4c79eafdff34 public static $classMap = array ( 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'Kirby\\CodeBlock\\FileSystem' => __DIR__ . '/../..' . '/src/CodeBlock/FileSystem.php', + 'Kirby\\CodeBlock\\KirbyContent' => __DIR__ . '/../..' . '/src/CodeBlock/KirbyContent.php', + 'Kirby\\Marsdown\\Marsdown' => __DIR__ . '/../..' . '/src/Marsdown/Marsdown.php', + 'Kirby\\Reference\\DocBlock' => __DIR__ . '/../..' . '/src/Reference/DocBlock.php', + 'Kirby\\Reference\\ReflectionPage' => __DIR__ . '/../..' . '/src/Reference/ReflectionPage.php', + 'Kirby\\Reference\\SectionPage' => __DIR__ . '/../..' . '/src/Reference/SectionPage.php', + 'Kirby\\Types\\Type' => __DIR__ . '/../..' . '/src/Types/Type.php', + 'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php', + 'Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', + 'Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', + 'phpDocumentor\\Reflection\\DocBlock' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock.php', + 'phpDocumentor\\Reflection\\DocBlockFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', + 'phpDocumentor\\Reflection\\DocBlockFactoryInterface' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', + 'phpDocumentor\\Reflection\\DocBlock\\Description' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', + 'phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', + 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', + 'phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', + 'phpDocumentor\\Reflection\\DocBlock\\TagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', + 'phpDocumentor\\Reflection\\Element' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Element.php', + 'phpDocumentor\\Reflection\\Exception\\PcreException' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', + 'phpDocumentor\\Reflection\\File' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/File.php', + 'phpDocumentor\\Reflection\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Fqsen.php', + 'phpDocumentor\\Reflection\\FqsenResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/FqsenResolver.php', + 'phpDocumentor\\Reflection\\Location' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Location.php', + 'phpDocumentor\\Reflection\\Project' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Project.php', + 'phpDocumentor\\Reflection\\ProjectFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/ProjectFactory.php', + 'phpDocumentor\\Reflection\\PseudoType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoType.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\False_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', + 'phpDocumentor\\Reflection\\PseudoTypes\\True_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', + 'phpDocumentor\\Reflection\\Type' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Type.php', + 'phpDocumentor\\Reflection\\TypeResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/TypeResolver.php', + 'phpDocumentor\\Reflection\\Types\\AbstractList' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', + 'phpDocumentor\\Reflection\\Types\\AggregatedType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', + 'phpDocumentor\\Reflection\\Types\\Array_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Array_.php', + 'phpDocumentor\\Reflection\\Types\\Boolean' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Boolean.php', + 'phpDocumentor\\Reflection\\Types\\Callable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Callable_.php', + 'phpDocumentor\\Reflection\\Types\\ClassString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ClassString.php', + 'phpDocumentor\\Reflection\\Types\\Collection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Collection.php', + 'phpDocumentor\\Reflection\\Types\\Compound' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Compound.php', + 'phpDocumentor\\Reflection\\Types\\Context' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Context.php', + 'phpDocumentor\\Reflection\\Types\\ContextFactory' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', + 'phpDocumentor\\Reflection\\Types\\Expression' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Expression.php', + 'phpDocumentor\\Reflection\\Types\\Float_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Float_.php', + 'phpDocumentor\\Reflection\\Types\\Integer' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Integer.php', + 'phpDocumentor\\Reflection\\Types\\Intersection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Intersection.php', + 'phpDocumentor\\Reflection\\Types\\Iterable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', + 'phpDocumentor\\Reflection\\Types\\Mixed_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', + 'phpDocumentor\\Reflection\\Types\\Null_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Null_.php', + 'phpDocumentor\\Reflection\\Types\\Nullable' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Nullable.php', + 'phpDocumentor\\Reflection\\Types\\Object_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Object_.php', + 'phpDocumentor\\Reflection\\Types\\Parent_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Parent_.php', + 'phpDocumentor\\Reflection\\Types\\Resource_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Resource_.php', + 'phpDocumentor\\Reflection\\Types\\Scalar' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Scalar.php', + 'phpDocumentor\\Reflection\\Types\\Self_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Self_.php', + 'phpDocumentor\\Reflection\\Types\\Static_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Static_.php', + 'phpDocumentor\\Reflection\\Types\\String_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/String_.php', + 'phpDocumentor\\Reflection\\Types\\This' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/This.php', + 'phpDocumentor\\Reflection\\Types\\Void_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Void_.php', + 'phpDocumentor\\Reflection\\Utils' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Utils.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInitcc5435cbf327c40cde5b4c79eafdff34::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInitcc5435cbf327c40cde5b4c79eafdff34::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInitcc5435cbf327c40cde5b4c79eafdff34::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInit7735eedf59144eaf4d78690a66d8bbdf::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit7735eedf59144eaf4d78690a66d8bbdf::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit7735eedf59144eaf4d78690a66d8bbdf::$classMap; }, null, ClassLoader::class); } diff --git a/site/plugins/site/vendor/composer/installed.json b/site/plugins/site/vendor/composer/installed.json deleted file mode 100644 index 502705de86..0000000000 --- a/site/plugins/site/vendor/composer/installed.json +++ /dev/null @@ -1,214 +0,0 @@ -{ - "packages": [ - { - "name": "phpdocumentor/reflection-common", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.6" - }, - "time": "2017-09-11T18:02:19+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "install-path": "../phpdocumentor/reflection-common" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "3.3.2", - "version_normalized": "3.3.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bf329f6c1aadea3299f08ee804682b7c45b326a2", - "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", - "webmozart/assert": "^1.0" - }, - "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^4.4" - }, - "time": "2017-11-10T14:09:06+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "install-path": "../phpdocumentor/reflection-docblock" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "0.4.0", - "version_normalized": "0.4.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" - }, - "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" - }, - "time": "2017-07-14T14:27:02+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "install-path": "../phpdocumentor/type-resolver" - }, - { - "name": "webmozart/assert", - "version": "1.3.0", - "version_normalized": "1.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "time": "2018-01-29T19:49:41+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "install-path": "../webmozart/assert" - } - ], - "dev": true, - "dev-package-names": [] -} diff --git a/site/plugins/site/vendor/composer/installed.php b/site/plugins/site/vendor/composer/installed.php index 77d6664c87..982d425c25 100644 --- a/site/plugins/site/vendor/composer/installed.php +++ b/site/plugins/site/vendor/composer/installed.php @@ -1,60 +1,69 @@ array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', 'aliases' => array ( ), - 'reference' => 'f39934134acf99f1066a94e5176b8d4ea5936c62', - 'name' => 'kirby/site', + 'reference' => '25f3685214da8f3eeaf14004e2758c809f418e3c', + 'name' => 'getkirby/site', ), 'versions' => array ( - 'kirby/site' => + 'getkirby/site' => array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', 'aliases' => array ( ), - 'reference' => 'f39934134acf99f1066a94e5176b8d4ea5936c62', + 'reference' => '25f3685214da8f3eeaf14004e2758c809f418e3c', ), 'phpdocumentor/reflection-common' => array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', + 'pretty_version' => '2.2.0', + 'version' => '2.2.0.0', 'aliases' => array ( ), - 'reference' => '21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6', + 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', ), 'phpdocumentor/reflection-docblock' => array ( - 'pretty_version' => '3.3.2', - 'version' => '3.3.2.0', + 'pretty_version' => '5.2.2', + 'version' => '5.2.2.0', 'aliases' => array ( ), - 'reference' => 'bf329f6c1aadea3299f08ee804682b7c45b326a2', + 'reference' => '069a785b2141f5bcf49f3e353548dc1cce6df556', ), 'phpdocumentor/type-resolver' => array ( - 'pretty_version' => '0.4.0', - 'version' => '0.4.0.0', + 'pretty_version' => '1.4.0', + 'version' => '1.4.0.0', 'aliases' => array ( ), - 'reference' => '9c977708995954784726e25d0cd1dddf4e65b0f7', + 'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0', + ), + 'symfony/polyfill-ctype' => + array ( + 'pretty_version' => 'v1.22.1', + 'version' => '1.22.1.0', + 'aliases' => + array ( + ), + 'reference' => 'c6c942b1ac76c82448322025e084cadc56048b4e', ), 'webmozart/assert' => array ( - 'pretty_version' => '1.3.0', - 'version' => '1.3.0.0', + 'pretty_version' => '1.9.1', + 'version' => '1.9.1.0', 'aliases' => array ( ), - 'reference' => '0df1908962e7a3071564e857d86874dad1ef204a', + 'reference' => 'bafc69caeb4d49c39fd0779086c03a3738cbb389', ), ), ); diff --git a/site/plugins/site/vendor/composer/platform_check.php b/site/plugins/site/vendor/composer/platform_check.php index 8b379f4469..589e9e770b 100644 --- a/site/plugins/site/vendor/composer/platform_check.php +++ b/site/plugins/site/vendor/composer/platform_check.php @@ -4,8 +4,8 @@ $issues = array(); -if (!(PHP_VERSION_ID >= 50600)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 5.6.0". You are running ' . PHP_VERSION . '.'; +if (!(PHP_VERSION_ID >= 70200)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.0". You are running ' . PHP_VERSION . '.'; } if ($issues) { diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-common/.travis.yml b/site/plugins/site/vendor/phpdocumentor/reflection-common/.travis.yml deleted file mode 100644 index 958ecf864b..0000000000 --- a/site/plugins/site/vendor/phpdocumentor/reflection-common/.travis.yml +++ /dev/null @@ -1,35 +0,0 @@ -language: php -php: - - 5.5 - - 5.6 - - 7.0 - - 7.1 - - hhvm - - nightly - -matrix: - allow_failures: - - php: - - hhvm - - nightly - -cache: - directories: - - $HOME/.composer/cache - -script: - - vendor/bin/phpunit --coverage-clover=coverage.clover -v - - composer update --no-interaction --prefer-source - - vendor/bin/phpunit -v - -before_script: - - composer install --no-interaction - -after_script: - - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then wget https://scrutinizer-ci.com/ocular.phar; php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi - -notifications: - irc: "irc.freenode.org#phpdocumentor" - email: - - me@mikevanriel.com - - ashnazg@php.net diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-common/README.md b/site/plugins/site/vendor/phpdocumentor/reflection-common/README.md deleted file mode 100644 index 68a80c82f1..0000000000 --- a/site/plugins/site/vendor/phpdocumentor/reflection-common/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# ReflectionCommon -[![Build Status](https://travis-ci.org/phpDocumentor/ReflectionCommon.svg?branch=master)](https://travis-ci.org/phpDocumentor/ReflectionCommon) diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-common/composer.json b/site/plugins/site/vendor/phpdocumentor/reflection-common/composer.json deleted file mode 100644 index 90eee0f083..0000000000 --- a/site/plugins/site/vendor/phpdocumentor/reflection-common/composer.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "phpdocumentor/reflection-common", - "keywords": ["phpdoc", "phpDocumentor", "reflection", "static analysis", "FQSEN"], - "homepage": "http://www.phpdoc.org", - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "license": "MIT", - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "require": { - "php": ">=5.5" - }, - "autoload" : { - "psr-4" : { - "phpDocumentor\\Reflection\\": ["src"] - } - }, - "require-dev": { - "phpunit/phpunit": "^4.6" - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Element.php b/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Element.php index 712e30e8f7..8923e4fb01 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Element.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Element.php @@ -1,11 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -19,22 +20,16 @@ interface File { /** * Returns the content of the file as a string. - * - * @return string */ - public function getContents(); + public function getContents() : string; /** * Returns md5 hash of the file. - * - * @return string */ - public function md5(); + public function md5() : string; /** * Returns an relative path to the file. - * - * @return string */ - public function path(); + public function path() : string; } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Fqsen.php b/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Fqsen.php index ce88d03ffc..8fc5d34411 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Fqsen.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Fqsen.php @@ -1,51 +1,60 @@ name = $matches[2]; } else { $matches = explode('\\', $fqsen); - $this->name = trim(end($matches), '()'); + $name = end($matches); + assert(is_string($name)); + $this->name = trim($name, '()'); } } /** * converts this class to string. - * - * @return string */ - public function __toString() + public function __toString() : string { return $this->fqsen; } /** * Returns the name of the element without path. - * - * @return string */ - public function getName() + public function getName() : string { return $this->name; } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Location.php b/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Location.php index 5760321949..177deede69 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Location.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Location.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -14,10 +15,12 @@ /** * The location where an element occurs within a file. + * + * @psalm-immutable */ final class Location { - /** @var int */ + /** @var int */ private $lineNumber = 0; /** @var int */ @@ -25,32 +28,25 @@ final class Location /** * Initializes the location for an element using its line number in the file and optionally the column number. - * - * @param int $lineNumber - * @param int $columnNumber */ - public function __construct($lineNumber, $columnNumber = 0) + public function __construct(int $lineNumber, int $columnNumber = 0) { - $this->lineNumber = $lineNumber; + $this->lineNumber = $lineNumber; $this->columnNumber = $columnNumber; } /** * Returns the line number that is covered by this location. - * - * @return integer */ - public function getLineNumber() + public function getLineNumber() : int { return $this->lineNumber; } /** * Returns the column number (character position on a line) for this location object. - * - * @return integer */ - public function getColumnNumber() + public function getColumnNumber() : int { return $this->columnNumber; } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Project.php b/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Project.php index 3ed1e39343..57839fd146 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Project.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-common/src/Project.php @@ -1,11 +1,13 @@ **Note**: *this is a core component of phpDocumentor and is constantly being -> optimized for performance.* - -Installation ------------- - -You can install the component in the following ways: - -* Use the official Github repository (https://github.com/phpDocumentor/ReflectionDocBlock) -* Via Composer (http://packagist.org/packages/phpdocumentor/reflection-docblock) - -Usage ------ - -In order to parse the DocBlock one needs a DocBlockFactory that can be -instantiated using its `createInstance` factory method like this: - -```php -$factory = \phpDocumentor\Reflection\DocBlockFactory::createInstance(); -``` - -Then we can use the `create` method of the factory to interpret the DocBlock. -Please note that it is also possible to provide a class that has the -`getDocComment()` method, such as an object of type `ReflectionClass`, the -create method will read that if it exists. - -```php -$docComment = <<create($docComment); -``` - -The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock` -whose methods can be queried as shown in the following example. - -```php -// Should contain the summary for this DocBlock -$summary = $docblock->getSummary(); - -// Contains an object of type \phpDocumentor\Reflection\DocBlock\Description; -// you can either cast it to string or use the render method to get a string -// representation of the Description. -$description = $docblock->getDescription(); -``` - -> For more examples it would be best to review the scripts in the `/examples` -> folder. - diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/composer.json b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/composer.json deleted file mode 100644 index 78c6851727..0000000000 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/composer.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "phpdocumentor/reflection-docblock", - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "require": { - "php": "^5.6 || ^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", - "webmozart/assert": "^1.0" - }, - "autoload": { - "psr-4": {"phpDocumentor\\Reflection\\": ["src/"]} - }, - "autoload-dev": { - "psr-4": {"phpDocumentor\\Reflection\\": ["tests/unit"]} - }, - "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^4.4" - } -} diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php index 399114067d..f3403d6e8c 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -18,95 +19,77 @@ final class DocBlock { /** @var string The opening line for this docblock. */ - private $summary = ''; + private $summary; /** @var DocBlock\Description The actual description for this docblock. */ - private $description = null; + private $description; /** @var Tag[] An array containing all the tags in this docblock; except inline. */ - private $tags = array(); + private $tags = []; - /** @var Types\Context Information about the context of this DocBlock. */ - private $context = null; + /** @var Types\Context|null Information about the context of this DocBlock. */ + private $context; - /** @var Location Information about the location of this DocBlock. */ - private $location = null; + /** @var Location|null Information about the location of this DocBlock. */ + private $location; /** @var bool Is this DocBlock (the start of) a template? */ - private $isTemplateStart = false; + private $isTemplateStart; /** @var bool Does this DocBlock signify the end of a DocBlock template? */ - private $isTemplateEnd = false; + private $isTemplateEnd; /** - * @param string $summary - * @param DocBlock\Description $description * @param DocBlock\Tag[] $tags - * @param Types\Context $context The context in which the DocBlock occurs. - * @param Location $location The location within the file that this DocBlock occurs in. - * @param bool $isTemplateStart - * @param bool $isTemplateEnd + * @param Types\Context $context The context in which the DocBlock occurs. + * @param Location $location The location within the file that this DocBlock occurs in. */ public function __construct( - $summary = '', - DocBlock\Description $description = null, + string $summary = '', + ?DocBlock\Description $description = null, array $tags = [], - Types\Context $context = null, - Location $location = null, - $isTemplateStart = false, - $isTemplateEnd = false - ) - { - Assert::string($summary); - Assert::boolean($isTemplateStart); - Assert::boolean($isTemplateEnd); + ?Types\Context $context = null, + ?Location $location = null, + bool $isTemplateStart = false, + bool $isTemplateEnd = false + ) { Assert::allIsInstanceOf($tags, Tag::class); - $this->summary = $summary; + $this->summary = $summary; $this->description = $description ?: new DocBlock\Description(''); foreach ($tags as $tag) { $this->addTag($tag); } - $this->context = $context; + $this->context = $context; $this->location = $location; - $this->isTemplateEnd = $isTemplateEnd; + $this->isTemplateEnd = $isTemplateEnd; $this->isTemplateStart = $isTemplateStart; } - /** - * @return string - */ - public function getSummary() + public function getSummary() : string { return $this->summary; } - /** - * @return DocBlock\Description - */ - public function getDescription() + public function getDescription() : DocBlock\Description { return $this->description; } /** * Returns the current context. - * - * @return Types\Context */ - public function getContext() + public function getContext() : ?Types\Context { return $this->context; } /** * Returns the current location. - * - * @return Location */ - public function getLocation() + public function getLocation() : ?Location { return $this->location; } @@ -129,10 +112,8 @@ public function getLocation() * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). * * @see self::isTemplateEnd() for the check whether a closing marker was provided. - * - * @return boolean */ - public function isTemplateStart() + public function isTemplateStart() : bool { return $this->isTemplateStart; } @@ -141,10 +122,8 @@ public function isTemplateStart() * Returns whether this DocBlock is the end of a Template section. * * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. - * - * @return boolean */ - public function isTemplateEnd() + public function isTemplateEnd() : bool { return $this->isTemplateEnd; } @@ -154,7 +133,7 @@ public function isTemplateEnd() * * @return Tag[] */ - public function getTags() + public function getTags() : array { return $this->tags; } @@ -167,15 +146,12 @@ public function getTags() * * @return Tag[] */ - public function getTagsByName($name) + public function getTagsByName(string $name) : array { - Assert::string($name); - - $result = array(); + $result = []; - /** @var Tag $tag */ foreach ($this->getTags() as $tag) { - if ($tag->getName() != $name) { + if ($tag->getName() !== $name) { continue; } @@ -189,16 +165,11 @@ public function getTagsByName($name) * Checks if a tag of a certain type is present in this DocBlock. * * @param string $name Tag name to check for. - * - * @return bool */ - public function hasTag($name) + public function hasTag(string $name) : bool { - Assert::string($name); - - /** @var Tag $tag */ foreach ($this->getTags() as $tag) { - if ($tag->getName() == $name) { + if ($tag->getName() === $name) { return true; } } @@ -206,14 +177,27 @@ public function hasTag($name) return false; } + /** + * Remove a tag from this DocBlock. + * + * @param Tag $tagToRemove The tag to remove. + */ + public function removeTag(Tag $tagToRemove) : void + { + foreach ($this->tags as $key => $tag) { + if ($tag === $tagToRemove) { + unset($this->tags[$key]); + break; + } + } + } + /** * Adds a tag to this DocBlock. * * @param Tag $tag The tag to add. - * - * @return void */ - private function addTag(Tag $tag) + private function addTag(Tag $tag) : void { $this->tags[] = $tag; } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php index c63cae5aab..7b11b808e7 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -14,7 +15,7 @@ use phpDocumentor\Reflection\DocBlock\Tags\Formatter; use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter; -use Webmozart\Assert\Assert; +use function vsprintf; /** * Object representing to description for a DocBlock. @@ -59,23 +60,28 @@ class Description /** * Initializes a Description with its body (template) and a listing of the tags used in the body template. * - * @param string $bodyTemplate * @param Tag[] $tags */ - public function __construct($bodyTemplate, array $tags = []) + public function __construct(string $bodyTemplate, array $tags = []) { - Assert::string($bodyTemplate); - $this->bodyTemplate = $bodyTemplate; - $this->tags = $tags; + $this->tags = $tags; } - + + /** + * Returns the body template. + */ + public function getBodyTemplate() : string + { + return $this->bodyTemplate; + } + /** * Returns the tags for this DocBlock. * * @return Tag[] */ - public function getTags() + public function getTags() : array { return $this->tags; } @@ -83,12 +89,8 @@ public function getTags() /** * Renders this description as a string where the provided formatter will format the tags in the expected string * format. - * - * @param Formatter|null $formatter - * - * @return string */ - public function render(Formatter $formatter = null) + public function render(?Formatter $formatter = null) : string { if ($formatter === null) { $formatter = new PassthroughFormatter(); @@ -98,15 +100,14 @@ public function render(Formatter $formatter = null) foreach ($this->tags as $tag) { $tags[] = '{' . $formatter->format($tag) . '}'; } + return vsprintf($this->bodyTemplate, $tags); } /** * Returns a plain string representation of this description. - * - * @return string */ - public function __toString() + public function __toString() : string { return $this->render(); } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php index f34d0f7e9f..c27d2a0121 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php @@ -1,18 +1,31 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\Utils; +use function count; +use function explode; +use function implode; +use function ltrim; +use function min; +use function str_replace; +use function strlen; +use function strpos; +use function substr; +use function trim; +use const PREG_SPLIT_DELIM_CAPTURE; /** * Creates a new Description object given a body of text. @@ -38,8 +51,6 @@ class DescriptionFactory /** * Initializes this factory with the means to construct (inline) tags. - * - * @param TagFactory $tagFactory */ public function __construct(TagFactory $tagFactory) { @@ -48,27 +59,36 @@ public function __construct(TagFactory $tagFactory) /** * Returns the parsed text of this description. - * - * @param string $contents - * @param TypeContext $context - * - * @return Description */ - public function create($contents, TypeContext $context = null) + public function create(string $contents, ?TypeContext $context = null) : Description { - list($text, $tags) = $this->parse($this->lex($contents), $context); + $tokens = $this->lex($contents); + $count = count($tokens); + $tagCount = 0; + $tags = []; + + for ($i = 1; $i < $count; $i += 2) { + $tags[] = $this->tagFactory->create($tokens[$i], $context); + $tokens[$i] = '%' . ++$tagCount . '$s'; + } + + //In order to allow "literal" inline tags, the otherwise invalid + //sequence "{@}" is changed to "@", and "{}" is changed to "}". + //"%" is escaped to "%%" because of vsprintf. + //See unit tests for examples. + for ($i = 0; $i < $count; $i += 2) { + $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); + } - return new Description($text, $tags); + return new Description(implode('', $tokens), $tags); } /** * Strips the contents from superfluous whitespace and splits the description into a series of tokens. * - * @param string $contents - * * @return string[] A series of tokens of which the description text is composed. */ - private function lex($contents) + private function lex(string $contents) : array { $contents = $this->removeSuperfluousStartingWhitespace($contents); @@ -77,7 +97,7 @@ private function lex($contents) return [$contents]; } - return preg_split( + return Utils::pregSplit( '/\{ # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. (?!@\}) @@ -103,41 +123,11 @@ private function lex($contents) ) \}/Sux', $contents, - null, + 0, PREG_SPLIT_DELIM_CAPTURE ); } - /** - * Parses the stream of tokens in to a new set of tokens containing Tags. - * - * @param string[] $tokens - * @param TypeContext $context - * - * @return string[]|Tag[] - */ - private function parse($tokens, TypeContext $context) - { - $count = count($tokens); - $tagCount = 0; - $tags = []; - - for ($i = 1; $i < $count; $i += 2) { - $tags[] = $this->tagFactory->create($tokens[$i], $context); - $tokens[$i] = '%' . ++$tagCount . '$s'; - } - - //In order to allow "literal" inline tags, the otherwise invalid - //sequence "{@}" is changed to "@", and "{}" is changed to "}". - //"%" is escaped to "%%" because of vsprintf. - //See unit tests for examples. - for ($i = 0; $i < $count; $i += 2) { - $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); - } - - return [implode('', $tokens), $tags]; - } - /** * Removes the superfluous from a multi-line description. * @@ -151,12 +141,8 @@ private function parse($tokens, TypeContext $context) * * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent * lines and this may cause rendering issues when, for example, using a Markdown converter. - * - * @param string $contents - * - * @return string */ - private function removeSuperfluousStartingWhitespace($contents) + private function removeSuperfluousStartingWhitespace(string $contents) : string { $lines = explode("\n", $contents); @@ -168,9 +154,9 @@ private function removeSuperfluousStartingWhitespace($contents) // determine how many whitespace characters need to be stripped $startingSpaceCount = 9999999; - for ($i = 1; $i < count($lines); $i++) { + for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { // lines with a no length do not count as they are not indented at all - if (strlen(trim($lines[$i])) === 0) { + if (trim($lines[$i]) === '') { continue; } @@ -181,12 +167,11 @@ private function removeSuperfluousStartingWhitespace($contents) // strip the number of spaces from each line if ($startingSpaceCount > 0) { - for ($i = 1; $i < count($lines); $i++) { + for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { $lines[$i] = substr($lines[$i], $startingSpaceCount); } } return implode("\n", $lines); } - } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php index ea79f7cb9d..7249efb049 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php @@ -1,18 +1,28 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlock\Tags\Example; +use function array_slice; +use function file; +use function getcwd; +use function implode; +use function is_readable; +use function rtrim; +use function sprintf; +use function trim; +use const DIRECTORY_SEPARATOR; /** * Class used to find an example file's location based on a given ExampleDescriptor. @@ -23,22 +33,18 @@ class ExampleFinder private $sourceDirectory = ''; /** @var string[] */ - private $exampleDirectories = array(); + private $exampleDirectories = []; /** * Attempts to find the example contents for the given descriptor. - * - * @param Example $example - * - * @return string */ - public function find(Example $example) + public function find(Example $example) : string { $filename = $example->getFilePath(); $file = $this->getExampleFileContents($filename); if (!$file) { - return "** File not found : {$filename} **"; + return sprintf('** File not found : %s **', $filename); } return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); @@ -46,22 +52,16 @@ public function find(Example $example) /** * Registers the project's root directory where an 'examples' folder can be expected. - * - * @param string $directory - * - * @return void */ - public function setSourceDirectory($directory = '') + public function setSourceDirectory(string $directory = '') : void { $this->sourceDirectory = $directory; } /** * Returns the project's root directory where an 'examples' folder can be expected. - * - * @return string */ - public function getSourceDirectory() + public function getSourceDirectory() : string { return $this->sourceDirectory; } @@ -71,7 +71,7 @@ public function getSourceDirectory() * * @param string[] $directories */ - public function setExampleDirectories(array $directories) + public function setExampleDirectories(array $directories) : void { $this->exampleDirectories = $directories; } @@ -81,7 +81,7 @@ public function setExampleDirectories(array $directories) * * @return string[] */ - public function getExampleDirectories() + public function getExampleDirectories() : array { return $this->exampleDirectories; } @@ -97,11 +97,9 @@ public function getExampleDirectories() * 3. Checks the 'examples' folder in the current working directory for examples * 4. Checks the path relative to the current working directory for the given filename * - * @param string $filename - * - * @return string|null + * @return string[] all lines of the example file */ - private function getExampleFileContents($filename) + private function getExampleFileContents(string $filename) : ?array { $normalizedPath = null; @@ -123,42 +121,31 @@ private function getExampleFileContents($filename) } } - return $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : null; + $lines = $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : false; + + return $lines !== false ? $lines : null; } /** * Get example filepath based on the example directory inside your project. - * - * @param string $file - * - * @return string */ - private function getExamplePathFromExampleDirectory($file) + private function getExamplePathFromExampleDirectory(string $file) : string { return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; } /** * Returns a path to the example file in the given directory.. - * - * @param string $directory - * @param string $file - * - * @return string */ - private function constructExamplePath($directory, $file) + private function constructExamplePath(string $directory, string $file) : string { return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; } /** * Get example filepath based on sourcecode. - * - * @param string $file - * - * @return string */ - private function getExamplePathFromSource($file) + private function getExamplePathFromSource(string $file) : string { return sprintf( '%s%s%s', diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php index e0faacb7b2..531970b92f 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php @@ -1,19 +1,26 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlock; -use Webmozart\Assert\Assert; +use phpDocumentor\Reflection\DocBlock\Tags\Formatter; +use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter; +use function sprintf; +use function str_repeat; +use function str_replace; +use function strlen; +use function wordwrap; /** * Converts a DocBlock back from an object to a complete DocComment including Asterisks. @@ -30,33 +37,32 @@ class Serializer protected $isFirstLineIndented = true; /** @var int|null The max length of a line. */ - protected $lineLength = null; + protected $lineLength; - /** @var DocBlock\Tags\Formatter A custom tag formatter. */ - protected $tagFormatter = null; + /** @var Formatter A custom tag formatter. */ + protected $tagFormatter; /** * Create a Serializer instance. * - * @param int $indent The number of times the indent string is repeated. - * @param string $indentString The string to indent the comment with. - * @param bool $indentFirstLine Whether to indent the first line. - * @param int|null $lineLength The max length of a line or NULL to disable line wrapping. - * @param DocBlock\Tags\Formatter $tagFormatter A custom tag formatter, defaults to PassthroughFormatter. + * @param int $indent The number of times the indent string is repeated. + * @param string $indentString The string to indent the comment with. + * @param bool $indentFirstLine Whether to indent the first line. + * @param int|null $lineLength The max length of a line or NULL to disable line wrapping. + * @param Formatter $tagFormatter A custom tag formatter, defaults to PassthroughFormatter. */ - public function __construct($indent = 0, $indentString = ' ', $indentFirstLine = true, $lineLength = null, $tagFormatter = null) - { - Assert::integer($indent); - Assert::string($indentString); - Assert::boolean($indentFirstLine); - Assert::nullOrInteger($lineLength); - Assert::nullOrIsInstanceOf($tagFormatter, 'phpDocumentor\Reflection\DocBlock\Tags\Formatter'); - - $this->indent = $indent; - $this->indentString = $indentString; + public function __construct( + int $indent = 0, + string $indentString = ' ', + bool $indentFirstLine = true, + ?int $lineLength = null, + ?Formatter $tagFormatter = null + ) { + $this->indent = $indent; + $this->indentString = $indentString; $this->isFirstLineIndented = $indentFirstLine; - $this->lineLength = $lineLength; - $this->tagFormatter = $tagFormatter ?: new DocBlock\Tags\Formatter\PassthroughFormatter(); + $this->lineLength = $lineLength; + $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); } /** @@ -66,9 +72,9 @@ public function __construct($indent = 0, $indentString = ' ', $indentFirstLine = * * @return string The serialized doc block. */ - public function getDocComment(DocBlock $docblock) + public function getDocComment(DocBlock $docblock) : string { - $indent = str_repeat($this->indentString, $this->indent); + $indent = str_repeat($this->indentString, $this->indent); $firstIndent = $this->isFirstLineIndented ? $indent : ''; // 3 === strlen(' * ') $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; @@ -81,66 +87,63 @@ public function getDocComment(DocBlock $docblock) ) ); - $comment = "{$firstIndent}/**\n{$indent} * {$text}\n{$indent} *\n"; + $comment = $firstIndent . "/**\n"; + if ($text) { + $comment .= $indent . ' * ' . $text . "\n"; + $comment .= $indent . " *\n"; + } + $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); - $comment .= $indent . ' */'; - return $comment; + return $comment . $indent . ' */'; } - /** - * @param $indent - * @param $text - * @return mixed - */ - private function removeTrailingSpaces($indent, $text) + private function removeTrailingSpaces(string $indent, string $text) : string { - return str_replace("\n{$indent} * \n", "\n{$indent} *\n", $text); + return str_replace( + sprintf("\n%s * \n", $indent), + sprintf("\n%s *\n", $indent), + $text + ); } - /** - * @param $indent - * @param $text - * @return mixed - */ - private function addAsterisksForEachLine($indent, $text) + private function addAsterisksForEachLine(string $indent, string $text) : string { - return str_replace("\n", "\n{$indent} * ", $text); + return str_replace( + "\n", + sprintf("\n%s * ", $indent), + $text + ); } - /** - * @param DocBlock $docblock - * @param $wrapLength - * @return string - */ - private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, $wrapLength) + private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength) : string { - $text = $docblock->getSummary() . ((string)$docblock->getDescription() ? "\n\n" . $docblock->getDescription() + $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() : ''); if ($wrapLength !== null) { $text = wordwrap($text, $wrapLength); + return $text; } + return $text; } - /** - * @param DocBlock $docblock - * @param $wrapLength - * @param $indent - * @param $comment - * @return string - */ - private function addTagBlock(DocBlock $docblock, $wrapLength, $indent, $comment) + private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment) : string { foreach ($docblock->getTags() as $tag) { $tagText = $this->tagFormatter->format($tag); if ($wrapLength !== null) { $tagText = wordwrap($tagText, $wrapLength); } - $tagText = str_replace("\n", "\n{$indent} * ", $tagText); - $comment .= "{$indent} * {$tagText}\n"; + $tagText = str_replace( + "\n", + sprintf("\n%s * ", $indent), + $tagText + ); + + $comment .= sprintf("%s * %s\n", $indent, $tagText); } return $comment; diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php index 8efd84e2b7..e64b587ef4 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php @@ -1,22 +1,52 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock; -use phpDocumentor\Reflection\DocBlock\Tags\Factory\StaticMethod; +use InvalidArgumentException; +use phpDocumentor\Reflection\DocBlock\Tags\Author; +use phpDocumentor\Reflection\DocBlock\Tags\Covers; +use phpDocumentor\Reflection\DocBlock\Tags\Deprecated; use phpDocumentor\Reflection\DocBlock\Tags\Generic; +use phpDocumentor\Reflection\DocBlock\Tags\InvalidTag; +use phpDocumentor\Reflection\DocBlock\Tags\Link as LinkTag; +use phpDocumentor\Reflection\DocBlock\Tags\Method; +use phpDocumentor\Reflection\DocBlock\Tags\Param; +use phpDocumentor\Reflection\DocBlock\Tags\Property; +use phpDocumentor\Reflection\DocBlock\Tags\PropertyRead; +use phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite; +use phpDocumentor\Reflection\DocBlock\Tags\Return_; +use phpDocumentor\Reflection\DocBlock\Tags\See as SeeTag; +use phpDocumentor\Reflection\DocBlock\Tags\Since; +use phpDocumentor\Reflection\DocBlock\Tags\Source; +use phpDocumentor\Reflection\DocBlock\Tags\Throws; +use phpDocumentor\Reflection\DocBlock\Tags\Uses; +use phpDocumentor\Reflection\DocBlock\Tags\Var_; +use phpDocumentor\Reflection\DocBlock\Tags\Version; use phpDocumentor\Reflection\FqsenResolver; use phpDocumentor\Reflection\Types\Context as TypeContext; +use ReflectionMethod; +use ReflectionNamedType; +use ReflectionParameter; use Webmozart\Assert\Assert; +use function array_merge; +use function array_slice; +use function call_user_func_array; +use function count; +use function get_class; +use function preg_match; +use function strpos; +use function trim; /** * Creates a Tag object given the contents of a tag. @@ -38,41 +68,47 @@ final class StandardTagFactory implements TagFactory { /** PCRE regular expression matching a tag name. */ - const REGEX_TAGNAME = '[\w\-\_\\\\]+'; + public const REGEX_TAGNAME = '[\w\-\_\\\\:]+'; /** - * @var string[] An array with a tag as a key, and an FQCN to a class that handles it as an array value. + * @var array> An array with a tag as a key, and an + * FQCN to a class that handles it as an array value. */ private $tagHandlerMappings = [ - 'author' => '\phpDocumentor\Reflection\DocBlock\Tags\Author', - 'covers' => '\phpDocumentor\Reflection\DocBlock\Tags\Covers', - 'deprecated' => '\phpDocumentor\Reflection\DocBlock\Tags\Deprecated', + 'author' => Author::class, + 'covers' => Covers::class, + 'deprecated' => Deprecated::class, // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', - 'link' => '\phpDocumentor\Reflection\DocBlock\Tags\Link', - 'method' => '\phpDocumentor\Reflection\DocBlock\Tags\Method', - 'param' => '\phpDocumentor\Reflection\DocBlock\Tags\Param', - 'property-read' => '\phpDocumentor\Reflection\DocBlock\Tags\PropertyRead', - 'property' => '\phpDocumentor\Reflection\DocBlock\Tags\Property', - 'property-write' => '\phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite', - 'return' => '\phpDocumentor\Reflection\DocBlock\Tags\Return_', - 'see' => '\phpDocumentor\Reflection\DocBlock\Tags\See', - 'since' => '\phpDocumentor\Reflection\DocBlock\Tags\Since', - 'source' => '\phpDocumentor\Reflection\DocBlock\Tags\Source', - 'throw' => '\phpDocumentor\Reflection\DocBlock\Tags\Throws', - 'throws' => '\phpDocumentor\Reflection\DocBlock\Tags\Throws', - 'uses' => '\phpDocumentor\Reflection\DocBlock\Tags\Uses', - 'var' => '\phpDocumentor\Reflection\DocBlock\Tags\Var_', - 'version' => '\phpDocumentor\Reflection\DocBlock\Tags\Version' + 'link' => LinkTag::class, + 'method' => Method::class, + 'param' => Param::class, + 'property-read' => PropertyRead::class, + 'property' => Property::class, + 'property-write' => PropertyWrite::class, + 'return' => Return_::class, + 'see' => SeeTag::class, + 'since' => Since::class, + 'source' => Source::class, + 'throw' => Throws::class, + 'throws' => Throws::class, + 'uses' => Uses::class, + 'var' => Var_::class, + 'version' => Version::class, ]; /** - * @var \ReflectionParameter[][] a lazy-loading cache containing parameters for each tagHandler that has been used. + * @var array> An array with a anotation s a key, and an + * FQCN to a class that handles it as an array value. */ - private $tagHandlerParameterCache = []; + private $annotationMappings = []; /** - * @var FqsenResolver + * @var ReflectionParameter[][] a lazy-loading cache containing parameters + * for each tagHandler that has been used. */ + private $tagHandlerParameterCache = []; + + /** @var FqsenResolver */ private $fqsenResolver; /** @@ -87,12 +123,11 @@ final class StandardTagFactory implements TagFactory * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property * is used. * - * @param FqsenResolver $fqsenResolver - * @param string[] $tagHandlers - * * @see self::registerTagHandler() to add a new tag handler to the existing default list. + * + * @param array> $tagHandlers */ - public function __construct(FqsenResolver $fqsenResolver, array $tagHandlers = null) + public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) { $this->fqsenResolver = $fqsenResolver; if ($tagHandlers !== null) { @@ -102,54 +137,38 @@ public function __construct(FqsenResolver $fqsenResolver, array $tagHandlers = n $this->addService($fqsenResolver, FqsenResolver::class); } - /** - * {@inheritDoc} - */ - public function create($tagLine, TypeContext $context = null) + public function create(string $tagLine, ?TypeContext $context = null) : Tag { - if (! $context) { + if (!$context) { $context = new TypeContext(''); } - list($tagName, $tagBody) = $this->extractTagParts($tagLine); - - if ($tagBody !== '' && $tagBody[0] === '[') { - throw new \InvalidArgumentException( - 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors' - ); - } + [$tagName, $tagBody] = $this->extractTagParts($tagLine); - return $this->createTag($tagBody, $tagName, $context); + return $this->createTag(trim($tagBody), $tagName, $context); } /** - * {@inheritDoc} + * @param mixed $value */ - public function addParameter($name, $value) + public function addParameter(string $name, $value) : void { $this->serviceLocator[$name] = $value; } - /** - * {@inheritDoc} - */ - public function addService($service, $alias = null) + public function addService(object $service, ?string $alias = null) : void { $this->serviceLocator[$alias ?: get_class($service)] = $service; } - /** - * {@inheritDoc} - */ - public function registerTagHandler($tagName, $handler) + public function registerTagHandler(string $tagName, string $handler) : void { Assert::stringNotEmpty($tagName); - Assert::stringNotEmpty($handler); Assert::classExists($handler); - Assert::implementsInterface($handler, StaticMethod::class); + Assert::implementsInterface($handler, Tag::class); if (strpos($tagName, '\\') && $tagName[0] !== '\\') { - throw new \InvalidArgumentException( + throw new InvalidArgumentException( 'A namespaced tag must have a leading backslash as it must be fully qualified' ); } @@ -160,15 +179,13 @@ public function registerTagHandler($tagName, $handler) /** * Extracts all components for a tag. * - * @param string $tagLine - * * @return string[] */ - private function extractTagParts($tagLine) + private function extractTagParts(string $tagLine) : array { - $matches = array(); - if (! preg_match('/^@(' . self::REGEX_TAGNAME . ')(?:\s*([^\s].*)|$)/us', $tagLine, $matches)) { - throw new \InvalidArgumentException( + $matches = []; + if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\s\(\{])\s*([^\s].*)|$)/us', $tagLine, $matches)) { + throw new InvalidArgumentException( 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors' ); } @@ -183,44 +200,43 @@ private function extractTagParts($tagLine) /** * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the * body was invalid. - * - * @param string $body - * @param string $name - * @param TypeContext $context - * - * @return Tag|null */ - private function createTag($body, $name, TypeContext $context) + private function createTag(string $body, string $name, TypeContext $context) : Tag { $handlerClassName = $this->findHandlerClassName($name, $context); $arguments = $this->getArgumentsForParametersFromWiring( $this->fetchParametersForHandlerFactoryMethod($handlerClassName), $this->getServiceLocatorWithDynamicParameters($context, $name, $body) - ) - ; + ); + + try { + $callable = [$handlerClassName, 'create']; + Assert::isCallable($callable); + /** @phpstan-var callable(string): ?Tag $callable */ + $tag = call_user_func_array($callable, $arguments); - return call_user_func_array([$handlerClassName, 'create'], $arguments); + return $tag ?? InvalidTag::create($body, $name); + } catch (InvalidArgumentException $e) { + return InvalidTag::create($body, $name)->withError($e); + } } /** * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). * - * @param string $tagName - * @param TypeContext $context - * - * @return string + * @return class-string */ - private function findHandlerClassName($tagName, TypeContext $context) + private function findHandlerClassName(string $tagName, TypeContext $context) : string { $handlerClassName = Generic::class; if (isset($this->tagHandlerMappings[$tagName])) { $handlerClassName = $this->tagHandlerMappings[$tagName]; } elseif ($this->isAnnotation($tagName)) { // TODO: Annotation support is planned for a later stage and as such is disabled for now - // $tagName = (string)$this->fqsenResolver->resolve($tagName, $context); - // if (isset($this->annotationMappings[$tagName])) { - // $handlerClassName = $this->annotationMappings[$tagName]; - // } + $tagName = (string) $this->fqsenResolver->resolve($tagName, $context); + if (isset($this->annotationMappings[$tagName])) { + $handlerClassName = $this->annotationMappings[$tagName]; + } } return $handlerClassName; @@ -229,17 +245,28 @@ private function findHandlerClassName($tagName, TypeContext $context) /** * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. * - * @param \ReflectionParameter[] $parameters - * @param mixed[] $locator + * @param ReflectionParameter[] $parameters + * @param mixed[] $locator * * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters * is provided with this method. */ - private function getArgumentsForParametersFromWiring($parameters, $locator) + private function getArgumentsForParametersFromWiring(array $parameters, array $locator) : array { $arguments = []; - foreach ($parameters as $index => $parameter) { - $typeHint = $parameter->getClass() ? $parameter->getClass()->getName() : null; + foreach ($parameters as $parameter) { + $type = $parameter->getType(); + $typeHint = null; + if ($type instanceof ReflectionNamedType) { + $typeHint = $type->getName(); + if ($typeHint === 'self') { + $declaringClass = $parameter->getDeclaringClass(); + if ($declaringClass !== null) { + $typeHint = $declaringClass->getName(); + } + } + } + if (isset($locator[$typeHint])) { $arguments[] = $locator[$typeHint]; continue; @@ -261,14 +288,14 @@ private function getArgumentsForParametersFromWiring($parameters, $locator) * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given * tag handler class name. * - * @param string $handlerClassName + * @param class-string $handlerClassName * - * @return \ReflectionParameter[] + * @return ReflectionParameter[] */ - private function fetchParametersForHandlerFactoryMethod($handlerClassName) + private function fetchParametersForHandlerFactoryMethod(string $handlerClassName) : array { - if (! isset($this->tagHandlerParameterCache[$handlerClassName])) { - $methodReflection = new \ReflectionMethod($handlerClassName, 'create'); + if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { + $methodReflection = new ReflectionMethod($handlerClassName, 'create'); $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); } @@ -276,39 +303,39 @@ private function fetchParametersForHandlerFactoryMethod($handlerClassName) } /** - * Returns a copy of this class' Service Locator with added dynamic parameters, such as the tag's name, body and - * Context. + * Returns a copy of this class' Service Locator with added dynamic parameters, + * such as the tag's name, body and Context. * - * @param TypeContext $context The Context (namespace and aliasses) that may be passed and is used to resolve FQSENs. - * @param string $tagName The name of the tag that may be passed onto the factory method of the Tag class. - * @param string $tagBody The body of the tag that may be passed onto the factory method of the Tag class. + * @param TypeContext $context The Context (namespace and aliasses) that may be + * passed and is used to resolve FQSENs. + * @param string $tagName The name of the tag that may be + * passed onto the factory method of the Tag class. + * @param string $tagBody The body of the tag that may be + * passed onto the factory method of the Tag class. * * @return mixed[] */ - private function getServiceLocatorWithDynamicParameters(TypeContext $context, $tagName, $tagBody) - { - $locator = array_merge( + private function getServiceLocatorWithDynamicParameters( + TypeContext $context, + string $tagName, + string $tagBody + ) : array { + return array_merge( $this->serviceLocator, [ - 'name' => $tagName, - 'body' => $tagBody, - TypeContext::class => $context + 'name' => $tagName, + 'body' => $tagBody, + TypeContext::class => $context, ] ); - - return $locator; } /** * Returns whether the given tag belongs to an annotation. * - * @param string $tagContent - * * @todo this method should be populated once we implement Annotation notation support. - * - * @return bool */ - private function isAnnotation($tagContent) + private function isAnnotation(string $tagContent) : bool { // 1. Contains a namespace separator // 2. Contains parenthesis diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php index e765367883..f55de91695 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,11 +17,16 @@ interface Tag { - public function getName(); + public function getName() : string; - public static function create($body); + /** + * @return Tag|mixed Class that implements Tag + * + * @phpstan-return ?Tag + */ + public static function create(string $body); - public function render(Formatter $formatter = null); + public function render(?Formatter $formatter = null) : string; - public function __toString(); + public function __toString() : string; } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php index 3c1d1132bc..0d318d1beb 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php @@ -1,17 +1,19 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock; +use InvalidArgumentException; use phpDocumentor\Reflection\Types\Context as TypeContext; interface TagFactory @@ -34,60 +36,49 @@ interface TagFactory * * These parameters are injected at the last moment and will override any existing parameter with those names. * - * @param string $name - * @param mixed $value - * - * @return void + * @param mixed $value */ - public function addParameter($name, $value); + public function addParameter(string $name, $value) : void; /** - * Registers a service with the Service Locator using the FQCN of the class or the alias, if provided. - * - * When calling a tag's "create" method we always check the signature for dependencies to inject. If a parameter - * has a typehint then the ServiceLocator is queried to see if a Service is registered for that typehint. + * Factory method responsible for instantiating the correct sub type. * - * Because interfaces are regularly used as type-hints this method provides an alias parameter; if the FQCN of the - * interface is passed as alias then every time that interface is requested the provided service will be returned. + * @param string $tagLine The text for this tag, including description. * - * @param object $service - * @param string $alias + * @return Tag A new tag object. * - * @return void + * @throws InvalidArgumentException If an invalid tag line was presented. */ - public function addService($service); + public function create(string $tagLine, ?TypeContext $context = null) : Tag; /** - * Factory method responsible for instantiating the correct sub type. - * - * @param string $tagLine The text for this tag, including description. - * @param TypeContext $context + * Registers a service with the Service Locator using the FQCN of the class or the alias, if provided. * - * @throws \InvalidArgumentException if an invalid tag line was presented. + * When calling a tag's "create" method we always check the signature for dependencies to inject. If a parameter + * has a typehint then the ServiceLocator is queried to see if a Service is registered for that typehint. * - * @return Tag A new tag object. + * Because interfaces are regularly used as type-hints this method provides an alias parameter; if the FQCN of the + * interface is passed as alias then every time that interface is requested the provided service will be returned. */ - public function create($tagLine, TypeContext $context = null); + public function addService(object $service) : void; /** * Registers a handler for tags. * - * If you want to use your own tags then you can use this method to instruct the TagFactory to register the name - * of a tag with the FQCN of a 'Tag Handler'. The Tag handler should implement the {@see Tag} interface (and thus - * the create method). - * - * @param string $tagName Name of tag to register a handler for. When registering a namespaced tag, the full - * name, along with a prefixing slash MUST be provided. - * @param string $handler FQCN of handler. + * If you want to use your own tags then you can use this method to instruct the TagFactory + * to register the name of a tag with the FQCN of a 'Tag Handler'. The Tag handler should implement + * the {@see Tag} interface (and thus the create method). * - * @throws \InvalidArgumentException if the tag name is not a string - * @throws \InvalidArgumentException if the tag name is namespaced (contains backslashes) but does not start with - * a backslash - * @throws \InvalidArgumentException if the handler is not a string - * @throws \InvalidArgumentException if the handler is not an existing class - * @throws \InvalidArgumentException if the handler does not implement the {@see Tag} interface + * @param string $tagName Name of tag to register a handler for. When registering a namespaced + * tag, the full name, along with a prefixing slash MUST be provided. + * @param class-string $handler FQCN of handler. * - * @return void + * @throws InvalidArgumentException If the tag name is not a string. + * @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but + * does not start with a backslash. + * @throws InvalidArgumentException If the handler is not a string. + * @throws InvalidArgumentException If the handler is not an existing class. + * @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. */ - public function registerTagHandler($tagName, $handler); + public function registerTagHandler(string $tagName, string $handler) : void; } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php index 29d7f1de17..d1207571da 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php @@ -1,18 +1,23 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; -use Webmozart\Assert\Assert; +use InvalidArgumentException; +use function filter_var; +use function preg_match; +use function trim; +use const FILTER_VALIDATE_EMAIL; /** * Reflection class for an {@}author tag in a Docblock. @@ -23,23 +28,18 @@ final class Author extends BaseTag implements Factory\StaticMethod protected $name = 'author'; /** @var string The name of the author */ - private $authorName = ''; + private $authorName; /** @var string The email of the author */ - private $authorEmail = ''; + private $authorEmail; /** * Initializes this tag with the author name and e-mail. - * - * @param string $authorName - * @param string $authorEmail */ - public function __construct($authorName, $authorEmail) + public function __construct(string $authorName, string $authorEmail) { - Assert::string($authorName); - Assert::string($authorEmail); if ($authorEmail && !filter_var($authorEmail, FILTER_VALIDATE_EMAIL)) { - throw new \InvalidArgumentException('The author tag does not have a valid e-mail address'); + throw new InvalidArgumentException('The author tag does not have a valid e-mail address'); } $this->authorName = $authorName; @@ -51,7 +51,7 @@ public function __construct($authorName, $authorEmail) * * @return string The author's name. */ - public function getAuthorName() + public function getAuthorName() : string { return $this->authorName; } @@ -61,39 +61,39 @@ public function getAuthorName() * * @return string The author's email. */ - public function getEmail() + public function getEmail() : string { return $this->authorEmail; } /** * Returns this tag in string form. - * - * @return string */ - public function __toString() + public function __toString() : string { - return $this->authorName . (strlen($this->authorEmail) ? ' <' . $this->authorEmail . '>' : ''); + if ($this->authorEmail) { + $authorEmail = '<' . $this->authorEmail . '>'; + } else { + $authorEmail = ''; + } + + $authorName = (string) $this->authorName; + + return $authorName . ($authorEmail !== '' ? ($authorName !== '' ? ' ' : '') . $authorEmail : ''); } /** * Attempts to create a new Author object based on †he tag body. - * - * @param string $body - * - * @return static */ - public static function create($body) + public static function create(string $body) : ?self { - Assert::string($body); - $splitTagContent = preg_match('/^([^\<]*)(?:\<([^\>]*)\>)?$/u', $body, $matches); if (!$splitTagContent) { return null; } $authorName = trim($matches[1]); - $email = isset($matches[2]) ? trim($matches[2]) : ''; + $email = isset($matches[2]) ? trim($matches[2]) : ''; return new static($authorName, $email); } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php index 14bb71771f..fbcd4022fc 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php @@ -1,13 +1,14 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; @@ -31,17 +32,17 @@ abstract class BaseTag implements DocBlock\Tag * * @return string The name of this tag. */ - public function getName() + public function getName() : string { return $this->name; } - public function getDescription() + public function getDescription() : ?Description { return $this->description; } - public function render(Formatter $formatter = null) + public function render(?Formatter $formatter = null) : string { if ($formatter === null) { $formatter = new Formatter\PassthroughFormatter(); diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php index 31b4f82c8e..9e52e5e4ca 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php @@ -1,84 +1,100 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; +use phpDocumentor\Reflection\DocBlock\Description; use phpDocumentor\Reflection\DocBlock\DescriptionFactory; use phpDocumentor\Reflection\Fqsen; -use phpDocumentor\Reflection\DocBlock\Description; -use phpDocumentor\Reflection\Types\Context as TypeContext; use phpDocumentor\Reflection\FqsenResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\Utils; use Webmozart\Assert\Assert; +use function array_key_exists; +use function explode; /** * Reflection class for a @covers tag in a Docblock. */ final class Covers extends BaseTag implements Factory\StaticMethod { + /** @var string */ protected $name = 'covers'; /** @var Fqsen */ - private $refers = null; + private $refers; /** * Initializes this tag. - * - * @param Fqsen $refers - * @param Description $description */ - public function __construct(Fqsen $refers, Description $description = null) + public function __construct(Fqsen $refers, ?Description $description = null) { - $this->refers = $refers; + $this->refers = $refers; $this->description = $description; } - /** - * {@inheritdoc} - */ public static function create( - $body, - DescriptionFactory $descriptionFactory = null, - FqsenResolver $resolver = null, - TypeContext $context = null - ) - { - Assert::string($body); - Assert::notEmpty($body); + string $body, + ?DescriptionFactory $descriptionFactory = null, + ?FqsenResolver $resolver = null, + ?TypeContext $context = null + ) : self { + Assert::stringNotEmpty($body); + Assert::notNull($descriptionFactory); + Assert::notNull($resolver); - $parts = preg_split('/\s+/Su', $body, 2); + $parts = Utils::pregSplit('/\s+/Su', $body, 2); return new static( - $resolver->resolve($parts[0], $context), - $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context) + self::resolveFqsen($parts[0], $resolver, $context), + $descriptionFactory->create($parts[1] ?? '', $context) ); } + private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen + { + Assert::notNull($fqsenResolver); + $fqsenParts = explode('::', $parts); + $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); + + if (!array_key_exists(1, $fqsenParts)) { + return $resolved; + } + + return new Fqsen($resolved . '::' . $fqsenParts[1]); + } + /** * Returns the structural element this tag refers to. - * - * @return Fqsen */ - public function getReference() + public function getReference() : Fqsen { return $this->refers; } /** * Returns a string representation of this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return $this->refers . ($this->description ? ' ' . $this->description->render() : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $refers = (string) $this->refers; + + return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php index 7c1039fa2a..68e8f03639 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php @@ -1,34 +1,37 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; -use phpDocumentor\Reflection\Types\Context as TypeContext; use phpDocumentor\Reflection\DocBlock\Description; use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Types\Context as TypeContext; use Webmozart\Assert\Assert; +use function preg_match; /** * Reflection class for a {@}deprecated tag in a Docblock. */ final class Deprecated extends BaseTag implements Factory\StaticMethod { + /** @var string */ protected $name = 'deprecated'; /** * PCRE regular expression matching a version vector. * Assumes the "x" modifier. */ - const REGEX_VECTOR = '(?: + public const REGEX_VECTOR = '(?: # Normal release vectors. \d\S* | @@ -40,23 +43,25 @@ final class Deprecated extends BaseTag implements Factory\StaticMethod [^\s\:]+\:\s*\$[^\$]+\$ )'; - /** @var string The version vector. */ - private $version = ''; + /** @var string|null The version vector. */ + private $version; - public function __construct($version = null, Description $description = null) + public function __construct(?string $version = null, ?Description $description = null) { - Assert::nullOrStringNotEmpty($version); + Assert::nullOrNotEmpty($version); - $this->version = $version; + $this->version = $version; $this->description = $description; } /** * @return static */ - public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null) - { - Assert::nullOrString($body); + public static function create( + ?string $body, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { if (empty($body)) { return new static(); } @@ -65,33 +70,39 @@ public static function create($body, DescriptionFactory $descriptionFactory = nu if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { return new static( null, - null !== $descriptionFactory ? $descriptionFactory->create($body, $context) : null + $descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null ); } + Assert::notNull($descriptionFactory); + return new static( $matches[1], - $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context) + $descriptionFactory->create($matches[2] ?? '', $context) ); } /** * Gets the version section of the tag. - * - * @return string */ - public function getVersion() + public function getVersion() : ?string { return $this->version; } /** * Returns a string representation for this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return $this->version . ($this->description ? ' ' . $this->description->render() : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $version = (string) $this->version; + + return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php index b77a934e52..3face1efa6 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php @@ -1,103 +1,109 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; -use phpDocumentor\Reflection\DocBlock\Description; use phpDocumentor\Reflection\DocBlock\Tag; use Webmozart\Assert\Assert; +use function array_key_exists; +use function preg_match; +use function rawurlencode; +use function str_replace; +use function strpos; +use function trim; /** * Reflection class for a {@}example tag in a Docblock. */ -final class Example extends BaseTag +final class Example implements Tag, Factory\StaticMethod { - /** - * @var string Path to a file to use as an example. May also be an absolute URI. - */ + /** @var string Path to a file to use as an example. May also be an absolute URI. */ private $filePath; /** * @var bool Whether the file path component represents an URI. This determines how the file portion * appears at {@link getContent()}. */ - private $isURI = false; + private $isURI; - /** - * @var - */ + /** @var int */ private $startingLine; - /** - * @var - */ + /** @var int */ private $lineCount; - public function __construct($filePath, $isURI, $startingLine, $lineCount, $description) - { - Assert::notEmpty($filePath); - Assert::integer($startingLine); - Assert::greaterThanEq($startingLine, 0); - - $this->filePath = $filePath; + /** @var string|null */ + private $content; + + public function __construct( + string $filePath, + bool $isURI, + int $startingLine, + int $lineCount, + ?string $content + ) { + Assert::stringNotEmpty($filePath); + Assert::greaterThanEq($startingLine, 1); + Assert::greaterThanEq($lineCount, 0); + + $this->filePath = $filePath; $this->startingLine = $startingLine; - $this->lineCount = $lineCount; - $this->name = 'example'; - if ($description !== null) { - $this->description = trim($description); + $this->lineCount = $lineCount; + if ($content !== null) { + $this->content = trim($content); } $this->isURI = $isURI; } - /** - * {@inheritdoc} - */ - public function getContent() + public function getContent() : string { - if (null === $this->description) { - $filePath = '"' . $this->filePath . '"'; + if ($this->content === null || $this->content === '') { + $filePath = $this->filePath; if ($this->isURI) { $filePath = $this->isUriRelative($this->filePath) ? str_replace('%2F', '/', rawurlencode($this->filePath)) - :$this->filePath; + : $this->filePath; } - return trim($filePath . ' ' . parent::getDescription()); + return trim($filePath); } - return $this->description; + return $this->content; } - /** - * {@inheritdoc} - */ - public static function create($body) + public function getDescription() : ?string + { + return $this->content; + } + + public static function create(string $body) : ?Tag { // File component: File path in quotes or File URI / Source information - if (! preg_match('/^(?:\"([^\"]+)\"|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) { + if (!preg_match('/^\s*(?:(\"[^\"]+\")|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) { return null; } $filePath = null; $fileUri = null; - if ('' !== $matches[1]) { + if ($matches[1] !== '') { $filePath = $matches[1]; } else { $fileUri = $matches[2]; } $startingLine = 1; - $lineCount = null; + $lineCount = 0; $description = null; if (array_key_exists(3, $matches)) { @@ -105,9 +111,9 @@ public static function create($body) // Starting line / Number of lines / Description if (preg_match('/^([1-9]\d*)(?:\s+((?1))\s*)?(.*)$/sux', $matches[3], $contentMatches)) { - $startingLine = (int)$contentMatches[1]; - if (isset($contentMatches[2]) && $contentMatches[2] !== '') { - $lineCount = (int)$contentMatches[2]; + $startingLine = (int) $contentMatches[1]; + if (isset($contentMatches[2])) { + $lineCount = (int) $contentMatches[2]; } if (array_key_exists(3, $contentMatches)) { @@ -117,7 +123,7 @@ public static function create($body) } return new static( - $filePath !== null?$filePath:$fileUri, + $filePath ?? ($fileUri ?? ''), $fileUri !== null, $startingLine, $lineCount, @@ -131,46 +137,63 @@ public static function create($body) * @return string Path to a file to use as an example. * May also be an absolute URI. */ - public function getFilePath() + public function getFilePath() : string { - return $this->filePath; + return trim($this->filePath, '"'); } /** * Returns a string representation for this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return $this->filePath . ($this->description ? ' ' . $this->description : ''); + $filePath = (string) $this->filePath; + $isDefaultLine = $this->startingLine === 1 && $this->lineCount === 0; + $startingLine = !$isDefaultLine ? (string) $this->startingLine : ''; + $lineCount = !$isDefaultLine ? (string) $this->lineCount : ''; + $content = (string) $this->content; + + return $filePath + . ($startingLine !== '' + ? ($filePath !== '' ? ' ' : '') . $startingLine + : '') + . ($lineCount !== '' + ? ($filePath !== '' || $startingLine !== '' ? ' ' : '') . $lineCount + : '') + . ($content !== '' + ? ($filePath !== '' || $startingLine !== '' || $lineCount !== '' ? ' ' : '') . $content + : ''); } /** * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). - * - * @param string $uri - * - * @return bool */ - private function isUriRelative($uri) + private function isUriRelative(string $uri) : bool { - return false === strpos($uri, ':'); + return strpos($uri, ':') === false; } - /** - * @return int - */ - public function getStartingLine() + public function getStartingLine() : int { return $this->startingLine; } - /** - * @return int - */ - public function getLineCount() + public function getLineCount() : int { return $this->lineCount; } + + public function getName() : string + { + return 'example'; + } + + public function render(?Formatter $formatter = null) : string + { + if ($formatter === null) { + $formatter = new Formatter\PassthroughFormatter(); + } + + return $formatter->format($this); + } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php index 98aea455c1..f6f0bb5a4b 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php @@ -1,18 +1,25 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags\Factory; +/** + * @deprecated This contract is totally covered by Tag contract. Every class using StaticMethod also use Tag + */ interface StaticMethod { - public static function create($body); + /** + * @return mixed + */ + public static function create(string $body); } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php deleted file mode 100644 index b9ca0b8abe..0000000000 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tags\Factory; - -interface Strategy -{ - public function create($body); -} diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php index 64b2c60349..92fb9e6c41 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -18,10 +19,6 @@ interface Formatter { /** * Formats a tag into a string representation according to a specific format, such as Markdown. - * - * @param Tag $tag - * - * @return string */ - public function format(Tag $tag); + public function format(Tag $tag) : string; } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php index ceb40cc321..b1a406c0f0 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php @@ -1,13 +1,13 @@ - * @copyright 2017 Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -15,6 +15,9 @@ use phpDocumentor\Reflection\DocBlock\Tag; use phpDocumentor\Reflection\DocBlock\Tags\Formatter; +use function max; +use function str_repeat; +use function strlen; class AlignFormatter implements Formatter { @@ -22,8 +25,6 @@ class AlignFormatter implements Formatter protected $maxLen = 0; /** - * Constructor. - * * @param Tag[] $tags All tags that should later be aligned with the formatter. */ public function __construct(array $tags) @@ -35,13 +36,14 @@ public function __construct(array $tags) /** * Formats the given tag to return a simple plain text version. - * - * @param Tag $tag - * - * @return string */ - public function format(Tag $tag) + public function format(Tag $tag) : string { - return '@' . $tag->getName() . str_repeat(' ', $this->maxLen - strlen($tag->getName()) + 1) . (string)$tag; + return '@' . $tag->getName() . + str_repeat( + ' ', + $this->maxLen - strlen($tag->getName()) + 1 + ) . + $tag; } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php index 4e2c576268..f26d22fb68 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -14,18 +15,15 @@ use phpDocumentor\Reflection\DocBlock\Tag; use phpDocumentor\Reflection\DocBlock\Tags\Formatter; +use function trim; class PassthroughFormatter implements Formatter { /** * Formats the given tag to return a simple plain text version. - * - * @param Tag $tag - * - * @return string */ - public function format(Tag $tag) + public function format(Tag $tag) : string { - return trim('@' . $tag->getName() . ' ' . (string)$tag); + return trim('@' . $tag->getName() . ' ' . $tag); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php index e4c53e00a6..a7b423f5f7 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php @@ -1,88 +1,85 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; +use InvalidArgumentException; use phpDocumentor\Reflection\DocBlock\Description; use phpDocumentor\Reflection\DocBlock\DescriptionFactory; use phpDocumentor\Reflection\DocBlock\StandardTagFactory; use phpDocumentor\Reflection\Types\Context as TypeContext; use Webmozart\Assert\Assert; +use function preg_match; /** * Parses a tag definition for a DocBlock. */ -class Generic extends BaseTag implements Factory\StaticMethod +final class Generic extends BaseTag implements Factory\StaticMethod { /** * Parses a tag and populates the member variables. * - * @param string $name Name of the tag. + * @param string $name Name of the tag. * @param Description $description The contents of the given tag. */ - public function __construct($name, Description $description = null) + public function __construct(string $name, ?Description $description = null) { $this->validateTagName($name); - $this->name = $name; + $this->name = $name; $this->description = $description; } /** * Creates a new tag that represents any unknown tag type. * - * @param string $body - * @param string $name - * @param DescriptionFactory $descriptionFactory - * @param TypeContext $context - * * @return static */ public static function create( - $body, - $name = '', - DescriptionFactory $descriptionFactory = null, - TypeContext $context = null - ) { - Assert::string($body); + string $body, + string $name = '', + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { Assert::stringNotEmpty($name); Assert::notNull($descriptionFactory); - $description = $descriptionFactory && $body ? $descriptionFactory->create($body, $context) : null; + $description = $body !== '' ? $descriptionFactory->create($body, $context) : null; return new static($name, $description); } /** * Returns the tag as a serialized string - * - * @return string */ - public function __toString() + public function __toString() : string { - return ($this->description ? $this->description->render() : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + return $description; } /** * Validates if the tag name matches the expected format, otherwise throws an exception. - * - * @param string $name - * - * @return void */ - private function validateTagName($name) + private function validateTagName(string $name) : void { - if (! preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { - throw new \InvalidArgumentException( + if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { + throw new InvalidArgumentException( 'The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' . 'hyphens and backslashes.' ); diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php new file mode 100644 index 0000000000..e3deb5a8d0 --- /dev/null +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php @@ -0,0 +1,144 @@ +name = $name; + $this->body = $body; + } + + public function getException() : ?Throwable + { + return $this->throwable; + } + + public function getName() : string + { + return $this->name; + } + + public static function create(string $body, string $name = '') : self + { + return new self($name, $body); + } + + public function withError(Throwable $exception) : self + { + $this->flattenExceptionBacktrace($exception); + $tag = new self($this->name, $this->body); + $tag->throwable = $exception; + + return $tag; + } + + /** + * Removes all complex types from backtrace + * + * Not all objects are serializable. So we need to remove them from the + * stored exception to be sure that we do not break existing library usage. + */ + private function flattenExceptionBacktrace(Throwable $exception) : void + { + $traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); + $traceProperty->setAccessible(true); + + do { + $trace = $exception->getTrace(); + if (isset($trace[0]['args'])) { + $trace = array_map( + function (array $call) : array { + $call['args'] = array_map([$this, 'flattenArguments'], $call['args']); + + return $call; + }, + $trace + ); + } + + $traceProperty->setValue($exception, $trace); + $exception = $exception->getPrevious(); + } while ($exception !== null); + + $traceProperty->setAccessible(false); + } + + /** + * @param mixed $value + * + * @return mixed + * + * @throws ReflectionException + */ + private function flattenArguments($value) + { + if ($value instanceof Closure) { + $closureReflection = new ReflectionFunction($value); + $value = sprintf( + '(Closure at %s:%s)', + $closureReflection->getFileName(), + $closureReflection->getStartLine() + ); + } elseif (is_object($value)) { + $value = sprintf('object(%s)', get_class($value)); + } elseif (is_resource($value)) { + $value = sprintf('resource(%s)', get_resource_type($value)); + } elseif (is_array($value)) { + $value = array_map([$this, 'flattenArguments'], $value); + } + + return $value; + } + + public function render(?Formatter $formatter = null) : string + { + if ($formatter === null) { + $formatter = new Formatter\PassthroughFormatter(); + } + + return $formatter->format($this); + } + + public function __toString() : string + { + return $this->body; + } +} diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php index 9c0e367eb0..226bbe0f9e 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php @@ -1,13 +1,14 @@ - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; @@ -15,63 +16,63 @@ use phpDocumentor\Reflection\DocBlock\Description; use phpDocumentor\Reflection\DocBlock\DescriptionFactory; use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\Utils; use Webmozart\Assert\Assert; /** - * Reflection class for a @link tag in a Docblock. + * Reflection class for a {@}link tag in a Docblock. */ final class Link extends BaseTag implements Factory\StaticMethod { + /** @var string */ protected $name = 'link'; /** @var string */ - private $link = ''; + private $link; /** * Initializes a link to a URL. - * - * @param string $link - * @param Description $description */ - public function __construct($link, Description $description = null) + public function __construct(string $link, ?Description $description = null) { - Assert::string($link); - - $this->link = $link; + $this->link = $link; $this->description = $description; } - /** - * {@inheritdoc} - */ - public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null) - { - Assert::string($body); + public static function create( + string $body, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { Assert::notNull($descriptionFactory); - $parts = preg_split('/\s+/Su', $body, 2); + $parts = Utils::pregSplit('/\s+/Su', $body, 2); $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; return new static($parts[0], $description); } /** - * Gets the link - * - * @return string - */ - public function getLink() + * Gets the link + */ + public function getLink() : string { return $this->link; } /** * Returns a string representation for this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return $this->link . ($this->description ? ' ' . $this->description->render() : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $link = (string) $this->link; + + return $link . ($description !== '' ? ($link !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php index d3c1cd1114..08c0407ea9 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php @@ -1,53 +1,74 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; +use InvalidArgumentException; use phpDocumentor\Reflection\DocBlock\Description; use phpDocumentor\Reflection\DocBlock\DescriptionFactory; use phpDocumentor\Reflection\Type; use phpDocumentor\Reflection\TypeResolver; use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\Types\Mixed_; use phpDocumentor\Reflection\Types\Void_; use Webmozart\Assert\Assert; +use function array_keys; +use function explode; +use function implode; +use function is_string; +use function preg_match; +use function sort; +use function strpos; +use function substr; +use function trim; +use function var_export; /** * Reflection class for an {@}method in a Docblock. */ final class Method extends BaseTag implements Factory\StaticMethod { + /** @var string */ protected $name = 'method'; /** @var string */ - private $methodName = ''; + private $methodName; - /** @var string[] */ - private $arguments = []; + /** + * @phpstan-var array + * @var array> + */ + private $arguments; /** @var bool */ - private $isStatic = false; + private $isStatic; /** @var Type */ private $returnType; + /** + * @param array> $arguments + * + * @phpstan-param array $arguments + */ public function __construct( - $methodName, + string $methodName, array $arguments = [], - Type $returnType = null, - $static = false, - Description $description = null + ?Type $returnType = null, + bool $static = false, + ?Description $description = null ) { Assert::stringNotEmpty($methodName); - Assert::boolean($static); if ($returnType === null) { $returnType = new Void_(); @@ -60,17 +81,15 @@ public function __construct( $this->description = $description; } - /** - * {@inheritdoc} - */ public static function create( - $body, - TypeResolver $typeResolver = null, - DescriptionFactory $descriptionFactory = null, - TypeContext $context = null - ) { + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : ?self { Assert::stringNotEmpty($body); - Assert::allNotNull([ $typeResolver, $descriptionFactory ]); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); // 1. none or more whitespace // 2. optionally the keyword "static" followed by whitespace @@ -91,23 +110,19 @@ public static function create( )? # Return type (?: - ( + ( (?:[\w\|_\\\\]*\$this[\w\|_\\\\]*) | (?: (?:[\w\|_\\\\]+) - # array notation + # array notation (?:\[\])* - )* + )*+ ) \s+ )? - # Legacy method name (not captured) - (?: - [\w_]+\(\)\s+ - )? # Method name - ([\w\|_\\\\]+) + ([\w_]+) # Arguments (?: \(([^\)]*)\) @@ -122,9 +137,9 @@ public static function create( return null; } - list(, $static, $returnType, $methodName, $arguments, $description) = $matches; + [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; - $static = $static === 'static'; + $static = $static === 'static'; if ($returnType === '') { $returnType = 'void'; @@ -133,26 +148,26 @@ public static function create( $returnType = $typeResolver->resolve($returnType, $context); $description = $descriptionFactory->create($description, $context); - if (is_string($arguments) && strlen($arguments) > 0) { - $arguments = explode(',', $arguments); - foreach($arguments as &$argument) { + /** @phpstan-var array $arguments */ + $arguments = []; + if ($argumentLines !== '') { + $argumentsExploded = explode(',', $argumentLines); + foreach ($argumentsExploded as $argument) { $argument = explode(' ', self::stripRestArg(trim($argument)), 2); - if ($argument[0][0] === '$') { + if (strpos($argument[0], '$') === 0) { $argumentName = substr($argument[0], 1); - $argumentType = new Void_(); + $argumentType = new Mixed_(); } else { $argumentType = $typeResolver->resolve($argument[0], $context); $argumentName = ''; if (isset($argument[1])) { - $argument[1] = self::stripRestArg($argument[1]); + $argument[1] = self::stripRestArg($argument[1]); $argumentName = substr($argument[1], 1); } } - $argument = [ 'name' => $argumentName, 'type' => $argumentType]; + $arguments[] = ['name' => $argumentName, 'type' => $argumentType]; } - } else { - $arguments = []; } return new static($methodName, $arguments, $returnType, $static, $description); @@ -160,18 +175,18 @@ public static function create( /** * Retrieves the method name. - * - * @return string */ - public function getMethodName() + public function getMethodName() : string { return $this->methodName; } /** - * @return string[] + * @return array> + * + * @phpstan-return array */ - public function getArguments() + public function getArguments() : array { return $this->arguments; } @@ -181,54 +196,79 @@ public function getArguments() * * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. */ - public function isStatic() + public function isStatic() : bool { return $this->isStatic; } - /** - * @return Type - */ - public function getReturnType() + public function getReturnType() : Type { return $this->returnType; } - public function __toString() + public function __toString() : string { $arguments = []; foreach ($this->arguments as $argument) { $arguments[] = $argument['type'] . ' $' . $argument['name']; } - return trim(($this->isStatic() ? 'static ' : '') - . (string)$this->returnType . ' ' - . $this->methodName - . '(' . implode(', ', $arguments) . ')' - . ($this->description ? ' ' . $this->description->render() : '')); + $argumentStr = '(' . implode(', ', $arguments) . ')'; + + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $static = $this->isStatic ? 'static' : ''; + + $returnType = (string) $this->returnType; + + $methodName = (string) $this->methodName; + + return $static + . ($returnType !== '' ? ($static !== '' ? ' ' : '') . $returnType : '') + . ($methodName !== '' ? ($static !== '' || $returnType !== '' ? ' ' : '') . $methodName : '') + . $argumentStr + . ($description !== '' ? ' ' . $description : ''); } - private function filterArguments($arguments) + /** + * @param mixed[][]|string[] $arguments + * + * @return mixed[][] + * + * @phpstan-param array $arguments + * @phpstan-return array + */ + private function filterArguments(array $arguments = []) : array { - foreach ($arguments as &$argument) { + $result = []; + foreach ($arguments as $argument) { if (is_string($argument)) { - $argument = [ 'name' => $argument ]; + $argument = ['name' => $argument]; } - if (! isset($argument['type'])) { - $argument['type'] = new Void_(); + + if (!isset($argument['type'])) { + $argument['type'] = new Mixed_(); } + $keys = array_keys($argument); - if ($keys !== [ 'name', 'type' ]) { - throw new \InvalidArgumentException( + sort($keys); + if ($keys !== ['name', 'type']) { + throw new InvalidArgumentException( 'Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, true) ); } + + $result[] = $argument; } - return $arguments; + return $result; } - private static function stripRestArg($argument) + private static function stripRestArg(string $argument) : string { if (strpos($argument, '...') === 0) { $argument = trim(substr($argument, 3)); diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php index 1a51dc0dd7..83419e9c5d 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -17,125 +18,155 @@ use phpDocumentor\Reflection\Type; use phpDocumentor\Reflection\TypeResolver; use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\Utils; use Webmozart\Assert\Assert; +use function array_shift; +use function array_unshift; +use function implode; +use function strpos; +use function substr; +use const PREG_SPLIT_DELIM_CAPTURE; /** * Reflection class for the {@}param tag in a Docblock. */ -final class Param extends BaseTag implements Factory\StaticMethod +final class Param extends TagWithType implements Factory\StaticMethod { - /** @var string */ - protected $name = 'param'; - - /** @var Type */ - private $type; - - /** @var string */ - private $variableName = ''; + /** @var string|null */ + private $variableName; /** @var bool determines whether this is a variadic argument */ - private $isVariadic = false; + private $isVariadic; - /** - * @param string $variableName - * @param Type $type - * @param bool $isVariadic - * @param Description $description - */ - public function __construct($variableName, Type $type = null, $isVariadic = false, Description $description = null) - { - Assert::string($variableName); - Assert::boolean($isVariadic); + /** @var bool determines whether this is passed by reference */ + private $isReference; + public function __construct( + ?string $variableName, + ?Type $type = null, + bool $isVariadic = false, + ?Description $description = null, + bool $isReference = false + ) { + $this->name = 'param'; $this->variableName = $variableName; - $this->type = $type; - $this->isVariadic = $isVariadic; - $this->description = $description; + $this->type = $type; + $this->isVariadic = $isVariadic; + $this->description = $description; + $this->isReference = $isReference; } - /** - * {@inheritdoc} - */ public static function create( - $body, - TypeResolver $typeResolver = null, - DescriptionFactory $descriptionFactory = null, - TypeContext $context = null - ) { + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { Assert::stringNotEmpty($body); - Assert::allNotNull([$typeResolver, $descriptionFactory]); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + + [$firstPart, $body] = self::extractTypeFromBody($body); - $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); - $type = null; + $type = null; + $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; - $isVariadic = false; + $isVariadic = false; + $isReference = false; // if the first item that is encountered is not a variable; it is a type - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { - $type = $typeResolver->resolve(array_shift($parts), $context); - array_shift($parts); + if ($firstPart && !self::strStartsWithVariable($firstPart)) { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); } - // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$' || substr($parts[0], 0, 4) === '...$')) { + // if the next item starts with a $ or ...$ or &$ or &...$ it must be the variable name + if (isset($parts[0]) && self::strStartsWithVariable($parts[0])) { $variableName = array_shift($parts); - array_shift($parts); - - if (substr($variableName, 0, 3) === '...') { - $isVariadic = true; - $variableName = substr($variableName, 3); + if ($type) { + array_shift($parts); } - if (substr($variableName, 0, 1) === '$') { + Assert::notNull($variableName); + + if (strpos($variableName, '$') === 0) { $variableName = substr($variableName, 1); + } elseif (strpos($variableName, '&$') === 0) { + $isReference = true; + $variableName = substr($variableName, 2); + } elseif (strpos($variableName, '...$') === 0) { + $isVariadic = true; + $variableName = substr($variableName, 4); + } elseif (strpos($variableName, '&...$') === 0) { + $isVariadic = true; + $isReference = true; + $variableName = substr($variableName, 5); } } $description = $descriptionFactory->create(implode('', $parts), $context); - return new static($variableName, $type, $isVariadic, $description); + return new static($variableName, $type, $isVariadic, $description, $isReference); } /** * Returns the variable's name. - * - * @return string */ - public function getVariableName() + public function getVariableName() : ?string { return $this->variableName; } /** - * Returns the variable's type or null if unknown. - * - * @return Type|null + * Returns whether this tag is variadic. */ - public function getType() + public function isVariadic() : bool { - return $this->type; + return $this->isVariadic; } /** - * Returns whether this tag is variadic. - * - * @return boolean + * Returns whether this tag is passed by reference. */ - public function isVariadic() + public function isReference() : bool { - return $this->isVariadic; + return $this->isReference; } /** * Returns a string representation for this tag. - * - * @return string */ - public function __toString() + public function __toString() : string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $variableName = ''; + if ($this->variableName) { + $variableName .= ($this->isReference ? '&' : '') . ($this->isVariadic ? '...' : ''); + $variableName .= '$' . $this->variableName; + } + + $type = (string) $this->type; + + return $type + . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') + . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); + } + + private static function strStartsWithVariable(string $str) : bool { - return ($this->type ? $this->type . ' ' : '') - . ($this->isVariadic() ? '...' : '') - . '$' . $this->variableName - . ($this->description ? ' ' . $this->description : ''); + return strpos($str, '$') === 0 + || + strpos($str, '...$') === 0 + || + strpos($str, '&$') === 0 + || + strpos($str, '&...$') === 0; } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php index 3c59713339..03897578b9 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -17,66 +18,66 @@ use phpDocumentor\Reflection\Type; use phpDocumentor\Reflection\TypeResolver; use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\Utils; use Webmozart\Assert\Assert; +use function array_shift; +use function array_unshift; +use function implode; +use function strpos; +use function substr; +use const PREG_SPLIT_DELIM_CAPTURE; /** * Reflection class for a {@}property tag in a Docblock. */ -class Property extends BaseTag implements Factory\StaticMethod +final class Property extends TagWithType implements Factory\StaticMethod { - /** @var string */ - protected $name = 'property'; - - /** @var Type */ - private $type; + /** @var string|null */ + protected $variableName; - /** @var string */ - protected $variableName = ''; - - /** - * @param string $variableName - * @param Type $type - * @param Description $description - */ - public function __construct($variableName, Type $type = null, Description $description = null) + public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) { Assert::string($variableName); + $this->name = 'property'; $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; + $this->type = $type; + $this->description = $description; } - /** - * {@inheritdoc} - */ public static function create( - $body, - TypeResolver $typeResolver = null, - DescriptionFactory $descriptionFactory = null, - TypeContext $context = null - ) { + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { Assert::stringNotEmpty($body); - Assert::allNotNull([$typeResolver, $descriptionFactory]); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); - $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); - $type = null; + [$firstPart, $body] = self::extractTypeFromBody($body); + $type = null; + $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { - $type = $typeResolver->resolve(array_shift($parts), $context); - array_shift($parts); + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); } - // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) { + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); - array_shift($parts); - - if (substr($variableName, 0, 1) === '$') { - $variableName = substr($variableName, 1); + if ($type) { + array_shift($parts); } + + Assert::notNull($variableName); + + $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); @@ -86,33 +87,33 @@ public static function create( /** * Returns the variable's name. - * - * @return string */ - public function getVariableName() + public function getVariableName() : ?string { return $this->variableName; } - /** - * Returns the variable's type or null if unknown. - * - * @return Type|null - */ - public function getType() - { - return $this->type; - } - /** * Returns a string representation for this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return ($this->type ? $this->type . ' ' : '') - . '$' . $this->variableName - . ($this->description ? ' ' . $this->description : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + + $type = (string) $this->type; + + return $type + . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') + . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php index bf2b80569c..7ff55d50b5 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -17,66 +18,66 @@ use phpDocumentor\Reflection\Type; use phpDocumentor\Reflection\TypeResolver; use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\Utils; use Webmozart\Assert\Assert; +use function array_shift; +use function array_unshift; +use function implode; +use function strpos; +use function substr; +use const PREG_SPLIT_DELIM_CAPTURE; /** * Reflection class for a {@}property-read tag in a Docblock. */ -class PropertyRead extends BaseTag implements Factory\StaticMethod +final class PropertyRead extends TagWithType implements Factory\StaticMethod { - /** @var string */ - protected $name = 'property-read'; - - /** @var Type */ - private $type; + /** @var string|null */ + protected $variableName; - /** @var string */ - protected $variableName = ''; - - /** - * @param string $variableName - * @param Type $type - * @param Description $description - */ - public function __construct($variableName, Type $type = null, Description $description = null) + public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) { Assert::string($variableName); + $this->name = 'property-read'; $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; + $this->type = $type; + $this->description = $description; } - /** - * {@inheritdoc} - */ public static function create( - $body, - TypeResolver $typeResolver = null, - DescriptionFactory $descriptionFactory = null, - TypeContext $context = null - ) { + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { Assert::stringNotEmpty($body); - Assert::allNotNull([$typeResolver, $descriptionFactory]); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); - $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); - $type = null; + [$firstPart, $body] = self::extractTypeFromBody($body); + $type = null; + $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { - $type = $typeResolver->resolve(array_shift($parts), $context); - array_shift($parts); + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); } - // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) { + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); - array_shift($parts); - - if (substr($variableName, 0, 1) === '$') { - $variableName = substr($variableName, 1); + if ($type) { + array_shift($parts); } + + Assert::notNull($variableName); + + $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); @@ -86,33 +87,33 @@ public static function create( /** * Returns the variable's name. - * - * @return string */ - public function getVariableName() + public function getVariableName() : ?string { return $this->variableName; } - /** - * Returns the variable's type or null if unknown. - * - * @return Type|null - */ - public function getType() - { - return $this->type; - } - /** * Returns a string representation for this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return ($this->type ? $this->type . ' ' : '') - . '$' . $this->variableName - . ($this->description ? ' ' . $this->description : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + + $type = (string) $this->type; + + return $type + . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') + . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php index db37e0fb8c..cc1e4b6108 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -17,66 +18,66 @@ use phpDocumentor\Reflection\Type; use phpDocumentor\Reflection\TypeResolver; use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\Utils; use Webmozart\Assert\Assert; +use function array_shift; +use function array_unshift; +use function implode; +use function strpos; +use function substr; +use const PREG_SPLIT_DELIM_CAPTURE; /** * Reflection class for a {@}property-write tag in a Docblock. */ -class PropertyWrite extends BaseTag implements Factory\StaticMethod +final class PropertyWrite extends TagWithType implements Factory\StaticMethod { /** @var string */ - protected $name = 'property-write'; - - /** @var Type */ - private $type; - - /** @var string */ - protected $variableName = ''; + protected $variableName; - /** - * @param string $variableName - * @param Type $type - * @param Description $description - */ - public function __construct($variableName, Type $type = null, Description $description = null) + public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) { Assert::string($variableName); + $this->name = 'property-write'; $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; + $this->type = $type; + $this->description = $description; } - /** - * {@inheritdoc} - */ public static function create( - $body, - TypeResolver $typeResolver = null, - DescriptionFactory $descriptionFactory = null, - TypeContext $context = null - ) { + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { Assert::stringNotEmpty($body); - Assert::allNotNull([$typeResolver, $descriptionFactory]); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); - $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); - $type = null; + [$firstPart, $body] = self::extractTypeFromBody($body); + $type = null; + $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { - $type = $typeResolver->resolve(array_shift($parts), $context); - array_shift($parts); + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); } - // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) { + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); - array_shift($parts); - - if (substr($variableName, 0, 1) === '$') { - $variableName = substr($variableName, 1); + if ($type) { + array_shift($parts); } + + Assert::notNull($variableName); + + $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); @@ -86,33 +87,33 @@ public static function create( /** * Returns the variable's name. - * - * @return string */ - public function getVariableName() + public function getVariableName() : ?string { return $this->variableName; } - /** - * Returns the variable's type or null if unknown. - * - * @return Type|null - */ - public function getType() - { - return $this->type; - } - /** * Returns a string representation for this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return ($this->type ? $this->type . ' ' : '') - . '$' . $this->variableName - . ($this->description ? ' ' . $this->description : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + + $type = (string) $this->type; + + return $type + . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') + . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php index dc7b8b6d42..cede74c174 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php @@ -1,13 +1,14 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags\Reference; @@ -15,18 +16,13 @@ use phpDocumentor\Reflection\Fqsen as RealFqsen; /** - * Fqsen reference used by {@see phpDocumentor\Reflection\DocBlock\Tags\See} + * Fqsen reference used by {@see \phpDocumentor\Reflection\DocBlock\Tags\See} */ final class Fqsen implements Reference { - /** - * @var RealFqsen - */ + /** @var RealFqsen */ private $fqsen; - /** - * Fqsen constructor. - */ public function __construct(RealFqsen $fqsen) { $this->fqsen = $fqsen; @@ -35,8 +31,8 @@ public function __construct(RealFqsen $fqsen) /** * @return string string representation of the referenced fqsen */ - public function __toString() + public function __toString() : string { - return (string)$this->fqsen; + return (string) $this->fqsen; } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php index 5bf27d3779..5eedcbc366 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php @@ -1,21 +1,22 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags\Reference; /** - * Interface for references in {@see phpDocumentor\Reflection\DocBlock\Tags\See} + * Interface for references in {@see \phpDocumentor\Reflection\DocBlock\Tags\See} */ interface Reference { - public function __toString(); + public function __toString() : string; } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php index 2671d5e13c..1b2374b9c0 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php @@ -1,13 +1,14 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags\Reference; @@ -15,25 +16,20 @@ use Webmozart\Assert\Assert; /** - * Url reference used by {@see phpDocumentor\Reflection\DocBlock\Tags\See} + * Url reference used by {@see \phpDocumentor\Reflection\DocBlock\Tags\See} */ final class Url implements Reference { - /** - * @var string - */ + /** @var string */ private $uri; - /** - * Url constructor. - */ - public function __construct($uri) + public function __construct(string $uri) { Assert::stringNotEmpty($uri); $this->uri = $uri; } - public function __toString() + public function __toString() : string { return $this->uri; } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php index 09a5870e60..546a0eaa5a 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -22,52 +23,42 @@ /** * Reflection class for a {@}return tag in a Docblock. */ -final class Return_ extends BaseTag implements Factory\StaticMethod +final class Return_ extends TagWithType implements Factory\StaticMethod { - protected $name = 'return'; - - /** @var Type */ - private $type; - - public function __construct(Type $type, Description $description = null) + public function __construct(Type $type, ?Description $description = null) { - $this->type = $type; + $this->name = 'return'; + $this->type = $type; $this->description = $description; } - /** - * {@inheritdoc} - */ public static function create( - $body, - TypeResolver $typeResolver = null, - DescriptionFactory $descriptionFactory = null, - TypeContext $context = null - ) - { - Assert::string($body); - Assert::allNotNull([$typeResolver, $descriptionFactory]); + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); - $parts = preg_split('/\s+/Su', $body, 2); + [$type, $description] = self::extractTypeFromBody($body); - $type = $typeResolver->resolve(isset($parts[0]) ? $parts[0] : '', $context); - $description = $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context); + $type = $typeResolver->resolve($type, $context); + $description = $descriptionFactory->create($description, $context); return new static($type, $description); } - /** - * Returns the type section of the variable. - * - * @return Type - */ - public function getType() + public function __toString() : string { - return $this->type; - } + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } - public function __toString() - { - return $this->type . ' ' . $this->description; + $type = $this->type ? '' . $this->type : 'mixed'; + + return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php index 3774b4914a..73311df78a 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php @@ -1,17 +1,19 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; +use phpDocumentor\Reflection\DocBlock\Description; use phpDocumentor\Reflection\DocBlock\DescriptionFactory; use phpDocumentor\Reflection\DocBlock\Tags\Reference\Fqsen as FqsenRef; use phpDocumentor\Reflection\DocBlock\Tags\Reference\Reference; @@ -19,44 +21,41 @@ use phpDocumentor\Reflection\Fqsen; use phpDocumentor\Reflection\FqsenResolver; use phpDocumentor\Reflection\Types\Context as TypeContext; -use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\Utils; use Webmozart\Assert\Assert; +use function array_key_exists; +use function explode; +use function preg_match; /** * Reflection class for an {@}see tag in a Docblock. */ -class See extends BaseTag implements Factory\StaticMethod +final class See extends BaseTag implements Factory\StaticMethod { + /** @var string */ protected $name = 'see'; /** @var Reference */ - protected $refers = null; + protected $refers; /** * Initializes this tag. - * - * @param Reference $refers - * @param Description $description */ - public function __construct(Reference $refers, Description $description = null) + public function __construct(Reference $refers, ?Description $description = null) { - $this->refers = $refers; + $this->refers = $refers; $this->description = $description; } - /** - * {@inheritdoc} - */ public static function create( - $body, - FqsenResolver $resolver = null, - DescriptionFactory $descriptionFactory = null, - TypeContext $context = null - ) { - Assert::string($body); - Assert::allNotNull([$resolver, $descriptionFactory]); - - $parts = preg_split('/\s+/Su', $body, 2); + string $body, + ?FqsenResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { + Assert::notNull($descriptionFactory); + + $parts = Utils::pregSplit('/\s+/Su', $body, 2); $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; // https://tools.ietf.org/html/rfc2396#section-3 @@ -64,26 +63,43 @@ public static function create( return new static(new Url($parts[0]), $description); } - return new static(new FqsenRef($resolver->resolve($parts[0], $context)), $description); + return new static(new FqsenRef(self::resolveFqsen($parts[0], $typeResolver, $context)), $description); + } + + private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen + { + Assert::notNull($fqsenResolver); + $fqsenParts = explode('::', $parts); + $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); + + if (!array_key_exists(1, $fqsenParts)) { + return $resolved; + } + + return new Fqsen($resolved . '::' . $fqsenParts[1]); } /** * Returns the ref of this tag. - * - * @return Reference */ - public function getReference() + public function getReference() : Reference { return $this->refers; } /** * Returns a string representation of this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return $this->refers . ($this->description ? ' ' . $this->description->render() : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $refers = (string) $this->refers; + + return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php index 3d002ed318..32de527b0e 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php @@ -1,34 +1,37 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; -use phpDocumentor\Reflection\Types\Context as TypeContext; use phpDocumentor\Reflection\DocBlock\Description; use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Types\Context as TypeContext; use Webmozart\Assert\Assert; +use function preg_match; /** * Reflection class for a {@}since tag in a Docblock. */ final class Since extends BaseTag implements Factory\StaticMethod { + /** @var string */ protected $name = 'since'; /** * PCRE regular expression matching a version vector. * Assumes the "x" modifier. */ - const REGEX_VECTOR = '(?: + public const REGEX_VECTOR = '(?: # Normal release vectors. \d\S* | @@ -40,55 +43,60 @@ final class Since extends BaseTag implements Factory\StaticMethod [^\s\:]+\:\s*\$[^\$]+\$ )'; - /** @var string The version vector. */ - private $version = ''; + /** @var string|null The version vector. */ + private $version; - public function __construct($version = null, Description $description = null) + public function __construct(?string $version = null, ?Description $description = null) { - Assert::nullOrStringNotEmpty($version); + Assert::nullOrNotEmpty($version); $this->version = $version; $this->description = $description; } - /** - * @return static - */ - public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null) - { - Assert::nullOrString($body); + public static function create( + ?string $body, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : ?self { if (empty($body)) { return new static(); } $matches = []; - if (! preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { + if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { return null; } + Assert::notNull($descriptionFactory); + return new static( $matches[1], - $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context) + $descriptionFactory->create($matches[2] ?? '', $context) ); } /** * Gets the version section of the tag. - * - * @return string */ - public function getVersion() + public function getVersion() : ?string { return $this->version; } /** * Returns a string representation for this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return $this->version . ($this->description ? ' ' . $this->description->render() : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $version = (string) $this->version; + + return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php index b0646b9691..f0c3101411 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,6 +17,7 @@ use phpDocumentor\Reflection\DocBlock\DescriptionFactory; use phpDocumentor\Reflection\Types\Context as TypeContext; use Webmozart\Assert\Assert; +use function preg_match; /** * Reflection class for a {@}source tag in a Docblock. @@ -26,26 +28,30 @@ final class Source extends BaseTag implements Factory\StaticMethod protected $name = 'source'; /** @var int The starting line, relative to the structural element's location. */ - private $startingLine = 1; + private $startingLine; /** @var int|null The number of lines, relative to the starting line. NULL means "to the end". */ - private $lineCount = null; + private $lineCount; - public function __construct($startingLine, $lineCount = null, Description $description = null) + /** + * @param int|string $startingLine should be a to int convertible value + * @param int|string|null $lineCount should be a to int convertible value + */ + public function __construct($startingLine, $lineCount = null, ?Description $description = null) { Assert::integerish($startingLine); Assert::nullOrIntegerish($lineCount); - $this->startingLine = (int)$startingLine; - $this->lineCount = $lineCount !== null ? (int)$lineCount : null; + $this->startingLine = (int) $startingLine; + $this->lineCount = $lineCount !== null ? (int) $lineCount : null; $this->description = $description; } - /** - * {@inheritdoc} - */ - public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null) - { + public static function create( + string $body, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { Assert::stringNotEmpty($body); Assert::notNull($descriptionFactory); @@ -55,14 +61,15 @@ public static function create($body, DescriptionFactory $descriptionFactory = nu // Starting line / Number of lines / Description if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $body, $matches)) { - $startingLine = (int)$matches[1]; + $startingLine = (int) $matches[1]; if (isset($matches[2]) && $matches[2] !== '') { - $lineCount = (int)$matches[2]; + $lineCount = (int) $matches[2]; } + $description = $matches[3]; } - return new static($startingLine, $lineCount, $descriptionFactory->create($description, $context)); + return new static($startingLine, $lineCount, $descriptionFactory->create($description??'', $context)); } /** @@ -71,7 +78,7 @@ public static function create($body, DescriptionFactory $descriptionFactory = nu * @return int The starting line, relative to the structural element's * location. */ - public function getStartingLine() + public function getStartingLine() : int { return $this->startingLine; } @@ -82,15 +89,29 @@ public function getStartingLine() * @return int|null The number of lines, relative to the starting line. NULL * means "to the end". */ - public function getLineCount() + public function getLineCount() : ?int { return $this->lineCount; } - public function __toString() + public function __toString() : string { - return $this->startingLine - . ($this->lineCount !== null ? ' ' . $this->lineCount : '') - . ($this->description ? ' ' . $this->description->render() : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $startingLine = (string) $this->startingLine; + + $lineCount = $this->lineCount !== null ? '' . $this->lineCount : ''; + + return $startingLine + . ($lineCount !== '' + ? ($startingLine || $startingLine === '0' ? ' ' : '') . $lineCount + : '') + . ($description !== '' + ? ($startingLine || $startingLine === '0' || $lineCount !== '' ? ' ' : '') . $description + : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php new file mode 100644 index 0000000000..0083d34b28 --- /dev/null +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php @@ -0,0 +1,65 @@ +type; + } + + /** + * @return string[] + */ + protected static function extractTypeFromBody(string $body) : array + { + $type = ''; + $nestingLevel = 0; + for ($i = 0, $iMax = strlen($body); $i < $iMax; $i++) { + $character = $body[$i]; + + if ($nestingLevel === 0 && trim($character) === '') { + break; + } + + $type .= $character; + if (in_array($character, ['<', '(', '[', '{'])) { + $nestingLevel++; + continue; + } + + if (in_array($character, ['>', ')', ']', '}'])) { + $nestingLevel--; + continue; + } + } + + $description = trim(substr($body, strlen($type))); + + return [$type, $description]; + } +} diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php index 349e773bbe..d4dc9472c3 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -22,51 +23,42 @@ /** * Reflection class for a {@}throws tag in a Docblock. */ -final class Throws extends BaseTag implements Factory\StaticMethod +final class Throws extends TagWithType implements Factory\StaticMethod { - protected $name = 'throws'; - - /** @var Type */ - private $type; - - public function __construct(Type $type, Description $description = null) + public function __construct(Type $type, ?Description $description = null) { + $this->name = 'throws'; $this->type = $type; $this->description = $description; } - /** - * {@inheritdoc} - */ public static function create( - $body, - TypeResolver $typeResolver = null, - DescriptionFactory $descriptionFactory = null, - TypeContext $context = null - ) { - Assert::string($body); - Assert::allNotNull([$typeResolver, $descriptionFactory]); + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); - $parts = preg_split('/\s+/Su', $body, 2); + [$type, $description] = self::extractTypeFromBody($body); - $type = $typeResolver->resolve(isset($parts[0]) ? $parts[0] : '', $context); - $description = $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context); + $type = $typeResolver->resolve($type, $context); + $description = $descriptionFactory->create($description, $context); return new static($type, $description); } - /** - * Returns the type section of the variable. - * - * @return Type - */ - public function getType() + public function __toString() : string { - return $this->type; - } + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } - public function __toString() - { - return $this->type . ' ' . $this->description; + $type = (string) $this->type; + + return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php index 00dc3e3bc8..4d52afccd0 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php @@ -1,13 +1,14 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; @@ -17,67 +18,82 @@ use phpDocumentor\Reflection\Fqsen; use phpDocumentor\Reflection\FqsenResolver; use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\Utils; use Webmozart\Assert\Assert; +use function array_key_exists; +use function explode; /** * Reflection class for a {@}uses tag in a Docblock. */ final class Uses extends BaseTag implements Factory\StaticMethod { + /** @var string */ protected $name = 'uses'; /** @var Fqsen */ - protected $refers = null; + protected $refers; /** * Initializes this tag. - * - * @param Fqsen $refers - * @param Description $description */ - public function __construct(Fqsen $refers, Description $description = null) + public function __construct(Fqsen $refers, ?Description $description = null) { $this->refers = $refers; $this->description = $description; } - /** - * {@inheritdoc} - */ public static function create( - $body, - FqsenResolver $resolver = null, - DescriptionFactory $descriptionFactory = null, - TypeContext $context = null - ) { - Assert::string($body); - Assert::allNotNull([$resolver, $descriptionFactory]); + string $body, + ?FqsenResolver $resolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { + Assert::notNull($resolver); + Assert::notNull($descriptionFactory); - $parts = preg_split('/\s+/Su', $body, 2); + $parts = Utils::pregSplit('/\s+/Su', $body, 2); return new static( - $resolver->resolve($parts[0], $context), - $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context) + self::resolveFqsen($parts[0], $resolver, $context), + $descriptionFactory->create($parts[1] ?? '', $context) ); } + private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen + { + Assert::notNull($fqsenResolver); + $fqsenParts = explode('::', $parts); + $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); + + if (!array_key_exists(1, $fqsenParts)) { + return $resolved; + } + + return new Fqsen($resolved . '::' . $fqsenParts[1]); + } + /** * Returns the structural element this tag refers to. - * - * @return Fqsen */ - public function getReference() + public function getReference() : Fqsen { return $this->refers; } /** * Returns a string representation of this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return $this->refers . ' ' . $this->description->render(); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $refers = (string) $this->refers; + + return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php index f431a865ec..762c262f9e 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -17,66 +18,67 @@ use phpDocumentor\Reflection\Type; use phpDocumentor\Reflection\TypeResolver; use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\Utils; use Webmozart\Assert\Assert; +use function array_shift; +use function array_unshift; +use function implode; +use function strpos; +use function substr; +use const PREG_SPLIT_DELIM_CAPTURE; /** * Reflection class for a {@}var tag in a Docblock. */ -class Var_ extends BaseTag implements Factory\StaticMethod +final class Var_ extends TagWithType implements Factory\StaticMethod { - /** @var string */ - protected $name = 'var'; - - /** @var Type */ - private $type; - - /** @var string */ + /** @var string|null */ protected $variableName = ''; - /** - * @param string $variableName - * @param Type $type - * @param Description $description - */ - public function __construct($variableName, Type $type = null, Description $description = null) + public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) { Assert::string($variableName); + $this->name = 'var'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } - /** - * {@inheritdoc} - */ public static function create( - $body, - TypeResolver $typeResolver = null, - DescriptionFactory $descriptionFactory = null, - TypeContext $context = null - ) { + string $body, + ?TypeResolver $typeResolver = null, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : self { Assert::stringNotEmpty($body); - Assert::allNotNull([$typeResolver, $descriptionFactory]); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + + [$firstPart, $body] = self::extractTypeFromBody($body); - $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); + $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $type = null; $variableName = ''; // if the first item that is encountered is not a variable; it is a type - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { - $type = $typeResolver->resolve(array_shift($parts), $context); - array_shift($parts); + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); } - // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) { + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); - array_shift($parts); - - if (substr($variableName, 0, 1) === '$') { - $variableName = substr($variableName, 1); + if ($type) { + array_shift($parts); } + + Assert::notNull($variableName); + + $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); @@ -86,33 +88,33 @@ public static function create( /** * Returns the variable's name. - * - * @return string */ - public function getVariableName() + public function getVariableName() : ?string { return $this->variableName; } - /** - * Returns the variable's type or null if unknown. - * - * @return Type|null - */ - public function getType() - { - return $this->type; - } - /** * Returns a string representation for this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return ($this->type ? $this->type.' ' : '') - .(empty($this->variableName) ? null : ('$'.$this->variableName)) - .($this->description ? ' '.$this->description : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + + $type = (string) $this->type; + + return $type + . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') + . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php index 3e0e5bef74..460c86d72e 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php @@ -1,34 +1,37 @@ - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock\Tags; -use phpDocumentor\Reflection\Types\Context as TypeContext; use phpDocumentor\Reflection\DocBlock\Description; use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Types\Context as TypeContext; use Webmozart\Assert\Assert; +use function preg_match; /** * Reflection class for a {@}version tag in a Docblock. */ final class Version extends BaseTag implements Factory\StaticMethod { + /** @var string */ protected $name = 'version'; /** * PCRE regular expression matching a version vector. * Assumes the "x" modifier. */ - const REGEX_VECTOR = '(?: + public const REGEX_VECTOR = '(?: # Normal release vectors. \d\S* | @@ -40,23 +43,22 @@ final class Version extends BaseTag implements Factory\StaticMethod [^\s\:]+\:\s*\$[^\$]+\$ )'; - /** @var string The version vector. */ - private $version = ''; + /** @var string|null The version vector. */ + private $version; - public function __construct($version = null, Description $description = null) + public function __construct(?string $version = null, ?Description $description = null) { Assert::nullOrStringNotEmpty($version); - $this->version = $version; + $this->version = $version; $this->description = $description; } - /** - * @return static - */ - public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null) - { - Assert::nullOrString($body); + public static function create( + ?string $body, + ?DescriptionFactory $descriptionFactory = null, + ?TypeContext $context = null + ) : ?self { if (empty($body)) { return new static(); } @@ -66,29 +68,38 @@ public static function create($body, DescriptionFactory $descriptionFactory = nu return null; } + $description = null; + if ($descriptionFactory !== null) { + $description = $descriptionFactory->create($matches[2] ?? '', $context); + } + return new static( $matches[1], - $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context) + $description ); } /** * Gets the version section of the tag. - * - * @return string */ - public function getVersion() + public function getVersion() : ?string { return $this->version; } /** * Returns a string representation for this tag. - * - * @return string */ - public function __toString() + public function __toString() : string { - return $this->version . ($this->description ? ' ' . $this->description->render() : ''); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + + $version = (string) $this->version; + + return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php index 9ec2455d2f..cf04e5a552 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php @@ -1,22 +1,36 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection; +use InvalidArgumentException; +use LogicException; use phpDocumentor\Reflection\DocBlock\DescriptionFactory; use phpDocumentor\Reflection\DocBlock\StandardTagFactory; use phpDocumentor\Reflection\DocBlock\Tag; use phpDocumentor\Reflection\DocBlock\TagFactory; use Webmozart\Assert\Assert; +use function array_shift; +use function count; +use function explode; +use function is_object; +use function method_exists; +use function preg_match; +use function preg_replace; +use function str_replace; +use function strpos; +use function substr; +use function trim; final class DocBlockFactory implements DocBlockFactoryInterface { @@ -28,27 +42,22 @@ final class DocBlockFactory implements DocBlockFactoryInterface /** * Initializes this factory with the required subcontractors. - * - * @param DescriptionFactory $descriptionFactory - * @param TagFactory $tagFactory */ public function __construct(DescriptionFactory $descriptionFactory, TagFactory $tagFactory) { $this->descriptionFactory = $descriptionFactory; - $this->tagFactory = $tagFactory; + $this->tagFactory = $tagFactory; } /** * Factory method for easy instantiation. * - * @param string[] $additionalTags - * - * @return DocBlockFactory + * @param array> $additionalTags */ - public static function createInstance(array $additionalTags = []) + public static function createInstance(array $additionalTags = []) : self { - $fqsenResolver = new FqsenResolver(); - $tagFactory = new StandardTagFactory($fqsenResolver); + $fqsenResolver = new FqsenResolver(); + $tagFactory = new StandardTagFactory($fqsenResolver); $descriptionFactory = new DescriptionFactory($tagFactory); $tagFactory->addService($descriptionFactory); @@ -65,20 +74,18 @@ public static function createInstance(array $additionalTags = []) /** * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the * getDocComment method (such as a ReflectionClass object). - * @param Types\Context $context - * @param Location $location - * - * @return DocBlock */ - public function create($docblock, Types\Context $context = null, Location $location = null) + public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock { if (is_object($docblock)) { if (!method_exists($docblock, 'getDocComment')) { $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method'; - throw new \InvalidArgumentException($exceptionMessage); + + throw new InvalidArgumentException($exceptionMessage); } $docblock = $docblock->getDocComment(); + Assert::string($docblock); } Assert::stringNotEmpty($docblock); @@ -88,14 +95,13 @@ public function create($docblock, Types\Context $context = null, Location $locat } $parts = $this->splitDocBlock($this->stripDocComment($docblock)); - list($templateMarker, $summary, $description, $tags) = $parts; + + [$templateMarker, $summary, $description, $tags] = $parts; return new DocBlock( $summary, $description ? $this->descriptionFactory->create($description, $context) : null, - array_filter($this->parseTagBlock($tags, $context), function($tag) { - return $tag instanceof Tag; - }), + $this->parseTagBlock($tags, $context), $context, $location, $templateMarker === '#@+', @@ -103,7 +109,10 @@ public function create($docblock, Types\Context $context = null, Location $locat ); } - public function registerTagHandler($tagName, $handler) + /** + * @param class-string $handler + */ + public function registerTagHandler(string $tagName, string $handler) : void { $this->tagFactory->registerTagHandler($tagName, $handler); } @@ -112,43 +121,46 @@ public function registerTagHandler($tagName, $handler) * Strips the asterisks from the DocBlock comment. * * @param string $comment String containing the comment text. - * - * @return string */ - private function stripDocComment($comment) + private function stripDocComment(string $comment) : string { - $comment = trim(preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]{0,1}(.*)?#u', '$1', $comment)); + $comment = preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]?(.*)?#u', '$1', $comment); + Assert::string($comment); + $comment = trim($comment); // reg ex above is not able to remove */ from a single line docblock - if (substr($comment, -2) == '*/') { + if (substr($comment, -2) === '*/') { $comment = trim(substr($comment, 0, -2)); } - return str_replace(array("\r\n", "\r"), "\n", $comment); + return str_replace(["\r\n", "\r"], "\n", $comment); } + // phpcs:disable /** * Splits the DocBlock into a template marker, summary, description and block of tags. * * @param string $comment Comment to split into the sub-parts. * - * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. + * @return string[] containing the template marker (if any), summary, description and a string containing the tags. + * * @author Mike van Riel for extending the regex with template marker support. * - * @return string[] containing the template marker (if any), summary, description and a string containing the tags. + * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. */ - private function splitDocBlock($comment) + private function splitDocBlock(string $comment) : array { + // phpcs:enable // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the // performance impact of running a regular expression if (strpos($comment, '@') === 0) { - return array('', '', '', $comment); + return ['', '', '', $comment]; } // clears all extra horizontal whitespace from the line endings to prevent parsing issues $comment = preg_replace('/\h*$/Sum', '', $comment); - + Assert::string($comment); /* * Splits the docblock into a template marker, summary, description and tags section. * @@ -176,7 +188,7 @@ private function splitDocBlock($comment) [^\n.]+ (?: (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines - [\n.] (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line + [\n.]* (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line [^\n.]+ # Include anything else )* \.? @@ -214,20 +226,21 @@ private function splitDocBlock($comment) /** * Creates the tag objects. * - * @param string $tags Tag block to parse. + * @param string $tags Tag block to parse. * @param Types\Context $context Context of the parsed Tag * * @return DocBlock\Tag[] */ - private function parseTagBlock($tags, Types\Context $context) + private function parseTagBlock(string $tags, Types\Context $context) : array { $tags = $this->filterTagBlock($tags); - if (!$tags) { + if ($tags === null) { return []; } - $result = $this->splitTagBlockIntoTagLines($tags); - foreach ($result as $key => $tagLine) { + $result = []; + $lines = $this->splitTagBlockIntoTagLines($tags); + foreach ($lines as $key => $tagLine) { $result[$key] = $this->tagFactory->create(trim($tagLine), $context); } @@ -235,40 +248,36 @@ private function parseTagBlock($tags, Types\Context $context) } /** - * @param string $tags - * * @return string[] */ - private function splitTagBlockIntoTagLines($tags) + private function splitTagBlockIntoTagLines(string $tags) : array { - $result = array(); - foreach (explode("\n", $tags) as $tag_line) { - if (isset($tag_line[0]) && ($tag_line[0] === '@')) { - $result[] = $tag_line; + $result = []; + foreach (explode("\n", $tags) as $tagLine) { + if ($tagLine !== '' && strpos($tagLine, '@') === 0) { + $result[] = $tagLine; } else { - $result[count($result) - 1] .= "\n" . $tag_line; + $result[count($result) - 1] .= "\n" . $tagLine; } } return $result; } - /** - * @param $tags - * @return string - */ - private function filterTagBlock($tags) + private function filterTagBlock(string $tags) : ?string { $tags = trim($tags); if (!$tags) { return null; } - if ('@' !== $tags[0]) { + if ($tags[0] !== '@') { // @codeCoverageIgnoreStart // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that // we didn't foresee. - throw new \LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); + + throw new LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); + // @codeCoverageIgnoreEnd } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php index b35334295f..ef039a4d83 100644 --- a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php @@ -1,23 +1,23 @@ > $additionalTags */ - public static function createInstance(array $additionalTags = []); + public static function createInstance(array $additionalTags = []) : DocBlockFactory; /** - * @param string $docblock - * @param Types\Context $context - * @param Location $location - * - * @return DocBlock + * @param string|object $docblock */ - public function create($docblock, Types\Context $context = null, Location $location = null); + public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock; } diff --git a/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php new file mode 100644 index 0000000000..77aa40e135 --- /dev/null +++ b/site/plugins/site/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php @@ -0,0 +1,38 @@ + please note that if you want to pass partial class names that additional steps are necessary, see the - > chapter `Resolving partial classes and FQSENs` for more information. - -Where the FqsenResolver can resolve: - -- Constant expressions (i.e. `@see \MyNamespace\MY_CONSTANT`) -- Function expressions (i.e. `@see \MyNamespace\myFunction()`) -- Class expressions (i.e. `@see \MyNamespace\MyClass`) -- Interface expressions (i.e. `@see \MyNamespace\MyInterface`) -- Trait expressions (i.e. `@see \MyNamespace\MyTrait`) -- Class constant expressions (i.e. `@see \MyNamespace\MyClass::MY_CONSTANT`) -- Property expressions (i.e. `@see \MyNamespace\MyClass::$myProperty`) -- Method expressions (i.e. `@see \MyNamespace\MyClass::myMethod()`) - -## Resolving a type - -In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver` -and call its `resolve` method like this: - -```php -$typeResolver = new \phpDocumentor\Reflection\TypeResolver(); -$type = $typeResolver->resolve('string|integer'); -``` - -In this example you will receive a Value Object of class `\phpDocumentor\Reflection\Types\Compound` that has two -elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type -`\phpDocumentor\Reflection\Types\Integer`. - -The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but -in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver -in which namespace the given expression occurs and which namespace aliases (or imports) apply. - -## Resolving an FQSEN - -A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using -the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this: - -```php -$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); -$fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()'); -``` - -In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class -name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`. - -The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural -Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will -inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. - -## Resolving partial Classes and Structural Element Names - -Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class -names. - -For example, you have this file: - -```php -namespace My\Example; - -use phpDocumentor\Reflection\Types; - -class Classy -{ - /** - * @var Types\Context - * @see Classy::otherFunction() - */ - public function __construct($context) {} - - public function otherFunction(){} -} -``` - -Suppose that you would want to resolve (and expand) the type in the `@var` tag and the element name in the `@see` tag. -For the resolvers to know how to expand partial names you have to provide a bit of _Context_ for them by instantiating -a new class named `\phpDocumentor\Reflection\Types\Context` with the name of the namespace and the aliases that are in -play. - -### Creating a Context - -You can do this by manually creating a Context like this: - -```php -$context = new \phpDocumentor\Reflection\Types\Context( - '\My\Example', - [ 'Types' => '\phpDocumentor\Reflection\Types'] -); -``` - -Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector -object or by providing the namespace that you'd like to extract and the source code of the file in which the given -type expression occurs. - -```php -$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); -$context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct')); -``` - -or - -```php -$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); -$context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php')); -``` - -### Using the Context - -After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver -class as second argument and the Resolvers will take this into account when resolving partial names. - -To obtain the resolved class name for the `@var` tag in the example above you can do: - -```php -$typeResolver = new \phpDocumentor\Reflection\TypeResolver(); -$type = $typeResolver->resolve('Types\Context', $context); -``` - -When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call -the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be -`phpDocumentor\Reflection\Types\Context`. - -> Why is the FQSEN wrapped in another object `Object_`? -> -> The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common -> type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it -> is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN. - -Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To -resolve that you can do the following: - -```php -$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); -$type = $fqsenResolver->resolve('Classy::otherFunction()', $context); -``` - -Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the -`resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to -`\My\Example\Classy::otherFunction()`. diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/composer.json b/site/plugins/site/vendor/phpdocumentor/type-resolver/composer.json deleted file mode 100644 index 82ead1564c..0000000000 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/composer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "phpdocumentor/type-resolver", - "type": "library", - "license": "MIT", - "authors": [ - {"name": "Mike van Riel", "email": "me@mikevanriel.com"} - ], - "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" - }, - "autoload": { - "psr-4": {"phpDocumentor\\Reflection\\": ["src/"]} - }, - "autoload-dev": { - "psr-4": {"phpDocumentor\\Reflection\\": ["tests/unit"]} - }, - "require-dev": { - "phpunit/phpunit": "^5.2||^4.8.24", - "mockery/mockery": "^0.9.4" - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/composer.lock b/site/plugins/site/vendor/phpdocumentor/type-resolver/composer.lock new file mode 100644 index 0000000000..8fa8b87479 --- /dev/null +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/composer.lock @@ -0,0 +1,71 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "ee8aea1f755e1772266bc7e041d8ee5b", + "packages": [ + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2020-06-27T09:03:43+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^7.2 || ^8.0" + }, + "platform-dev": { + "ext-tokenizer": "*" + } +} diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php index 9aa6ba3050..6447a0159d 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php @@ -1,25 +1,35 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection; +use InvalidArgumentException; use phpDocumentor\Reflection\Types\Context; +use function explode; +use function implode; +use function strpos; +/** + * Resolver for Fqsen using Context information + * + * @psalm-immutable + */ class FqsenResolver { /** @var string Definition of the NAMESPACE operator in PHP */ - const OPERATOR_NAMESPACE = '\\'; + private const OPERATOR_NAMESPACE = '\\'; - public function resolve($fqsen, Context $context = null) + public function resolve(string $fqsen, ?Context $context = null) : Fqsen { if ($context === null) { $context = new Context(''); @@ -34,12 +44,8 @@ public function resolve($fqsen, Context $context = null) /** * Tests whether the given type is a Fully Qualified Structural Element Name. - * - * @param string $type - * - * @return bool */ - private function isFqsen($type) + private function isFqsen(string $type) : bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } @@ -48,13 +54,9 @@ private function isFqsen($type) * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. * - * @param string $type - * @param Context $context - * - * @return Fqsen - * @throws \InvalidArgumentException when type is not a valid FQSEN. + * @throws InvalidArgumentException When type is not a valid FQSEN. */ - private function resolvePartialStructuralElementName($type, Context $context) + private function resolvePartialStructuralElementName(string $type, Context $context) : Fqsen { $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); @@ -63,7 +65,7 @@ private function resolvePartialStructuralElementName($type, Context $context) // if the first segment is not an alias; prepend namespace name and return if (!isset($namespaceAliases[$typeParts[0]])) { $namespace = $context->getNamespace(); - if ('' !== $namespace) { + if ($namespace !== '') { $namespace .= self::OPERATOR_NAMESPACE; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/PseudoType.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/PseudoType.php new file mode 100644 index 0000000000..f94cff5b35 --- /dev/null +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/PseudoType.php @@ -0,0 +1,19 @@ + - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection; +/** + * @psalm-immutable + */ interface Type { - public function __toString(); + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/TypeResolver.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/TypeResolver.php index 08b2a5f8aa..07e1b8331d 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/TypeResolver.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/TypeResolver.php @@ -1,39 +1,81 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection; +use ArrayIterator; +use InvalidArgumentException; use phpDocumentor\Reflection\Types\Array_; +use phpDocumentor\Reflection\Types\ClassString; +use phpDocumentor\Reflection\Types\Collection; use phpDocumentor\Reflection\Types\Compound; use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\Expression; +use phpDocumentor\Reflection\Types\Integer; +use phpDocumentor\Reflection\Types\Intersection; use phpDocumentor\Reflection\Types\Iterable_; use phpDocumentor\Reflection\Types\Nullable; use phpDocumentor\Reflection\Types\Object_; +use phpDocumentor\Reflection\Types\String_; +use RuntimeException; +use function array_key_exists; +use function array_pop; +use function array_values; +use function class_exists; +use function class_implements; +use function count; +use function end; +use function in_array; +use function key; +use function preg_split; +use function strpos; +use function strtolower; +use function trim; +use const PREG_SPLIT_DELIM_CAPTURE; +use const PREG_SPLIT_NO_EMPTY; final class TypeResolver { /** @var string Definition of the ARRAY operator for types */ - const OPERATOR_ARRAY = '[]'; + private const OPERATOR_ARRAY = '[]'; /** @var string Definition of the NAMESPACE operator in PHP */ - const OPERATOR_NAMESPACE = '\\'; + private const OPERATOR_NAMESPACE = '\\'; + + /** @var int the iterator parser is inside a compound context */ + private const PARSER_IN_COMPOUND = 0; + + /** @var int the iterator parser is inside a nullable expression context */ + private const PARSER_IN_NULLABLE = 1; + + /** @var int the iterator parser is inside an array expression context */ + private const PARSER_IN_ARRAY_EXPRESSION = 2; - /** @var string[] List of recognized keywords and unto which Value Object they map */ - private $keywords = array( + /** @var int the iterator parser is inside a collection expression context */ + private const PARSER_IN_COLLECTION_EXPRESSION = 3; + + /** + * @var array List of recognized keywords and unto which Value Object they map + * @psalm-var array> + */ + private $keywords = [ 'string' => Types\String_::class, + 'class-string' => Types\ClassString::class, 'int' => Types\Integer::class, 'integer' => Types\Integer::class, 'bool' => Types\Boolean::class, 'boolean' => Types\Boolean::class, + 'real' => Types\Float_::class, 'float' => Types\Float_::class, 'double' => Types\Float_::class, 'object' => Object_::class, @@ -45,24 +87,25 @@ final class TypeResolver 'scalar' => Types\Scalar::class, 'callback' => Types\Callable_::class, 'callable' => Types\Callable_::class, - 'false' => Types\Boolean::class, - 'true' => Types\Boolean::class, + 'false' => PseudoTypes\False_::class, + 'true' => PseudoTypes\True_::class, 'self' => Types\Self_::class, '$this' => Types\This::class, 'static' => Types\Static_::class, 'parent' => Types\Parent_::class, 'iterable' => Iterable_::class, - ); + ]; - /** @var FqsenResolver */ + /** + * @var FqsenResolver + * @psalm-readonly + */ private $fqsenResolver; /** * Initializes this TypeResolver with the means to create and resolve Fqsen objects. - * - * @param FqsenResolver $fqsenResolver */ - public function __construct(FqsenResolver $fqsenResolver = null) + public function __construct(?FqsenResolver $fqsenResolver = null) { $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); } @@ -77,74 +120,236 @@ public function __construct(FqsenResolver $fqsenResolver = null) * This method only works as expected if the namespace and aliases are set; * no dynamic reflection is being performed here. * - * @param string $type The relative or absolute type. - * @param Context $context - * - * @uses Context::getNamespace() to determine with what to prefix the type name. * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be - * replaced with another namespace. + * replaced with another namespace. + * @uses Context::getNamespace() to determine with what to prefix the type name. * - * @return Type|null + * @param string $type The relative or absolute type. */ - public function resolve($type, Context $context = null) + public function resolve(string $type, ?Context $context = null) : Type { - if (!is_string($type)) { - throw new \InvalidArgumentException( - 'Attempted to resolve type but it appeared not to be a string, received: ' . var_export($type, true) - ); - } - $type = trim($type); if (!$type) { - throw new \InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); + throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); } if ($context === null) { $context = new Context(''); } + // split the type string into tokens `|`, `?`, `<`, `>`, `,`, `(`, `)`, `[]`, '<', '>' and type names + $tokens = preg_split( + '/(\\||\\?|<|>|&|, ?|\\(|\\)|\\[\\]+)/', + $type, + -1, + PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE + ); + + if ($tokens === false) { + throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); + } + + /** @var ArrayIterator $tokenIterator */ + $tokenIterator = new ArrayIterator($tokens); + + return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); + } + + /** + * Analyse each tokens and creates types + * + * @param ArrayIterator $tokens the iterator on tokens + * @param int $parserContext on of self::PARSER_* constants, indicating + * the context where we are in the parsing + */ + private function parseTypes(ArrayIterator $tokens, Context $context, int $parserContext) : Type + { + $types = []; + $token = ''; + $compoundToken = '|'; + while ($tokens->valid()) { + $token = $tokens->current(); + if ($token === null) { + throw new RuntimeException( + 'Unexpected nullable character' + ); + } + + if ($token === '|' || $token === '&') { + if (count($types) === 0) { + throw new RuntimeException( + 'A type is missing before a type separator' + ); + } + + if (!in_array($parserContext, [ + self::PARSER_IN_COMPOUND, + self::PARSER_IN_ARRAY_EXPRESSION, + self::PARSER_IN_COLLECTION_EXPRESSION, + ], true) + ) { + throw new RuntimeException( + 'Unexpected type separator' + ); + } + + $compoundToken = $token; + $tokens->next(); + } elseif ($token === '?') { + if (!in_array($parserContext, [ + self::PARSER_IN_COMPOUND, + self::PARSER_IN_ARRAY_EXPRESSION, + self::PARSER_IN_COLLECTION_EXPRESSION, + ], true) + ) { + throw new RuntimeException( + 'Unexpected nullable character' + ); + } + + $tokens->next(); + $type = $this->parseTypes($tokens, $context, self::PARSER_IN_NULLABLE); + $types[] = new Nullable($type); + } elseif ($token === '(') { + $tokens->next(); + $type = $this->parseTypes($tokens, $context, self::PARSER_IN_ARRAY_EXPRESSION); + + $token = $tokens->current(); + if ($token === null) { // Someone did not properly close their array expression .. + break; + } + + $tokens->next(); + + $resolvedType = new Expression($type); + + $types[] = $resolvedType; + } elseif ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION && $token[0] === ')') { + break; + } elseif ($token === '<') { + if (count($types) === 0) { + throw new RuntimeException( + 'Unexpected collection operator "<", class name is missing' + ); + } + + $classType = array_pop($types); + if ($classType !== null) { + if ((string) $classType === 'class-string') { + $types[] = $this->resolveClassString($tokens, $context); + } else { + $types[] = $this->resolveCollection($tokens, $classType, $context); + } + } + + $tokens->next(); + } elseif ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION + && ($token === '>' || trim($token) === ',') + ) { + break; + } elseif ($token === self::OPERATOR_ARRAY) { + end($types); + $last = key($types); + $lastItem = $types[$last]; + if ($lastItem instanceof Expression) { + $lastItem = $lastItem->getValueType(); + } + + $types[$last] = new Array_($lastItem); + + $tokens->next(); + } else { + $type = $this->resolveSingleType($token, $context); + $tokens->next(); + if ($parserContext === self::PARSER_IN_NULLABLE) { + return $type; + } + + $types[] = $type; + } + } + + if ($token === '|' || $token === '&') { + throw new RuntimeException( + 'A type is missing after a type separator' + ); + } + + if (count($types) === 0) { + if ($parserContext === self::PARSER_IN_NULLABLE) { + throw new RuntimeException( + 'A type is missing after a nullable character' + ); + } + + if ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION) { + throw new RuntimeException( + 'A type is missing in an array expression' + ); + } + + if ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION) { + throw new RuntimeException( + 'A type is missing in a collection expression' + ); + } + } elseif (count($types) === 1) { + return $types[0]; + } + + if ($compoundToken === '|') { + return new Compound(array_values($types)); + } + + return new Intersection(array_values($types)); + } + + /** + * resolve the given type into a type object + * + * @param string $type the type string, representing a single type + * + * @return Type|Array_|Object_ + * + * @psalm-mutation-free + */ + private function resolveSingleType(string $type, Context $context) : object + { switch (true) { - case $this->isNullableType($type): - return $this->resolveNullableType($type, $context); case $this->isKeyword($type): return $this->resolveKeyword($type); - case ($this->isCompoundType($type)): - return $this->resolveCompoundType($type, $context); - case $this->isTypedArray($type): - return $this->resolveTypedArray($type, $context); case $this->isFqsen($type): return $this->resolveTypedObject($type); case $this->isPartialStructuralElementName($type): return $this->resolveTypedObject($type, $context); + // @codeCoverageIgnoreStart default: // I haven't got the foggiest how the logic would come here but added this as a defense. - throw new \RuntimeException( + throw new RuntimeException( 'Unable to resolve type "' . $type . '", there is no known method to resolve it' ); } + // @codeCoverageIgnoreEnd } /** * Adds a keyword to the list of Keywords and associates it with a specific Value Object. * - * @param string $keyword - * @param string $typeClassName - * - * @return void + * @psalm-param class-string $typeClassName */ - public function addKeyword($keyword, $typeClassName) + public function addKeyword(string $keyword, string $typeClassName) : void { if (!class_exists($typeClassName)) { - throw new \InvalidArgumentException( + throw new InvalidArgumentException( 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName ); } - if (!in_array(Type::class, class_implements($typeClassName))) { - throw new \InvalidArgumentException( + if (!in_array(Type::class, class_implements($typeClassName), true)) { + throw new InvalidArgumentException( 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"' ); } @@ -152,28 +357,16 @@ public function addKeyword($keyword, $typeClassName) $this->keywords[$keyword] = $typeClassName; } - /** - * Detects whether the given type represents an array. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @return bool - */ - private function isTypedArray($type) - { - return substr($type, -2) === self::OPERATOR_ARRAY; - } - /** * Detects whether the given type represents a PHPDoc keyword. * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * - * @return bool + * @psalm-mutation-free */ - private function isKeyword($type) + private function isKeyword(string $type) : bool { - return in_array(strtolower($type), array_keys($this->keywords), true); + return array_key_exists(strtolower($type), $this->keywords); } /** @@ -181,9 +374,9 @@ private function isKeyword($type) * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * - * @return bool + * @psalm-mutation-free */ - private function isPartialStructuralElementName($type) + private function isPartialStructuralElementName(string $type) : bool { return ($type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type); } @@ -191,108 +384,160 @@ private function isPartialStructuralElementName($type) /** * Tests whether the given type is a Fully Qualified Structural Element Name. * - * @param string $type - * - * @return bool + * @psalm-mutation-free */ - private function isFqsen($type) + private function isFqsen(string $type) : bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } /** - * Tests whether the given type is a compound type (i.e. `string|int`). - * - * @param string $type + * Resolves the given keyword (such as `string`) into a Type object representing that keyword. * - * @return bool + * @psalm-mutation-free */ - private function isCompoundType($type) + private function resolveKeyword(string $type) : Type { - return strpos($type, '|') !== false; - } + $className = $this->keywords[strtolower($type)]; - /** - * Test whether the given type is a nullable type (i.e. `?string`) - * - * @param string $type - * - * @return bool - */ - private function isNullableType($type) - { - return $type[0] === '?'; + return new $className(); } /** - * Resolves the given typed array string (i.e. `string[]`) into an Array object with the right types set. - * - * @param string $type - * @param Context $context + * Resolves the given FQSEN string into an FQSEN object. * - * @return Array_ + * @psalm-mutation-free */ - private function resolveTypedArray($type, Context $context) + private function resolveTypedObject(string $type, ?Context $context = null) : Object_ { - return new Array_($this->resolve(substr($type, 0, -2), $context)); + return new Object_($this->fqsenResolver->resolve($type, $context)); } /** - * Resolves the given keyword (such as `string`) into a Type object representing that keyword. + * Resolves class string * - * @param string $type - * - * @return Type + * @param ArrayIterator $tokens */ - private function resolveKeyword($type) + private function resolveClassString(ArrayIterator $tokens, Context $context) : Type { - $className = $this->keywords[strtolower($type)]; + $tokens->next(); - return new $className(); - } + $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - /** - * Resolves the given FQSEN string into an FQSEN object. - * - * @param string $type - * @param Context|null $context - * - * @return Object_ - */ - private function resolveTypedObject($type, Context $context = null) - { - return new Object_($this->fqsenResolver->resolve($type, $context)); + if (!$classType instanceof Object_ || $classType->getFqsen() === null) { + throw new RuntimeException( + $classType . ' is not a class string' + ); + } + + $token = $tokens->current(); + if ($token !== '>') { + if (empty($token)) { + throw new RuntimeException( + 'class-string: ">" is missing' + ); + } + + throw new RuntimeException( + 'Unexpected character "' . $token . '", ">" is missing' + ); + } + + return new ClassString($classType->getFqsen()); } /** - * Resolves a compound type (i.e. `string|int`) into the appropriate Type objects or FQSEN. + * Resolves the collection values and keys * - * @param string $type - * @param Context $context + * @param ArrayIterator $tokens * - * @return Compound + * @return Array_|Iterable_|Collection */ - private function resolveCompoundType($type, Context $context) + private function resolveCollection(ArrayIterator $tokens, Type $classType, Context $context) : Type { - $types = []; + $isArray = ((string) $classType === 'array'); + $isIterable = ((string) $classType === 'iterable'); + + // allow only "array", "iterable" or class name before "<" + if (!$isArray && !$isIterable + && (!$classType instanceof Object_ || $classType->getFqsen() === null)) { + throw new RuntimeException( + $classType . ' is not a collection' + ); + } + + $tokens->next(); - foreach (explode('|', $type) as $part) { - $types[] = $this->resolve($part, $context); + $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); + $keyType = null; + + $token = $tokens->current(); + if ($token !== null && trim($token) === ',') { + // if we have a comma, then we just parsed the key type, not the value type + $keyType = $valueType; + if ($isArray) { + // check the key type for an "array" collection. We allow only + // strings or integers. + if (!$keyType instanceof String_ && + !$keyType instanceof Integer && + !$keyType instanceof Compound + ) { + throw new RuntimeException( + 'An array can have only integers or strings as keys' + ); + } + + if ($keyType instanceof Compound) { + foreach ($keyType->getIterator() as $item) { + if (!$item instanceof String_ && + !$item instanceof Integer + ) { + throw new RuntimeException( + 'An array can have only integers or strings as keys' + ); + } + } + } + } + + $tokens->next(); + // now let's parse the value type + $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); + } + + $token = $tokens->current(); + if ($token !== '>') { + if (empty($token)) { + throw new RuntimeException( + 'Collection: ">" is missing' + ); + } + + throw new RuntimeException( + 'Unexpected character "' . $token . '", ">" is missing' + ); } - return new Compound($types); + if ($isArray) { + return new Array_($valueType, $keyType); + } + + if ($isIterable) { + return new Iterable_($valueType, $keyType); + } + + if ($classType instanceof Object_) { + return $this->makeCollectionFromObject($classType, $valueType, $keyType); + } + + throw new RuntimeException('Invalid $classType provided'); } /** - * Resolve nullable types (i.e. `?string`) into a Nullable type wrapper - * - * @param string $type - * @param Context $context - * - * @return Nullable + * @psalm-pure */ - private function resolveNullableType($type, Context $context) + private function makeCollectionFromObject(Object_ $object, Type $valueType, ?Type $keyType = null) : Collection { - return new Nullable($this->resolve(ltrim($type, '?'), $context)); + return new Collection($object->getFqsen(), $valueType, $keyType); } } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php new file mode 100644 index 0000000000..bbea4f1414 --- /dev/null +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php @@ -0,0 +1,83 @@ +valueType = $valueType; + $this->defaultKeyType = new Compound([new String_(), new Integer()]); + $this->keyType = $keyType; + } + + /** + * Returns the type for the keys of this array. + */ + public function getKeyType() : Type + { + return $this->keyType ?? $this->defaultKeyType; + } + + /** + * Returns the value for the keys of this array. + */ + public function getValueType() : Type + { + return $this->valueType; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + if ($this->keyType) { + return 'array<' . $this->keyType . ',' . $this->valueType . '>'; + } + + if ($this->valueType instanceof Mixed_) { + return 'array'; + } + + if ($this->valueType instanceof Compound) { + return '(' . $this->valueType . ')[]'; + } + + return $this->valueType . '[]'; + } +} diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php new file mode 100644 index 0000000000..9522295831 --- /dev/null +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php @@ -0,0 +1,124 @@ + + */ +abstract class AggregatedType implements Type, IteratorAggregate +{ + /** + * @psalm-allow-private-mutation + * @var array + */ + private $types = []; + + /** @var string */ + private $token; + + /** + * @param array $types + */ + public function __construct(array $types, string $token) + { + foreach ($types as $type) { + $this->add($type); + } + + $this->token = $token; + } + + /** + * Returns the type at the given index. + */ + public function get(int $index) : ?Type + { + if (!$this->has($index)) { + return null; + } + + return $this->types[$index]; + } + + /** + * Tests if this compound type has a type with the given index. + */ + public function has(int $index) : bool + { + return array_key_exists($index, $this->types); + } + + /** + * Tests if this compound type contains the given type. + */ + public function contains(Type $type) : bool + { + foreach ($this->types as $typePart) { + // if the type is duplicate; do not add it + if ((string) $typePart === (string) $type) { + return true; + } + } + + return false; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return implode($this->token, $this->types); + } + + /** + * @return ArrayIterator + */ + public function getIterator() : ArrayIterator + { + return new ArrayIterator($this->types); + } + + /** + * @psalm-suppress ImpureMethodCall + */ + private function add(Type $type) : void + { + if ($type instanceof self) { + foreach ($type->getIterator() as $subType) { + $this->add($subType); + } + + return; + } + + // if the type is duplicate; do not add it + if ($this->contains($type)) { + return; + } + + $this->types[] = $type; + } +} diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Array_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Array_.php index 49b7c6ea0c..7f880e2db2 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Array_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Array_.php @@ -1,19 +1,18 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; -use phpDocumentor\Reflection\Type; - /** * Represents an array type as described in the PSR-5, the PHPDoc Standard. * @@ -22,65 +21,9 @@ * 1. Untyped (`array`), where the key and value type is unknown and hence classified as 'Mixed_'. * 2. Types (`string[]`), where the value type is provided by preceding an opening and closing square bracket with a * type name. + * + * @psalm-immutable */ -final class Array_ implements Type +final class Array_ extends AbstractList { - /** @var Type */ - private $valueType; - - /** @var Type */ - private $keyType; - - /** - * Initializes this representation of an array with the given Type or Fqsen. - * - * @param Type $valueType - * @param Type $keyType - */ - public function __construct(Type $valueType = null, Type $keyType = null) - { - if ($keyType === null) { - $keyType = new Compound([ new String_(), new Integer() ]); - } - if ($valueType === null) { - $valueType = new Mixed_(); - } - - $this->valueType = $valueType; - $this->keyType = $keyType; - } - - /** - * Returns the type for the keys of this array. - * - * @return Type - */ - public function getKeyType() - { - return $this->keyType; - } - - /** - * Returns the value for the keys of this array. - * - * @return Type - */ - public function getValueType() - { - return $this->valueType; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string - */ - public function __toString() - { - if ($this->valueType instanceof Mixed_) { - return 'array'; - } - - return $this->valueType . '[]'; - } } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php index f82b19e563..9163b51b68 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing a Boolean type. + * + * @psalm-immutable */ -final class Boolean implements Type +class Boolean implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'bool'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php index 68ebfbd064..1522325e31 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing a Callable type. + * + * @psalm-immutable */ final class Callable_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'callable'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/ClassString.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/ClassString.php new file mode 100644 index 0000000000..f847f17273 --- /dev/null +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/ClassString.php @@ -0,0 +1,56 @@ +fqsen = $fqsen; + } + + /** + * Returns the FQSEN associated with this object. + */ + public function getFqsen() : ?Fqsen + { + return $this->fqsen; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + if ($this->fqsen === null) { + return 'class-string'; + } + + return 'class-string<' . (string) $this->fqsen . '>'; + } +} diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Collection.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Collection.php new file mode 100644 index 0000000000..84b4463a6e --- /dev/null +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Collection.php @@ -0,0 +1,68 @@ +` + * 2. `ACollectionObject` + * + * - ACollectionObject can be 'array' or an object that can act as an array + * - aValueType and aKeyType can be any type expression + * + * @psalm-immutable + */ +final class Collection extends AbstractList +{ + /** @var Fqsen|null */ + private $fqsen; + + /** + * Initializes this representation of an array with the given Type or Fqsen. + */ + public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) + { + parent::__construct($valueType, $keyType); + + $this->fqsen = $fqsen; + } + + /** + * Returns the FQSEN associated with this object. + */ + public function getFqsen() : ?Fqsen + { + return $this->fqsen; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + $objectType = (string) ($this->fqsen ?? 'object'); + + if ($this->keyType === null) { + return $objectType . '<' . $this->valueType . '>'; + } + + return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; + } +} diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Compound.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Compound.php index be986c317c..ad426cc2c0 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Compound.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Compound.php @@ -1,19 +1,18 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; -use ArrayIterator; -use IteratorAggregate; use phpDocumentor\Reflection\Type; /** @@ -22,72 +21,18 @@ * A Compound Type is not so much a special keyword or object reference but is a series of Types that are separated * using an OR operator (`|`). This combination of types signifies that whatever is associated with this compound type * may contain a value with any of the given types. + * + * @psalm-immutable */ -final class Compound implements Type, IteratorAggregate +final class Compound extends AggregatedType { - /** @var Type[] */ - private $types; - /** * Initializes a compound type (i.e. `string|int`) and tests if the provided types all implement the Type interface. * - * @param Type[] $types - * @throws \InvalidArgumentException when types are not all instance of Type + * @param array $types */ public function __construct(array $types) { - foreach ($types as $type) { - if (!$type instanceof Type) { - throw new \InvalidArgumentException('A compound type can only have other types as elements'); - } - } - - $this->types = $types; - } - - /** - * Returns the type at the given index. - * - * @param integer $index - * - * @return Type|null - */ - public function get($index) - { - if (!$this->has($index)) { - return null; - } - - return $this->types[$index]; - } - - /** - * Tests if this compound type has a type with the given index. - * - * @param integer $index - * - * @return bool - */ - public function has($index) - { - return isset($this->types[$index]); - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string - */ - public function __toString() - { - return implode('|', $this->types); - } - - /** - * {@inheritdoc} - */ - public function getIterator() - { - return new ArrayIterator($this->types); + parent::__construct($types, '|'); } } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Context.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Context.php index 4e9ce5a03b..c134d7cfd2 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Context.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Context.php @@ -1,17 +1,22 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; +use function strlen; +use function substr; +use function trim; + /** * Provides information about the Context in which the DocBlock occurs that receives this context. * @@ -25,32 +30,40 @@ * * @see ContextFactory::createFromClassReflector() * @see ContextFactory::createForNamespace() + * + * @psalm-immutable */ final class Context { /** @var string The current namespace. */ private $namespace; - /** @var array List of namespace aliases => Fully Qualified Namespace. */ + /** + * @var string[] List of namespace aliases => Fully Qualified Namespace. + * @psalm-var array + */ private $namespaceAliases; /** * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) * format (without a preceding `\`). * - * @param string $namespace The namespace where this DocBlock resides in. - * @param array $namespaceAliases List of namespace aliases => Fully Qualified Namespace. + * @param string $namespace The namespace where this DocBlock resides in. + * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. + * + * @psalm-param array $namespaceAliases */ - public function __construct($namespace, array $namespaceAliases = []) + public function __construct(string $namespace, array $namespaceAliases = []) { - $this->namespace = ('global' !== $namespace && 'default' !== $namespace) - ? trim((string)$namespace, '\\') + $this->namespace = $namespace !== 'global' && $namespace !== 'default' + ? trim($namespace, '\\') : ''; foreach ($namespaceAliases as $alias => $fqnn) { if ($fqnn[0] === '\\') { $fqnn = substr($fqnn, 1); } + if ($fqnn[strlen($fqnn) - 1] === '\\') { $fqnn = substr($fqnn, 0, -1); } @@ -63,10 +76,8 @@ public function __construct($namespace, array $namespaceAliases = []) /** * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. - * - * @return string */ - public function getNamespace() + public function getNamespace() : string { return $this->namespace; } @@ -76,8 +87,10 @@ public function getNamespace() * the alias for the imported Namespace. * * @return string[] + * + * @psalm-return array */ - public function getNamespaceAliases() + public function getNamespaceAliases() : array { return $this->namespaceAliases; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php index 30936a3049..5d09d565ec 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php @@ -1,17 +1,56 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; +use ArrayIterator; +use InvalidArgumentException; +use ReflectionClass; +use ReflectionClassConstant; +use ReflectionMethod; +use ReflectionParameter; +use ReflectionProperty; +use Reflector; +use RuntimeException; +use UnexpectedValueException; +use function define; +use function defined; +use function file_exists; +use function file_get_contents; +use function get_class; +use function in_array; +use function is_string; +use function strrpos; +use function substr; +use function token_get_all; +use function trim; +use const T_AS; +use const T_CLASS; +use const T_CURLY_OPEN; +use const T_DOLLAR_OPEN_CURLY_BRACES; +use const T_NAMESPACE; +use const T_NS_SEPARATOR; +use const T_STRING; +use const T_USE; + +if (!defined('T_NAME_QUALIFIED')) { + define('T_NAME_QUALIFIED', 'T_NAME_QUALIFIED'); +} + +if (!defined('T_NAME_FULLY_QUALIFIED')) { + define('T_NAME_FULLY_QUALIFIED', 'T_NAME_FULLY_QUALIFIED'); +} + /** * Convenience class to create a Context for DocBlocks when not using the Reflection Component of phpDocumentor. * @@ -24,31 +63,99 @@ final class ContextFactory { /** The literal used at the end of a use statement. */ - const T_LITERAL_END_OF_USE = ';'; + private const T_LITERAL_END_OF_USE = ';'; /** The literal used between sets of use statements */ - const T_LITERAL_USE_SEPARATOR = ','; + private const T_LITERAL_USE_SEPARATOR = ','; /** * Build a Context given a Class Reflection. * - * @param \Reflector $reflector - * * @see Context for more information on Contexts. - * - * @return Context */ - public function createFromReflector(\Reflector $reflector) + public function createFromReflector(Reflector $reflector) : Context { - if (method_exists($reflector, 'getDeclaringClass')) { - $reflector = $reflector->getDeclaringClass(); + if ($reflector instanceof ReflectionClass) { + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @var ReflectionClass $reflector */ + + return $this->createFromReflectionClass($reflector); } - $fileName = $reflector->getFileName(); - $namespace = $reflector->getNamespaceName(); + if ($reflector instanceof ReflectionParameter) { + return $this->createFromReflectionParameter($reflector); + } + + if ($reflector instanceof ReflectionMethod) { + return $this->createFromReflectionMethod($reflector); + } + + if ($reflector instanceof ReflectionProperty) { + return $this->createFromReflectionProperty($reflector); + } - if (file_exists($fileName)) { - return $this->createForNamespace($namespace, file_get_contents($fileName)); + if ($reflector instanceof ReflectionClassConstant) { + return $this->createFromReflectionClassConstant($reflector); + } + + throw new UnexpectedValueException('Unhandled \Reflector instance given: ' . get_class($reflector)); + } + + private function createFromReflectionParameter(ReflectionParameter $parameter) : Context + { + $class = $parameter->getDeclaringClass(); + if (!$class) { + throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); + } + + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @var ReflectionClass $class */ + + return $this->createFromReflectionClass($class); + } + + private function createFromReflectionMethod(ReflectionMethod $method) : Context + { + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @var ReflectionClass $class */ + $class = $method->getDeclaringClass(); + + return $this->createFromReflectionClass($class); + } + + private function createFromReflectionProperty(ReflectionProperty $property) : Context + { + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @var ReflectionClass $class */ + $class = $property->getDeclaringClass(); + + return $this->createFromReflectionClass($class); + } + + private function createFromReflectionClassConstant(ReflectionClassConstant $constant) : Context + { + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @var ReflectionClass $class */ + $class = $constant->getDeclaringClass(); + + return $this->createFromReflectionClass($class); + } + + /** + * @param ReflectionClass $class + */ + private function createFromReflectionClass(ReflectionClass $class) : Context + { + $fileName = $class->getFileName(); + $namespace = $class->getNamespaceName(); + + if (is_string($fileName) && file_exists($fileName)) { + $contents = file_get_contents($fileName); + if ($contents === false) { + throw new RuntimeException('Unable to read file "' . $fileName . '"'); + } + + return $this->createForNamespace($namespace, $contents); } return new Context($namespace, []); @@ -57,22 +164,22 @@ public function createFromReflector(\Reflector $reflector) /** * Build a Context for a namespace in the provided file contents. * - * @param string $namespace It does not matter if a `\` precedes the namespace name, this method first normalizes. - * @param string $fileContents the file's contents to retrieve the aliases from with the given namespace. - * * @see Context for more information on Contexts. * - * @return Context + * @param string $namespace It does not matter if a `\` precedes the namespace name, + * this method first normalizes. + * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. */ - public function createForNamespace($namespace, $fileContents) + public function createForNamespace(string $namespace, string $fileContents) : Context { - $namespace = trim($namespace, '\\'); - $useStatements = []; + $namespace = trim($namespace, '\\'); + $useStatements = []; $currentNamespace = ''; - $tokens = new \ArrayIterator(token_get_all($fileContents)); + $tokens = new ArrayIterator(token_get_all($fileContents)); while ($tokens->valid()) { - switch ($tokens->current()[0]) { + $currentToken = $tokens->current(); + switch ($currentToken[0]) { case T_NAMESPACE: $currentNamespace = $this->parseNamespace($tokens); break; @@ -80,30 +187,35 @@ public function createForNamespace($namespace, $fileContents) // Fast-forward the iterator through the class so that any // T_USE tokens found within are skipped - these are not // valid namespace use statements so should be ignored. - $braceLevel = 0; + $braceLevel = 0; $firstBraceFound = false; while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { - if ($tokens->current() === '{' - || $tokens->current()[0] === T_CURLY_OPEN - || $tokens->current()[0] === T_DOLLAR_OPEN_CURLY_BRACES) { + $currentToken = $tokens->current(); + if ($currentToken === '{' + || in_array($currentToken[0], [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES], true)) { if (!$firstBraceFound) { $firstBraceFound = true; } - $braceLevel++; + + ++$braceLevel; } - if ($tokens->current() === '}') { - $braceLevel--; + if ($currentToken === '}') { + --$braceLevel; } + $tokens->next(); } + break; case T_USE: if ($currentNamespace === $namespace) { - $useStatements = array_merge($useStatements, $this->parseUseStatement($tokens)); + $useStatements += $this->parseUseStatement($tokens); } + break; } + $tokens->next(); } @@ -113,18 +225,16 @@ public function createForNamespace($namespace, $fileContents) /** * Deduce the name from tokens when we are at the T_NAMESPACE token. * - * @param \ArrayIterator $tokens - * - * @return string + * @param ArrayIterator $tokens */ - private function parseNamespace(\ArrayIterator $tokens) + private function parseNamespace(ArrayIterator $tokens) : string { // skip to the first string or namespace separator $this->skipToNextStringOrNamespaceSeparator($tokens); $name = ''; - while ($tokens->valid() && ($tokens->current()[0] === T_STRING || $tokens->current()[0] === T_NS_SEPARATOR) - ) { + $acceptedTokens = [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED]; + while ($tokens->valid() && in_array($tokens->current()[0], $acceptedTokens, true)) { $name .= $tokens->current()[1]; $tokens->next(); } @@ -135,22 +245,23 @@ private function parseNamespace(\ArrayIterator $tokens) /** * Deduce the names of all imports when we are at the T_USE token. * - * @param \ArrayIterator $tokens + * @param ArrayIterator $tokens * * @return string[] + * + * @psalm-return array */ - private function parseUseStatement(\ArrayIterator $tokens) + private function parseUseStatement(ArrayIterator $tokens) : array { $uses = []; - $continue = true; - while ($continue) { + while ($tokens->valid()) { $this->skipToNextStringOrNamespaceSeparator($tokens); - list($alias, $fqnn) = $this->extractUseStatement($tokens); - $uses[$alias] = $fqnn; - if ($tokens->current()[0] === self::T_LITERAL_END_OF_USE) { - $continue = false; + $uses += $this->extractUseStatements($tokens); + $currentToken = $tokens->current(); + if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { + return $uses; } } @@ -160,51 +271,153 @@ private function parseUseStatement(\ArrayIterator $tokens) /** * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. * - * @param \ArrayIterator $tokens - * - * @return void + * @param ArrayIterator $tokens */ - private function skipToNextStringOrNamespaceSeparator(\ArrayIterator $tokens) + private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens) : void { - while ($tokens->valid() && ($tokens->current()[0] !== T_STRING) && ($tokens->current()[0] !== T_NS_SEPARATOR)) { + while ($tokens->valid()) { + $currentToken = $tokens->current(); + if (in_array($currentToken[0], [T_STRING, T_NS_SEPARATOR], true)) { + break; + } + + if ($currentToken[0] === T_NAME_QUALIFIED) { + break; + } + + if (defined('T_NAME_FULLY_QUALIFIED') && $currentToken[0] === T_NAME_FULLY_QUALIFIED) { + break; + } + $tokens->next(); } } /** * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of - * a USE statement yet. + * a USE statement yet. This will return a key/value array of the alias => namespace. * - * @param \ArrayIterator $tokens + * @param ArrayIterator $tokens * - * @return string + * @return string[] + * + * @psalm-suppress TypeDoesNotContainType + * + * @psalm-return array */ - private function extractUseStatement(\ArrayIterator $tokens) + private function extractUseStatements(ArrayIterator $tokens) : array { - $result = ['']; - while ($tokens->valid() - && ($tokens->current()[0] !== self::T_LITERAL_USE_SEPARATOR) - && ($tokens->current()[0] !== self::T_LITERAL_END_OF_USE) - ) { - if ($tokens->current()[0] === T_AS) { - $result[] = ''; + $extractedUseStatements = []; + $groupedNs = ''; + $currentNs = ''; + $currentAlias = ''; + $state = 'start'; + + while ($tokens->valid()) { + $currentToken = $tokens->current(); + $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; + $tokenValue = is_string($currentToken) ? null : $currentToken[1]; + switch ($state) { + case 'start': + switch ($tokenId) { + case T_STRING: + case T_NS_SEPARATOR: + $currentNs .= (string) $tokenValue; + $currentAlias = $tokenValue; + break; + case T_NAME_QUALIFIED: + case T_NAME_FULLY_QUALIFIED: + $currentNs .= (string) $tokenValue; + $currentAlias = substr( + (string) $tokenValue, + (int) (strrpos((string) $tokenValue, '\\')) + 1 + ); + break; + case T_CURLY_OPEN: + case '{': + $state = 'grouped'; + $groupedNs = $currentNs; + break; + case T_AS: + $state = 'start-alias'; + break; + case self::T_LITERAL_USE_SEPARATOR: + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + + break; + case 'start-alias': + switch ($tokenId) { + case T_STRING: + $currentAlias = $tokenValue; + break; + case self::T_LITERAL_USE_SEPARATOR: + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + + break; + case 'grouped': + switch ($tokenId) { + case T_STRING: + case T_NS_SEPARATOR: + $currentNs .= (string) $tokenValue; + $currentAlias = $tokenValue; + break; + case T_AS: + $state = 'grouped-alias'; + break; + case self::T_LITERAL_USE_SEPARATOR: + $state = 'grouped'; + $extractedUseStatements[(string) $currentAlias] = $currentNs; + $currentNs = $groupedNs; + $currentAlias = ''; + break; + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + + break; + case 'grouped-alias': + switch ($tokenId) { + case T_STRING: + $currentAlias = $tokenValue; + break; + case self::T_LITERAL_USE_SEPARATOR: + $state = 'grouped'; + $extractedUseStatements[(string) $currentAlias] = $currentNs; + $currentNs = $groupedNs; + $currentAlias = ''; + break; + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } } - if ($tokens->current()[0] === T_STRING || $tokens->current()[0] === T_NS_SEPARATOR) { - $result[count($result) - 1] .= $tokens->current()[1]; + + if ($state === 'end') { + break; } + $tokens->next(); } - if (count($result) == 1) { - $backslashPos = strrpos($result[0], '\\'); - - if (false !== $backslashPos) { - $result[] = substr($result[0], $backslashPos + 1); - } else { - $result[] = $result[0]; - } + if ($groupedNs !== $currentNs) { + $extractedUseStatements[(string) $currentAlias] = $currentNs; } - return array_reverse($result); + return $extractedUseStatements; } } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Expression.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Expression.php new file mode 100644 index 0000000000..4a8ae1fcf7 --- /dev/null +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Expression.php @@ -0,0 +1,51 @@ +valueType = $valueType; + } + + /** + * Returns the value for the keys of this array. + */ + public function getValueType() : Type + { + return $this->valueType; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return '(' . $this->valueType . ')'; + } +} diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Float_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Float_.php index e58d8966e0..e70ce7dd5d 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Float_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Float_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing a Float. + * + * @psalm-immutable */ final class Float_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'float'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Integer.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Integer.php index be4555ef67..2cfd7e9e75 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Integer.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Integer.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -14,14 +15,17 @@ use phpDocumentor\Reflection\Type; +/** + * Value object representing Integer type + * + * @psalm-immutable + */ final class Integer implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'int'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php new file mode 100644 index 0000000000..ced37b6262 --- /dev/null +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php @@ -0,0 +1,37 @@ + $types + */ + public function __construct(array $types) + { + parent::__construct($types, '&'); + } +} diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php index 0cbf48f7b9..a03a7cd3f0 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php @@ -1,31 +1,38 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; -use phpDocumentor\Reflection\Type; - /** * Value Object representing iterable type + * + * @psalm-immutable */ -final class Iterable_ implements Type +final class Iterable_ extends AbstractList { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { - return 'iterable'; + if ($this->keyType) { + return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; + } + + if ($this->valueType instanceof Mixed_) { + return 'iterable'; + } + + return 'iterable<' . $this->valueType . '>'; } } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php index c1c165f476..2fedff4009 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing an unknown, or mixed, type. + * + * @psalm-immutable */ final class Mixed_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'mixed'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Null_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Null_.php index 203b422719..f5994d9ad6 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Null_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Null_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing a null value or type. + * + * @psalm-immutable */ final class Null_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'null'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php index 3c6d1b1355..80aaf4ecc6 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,18 +17,16 @@ /** * Value Object representing a nullable type. The real type is wrapped. + * + * @psalm-immutable */ final class Nullable implements Type { - /** - * @var Type - */ + /** @var Type The actual type that is wrapped */ private $realType; /** * Initialises this nullable type using the real type embedded - * - * @param Type $realType */ public function __construct(Type $realType) { @@ -36,20 +35,16 @@ public function __construct(Type $realType) /** * Provide access to the actual type directly, if needed. - * - * @return Type */ - public function getActualType() + public function getActualType() : Type { return $this->realType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return '?' . $this->realType->__toString(); } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Object_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Object_.php index 389f7c70fa..4cfe2a0c32 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Object_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Object_.php @@ -1,19 +1,22 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; +use InvalidArgumentException; use phpDocumentor\Reflection\Fqsen; use phpDocumentor\Reflection\Type; +use function strpos; /** * Value Object representing an object. @@ -21,6 +24,8 @@ * An object can be either typed or untyped. When an object is typed it means that it has an identifier, the FQSEN, * pointing to an element in PHP. Object types that are untyped do not refer to a specific class but represent objects * in general. + * + * @psalm-immutable */ final class Object_ implements Type { @@ -30,15 +35,14 @@ final class Object_ implements Type /** * Initializes this object with an optional FQSEN, if not provided this object is considered 'untyped'. * - * @param Fqsen $fqsen - * @throws \InvalidArgumentException when provided $fqsen is not a valid type. + * @throws InvalidArgumentException When provided $fqsen is not a valid type. */ - public function __construct(Fqsen $fqsen = null) + public function __construct(?Fqsen $fqsen = null) { - if (strpos((string)$fqsen, '::') !== false || strpos((string)$fqsen, '()') !== false) { - throw new \InvalidArgumentException( + if (strpos((string) $fqsen, '::') !== false || strpos((string) $fqsen, '()') !== false) { + throw new InvalidArgumentException( 'Object types can only refer to a class, interface or trait but a method, function, constant or ' - . 'property was received: ' . (string)$fqsen + . 'property was received: ' . (string) $fqsen ); } @@ -47,23 +51,16 @@ public function __construct(Fqsen $fqsen = null) /** * Returns the FQSEN associated with this object. - * - * @return Fqsen|null */ - public function getFqsen() + public function getFqsen() : ?Fqsen { return $this->fqsen; } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string - */ - public function __toString() + public function __toString() : string { if ($this->fqsen) { - return (string)$this->fqsen; + return (string) $this->fqsen; } return 'object'; diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php index aabdbfb31d..08900abce9 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -18,15 +19,15 @@ * Value Object representing the 'parent' type. * * Parent, as a Type, represents the parent class of class in which the associated element was defined. + * + * @psalm-immutable */ final class Parent_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'parent'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php index a1b613dc51..2d4a794c2b 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing the 'resource' Type. + * + * @psalm-immutable */ final class Resource_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'resource'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php index 1e2a660299..00ac369144 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing the 'scalar' pseudo-type, which is either a string, integer, float or boolean. + * + * @psalm-immutable */ final class Scalar implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'scalar'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Self_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Self_.php index 1ba3fc5a50..7fa13fa5e9 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Self_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Self_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -18,15 +19,15 @@ * Value Object representing the 'self' type. * * Self, as a Type, represents the class in which the associated element was defined. + * + * @psalm-immutable */ final class Self_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'self'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Static_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Static_.php index 9eb67299cb..568400ce58 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Static_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Static_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -23,15 +24,15 @@ * * See the documentation on late static binding in the PHP Documentation for more information on the difference between * static and self. + * + * @psalm-immutable */ final class Static_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'static'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/String_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/String_.php index 8db596857d..6b92e413d4 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/String_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/String_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing the type 'string'. + * + * @psalm-immutable */ final class String_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'string'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/This.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/This.php index c098a939ba..58cb3af057 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/This.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/This.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -19,15 +20,15 @@ * * $this, as a Type, represents the instance of the class associated with the element as it was called. $this is * commonly used when documenting fluent interfaces since it represents that the same object is returned. + * + * @psalm-immutable */ final class This implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return '$this'; } diff --git a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Void_.php b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Void_.php index 3d1be272c3..5cabad5052 100644 --- a/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Void_.php +++ b/site/plugins/site/vendor/phpdocumentor/type-resolver/src/Types/Void_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -19,15 +20,15 @@ * * Void is generally only used when working with return types as it signifies that the method intentionally does not * return any value. + * + * @psalm-immutable */ final class Void_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'void'; } diff --git a/site/plugins/site/vendor/symfony/polyfill-ctype/Ctype.php b/site/plugins/site/vendor/symfony/polyfill-ctype/Ctype.php new file mode 100644 index 0000000000..58414dc73b --- /dev/null +++ b/site/plugins/site/vendor/symfony/polyfill-ctype/Ctype.php @@ -0,0 +1,227 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Ctype; + +/** + * Ctype implementation through regex. + * + * @internal + * + * @author Gert de Pagter + */ +final class Ctype +{ + /** + * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. + * + * @see https://php.net/ctype-alnum + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_alnum($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is a letter, FALSE otherwise. + * + * @see https://php.net/ctype-alpha + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_alpha($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); + } + + /** + * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. + * + * @see https://php.net/ctype-cntrl + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_cntrl($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); + } + + /** + * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. + * + * @see https://php.net/ctype-digit + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_digit($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. + * + * @see https://php.net/ctype-graph + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_graph($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); + } + + /** + * Returns TRUE if every character in text is a lowercase letter. + * + * @see https://php.net/ctype-lower + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_lower($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); + } + + /** + * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. + * + * @see https://php.net/ctype-print + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_print($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); + } + + /** + * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. + * + * @see https://php.net/ctype-punct + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_punct($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); + } + + /** + * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. + * + * @see https://php.net/ctype-space + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_space($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); + } + + /** + * Returns TRUE if every character in text is an uppercase letter. + * + * @see https://php.net/ctype-upper + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_upper($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); + } + + /** + * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. + * + * @see https://php.net/ctype-xdigit + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_xdigit($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); + } + + /** + * Converts integers to their char versions according to normal ctype behaviour, if needed. + * + * If an integer between -128 and 255 inclusive is provided, + * it is interpreted as the ASCII value of a single character + * (negative values have 256 added in order to allow characters in the Extended ASCII range). + * Any other integer is interpreted as a string containing the decimal digits of the integer. + * + * @param string|int $int + * + * @return mixed + */ + private static function convert_int_to_char_for_ctype($int) + { + if (!\is_int($int)) { + return $int; + } + + if ($int < -128 || $int > 255) { + return (string) $int; + } + + if ($int < 0) { + $int += 256; + } + + return \chr($int); + } +} diff --git a/site/plugins/site/vendor/symfony/polyfill-ctype/LICENSE b/site/plugins/site/vendor/symfony/polyfill-ctype/LICENSE new file mode 100644 index 0000000000..3f853aaf35 --- /dev/null +++ b/site/plugins/site/vendor/symfony/polyfill-ctype/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2019 Fabien Potencier + +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/site/plugins/site/vendor/symfony/polyfill-ctype/bootstrap.php b/site/plugins/site/vendor/symfony/polyfill-ctype/bootstrap.php new file mode 100644 index 0000000000..d54524b31b --- /dev/null +++ b/site/plugins/site/vendor/symfony/polyfill-ctype/bootstrap.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__.'/bootstrap80.php'; +} + +if (!function_exists('ctype_alnum')) { + function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit($text) { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph($text) { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower($text) { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print($text) { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct($text) { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space($text) { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper($text) { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } +} diff --git a/site/plugins/site/vendor/symfony/polyfill-ctype/bootstrap80.php b/site/plugins/site/vendor/symfony/polyfill-ctype/bootstrap80.php new file mode 100644 index 0000000000..ab2f8611da --- /dev/null +++ b/site/plugins/site/vendor/symfony/polyfill-ctype/bootstrap80.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (!function_exists('ctype_alnum')) { + function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); } +} diff --git a/site/plugins/site/vendor/webmozart/assert/.composer-auth.json b/site/plugins/site/vendor/webmozart/assert/.composer-auth.json deleted file mode 100644 index eea80018f0..0000000000 --- a/site/plugins/site/vendor/webmozart/assert/.composer-auth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "github-oauth": { - "github.com": "PLEASE DO NOT USE THIS TOKEN IN YOUR OWN PROJECTS/FORKS", - "github.com": "This token is reserved for testing the webmozart/* repositories", - "github.com": "a9debbffdd953ee9b3b82dbc3b807cde2086bb86" - } -} diff --git a/site/plugins/site/vendor/webmozart/assert/.styleci.yml b/site/plugins/site/vendor/webmozart/assert/.styleci.yml deleted file mode 100644 index c2ad4a57de..0000000000 --- a/site/plugins/site/vendor/webmozart/assert/.styleci.yml +++ /dev/null @@ -1,11 +0,0 @@ -preset: symfony - -finder: - exclude: - - "tests" - -enabled: - - ordered_use - -disabled: - - phpdoc_annotation_without_dot # This is still buggy: https://github.com/symfony/symfony/pull/19198 diff --git a/site/plugins/site/vendor/webmozart/assert/CHANGELOG.md b/site/plugins/site/vendor/webmozart/assert/CHANGELOG.md deleted file mode 100644 index 65fbc8f7ad..0000000000 --- a/site/plugins/site/vendor/webmozart/assert/CHANGELOG.md +++ /dev/null @@ -1,53 +0,0 @@ -Changelog -========= - -## UNRELEASED - -### Added - -* added `Assert::minCount()` -* added `Assert::maxCount()` -* added `Assert::countBetween()` -* added `Assert::isCountable()` -* added `Assert::notWhitespaceOnly()` -* added `Assert::natural()` -* added `Assert::notContains()` -* added `Assert::isArrayAccessible()` -* added `Assert::isInstanceOfAny()` -* added `Assert::isIterable()` - -### Fixed - -* `stringNotEmpty` will no longer report "0" is an empty string - -## 1.2.0 (2016-11-23) - - * added `Assert::throws()` - * added `Assert::count()` - * added extension point `Assert::reportInvalidArgument()` for custom subclasses - -## 1.1.0 (2016-08-09) - - * added `Assert::object()` - * added `Assert::propertyExists()` - * added `Assert::propertyNotExists()` - * added `Assert::methodExists()` - * added `Assert::methodNotExists()` - * added `Assert::uuid()` - -## 1.0.2 (2015-08-24) - - * integrated Style CI - * add tests for minimum package dependencies on Travis CI - -## 1.0.1 (2015-05-12) - - * added support for PHP 5.3.3 - -## 1.0.0 (2015-05-12) - - * first stable release - -## 1.0.0-beta (2015-03-19) - - * first beta release diff --git a/site/plugins/site/vendor/webmozart/assert/README.md b/site/plugins/site/vendor/webmozart/assert/README.md deleted file mode 100644 index 1c1ede7dd1..0000000000 --- a/site/plugins/site/vendor/webmozart/assert/README.md +++ /dev/null @@ -1,252 +0,0 @@ -Webmozart Assert -================ - -[![Build Status](https://travis-ci.org/webmozart/assert.svg?branch=master)](https://travis-ci.org/webmozart/assert) -[![Build status](https://ci.appveyor.com/api/projects/status/lyg83bcsisrr94se/branch/master?svg=true)](https://ci.appveyor.com/project/webmozart/assert/branch/master) -[![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert) -[![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert) -[![Dependency Status](https://www.versioneye.com/php/webmozart:assert/1.2.0/badge.svg)](https://www.versioneye.com/php/webmozart:assert/1.2.0) - -Latest release: [1.2.0](https://packagist.org/packages/webmozart/assert#1.2.0) - -PHP >= 5.3.9 - -This library contains efficient assertions to test the input and output of -your methods. With these assertions, you can greatly reduce the amount of coding -needed to write a safe implementation. - -All assertions in the [`Assert`] class throw an `\InvalidArgumentException` if -they fail. - -FAQ ---- - -**What's the difference to [beberlei/assert]?** - -This library is heavily inspired by Benjamin Eberlei's wonderful [assert package], -but fixes a usability issue with error messages that can't be fixed there without -breaking backwards compatibility. - -This package features usable error messages by default. However, you can also -easily write custom error messages: - -``` -Assert::string($path, 'The path is expected to be a string. Got: %s'); -``` - -In [beberlei/assert], the ordering of the `%s` placeholders is different for -every assertion. This package, on the contrary, provides consistent placeholder -ordering for all assertions: - -* `%s`: The tested value as string, e.g. `"/foo/bar"`. -* `%2$s`, `%3$s`, ...: Additional assertion-specific values, e.g. the - minimum/maximum length, allowed values, etc. - -Check the source code of the assertions to find out details about the additional -available placeholders. - -Installation ------------- - -Use [Composer] to install the package: - -``` -$ composer require webmozart/assert -``` - -Example -------- - -```php -use Webmozart\Assert\Assert; - -class Employee -{ - public function __construct($id) - { - Assert::integer($id, 'The employee ID must be an integer. Got: %s'); - Assert::greaterThan($id, 0, 'The employee ID must be a positive integer. Got: %s'); - } -} -``` - -If you create an employee with an invalid ID, an exception is thrown: - -```php -new Employee('foobar'); -// => InvalidArgumentException: -// The employee ID must be an integer. Got: string - -new Employee(-10); -// => InvalidArgumentException: -// The employee ID must be a positive integer. Got: -10 -``` - -Assertions ----------- - -The [`Assert`] class provides the following assertions: - -### Type Assertions - -Method | Description --------------------------------------------------------- | -------------------------------------------------- -`string($value, $message = '')` | Check that a value is a string -`stringNotEmpty($value, $message = '')` | Check that a value is a non-empty string -`integer($value, $message = '')` | Check that a value is an integer -`integerish($value, $message = '')` | Check that a value casts to an integer -`float($value, $message = '')` | Check that a value is a float -`numeric($value, $message = '')` | Check that a value is numeric -`natural($value, $message= ''')` | Check that a value is a non-negative integer -`boolean($value, $message = '')` | Check that a value is a boolean -`scalar($value, $message = '')` | Check that a value is a scalar -`object($value, $message = '')` | Check that a value is an object -`resource($value, $type = null, $message = '')` | Check that a value is a resource -`isCallable($value, $message = '')` | Check that a value is a callable -`isArray($value, $message = '')` | Check that a value is an array -`isTraversable($value, $message = '')` (deprecated) | Check that a value is an array or a `\Traversable` -`isIterable($value, $message = '')` | Check that a value is an array or a `\Traversable` -`isCountable($value, $message = '')` | Check that a value is an array or a `\Countable` -`isInstanceOf($value, $class, $message = '')` | Check that a value is an `instanceof` a class -`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` a at least one class on the array of classes -`notInstanceOf($value, $class, $message = '')` | Check that a value is not an `instanceof` a class -`isArrayAccessible($value, $message = '')` | Check that a value can be accessed as an array - -### Comparison Assertions - -Method | Description ------------------------------------------------ | -------------------------------------------------- -`true($value, $message = '')` | Check that a value is `true` -`false($value, $message = '')` | Check that a value is `false` -`null($value, $message = '')` | Check that a value is `null` -`notNull($value, $message = '')` | Check that a value is not `null` -`isEmpty($value, $message = '')` | Check that a value is `empty()` -`notEmpty($value, $message = '')` | Check that a value is not `empty()` -`eq($value, $value2, $message = '')` | Check that a value equals another (`==`) -`notEq($value, $value2, $message = '')` | Check that a value does not equal another (`!=`) -`same($value, $value2, $message = '')` | Check that a value is identical to another (`===`) -`notSame($value, $value2, $message = '')` | Check that a value is not identical to another (`!==`) -`greaterThan($value, $value2, $message = '')` | Check that a value is greater than another -`greaterThanEq($value, $value2, $message = '')` | Check that a value is greater than or equal to another -`lessThan($value, $value2, $message = '')` | Check that a value is less than another -`lessThanEq($value, $value2, $message = '')` | Check that a value is less than or equal to another -`range($value, $min, $max, $message = '')` | Check that a value is within a range -`oneOf($value, array $values, $message = '')` | Check that a value is one of a list of values - -### String Assertions - -You should check that a value is a string with `Assert::string()` before making -any of the following assertions. - -Method | Description ---------------------------------------------------- | ----------------------------------------------------------------- -`contains($value, $subString, $message = '')` | Check that a string contains a substring -`notContains($value, $subString, $message = '')` | Check that a string does not contains a substring -`startsWith($value, $prefix, $message = '')` | Check that a string has a prefix -`startsWithLetter($value, $message = '')` | Check that a string starts with a letter -`endsWith($value, $suffix, $message = '')` | Check that a string has a suffix -`regex($value, $pattern, $message = '')` | Check that a string matches a regular expression -`alpha($value, $message = '')` | Check that a string contains letters only -`digits($value, $message = '')` | Check that a string contains digits only -`alnum($value, $message = '')` | Check that a string contains letters and digits only -`lower($value, $message = '')` | Check that a string contains lowercase characters only -`upper($value, $message = '')` | Check that a string contains uppercase characters only -`length($value, $length, $message = '')` | Check that a string has a certain number of characters -`minLength($value, $min, $message = '')` | Check that a string has at least a certain number of characters -`maxLength($value, $max, $message = '')` | Check that a string has at most a certain number of characters -`lengthBetween($value, $min, $max, $message = '')` | Check that a string has a length in the given range -`uuid($value, $message = '')` | Check that a string is a valid UUID -`notWhitespaceOnly($value, $message = '')` | Check that a string contains at least one non-whitespace character - -### File Assertions - -Method | Description ------------------------------------ | -------------------------------------------------- -`fileExists($value, $message = '')` | Check that a value is an existing path -`file($value, $message = '')` | Check that a value is an existing file -`directory($value, $message = '')` | Check that a value is an existing directory -`readable($value, $message = '')` | Check that a value is a readable path -`writable($value, $message = '')` | Check that a value is a writable path - -### Object Assertions - -Method | Description ------------------------------------------------------ | -------------------------------------------------- -`classExists($value, $message = '')` | Check that a value is an existing class name -`subclassOf($value, $class, $message = '')` | Check that a class is a subclass of another -`implementsInterface($value, $class, $message = '')` | Check that a class implements an interface -`propertyExists($value, $property, $message = '')` | Check that a property exists in a class/object -`propertyNotExists($value, $property, $message = '')` | Check that a property does not exist in a class/object -`methodExists($value, $method, $message = '')` | Check that a method exists in a class/object -`methodNotExists($value, $method, $message = '')` | Check that a method does not exist in a class/object - -### Array Assertions - -Method | Description --------------------------------------------------- | ------------------------------------------------------------------ -`keyExists($array, $key, $message = '')` | Check that a key exists in an array -`keyNotExists($array, $key, $message = '')` | Check that a key does not exist in an array -`count($array, $number, $message = '')` | Check that an array contains a specific number of elements -`minCount($array, $min, $message = '')` | Check that an array contains at least a certain number of elements -`maxCount($array, $max, $message = '')` | Check that an array contains at most a certain number of elements -`countBetween($array, $min, $max, $message = '')` | Check that an array has a count in the given range - -### Function Assertions - -Method | Description -------------------------------------------- | ----------------------------------------------------------------------------------------------------- -`throws($closure, $class, $message = '')` | Check that a function throws a certain exception. Subclasses of the exception class will be accepted. - -### Collection Assertions - -All of the above assertions can be prefixed with `all*()` to test the contents -of an array or a `\Traversable`: - -```php -Assert::allIsInstanceOf($employees, 'Acme\Employee'); -``` - -### Nullable Assertions - -All of the above assertions can be prefixed with `nullOr*()` to run the -assertion only if it the value is not `null`: - -```php -Assert::nullOrString($middleName, 'The middle name must be a string or null. Got: %s'); -``` - -Authors -------- - -* [Bernhard Schussek] a.k.a. [@webmozart] -* [The Community Contributors] - -Contribute ----------- - -Contributions to the package are always welcome! - -* Report any bugs or issues you find on the [issue tracker]. -* You can grab the source code at the package's [Git repository]. - -Support -------- - -If you are having problems, send a mail to bschussek@gmail.com or shout out to -[@webmozart] on Twitter. - -License -------- - -All contents of this package are licensed under the [MIT license]. - -[beberlei/assert]: https://github.com/beberlei/assert -[assert package]: https://github.com/beberlei/assert -[Composer]: https://getcomposer.org -[Bernhard Schussek]: http://webmozarts.com -[The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors -[issue tracker]: https://github.com/webmozart/assert/issues -[Git repository]: https://github.com/webmozart/assert -[@webmozart]: https://twitter.com/webmozart -[MIT license]: LICENSE -[`Assert`]: src/Assert.php diff --git a/site/plugins/site/vendor/webmozart/assert/composer.json b/site/plugins/site/vendor/webmozart/assert/composer.json deleted file mode 100644 index c49e623a30..0000000000 --- a/site/plugins/site/vendor/webmozart/assert/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "webmozart/assert", - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": ["assert", "check", "validate"], - "license": "MIT", - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Webmozart\\Assert\\Tests\\": "tests/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - } -} diff --git a/site/plugins/site/vendor/webmozart/assert/src/Assert.php b/site/plugins/site/vendor/webmozart/assert/src/Assert.php index e2f89c0b0d..b28e17841a 100644 --- a/site/plugins/site/vendor/webmozart/assert/src/Assert.php +++ b/site/plugins/site/vendor/webmozart/assert/src/Assert.php @@ -15,150 +15,19 @@ use BadMethodCallException; use Closure; use Countable; +use DateTime; +use DateTimeImmutable; use Exception; use InvalidArgumentException; +use ResourceBundle; +use SimpleXMLElement; use Throwable; use Traversable; /** * Efficient assertions to validate the input/output of your methods. * - * @method static void nullOrString($value, $message = '') - * @method static void nullOrStringNotEmpty($value, $message = '') - * @method static void nullOrInteger($value, $message = '') - * @method static void nullOrIntegerish($value, $message = '') - * @method static void nullOrFloat($value, $message = '') - * @method static void nullOrNumeric($value, $message = '') - * @method static void nullOrBoolean($value, $message = '') - * @method static void nullOrScalar($value, $message = '') - * @method static void nullOrObject($value, $message = '') - * @method static void nullOrResource($value, $type = null, $message = '') - * @method static void nullOrIsCallable($value, $message = '') - * @method static void nullOrIsArray($value, $message = '') - * @method static void nullOrIsTraversable($value, $message = '') - * @method static void nullOrIsArrayAccessible($value, $message = '') - * @method static void nullOrIsCountable($value, $message = '') - * @method static void nullOrIsInstanceOf($value, $class, $message = '') - * @method static void nullOrNotInstanceOf($value, $class, $message = '') - * @method static void nullOrIsInstanceOfAny($value, $classes, $message = '') - * @method static void nullOrIsEmpty($value, $message = '') - * @method static void nullOrNotEmpty($value, $message = '') - * @method static void nullOrTrue($value, $message = '') - * @method static void nullOrFalse($value, $message = '') - * @method static void nullOrEq($value, $value2, $message = '') - * @method static void nullOrNotEq($value,$value2, $message = '') - * @method static void nullOrSame($value, $value2, $message = '') - * @method static void nullOrNotSame($value, $value2, $message = '') - * @method static void nullOrGreaterThan($value, $value2, $message = '') - * @method static void nullOrGreaterThanEq($value, $value2, $message = '') - * @method static void nullOrLessThan($value, $value2, $message = '') - * @method static void nullOrLessThanEq($value, $value2, $message = '') - * @method static void nullOrRange($value, $min, $max, $message = '') - * @method static void nullOrOneOf($value, $values, $message = '') - * @method static void nullOrContains($value, $subString, $message = '') - * @method static void nullOrNotContains($value, $subString, $message = '') - * @method static void nullOrNotWhitespaceOnly($value, $message = '') - * @method static void nullOrStartsWith($value, $prefix, $message = '') - * @method static void nullOrStartsWithLetter($value, $message = '') - * @method static void nullOrEndsWith($value, $suffix, $message = '') - * @method static void nullOrRegex($value, $pattern, $message = '') - * @method static void nullOrAlpha($value, $message = '') - * @method static void nullOrDigits($value, $message = '') - * @method static void nullOrAlnum($value, $message = '') - * @method static void nullOrLower($value, $message = '') - * @method static void nullOrUpper($value, $message = '') - * @method static void nullOrLength($value, $length, $message = '') - * @method static void nullOrMinLength($value, $min, $message = '') - * @method static void nullOrMaxLength($value, $max, $message = '') - * @method static void nullOrLengthBetween($value, $min, $max, $message = '') - * @method static void nullOrFileExists($value, $message = '') - * @method static void nullOrFile($value, $message = '') - * @method static void nullOrDirectory($value, $message = '') - * @method static void nullOrReadable($value, $message = '') - * @method static void nullOrWritable($value, $message = '') - * @method static void nullOrClassExists($value, $message = '') - * @method static void nullOrSubclassOf($value, $class, $message = '') - * @method static void nullOrImplementsInterface($value, $interface, $message = '') - * @method static void nullOrPropertyExists($value, $property, $message = '') - * @method static void nullOrPropertyNotExists($value, $property, $message = '') - * @method static void nullOrMethodExists($value, $method, $message = '') - * @method static void nullOrMethodNotExists($value, $method, $message = '') - * @method static void nullOrKeyExists($value, $key, $message = '') - * @method static void nullOrKeyNotExists($value, $key, $message = '') - * @method static void nullOrCount($value, $key, $message = '') - * @method static void nullOrMinCount($value, $min, $message = '') - * @method static void nullOrMaxCount($value, $max, $message = '') - * @method static void nullCountBetween($value, $min, $max, $message = '') - * @method static void nullOrUuid($values, $message = '') - * @method static void allString($values, $message = '') - * @method static void allStringNotEmpty($values, $message = '') - * @method static void allInteger($values, $message = '') - * @method static void allIntegerish($values, $message = '') - * @method static void allFloat($values, $message = '') - * @method static void allNumeric($values, $message = '') - * @method static void allBoolean($values, $message = '') - * @method static void allScalar($values, $message = '') - * @method static void allObject($values, $message = '') - * @method static void allResource($values, $type = null, $message = '') - * @method static void allIsCallable($values, $message = '') - * @method static void allIsArray($values, $message = '') - * @method static void allIsTraversable($values, $message = '') - * @method static void allIsArrayAccessible($values, $message = '') - * @method static void allIsCountable($values, $message = '') - * @method static void allIsInstanceOf($values, $class, $message = '') - * @method static void allNotInstanceOf($values, $class, $message = '') - * @method static void allIsInstanceOfAny($values, $classes, $message = '') - * @method static void allNull($values, $message = '') - * @method static void allNotNull($values, $message = '') - * @method static void allIsEmpty($values, $message = '') - * @method static void allNotEmpty($values, $message = '') - * @method static void allTrue($values, $message = '') - * @method static void allFalse($values, $message = '') - * @method static void allEq($values, $value2, $message = '') - * @method static void allNotEq($values,$value2, $message = '') - * @method static void allSame($values, $value2, $message = '') - * @method static void allNotSame($values, $value2, $message = '') - * @method static void allGreaterThan($values, $value2, $message = '') - * @method static void allGreaterThanEq($values, $value2, $message = '') - * @method static void allLessThan($values, $value2, $message = '') - * @method static void allLessThanEq($values, $value2, $message = '') - * @method static void allRange($values, $min, $max, $message = '') - * @method static void allOneOf($values, $values, $message = '') - * @method static void allContains($values, $subString, $message = '') - * @method static void allNotContains($values, $subString, $message = '') - * @method static void allNotWhitespaceOnly($values, $message = '') - * @method static void allStartsWith($values, $prefix, $message = '') - * @method static void allStartsWithLetter($values, $message = '') - * @method static void allEndsWith($values, $suffix, $message = '') - * @method static void allRegex($values, $pattern, $message = '') - * @method static void allAlpha($values, $message = '') - * @method static void allDigits($values, $message = '') - * @method static void allAlnum($values, $message = '') - * @method static void allLower($values, $message = '') - * @method static void allUpper($values, $message = '') - * @method static void allLength($values, $length, $message = '') - * @method static void allMinLength($values, $min, $message = '') - * @method static void allMaxLength($values, $max, $message = '') - * @method static void allLengthBetween($values, $min, $max, $message = '') - * @method static void allFileExists($values, $message = '') - * @method static void allFile($values, $message = '') - * @method static void allDirectory($values, $message = '') - * @method static void allReadable($values, $message = '') - * @method static void allWritable($values, $message = '') - * @method static void allClassExists($values, $message = '') - * @method static void allSubclassOf($values, $class, $message = '') - * @method static void allImplementsInterface($values, $interface, $message = '') - * @method static void allPropertyExists($values, $property, $message = '') - * @method static void allPropertyNotExists($values, $property, $message = '') - * @method static void allMethodExists($values, $method, $message = '') - * @method static void allMethodNotExists($values, $method, $message = '') - * @method static void allKeyExists($values, $key, $message = '') - * @method static void allKeyNotExists($values, $key, $message = '') - * @method static void allCount($values, $key, $message = '') - * @method static void allMinCount($values, $min, $message = '') - * @method static void allMaxCount($values, $max, $message = '') - * @method static void allCountBetween($values, $min, $max, $message = '') - * @method static void allUuid($values, $message = '') + * @mixin Mixin * * @since 1.0 * @@ -166,113 +35,213 @@ */ class Assert { + /** + * @psalm-pure + * @psalm-assert string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function string($value, $message = '') { - if (!is_string($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_string($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a string. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert non-empty-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function stringNotEmpty($value, $message = '') { static::string($value, $message); static::notEq($value, '', $message); } + /** + * @psalm-pure + * @psalm-assert int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function integer($value, $message = '') { - if (!is_int($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_int($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an integer. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function integerish($value, $message = '') { - if (!is_numeric($value) || $value != (int) $value) { - static::reportInvalidArgument(sprintf( + if (!\is_numeric($value) || $value != (int) $value) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an integerish value. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert float $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function float($value, $message = '') { - if (!is_float($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_float($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a float. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function numeric($value, $message = '') { - if (!is_numeric($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_numeric($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a numeric. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function natural($value, $message = '') { - if (!is_int($value) || $value < 0) { - static::reportInvalidArgument(sprintf( - $message ?: 'Expected a non-negative integer. Got %s', + if (!\is_int($value) || $value < 0) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a non-negative integer. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert bool $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function boolean($value, $message = '') { - if (!is_bool($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_bool($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a boolean. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert scalar $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function scalar($value, $message = '') { - if (!is_scalar($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_scalar($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a scalar. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert object $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function object($value, $message = '') { - if (!is_object($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_object($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an object. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert resource $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + */ public static function resource($value, $type = null, $message = '') { - if (!is_resource($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_resource($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a resource. Got: %s', static::typeToString($value) )); } - if ($type && $type !== get_resource_type($value)) { - static::reportInvalidArgument(sprintf( + if ($type && $type !== \get_resource_type($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a resource of type %2$s. Got: %s', static::typeToString($value), $type @@ -280,78 +249,151 @@ public static function resource($value, $type = null, $message = '') } } + /** + * @psalm-pure + * @psalm-assert callable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isCallable($value, $message = '') { - if (!is_callable($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_callable($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a callable. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert array $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isArray($value, $message = '') { - if (!is_array($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_array($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isTraversable($value, $message = '') { - @trigger_error( - sprintf( + @\trigger_error( + \sprintf( 'The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.', __METHOD__ ), - E_USER_DEPRECATED + \E_USER_DEPRECATED ); - if (!is_array($value) && !($value instanceof Traversable)) { - static::reportInvalidArgument(sprintf( + if (!\is_array($value) && !($value instanceof Traversable)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a traversable. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert array|ArrayAccess $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isArrayAccessible($value, $message = '') { - if (!is_array($value) && !($value instanceof ArrayAccess)) { - static::reportInvalidArgument(sprintf( + if (!\is_array($value) && !($value instanceof ArrayAccess)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array accessible. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert countable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isCountable($value, $message = '') { - if (!is_array($value) && !($value instanceof Countable)) { - static::reportInvalidArgument(sprintf( + if ( + !\is_array($value) + && !($value instanceof Countable) + && !($value instanceof ResourceBundle) + && !($value instanceof SimpleXMLElement) + ) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a countable. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isIterable($value, $message = '') { - if (!is_array($value) && !($value instanceof Traversable)) { - static::reportInvalidArgument(sprintf( + if (!\is_array($value) && !($value instanceof Traversable)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an iterable. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isInstanceOf($value, $class, $message = '') { if (!($value instanceof $class)) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an instance of %2$s. Got: %s', static::typeToString($value), $class @@ -359,10 +401,22 @@ public static function isInstanceOf($value, $class, $message = '') } } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert !ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ public static function notInstanceOf($value, $class, $message = '') { if ($value instanceof $class) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an instance other than %2$s. Got: %s', static::typeToString($value), $class @@ -370,6 +424,16 @@ public static function notInstanceOf($value, $class, $message = '') } } + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isInstanceOfAny($value, array $classes, $message = '') { foreach ($classes as $class) { @@ -378,43 +442,157 @@ public static function isInstanceOfAny($value, array $classes, $message = '') } } - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an instance of any of %2$s. Got: %s', static::typeToString($value), - implode(', ', array_map(array('static', 'valueToString'), $classes)) + \implode(', ', \array_map(array('static', 'valueToString'), $classes)) + )); + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType|class-string $value + * + * @param object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isAOf($value, $class, $message = '') + { + static::string($class, 'Expected class as a string. Got: %s'); + + if (!\is_a($value, $class, \is_string($value))) { + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an instance of this class or to this class among his parents %2$s. Got: %s', + static::typeToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * @psalm-assert !UnexpectedType $value + * @psalm-assert !class-string $value + * + * @param object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNotA($value, $class, $message = '') + { + static::string($class, 'Expected class as a string. Got: %s'); + + if (\is_a($value, $class, \is_string($value))) { + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an instance of this class or to this class among his parents other than %2$s. Got: %s', + static::typeToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param object|string $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isAnyOf($value, array $classes, $message = '') + { + foreach ($classes as $class) { + static::string($class, 'Expected class as a string. Got: %s'); + + if (\is_a($value, $class, \is_string($value))) { + return; + } + } + + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an any of instance of this class or to this class among his parents other than %2$s. Got: %s', + static::typeToString($value), + \implode(', ', \array_map(array('static', 'valueToString'), $classes)) )); } + /** + * @psalm-pure + * @psalm-assert empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isEmpty($value, $message = '') { if (!empty($value)) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an empty value. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert !empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function notEmpty($value, $message = '') { if (empty($value)) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a non-empty value. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function null($value, $message = '') { if (null !== $value) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected null. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert !null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function notNull($value, $message = '') { if (null === $value) { @@ -424,72 +602,237 @@ public static function notNull($value, $message = '') } } + /** + * @psalm-pure + * @psalm-assert true $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function true($value, $message = '') { if (true !== $value) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to be true. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function false($value, $message = '') { if (false !== $value) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to be false. Got: %s', static::valueToString($value) )); } } - public static function eq($value, $value2, $message = '') + /** + * @psalm-pure + * @psalm-assert !false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notFalse($value, $message = '') { - if ($value2 != $value) { - static::reportInvalidArgument(sprintf( + if (false === $value) { + static::reportInvalidArgument( + $message ?: 'Expected a value other than false.' + ); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ip($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IP. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ipv4($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IPv4. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ipv6($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IPv6. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function email($value, $message = '') + { + if (false === \filter_var($value, FILTER_VALIDATE_EMAIL)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be a valid e-mail address. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * Does non strict comparisons on the items, so ['3', 3] will not pass the assertion. + * + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function uniqueValues(array $values, $message = '') + { + $allValues = \count($values); + $uniqueValues = \count(\array_unique($values)); + + if ($allValues !== $uniqueValues) { + $difference = $allValues - $uniqueValues; + + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array of unique values, but %s of them %s duplicated', + $difference, + (1 === $difference ? 'is' : 'are') + )); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function eq($value, $expect, $message = '') + { + if ($expect != $value) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value equal to %2$s. Got: %s', static::valueToString($value), - static::valueToString($value2) + static::valueToString($expect) )); } } - public static function notEq($value, $value2, $message = '') + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEq($value, $expect, $message = '') { - if ($value2 == $value) { - static::reportInvalidArgument(sprintf( + if ($expect == $value) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a different value than %s.', - static::valueToString($value2) + static::valueToString($expect) )); } } - public static function same($value, $value2, $message = '') + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function same($value, $expect, $message = '') { - if ($value2 !== $value) { - static::reportInvalidArgument(sprintf( + if ($expect !== $value) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value identical to %2$s. Got: %s', static::valueToString($value), - static::valueToString($value2) + static::valueToString($expect) )); } } - public static function notSame($value, $value2, $message = '') + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notSame($value, $expect, $message = '') { - if ($value2 === $value) { - static::reportInvalidArgument(sprintf( + if ($expect === $value) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value not identical to %s.', - static::valueToString($value2) + static::valueToString($expect) )); } } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ public static function greaterThan($value, $limit, $message = '') { if ($value <= $limit) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value greater than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) @@ -497,10 +840,19 @@ public static function greaterThan($value, $limit, $message = '') } } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ public static function greaterThanEq($value, $limit, $message = '') { if ($value < $limit) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value greater than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) @@ -508,10 +860,19 @@ public static function greaterThanEq($value, $limit, $message = '') } } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ public static function lessThan($value, $limit, $message = '') { if ($value >= $limit) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value less than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) @@ -519,10 +880,19 @@ public static function lessThan($value, $limit, $message = '') } } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ public static function lessThanEq($value, $limit, $message = '') { if ($value > $limit) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value less than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) @@ -530,10 +900,22 @@ public static function lessThanEq($value, $limit, $message = '') } } + /** + * Inclusive range, so Assert::(3, 3, 5) passes. + * + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + */ public static function range($value, $min, $max, $message = '') { if ($value < $min || $value > $max) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value between %2$s and %3$s. Got: %s', static::valueToString($value), static::valueToString($min), @@ -542,21 +924,57 @@ public static function range($value, $min, $max, $message = '') } } + /** + * A more human-readable alias of Assert::inArray(). + * + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ public static function oneOf($value, array $values, $message = '') { - if (!in_array($value, $values, true)) { - static::reportInvalidArgument(sprintf( + static::inArray($value, $values, $message); + } + + /** + * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion. + * + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function inArray($value, array $values, $message = '') + { + if (!\in_array($value, $values, true)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected one of: %2$s. Got: %s', static::valueToString($value), - implode(', ', array_map(array('static', 'valueToString'), $values)) + \implode(', ', \array_map(array('static', 'valueToString'), $values)) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ public static function contains($value, $subString, $message = '') { - if (false === strpos($value, $subString)) { - static::reportInvalidArgument(sprintf( + if (false === \strpos($value, $subString)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain %2$s. Got: %s', static::valueToString($value), static::valueToString($subString) @@ -564,10 +982,19 @@ public static function contains($value, $subString, $message = '') } } + /** + * @psalm-pure + * + * @param string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ public static function notContains($value, $subString, $message = '') { - if (false !== strpos($value, $subString)) { - static::reportInvalidArgument(sprintf( + if (false !== \strpos($value, $subString)) { + static::reportInvalidArgument(\sprintf( $message ?: '%2$s was not expected to be contained in a value. Got: %s', static::valueToString($value), static::valueToString($subString) @@ -575,20 +1002,37 @@ public static function notContains($value, $subString, $message = '') } } + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function notWhitespaceOnly($value, $message = '') { - if (preg_match('/^\s*$/', $value)) { - static::reportInvalidArgument(sprintf( + if (\preg_match('/^\s*$/', $value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a non-whitespace string. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ public static function startsWith($value, $prefix, $message = '') { - if (0 !== strpos($value, $prefix)) { - static::reportInvalidArgument(sprintf( + if (0 !== \strpos($value, $prefix)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to start with %2$s. Got: %s', static::valueToString($value), static::valueToString($prefix) @@ -596,29 +1040,68 @@ public static function startsWith($value, $prefix, $message = '') } } + /** + * @psalm-pure + * + * @param string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notStartsWith($value, $prefix, $message = '') + { + if (0 === \strpos($value, $prefix)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value not to start with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($prefix) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function startsWithLetter($value, $message = '') { + static::string($value); + $valid = isset($value[0]); if ($valid) { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = ctype_alpha($value[0]); - setlocale(LC_CTYPE, $locale); + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = \ctype_alpha($value[0]); + \setlocale(LC_CTYPE, $locale); } if (!$valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to start with a letter. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ public static function endsWith($value, $suffix, $message = '') { - if ($suffix !== substr($value, -static::strlen($suffix))) { - static::reportInvalidArgument(sprintf( + if ($suffix !== \substr($value, -\strlen($suffix))) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to end with %2$s. Got: %s', static::valueToString($value), static::valueToString($suffix) @@ -626,95 +1109,218 @@ public static function endsWith($value, $suffix, $message = '') } } + /** + * @psalm-pure + * + * @param string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEndsWith($value, $suffix, $message = '') + { + if ($suffix === \substr($value, -\strlen($suffix))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value not to end with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($suffix) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ public static function regex($value, $pattern, $message = '') { - if (!preg_match($pattern, $value)) { - static::reportInvalidArgument(sprintf( + if (!\preg_match($pattern, $value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The value %s does not match the expected pattern.', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notRegex($value, $pattern, $message = '') + { + if (\preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The value %s matches the pattern %s (at offset %d).', + static::valueToString($value), + static::valueToString($pattern), + $matches[0][1] + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function unicodeLetters($value, $message = '') + { + static::string($value); + + if (!\preg_match('/^\p{L}+$/u', $value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain only Unicode letters. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function alpha($value, $message = '') { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = !ctype_alpha($value); - setlocale(LC_CTYPE, $locale); + static::string($value); + + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_alpha($value); + \setlocale(LC_CTYPE, $locale); if ($valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain only letters. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function digits($value, $message = '') { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = !ctype_digit($value); - setlocale(LC_CTYPE, $locale); + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_digit($value); + \setlocale(LC_CTYPE, $locale); if ($valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain digits only. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function alnum($value, $message = '') { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = !ctype_alnum($value); - setlocale(LC_CTYPE, $locale); + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_alnum($value); + \setlocale(LC_CTYPE, $locale); if ($valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain letters and digits only. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert lowercase-string $value + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function lower($value, $message = '') { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = !ctype_lower($value); - setlocale(LC_CTYPE, $locale); + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_lower($value); + \setlocale(LC_CTYPE, $locale); if ($valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain lowercase characters only. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert !lowercase-string $value + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function upper($value, $message = '') { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = !ctype_upper($value); - setlocale(LC_CTYPE, $locale); + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_upper($value); + \setlocale(LC_CTYPE, $locale); if ($valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain uppercase characters only. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + */ public static function length($value, $length, $message = '') { if ($length !== static::strlen($value)) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain %2$s characters. Got: %s', static::valueToString($value), $length @@ -722,10 +1328,21 @@ public static function length($value, $length, $message = '') } } + /** + * Inclusive min. + * + * @psalm-pure + * + * @param string $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ public static function minLength($value, $min, $message = '') { if (static::strlen($value) < $min) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain at least %2$s characters. Got: %s', static::valueToString($value), $min @@ -733,10 +1350,21 @@ public static function minLength($value, $min, $message = '') } } + /** + * Inclusive max. + * + * @psalm-pure + * + * @param string $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ public static function maxLength($value, $max, $message = '') { if (static::strlen($value) > $max) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain at most %2$s characters. Got: %s', static::valueToString($value), $max @@ -744,12 +1372,24 @@ public static function maxLength($value, $max, $message = '') } } + /** + * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion. + * + * @psalm-pure + * + * @param string $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ public static function lengthBetween($value, $min, $max, $message = '') { $length = static::strlen($value); if ($length < $min || $length > $max) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', static::valueToString($value), $min, @@ -758,76 +1398,128 @@ public static function lengthBetween($value, $min, $max, $message = '') } } + /** + * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file. + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function fileExists($value, $message = '') { static::string($value); - if (!file_exists($value)) { - static::reportInvalidArgument(sprintf( + if (!\file_exists($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The file %s does not exist.', static::valueToString($value) )); } } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function file($value, $message = '') { static::fileExists($value, $message); - if (!is_file($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_file($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is not a file.', static::valueToString($value) )); } } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function directory($value, $message = '') { static::fileExists($value, $message); - if (!is_dir($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_dir($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is no directory.', static::valueToString($value) )); } } + /** + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function readable($value, $message = '') { - if (!is_readable($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_readable($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is not readable.', static::valueToString($value) )); } } + /** + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function writable($value, $message = '') { - if (!is_writable($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_writable($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is not writable.', static::valueToString($value) )); } } + /** + * @psalm-assert class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function classExists($value, $message = '') { - if (!class_exists($value)) { - static::reportInvalidArgument(sprintf( + if (!\class_exists($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an existing class name. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert class-string|ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ public static function subclassOf($value, $class, $message = '') { - if (!is_subclass_of($value, $class)) { - static::reportInvalidArgument(sprintf( + if (!\is_subclass_of($value, $class)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a sub-class of %2$s. Got: %s', static::valueToString($value), static::valueToString($class) @@ -835,10 +1527,40 @@ public static function subclassOf($value, $class, $message = '') } } + /** + * @psalm-assert class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function interfaceExists($value, $message = '') + { + if (!\interface_exists($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an existing interface name. got %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert class-string $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + */ public static function implementsInterface($value, $interface, $message = '') { - if (!in_array($interface, class_implements($value))) { - static::reportInvalidArgument(sprintf( + if (!\in_array($interface, \class_implements($value))) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an implementation of %2$s. Got: %s', static::valueToString($value), static::valueToString($interface) @@ -846,103 +1568,223 @@ public static function implementsInterface($value, $interface, $message = '') } } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ public static function propertyExists($classOrObject, $property, $message = '') { - if (!property_exists($classOrObject, $property)) { - static::reportInvalidArgument(sprintf( + if (!\property_exists($classOrObject, $property)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the property %s to exist.', static::valueToString($property) )); } } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ public static function propertyNotExists($classOrObject, $property, $message = '') { - if (property_exists($classOrObject, $property)) { - static::reportInvalidArgument(sprintf( + if (\property_exists($classOrObject, $property)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the property %s to not exist.', static::valueToString($property) )); } } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ public static function methodExists($classOrObject, $method, $message = '') { - if (!method_exists($classOrObject, $method)) { - static::reportInvalidArgument(sprintf( + if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the method %s to exist.', static::valueToString($method) )); } } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ public static function methodNotExists($classOrObject, $method, $message = '') { - if (method_exists($classOrObject, $method)) { - static::reportInvalidArgument(sprintf( + if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the method %s to not exist.', static::valueToString($method) )); } } + /** + * @psalm-pure + * + * @param array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ public static function keyExists($array, $key, $message = '') { - if (!array_key_exists($key, $array)) { - static::reportInvalidArgument(sprintf( + if (!(isset($array[$key]) || \array_key_exists($key, $array))) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the key %s to exist.', static::valueToString($key) )); } } + /** + * @psalm-pure + * + * @param array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ public static function keyNotExists($array, $key, $message = '') { - if (array_key_exists($key, $array)) { - static::reportInvalidArgument(sprintf( + if (isset($array[$key]) || \array_key_exists($key, $array)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the key %s to not exist.', static::valueToString($key) )); } } + /** + * Checks if a value is a valid array key (int or string). + * + * @psalm-pure + * @psalm-assert array-key $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function validArrayKey($value, $message = '') + { + if (!(\is_int($value) || \is_string($value))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected string or integer. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + */ public static function count($array, $number, $message = '') { static::eq( - count($array), + \count($array), $number, - $message ?: sprintf('Expected an array to contain %d elements. Got: %d.', $number, count($array)) + \sprintf( + $message ?: 'Expected an array to contain %d elements. Got: %d.', + $number, + \count($array) + ) ); } + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ public static function minCount($array, $min, $message = '') { - if (count($array) < $min) { - static::reportInvalidArgument(sprintf( + if (\count($array) < $min) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array to contain at least %2$d elements. Got: %d', - count($array), + \count($array), $min )); } } + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ public static function maxCount($array, $max, $message = '') { - if (count($array) > $max) { - static::reportInvalidArgument(sprintf( + if (\count($array) > $max) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array to contain at most %2$d elements. Got: %d', - count($array), + \count($array), $max )); } } + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ public static function countBetween($array, $min, $max, $message = '') { - $count = count($array); + $count = \count($array); if ($count < $min || $count > $max) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d', $count, $min, @@ -951,9 +1793,91 @@ public static function countBetween($array, $min, $max, $message = '') } } + /** + * @psalm-pure + * @psalm-assert list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isList($array, $message = '') + { + if (!\is_array($array) || $array !== \array_values($array)) { + static::reportInvalidArgument( + $message ?: 'Expected list - non-associative array.' + ); + } + } + + /** + * @psalm-pure + * @psalm-assert non-empty-list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNonEmptyList($array, $message = '') + { + static::isList($array, $message); + static::notEmpty($array, $message); + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array $array + * @psalm-assert array $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isMap($array, $message = '') + { + if ( + !\is_array($array) || + \array_keys($array) !== \array_filter(\array_keys($array), '\is_string') + ) { + static::reportInvalidArgument( + $message ?: 'Expected map - associative array with string keys.' + ); + } + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array $array + * @psalm-assert array $array + * @psalm-assert !empty $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNonEmptyMap($array, $message = '') + { + static::isMap($array, $message); + static::notEmpty($array, $message); + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function uuid($value, $message = '') { - $value = str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); + $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); // The nil UUID is special form of UUID that is specified to have all // 128 bits set to zero. @@ -961,14 +1885,23 @@ public static function uuid($value, $message = '') return; } - if (!preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { - static::reportInvalidArgument(sprintf( + if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Value %s is not a valid UUID.', static::valueToString($value) )); } } + /** + * @psalm-param class-string $class + * + * @param Closure $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ public static function throws(Closure $expression, $class = 'Exception', $message = '') { static::string($class); @@ -978,45 +1911,48 @@ public static function throws(Closure $expression, $class = 'Exception', $messag try { $expression(); } catch (Exception $e) { - $actual = get_class($e); + $actual = \get_class($e); if ($e instanceof $class) { return; } } catch (Throwable $e) { - $actual = get_class($e); + $actual = \get_class($e); if ($e instanceof $class) { return; } } - static::reportInvalidArgument($message ?: sprintf( + static::reportInvalidArgument($message ?: \sprintf( 'Expected to throw "%s", got "%s"', $class, $actual )); } + /** + * @throws BadMethodCallException + */ public static function __callStatic($name, $arguments) { - if ('nullOr' === substr($name, 0, 6)) { + if ('nullOr' === \substr($name, 0, 6)) { if (null !== $arguments[0]) { - $method = lcfirst(substr($name, 6)); - call_user_func_array(array('static', $method), $arguments); + $method = \lcfirst(\substr($name, 6)); + \call_user_func_array(array('static', $method), $arguments); } return; } - if ('all' === substr($name, 0, 3)) { + if ('all' === \substr($name, 0, 3)) { static::isIterable($arguments[0]); - $method = lcfirst(substr($name, 3)); + $method = \lcfirst(\substr($name, 3)); $args = $arguments; foreach ($arguments[0] as $entry) { $args[0] = $entry; - call_user_func_array(array('static', $method), $args); + \call_user_func_array(array('static', $method), $args); } return; @@ -1025,6 +1961,11 @@ public static function __callStatic($name, $arguments) throw new BadMethodCallException('No such method: '.$name); } + /** + * @param mixed $value + * + * @return string + */ protected static function valueToString($value) { if (null === $value) { @@ -1039,43 +1980,63 @@ protected static function valueToString($value) return 'false'; } - if (is_array($value)) { + if (\is_array($value)) { return 'array'; } - if (is_object($value)) { - return get_class($value); + if (\is_object($value)) { + if (\method_exists($value, '__toString')) { + return \get_class($value).': '.self::valueToString($value->__toString()); + } + + if ($value instanceof DateTime || $value instanceof DateTimeImmutable) { + return \get_class($value).': '.self::valueToString($value->format('c')); + } + + return \get_class($value); } - if (is_resource($value)) { + if (\is_resource($value)) { return 'resource'; } - if (is_string($value)) { + if (\is_string($value)) { return '"'.$value.'"'; } return (string) $value; } + /** + * @param mixed $value + * + * @return string + */ protected static function typeToString($value) { - return is_object($value) ? get_class($value) : gettype($value); + return \is_object($value) ? \get_class($value) : \gettype($value); } protected static function strlen($value) { - if (!function_exists('mb_detect_encoding')) { - return strlen($value); + if (!\function_exists('mb_detect_encoding')) { + return \strlen($value); } - if (false === $encoding = mb_detect_encoding($value)) { - return strlen($value); + if (false === $encoding = \mb_detect_encoding($value)) { + return \strlen($value); } - return mb_strwidth($value, $encoding); + return \mb_strlen($value, $encoding); } + /** + * @param string $message + * + * @throws InvalidArgumentException + * + * @psalm-pure this method is not supposed to perform side-effects + */ protected static function reportInvalidArgument($message) { throw new InvalidArgumentException($message); diff --git a/site/plugins/site/vendor/webmozart/assert/src/Mixin.php b/site/plugins/site/vendor/webmozart/assert/src/Mixin.php new file mode 100644 index 0000000000..3ad9b2d042 --- /dev/null +++ b/site/plugins/site/vendor/webmozart/assert/src/Mixin.php @@ -0,0 +1,1971 @@ + $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allString($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|non-empty-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrStringNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allStringNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrInteger($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allInteger($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIntegerish($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIntegerish($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|float $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFloat($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFloat($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNumeric($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNumeric($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNatural($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNatural($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|bool $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrBoolean($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allBoolean($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|scalar $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrScalar($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allScalar($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|object $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrObject($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allObject($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|resource $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrResource($value, $type = null, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allResource($value, $type = null, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|callable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsCallable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsCallable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|array $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsArray($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsArray($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsTraversable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsTraversable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|array|ArrayAccess $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsArrayAccessible($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsArrayAccessible($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|countable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsCountable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsCountable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsIterable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsIterable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert null|ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsInstanceOfAny($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsInstanceOfAny($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert null|ExpectedType|class-string $value + * + * @param null|object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsAOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable> $value + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsAOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * + * @param null|object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsNotA($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsNotA($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param null|object|string $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsAnyOf($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param iterable $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsAnyOf($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-assert empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsEmpty($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNull($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotNull($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|true $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrTrue($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allTrue($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFalse($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFalse($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotFalse($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotFalse($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIp($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIp($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIpv4($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIpv4($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIpv6($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIpv6($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrEmail($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allEmail($value, $message = ''); + + /** + * @param null|array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUniqueValues($values, $message = ''); + + /** + * @param iterable $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUniqueValues($values, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrEq($value, $expect, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allEq($value, $expect, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotEq($value, $expect, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotEq($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrGreaterThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allGreaterThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrGreaterThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allGreaterThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLessThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLessThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLessThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLessThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrRange($value, $min, $max, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allRange($value, $min, $max, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrOneOf($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allOneOf($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrInArray($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allInArray($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotWhitespaceOnly($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotWhitespaceOnly($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrStartsWithLetter($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allStartsWithLetter($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUnicodeLetters($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUnicodeLetters($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrAlpha($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allAlpha($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrDigits($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allDigits($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrAlnum($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allAlnum($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|lowercase-string $value + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLower($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLower($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUpper($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUpper($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLength($value, $length, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLength($value, $length, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMinLength($value, $min, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMinLength($value, $min, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMaxLength($value, $max, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMaxLength($value, $max, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLengthBetween($value, $min, $max, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLengthBetween($value, $min, $max, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFileExists($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFileExists($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFile($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFile($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrDirectory($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allDirectory($value, $message = ''); + + /** + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrReadable($value, $message = ''); + + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allReadable($value, $message = ''); + + /** + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrWritable($value, $message = ''); + + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allWritable($value, $message = ''); + + /** + * @psalm-assert null|class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrClassExists($value, $message = ''); + + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allClassExists($value, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert null|class-string|ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrSubclassOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable|ExpectedType> $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allSubclassOf($value, $class, $message = ''); + + /** + * @psalm-assert null|class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrInterfaceExists($value, $message = ''); + + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allInterfaceExists($value, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert null|class-string $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrImplementsInterface($value, $interface, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert iterable> $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allImplementsInterface($value, $interface, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrPropertyExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allPropertyExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrPropertyNotExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allPropertyNotExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMethodExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMethodExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMethodNotExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMethodNotExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * + * @param null|array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrKeyExists($array, $key, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allKeyExists($array, $key, $message = ''); + + /** + * @psalm-pure + * + * @param null|array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrKeyNotExists($array, $key, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allKeyNotExists($array, $key, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|array-key $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrValidArrayKey($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allValidArrayKey($value, $message = ''); + + /** + * @param null|Countable|array $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrCount($array, $number, $message = ''); + + /** + * @param iterable $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allCount($array, $number, $message = ''); + + /** + * @param null|Countable|array $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMinCount($array, $min, $message = ''); + + /** + * @param iterable $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMinCount($array, $min, $message = ''); + + /** + * @param null|Countable|array $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMaxCount($array, $max, $message = ''); + + /** + * @param iterable $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMaxCount($array, $max, $message = ''); + + /** + * @param null|Countable|array $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrCountBetween($array, $min, $max, $message = ''); + + /** + * @param iterable $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allCountBetween($array, $min, $max, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|non-empty-list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsNonEmptyList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsNonEmptyList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param null|mixed|array $array + * @psalm-assert null|array $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsMap($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable> $array + * @psalm-assert iterable> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsMap($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param null|mixed|array $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsNonEmptyMap($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsNonEmptyMap($array, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUuid($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUuid($value, $message = ''); + + /** + * @psalm-param class-string $class + * + * @param null|Closure $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrThrows($expression, $class = 'Exception', $message = ''); + + /** + * @psalm-param class-string $class + * + * @param iterable $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allThrows($expression, $class = 'Exception', $message = ''); +} diff --git a/site/plugins/video-tag/index.php b/site/plugins/video-tag/index.php new file mode 100644 index 0000000000..5b4e829a24 --- /dev/null +++ b/site/plugins/video-tag/index.php @@ -0,0 +1,117 @@ + [ + 'video' => [ + 'attr' => [ + 'autoplay', + 'caption', + 'controls', + 'class', + 'height', + 'loop', + 'muted', + 'poster', + 'preload', + 'style', + 'width', + ], + 'html' => function ($tag) { + // available attributes + $attrs = KirbyTag::$types[$tag->type]['attr']; + + // gets global video tag options + $options = $tag->kirby()->option('kirbytext.video', []); + + // injects default values + // applies only defined attributes to safely update tag props + foreach ($options as $option => $value) { + if ( + in_array($option, $attrs) === true && + (isset($tag->{$option}) === false || $tag->{$option} === null) + ) { + $tag->{$option} = $value; + } + } + + // generates tag options helper + $generateTagOptions = function ($tag) { + // checks local poster file and handle + if ( + empty($tag->poster) === false && + Str::startsWith($tag->poster, 'http://') !== true && + Str::startsWith($tag->poster, 'https://') !== true + ) { + if ($poster = $tag->file($tag->poster)) { + $tag->poster = $poster->url(); + } + } + + return [ + 'autoplay' => $autoplay = Str::toType($tag->autoplay, 'bool'), + 'controls' => Str::toType($tag->controls ?? true, 'bool'), + 'height' => $tag->height, + 'loop' => Str::toType($tag->loop, 'bool'), + 'muted' => Str::toType($tag->muted ?? $autoplay, 'bool'), + 'poster' => $tag->poster, + 'preload' => $tag->preload, + 'width' => $tag->width + ]; + }; + + // handles local video file + if ( + Str::startsWith($tag->value, 'http://') !== true && + Str::startsWith($tag->value, 'https://') !== true + ) { + if ($tag->file = $tag->file($tag->value)) { + $options = $generateTagOptions($tag); + $source = Html::tag('source', null, [ + 'src' => $tag->file->url(), + 'type' => $tag->file->mime() + ]); + $video = Html::tag('video', [$source], $options); + } + } else { + // first handles supported video providers as youtube, vimeo, etc + try { + $video = Html::video( + $tag->value, + $options, + [ + 'height' => $tag->height, + 'width' => $tag->width + ] + ); + } catch (Exception $e) { + // if not one of the supported video providers + // it checks if there is a valid remote video file + $extension = F::extension($tag->value); + $type = F::extensionToType($extension); + $mime = F::extensionToMime($extension); + + if ($type === 'video') { + $options = $generateTagOptions($tag); + $source = Html::tag('source', null, [ + 'src' => $tag->value, + 'type' => $mime + ]); + $video = Html::tag('video', [$source], $options); + } + } + } + + return Html::figure([$video ?? ''], $tag->caption, [ + 'class' => $tag->class ?? 'video', + 'style' => $tag->style . ' --aspect-ratio: 16/9' + ]); + } + ] + ] +]); diff --git a/site/sessions/index.html b/site/sessions/index.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/site/snippets/arrow-link.php b/site/snippets/arrow-link.php deleted file mode 100644 index 828eb75a72..0000000000 --- a/site/snippets/arrow-link.php +++ /dev/null @@ -1,23 +0,0 @@ -« ' : ''; - -$iconAfter = ($direction === 'right') ? icon('chevron-right', true) : ''; -$suffix = ($direction === 'right') ? '' : ''; - -$content = "{$iconBefore}{$prefix}{$text}{$suffix}{$iconAfter}"; - -if (@$disabled) { - echo Html::tag('span', [$content], [ - 'class' => "arrow-link -direction:{$direction} -disabled", - 'aria-hidden' => 'true', - ]); -} else { - echo Html::a($link, [$content], [ - 'class' => "arrow-link -direction:{$direction}", - 'rel' => @$rel ?? null, - ]); -} diff --git a/site/snippets/audience.php b/site/snippets/audience.php new file mode 100644 index 0000000000..924a29cb98 --- /dev/null +++ b/site/snippets/audience.php @@ -0,0 +1,14 @@ +filter('isActive', false)->limit(4) ?> + diff --git a/site/snippets/cheatsheet.article.deprecated.php b/site/snippets/cheatsheet.article.deprecated.php deleted file mode 100644 index ee7823cbd6..0000000000 --- a/site/snippets/cheatsheet.article.deprecated.php +++ /dev/null @@ -1,16 +0,0 @@ -
- -

diff --git a/site/snippets/cheatsheet.article.footer.php b/site/snippets/cheatsheet.article.footer.php deleted file mode 100755 index 43cc18e1fb..0000000000 --- a/site/snippets/cheatsheet.article.footer.php +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/site/snippets/cheatsheet.article.header.php b/site/snippets/cheatsheet.article.header.php deleted file mode 100755 index 25444b2cb9..0000000000 --- a/site/snippets/cheatsheet.article.header.php +++ /dev/null @@ -1,33 +0,0 @@ - - - $icons ?? null]) ?> - $page->siblings()->forCheatsheet()]) ?> - -
- - -
- - -
- -
-
-
-

title() ?>

- - excerpt()->isNotEmpty()): ?> -
- excerpt()->kt() ?> -
- - - -
- - deprecated()->isNotEmpty()): ?> - $page->deprecated()->split('|')]) ?> - - diff --git a/site/snippets/cheatsheet.article.meta.php b/site/snippets/cheatsheet.article.meta.php deleted file mode 100644 index 38cfe8f60e..0000000000 --- a/site/snippets/cheatsheet.article.meta.php +++ /dev/null @@ -1,49 +0,0 @@ - - - diff --git a/site/snippets/cheatsheet.entries.php b/site/snippets/cheatsheet.entries.php deleted file mode 100755 index e97db4bb5f..0000000000 --- a/site/snippets/cheatsheet.entries.php +++ /dev/null @@ -1,22 +0,0 @@ - diff --git a/site/snippets/cheatsheet.entry.php b/site/snippets/cheatsheet.entry.php deleted file mode 100644 index 7c2fc6beb1..0000000000 --- a/site/snippets/cheatsheet.entry.php +++ /dev/null @@ -1,29 +0,0 @@ - -isActive(), ' aria-current="page"' ) ?> class="cheatsheet-entry"> - icon()->isNotEmpty()): ?> -
- - - -
- -
- title()); - ?> - info()->isNotEmpty()): ?> info() ?> - - excerpt()->kt() ?> - -
-
\ No newline at end of file diff --git a/site/snippets/cheatsheet.footer.php b/site/snippets/cheatsheet.footer.php deleted file mode 100755 index 5ac16cfa48..0000000000 --- a/site/snippets/cheatsheet.footer.php +++ /dev/null @@ -1,6 +0,0 @@ - - -
- - - diff --git a/site/snippets/cheatsheet.header.php b/site/snippets/cheatsheet.header.php deleted file mode 100755 index aa9eb7e421..0000000000 --- a/site/snippets/cheatsheet.header.php +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - true]) ?> - true]) ?> - - - - - - -
-
- -

- - Reference - -

- - - - - - - Guide - - - -
-
- diff --git a/site/snippets/cheatsheet.menu.button.php b/site/snippets/cheatsheet.menu.button.php deleted file mode 100755 index 0c45c13196..0000000000 --- a/site/snippets/cheatsheet.menu.button.php +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/site/snippets/cheatsheet.php b/site/snippets/cheatsheet.php deleted file mode 100644 index 785d10ba13..0000000000 --- a/site/snippets/cheatsheet.php +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/site/snippets/cheatsheet.section.advanced-link.php b/site/snippets/cheatsheet.section.advanced-link.php deleted file mode 100644 index 72d63c2a25..0000000000 --- a/site/snippets/cheatsheet.section.advanced-link.php +++ /dev/null @@ -1,9 +0,0 @@ -
- - - url(['query' => 'advanced=no']), 'basic', ['aria-current' => !$advanced]) ?> - url(['query' => 'advanced=yes']), 'advanced', ['aria-current' => $advanced]) ?> - -
diff --git a/site/snippets/cheatsheet.section.php b/site/snippets/cheatsheet.section.php deleted file mode 100755 index 175b345a14..0000000000 --- a/site/snippets/cheatsheet.section.php +++ /dev/null @@ -1,10 +0,0 @@ -
    - children()->forCheatsheet() as $item): ?> -
  • - $item, - 'excerpt' => $excerpt ?? false, - ]) ?> -
  • - -
\ No newline at end of file diff --git a/site/snippets/cheatsheet.sections.php b/site/snippets/cheatsheet.sections.php deleted file mode 100755 index db6fc1a857..0000000000 --- a/site/snippets/cheatsheet.sections.php +++ /dev/null @@ -1,26 +0,0 @@ - - diff --git a/site/snippets/clients.php b/site/snippets/clients.php deleted file mode 100644 index 78a20ee2a5..0000000000 --- a/site/snippets/clients.php +++ /dev/null @@ -1,9 +0,0 @@ -
    - children()->shuffle() as $client): ?> - image()): ?> -
  • - <?= $client->title() ?> -
  • - - -
diff --git a/site/snippets/cta.php b/site/snippets/cta.php index 11c45991c7..3ea297a552 100644 --- a/site/snippets/cta.php +++ b/site/snippets/cta.php @@ -1,13 +1,10 @@ -{$text}"], ['class' => trim("cta {$class}")]); -} else { - echo Html::a($link, [$icon, "{$text}"], ['class' => trim("cta {$class}")]); -} - + diff --git a/site/snippets/docs/class-aliases.php b/site/snippets/docs/class-aliases.php deleted file mode 100644 index 9da5efee2f..0000000000 --- a/site/snippets/docs/class-aliases.php +++ /dev/null @@ -1,8 +0,0 @@ -| Alias | Full class | -|--|--| -root('kirby') . '/config/aliases.php'; -foreach ($aliases as $alias => $class) : -?> -|``|``| - diff --git a/site/snippets/docs/kits.php b/site/snippets/docs/kits.php deleted file mode 100644 index 4df0fe4dfe..0000000000 --- a/site/snippets/docs/kits.php +++ /dev/null @@ -1,25 +0,0 @@ -
-
- -

- 'https://download.getkirby.com', - 'text' => 'Starterkit', - 'icon' => 'download', - ]) ?> -

-

The Starterkit is a full-blown Kirby installation with a lot of example content, blueprints, templates and more. It is ideal for new users to explore many of Kirby's options and get to know the Panel. -

-
-
-

- 'https://github.com/getkirby/plainkit/archive/main.zip', - 'text' => 'Plainkit', - 'icon' => 'download', - ]) ?> -

-

The Plainkit is a minimal Kirby setup with the basics you need to start a project from scratch. It is the ideal choice if you are already familiar with Kirby and want to start step-by-step. -

-
-
diff --git a/site/snippets/docs/methods/file/props.php b/site/snippets/docs/methods/file/props.php deleted file mode 100644 index 42e49f3a07..0000000000 --- a/site/snippets/docs/methods/file/props.php +++ /dev/null @@ -1,66 +0,0 @@ -## The `$props` parameter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
blueprintBlueprint definition
contentField values
filenameField values
parent$site, $page or $user
root
source
template
translationsLanguage codes with subarrays of field values
url
diff --git a/site/snippets/docs/methods/page/props.php b/site/snippets/docs/methods/page/props.php deleted file mode 100644 index 4916d61b6c..0000000000 --- a/site/snippets/docs/methods/page/props.php +++ /dev/null @@ -1,85 +0,0 @@ -## The `$props` parameter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
blueprintBlueprint definition
contentField values
dirname
draftIf true, the page will be created as draft
modelPage model
numSorting number, use null for unlisted pages
parentParent page
root
slug
template
translationsLanguage codes with subarrays of field values
url
diff --git a/site/snippets/docs/methods/user/props.php b/site/snippets/docs/methods/user/props.php deleted file mode 100644 index 810976e839..0000000000 --- a/site/snippets/docs/methods/user/props.php +++ /dev/null @@ -1,58 +0,0 @@ -## The `$props` parameter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
blueprintBlueprint definition
contentField values
email
id
language
name
password
role
translationsLanguage codes with subarrays of field values
diff --git a/site/snippets/faq.php b/site/snippets/faq.php new file mode 100644 index 0000000000..88ba3ce049 --- /dev/null +++ b/site/snippets/faq.php @@ -0,0 +1,10 @@ +
+ +
+ title()->widont() ?> +
+ text()->kt() ?> +
+
+ +
diff --git a/site/snippets/features/code.php b/site/snippets/features/code.php deleted file mode 100644 index 881c235ce0..0000000000 --- a/site/snippets/features/code.php +++ /dev/null @@ -1,5 +0,0 @@ -
-
- kt() ?> -
-
diff --git a/site/snippets/features/header.php b/site/snippets/features/header.php deleted file mode 100644 index e94040cc74..0000000000 --- a/site/snippets/features/header.php +++ /dev/null @@ -1,4 +0,0 @@ -
-

-

-
diff --git a/site/snippets/features/image.php b/site/snippets/features/image.php deleted file mode 100644 index ec3807ea2b..0000000000 --- a/site/snippets/features/image.php +++ /dev/null @@ -1,9 +0,0 @@ -
-
- - html(['alt' => $alt ?? null]) ?> - - html(['alt' => $alt ?? null]) ?> - -
-
diff --git a/site/snippets/features/text.php b/site/snippets/features/text.php deleted file mode 100644 index abd36aae86..0000000000 --- a/site/snippets/features/text.php +++ /dev/null @@ -1,19 +0,0 @@ -
-
-

-

- -

-

- - Learn more → - -

-
- - -
- -
- -
diff --git a/site/snippets/field-options.php b/site/snippets/field-options.php deleted file mode 100644 index 24594116da..0000000000 --- a/site/snippets/field-options.php +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - "> */ ?> - - - - - -
PropertyTypeDefaultDescription
- diff --git a/site/snippets/footer.php b/site/snippets/footer.php deleted file mode 100755 index 421e040236..0000000000 --- a/site/snippets/footer.php +++ /dev/null @@ -1,77 +0,0 @@ - - - - - diff --git a/site/snippets/github.edit.php b/site/snippets/github.edit.php deleted file mode 100644 index 0facbbb815..0000000000 --- a/site/snippets/github.edit.php +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/site/snippets/header.php b/site/snippets/header.php deleted file mode 100755 index 0fb03bf8da..0000000000 --- a/site/snippets/header.php +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - true]) ?> - true]) ?> - - - - - - - Skip to content - - - isHomePage()): ?> - - - - - - diff --git a/site/snippets/hero.php b/site/snippets/hero.php deleted file mode 100644 index f3d291f7b8..0000000000 --- a/site/snippets/hero.php +++ /dev/null @@ -1,11 +0,0 @@ -
- -

title() ?>

- - intro()->isNotEmpty()): ?> -
- intro()->kt()->widont() ?> -
- - -
diff --git a/site/snippets/hgroup.php b/site/snippets/hgroup.php new file mode 100644 index 0000000000..482c6f1510 --- /dev/null +++ b/site/snippets/hgroup.php @@ -0,0 +1,6 @@ +
+

+ +

+ +
diff --git a/site/snippets/home/why.php b/site/snippets/home/why.php deleted file mode 100644 index 75762796a2..0000000000 --- a/site/snippets/home/why.php +++ /dev/null @@ -1,38 +0,0 @@ - -
-
- -
-
-

Easy

-

- We want you to be effective with a shallow learning curve. No matter if you are the designer, the developer or the editor. -

-
- -
-

Flexible

-

- If you can dream it, you can build it with Kirby. We give you all the tools you need to build highly professional websites. -

-
- -
-

Fast

-

- Kirby's file-based architecture is built with performance in mind. From small sites to large projects. -

-
- -
-

Reliable

-

- More than six years of experience, a dedicated team and a friendly and helpful community are always here for you. -

-
-
- - - -
-
diff --git a/site/snippets/img.php b/site/snippets/img.php new file mode 100644 index 0000000000..7ad2c3f605 --- /dev/null +++ b/site/snippets/img.php @@ -0,0 +1,7 @@ + +
+ + + +
+ diff --git a/site/snippets/kirbytext/box.php b/site/snippets/kirbytext/box.php new file mode 100644 index 0000000000..ba29cc7abf --- /dev/null +++ b/site/snippets/kirbytext/box.php @@ -0,0 +1,4 @@ +
+
+ +
diff --git a/site/snippets/kirbytext/columns.php b/site/snippets/kirbytext/columns.php new file mode 100755 index 0000000000..c2e8855bce --- /dev/null +++ b/site/snippets/kirbytext/columns.php @@ -0,0 +1,5 @@ + +
+ +
+ diff --git a/site/snippets/kirbytext/image.php b/site/snippets/kirbytext/image.php new file mode 100644 index 0000000000..ebebeb8ea6 --- /dev/null +++ b/site/snippets/kirbytext/image.php @@ -0,0 +1,30 @@ + $file ?? null, + 'link' => $link ?? null, + 'caption' => $caption ?? null +]); + +echo Html::figure( + [ + Html::a($link ?? $file->url(), + [ + img($file, [ + 'alt' => $file->alt()->or($caption), + 'src' => [ + 'width' => 960 + ], + 'srcset' => [320, 640, 960, 1280], + ]) + ], + [ + 'data-lightbox' => !$link + ] + ) + ], + $caption, + [ + 'class' => 'image' + ] +); diff --git a/site/snippets/kirbytext/reference.php b/site/snippets/kirbytext/reference.php new file mode 100644 index 0000000000..dd44ce89e6 --- /dev/null +++ b/site/snippets/kirbytext/reference.php @@ -0,0 +1,8 @@ + diff --git a/site/snippets/kirbytext/screencast.php b/site/snippets/kirbytext/screencast.php new file mode 100644 index 0000000000..2a33db928e --- /dev/null +++ b/site/snippets/kirbytext/screencast.php @@ -0,0 +1,22 @@ +
+
+ Screencast +

+ +

+ +
+
+ [ + 'controls' => 0, + 'modestbranding' => 1, + 'showinfo' => 0, + 'rel' => 0, + ] + ], [ + 'loading' => 'lazy' + ]) ?> +
+
+ diff --git a/site/snippets/kirbytext/since.php b/site/snippets/kirbytext/since.php new file mode 100644 index 0000000000..1bff42d5a4 --- /dev/null +++ b/site/snippets/kirbytext/since.php @@ -0,0 +1,6 @@ + + Since + +
+ +
diff --git a/site/snippets/kosmos-form.php b/site/snippets/kosmos-form.php deleted file mode 100644 index 79ad1dd6ca..0000000000 --- a/site/snippets/kosmos-form.php +++ /dev/null @@ -1,23 +0,0 @@ -
-
- - - - - -
-
- - - - - -
-
- -
-
diff --git a/site/snippets/kosmos-issues.php b/site/snippets/kosmos-issues.php deleted file mode 100644 index 9cf526263b..0000000000 --- a/site/snippets/kosmos-issues.php +++ /dev/null @@ -1,23 +0,0 @@ - diff --git a/site/snippets/kosmos.php b/site/snippets/kosmos.php deleted file mode 100644 index 292a827d2f..0000000000 --- a/site/snippets/kosmos.php +++ /dev/null @@ -1,15 +0,0 @@ - -
- - 'left', 'theme' => 'dark', 'page' => $kosmos]) ?> - - -
-

Latest issues

- $kosmos->url(), 'text' => 'View all']) ?> -
- - page('kosmos')->children()->listed()->flip()->limit(4)]) ?> - -
- diff --git a/site/snippets/layouts/banner.php b/site/snippets/layouts/banner.php new file mode 100644 index 0000000000..cadbc46802 --- /dev/null +++ b/site/snippets/layouts/banner.php @@ -0,0 +1,9 @@ + + + diff --git a/site/snippets/layouts/footer.php b/site/snippets/layouts/footer.php new file mode 100644 index 0000000000..aac2013e1c --- /dev/null +++ b/site/snippets/layouts/footer.php @@ -0,0 +1,98 @@ + + diff --git a/site/snippets/layouts/github-edit.php b/site/snippets/layouts/github-edit.php new file mode 100644 index 0000000000..ae0df24428 --- /dev/null +++ b/site/snippets/layouts/github-edit.php @@ -0,0 +1,14 @@ + diff --git a/site/snippets/layouts/head.php b/site/snippets/layouts/head.php new file mode 100644 index 0000000000..5834183a72 --- /dev/null +++ b/site/snippets/layouts/head.php @@ -0,0 +1,37 @@ + $page->meta() +]); +?> + + + + + + + +<?= $page->isHomePage() ? $page->title() : $page->title() . ' | ' . $site->title() ?> + + + + + + + + + +template()->name() === 'buy'): ?> + + + + + + +robots() ?> +jsonld() ?> +opensearch() ?> +social() ?> + + + 'module']) ?> + diff --git a/site/snippets/layouts/header.php b/site/snippets/layouts/header.php new file mode 100644 index 0000000000..62b125a6ac --- /dev/null +++ b/site/snippets/layouts/header.php @@ -0,0 +1,10 @@ +
+ +
+
+ + + $search ?? 'all']) ?> +
+
+
diff --git a/site/snippets/layouts/logo.php b/site/snippets/layouts/logo.php new file mode 100644 index 0000000000..8fd013f175 --- /dev/null +++ b/site/snippets/layouts/logo.php @@ -0,0 +1,3 @@ + diff --git a/site/snippets/layouts/menu.php b/site/snippets/layouts/menu.php new file mode 100644 index 0000000000..717c757253 --- /dev/null +++ b/site/snippets/layouts/menu.php @@ -0,0 +1,62 @@ + diff --git a/site/snippets/layouts/search.php b/site/snippets/layouts/search.php new file mode 100644 index 0000000000..171a951b63 --- /dev/null +++ b/site/snippets/layouts/search.php @@ -0,0 +1,59 @@ + + diff --git a/site/snippets/layouts/skipper.php b/site/snippets/layouts/skipper.php new file mode 100644 index 0000000000..fd7f42b07a --- /dev/null +++ b/site/snippets/layouts/skipper.php @@ -0,0 +1 @@ +Skip to content diff --git a/site/snippets/lazy-image.php b/site/snippets/lazy-image.php deleted file mode 100644 index 852435a31a..0000000000 --- a/site/snippets/lazy-image.php +++ /dev/null @@ -1,34 +0,0 @@ -height() / $image->width() * 100, 5, '.', ''), '0'); -$tagName = !empty($link)? 'a' : 'span'; - -?> -< class="intrinsic" style="padding-bottom: %;"> - - data-src="resize($srcset[0])->url() ?>" - data-srcset="srcset($srcset) ?>" - data-sizes="auto" - sizes="100vw" - - data-src="url() ?>" - - class="lazyload" - alt="alt()->html() ?>" - > - -> diff --git a/site/snippets/legacy.footer.php b/site/snippets/legacy.footer.php deleted file mode 100755 index 5ac16cfa48..0000000000 --- a/site/snippets/legacy.footer.php +++ /dev/null @@ -1,6 +0,0 @@ - -
-
- - - diff --git a/site/snippets/legacy.header.php b/site/snippets/legacy.header.php deleted file mode 100755 index 38cc3281d6..0000000000 --- a/site/snippets/legacy.header.php +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - -
-
- -

- - Archive - -

- - - - - - - -
-
diff --git a/site/snippets/logo.php b/site/snippets/logo.php deleted file mode 100755 index 5d9ab2e1dd..0000000000 --- a/site/snippets/logo.php +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/site/snippets/menu.php b/site/snippets/menu.php deleted file mode 100755 index 3751c83278..0000000000 --- a/site/snippets/menu.php +++ /dev/null @@ -1,53 +0,0 @@ - diff --git a/site/snippets/meta.php b/site/snippets/meta.php deleted file mode 100644 index beee6dcb68..0000000000 --- a/site/snippets/meta.php +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - -<?= $page->isHomePage() ? $page->title() : $page->title() . ' | ' . $site->title() ?> - - - - - - - - - -template()->name() === 'buy'): ?> - - - - - - -meta() ?> - -robots() ?> - -jsonld() ?> - -opensearch() ?> - -social() ?> diff --git a/site/snippets/method/call.php b/site/snippets/method/call.php deleted file mode 100644 index 827aa81de0..0000000000 --- a/site/snippets/method/call.php +++ /dev/null @@ -1,5 +0,0 @@ - -
-
-
- diff --git a/site/snippets/method/inherits.php b/site/snippets/method/inherits.php deleted file mode 100644 index e37a3e9684..0000000000 --- a/site/snippets/method/inherits.php +++ /dev/null @@ -1,4 +0,0 @@ - -

Inherited from

-className()) ?> - diff --git a/site/snippets/method/parameters.php b/site/snippets/method/parameters.php deleted file mode 100644 index 68180cd9dc..0000000000 --- a/site/snippets/method/parameters.php +++ /dev/null @@ -1,23 +0,0 @@ - 0): ?> -

Parameters

- - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
$
- diff --git a/site/snippets/method/returns.php b/site/snippets/method/returns.php deleted file mode 100644 index 1b5f60d888..0000000000 --- a/site/snippets/method/returns.php +++ /dev/null @@ -1,4 +0,0 @@ - -

Return type

-

- diff --git a/site/snippets/method/source.php b/site/snippets/method/source.php deleted file mode 100644 index ba4a058068..0000000000 --- a/site/snippets/method/source.php +++ /dev/null @@ -1,7 +0,0 @@ - -

Source code

-

- diff --git a/site/snippets/method/throws.php b/site/snippets/method/throws.php deleted file mode 100644 index 947ed7ddf7..0000000000 --- a/site/snippets/method/throws.php +++ /dev/null @@ -1,15 +0,0 @@ - 0): ?> -

Exceptions

- - - - - - - - - - - -
TypeDescription
- diff --git a/site/snippets/pages.php b/site/snippets/pages.php deleted file mode 100644 index 20184c0fb0..0000000000 --- a/site/snippets/pages.php +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/site/snippets/pagination.php b/site/snippets/pagination.php index f3e870de41..e0e5cd2338 100644 --- a/site/snippets/pagination.php +++ b/site/snippets/pagination.php @@ -1,28 +1,21 @@ pages() > 0): ?> - - - + diff --git a/site/snippets/plugins.php b/site/snippets/plugins.php deleted file mode 100644 index 51ab2c6f6f..0000000000 --- a/site/snippets/plugins.php +++ /dev/null @@ -1,18 +0,0 @@ - diff --git a/site/snippets/plugins/info.php b/site/snippets/plugins/info.php deleted file mode 100644 index 847cd98785..0000000000 --- a/site/snippets/plugins/info.php +++ /dev/null @@ -1,37 +0,0 @@ - -
-
-

Installation

- -
    -
  1. Download 1.2.5
  2. -
  3. Unzip the plugin
  4. -
  5. Copy the plugin to /site/plugins/slug() ?>
  6. -
- -

Alternatively, you can install it with composer:

-
composer require parent()->slug() . '/' . $page->slug() ?>
- -

… or as Git submodule

-
git submodule add repository() ?>.git site/plugins/slug() ?>
- -
- -
-

About this plugin

- -
-
Author
-
parent()->title() ?>
- -
Version
-
1.2.5
- -
License
-
MIT
- -
Requirements
-
Kirby 3+
-
-
-
diff --git a/site/snippets/plugins/pay-it-forward.php b/site/snippets/plugins/pay-it-forward.php deleted file mode 100644 index e267fb68f3..0000000000 --- a/site/snippets/plugins/pay-it-forward.php +++ /dev/null @@ -1,9 +0,0 @@ -
-
-
-

Pay it forward 💛

-

This plugin is completely free and published under the MIT license. However, development needs time and effort. If you are using it in a commercial project or just want to support me to keep this plugin alive, please make a donation of your choice, purchase your Kirby licenses through my affiliate link, or sponsor me on a monthly basis.

-
-
-
- diff --git a/site/snippets/recipes.php b/site/snippets/recipes.php deleted file mode 100644 index a346e9fdde..0000000000 --- a/site/snippets/recipes.php +++ /dev/null @@ -1,25 +0,0 @@ - diff --git a/site/snippets/search.php b/site/snippets/search.php deleted file mode 100755 index 53c4d68b33..0000000000 --- a/site/snippets/search.php +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/site/snippets/security-incidents.php b/site/snippets/security-incidents.php deleted file mode 100644 index 3ed6314c7b..0000000000 --- a/site/snippets/security-incidents.php +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - -
Affected versionsDescriptionFixed in
affected()->escape() ?> - - description() ?> - - - cve()->or('CVE reference pending') ?> - - cve()->isNotEmpty()): ?> - CVE Entry - - - links()->yaml() as $title => $link): ?> - - - - - fixed() ?> - -
diff --git a/site/snippets/security-supported.php b/site/snippets/security-supported.php deleted file mode 100644 index c34f4479f5..0000000000 --- a/site/snippets/security-supported.php +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - -
Kirby VersionSupport Status
version()->escape() ?>description() ?>
diff --git a/site/snippets/sidebar.php b/site/snippets/sidebar.php old mode 100755 new mode 100644 index a169aade25..6f90e58bed --- a/site/snippets/sidebar.php +++ b/site/snippets/sidebar.php @@ -1,79 +1,8 @@ -find('docs')->children()->listed(); - -$doNotSkipTemplates = [ - 'reference', - 'reference-fields', - 'reference-fieldmethods', - 'reference-packages', - 'reference-helpers', - 'reference-kirbytags', - 'reference-roots', - 'reference-urls', - 'reference-validators', -]; - -?> - - - - +
+ +
  • +
    +
    +

    2014-2020

    +

    Kirby 2

    +
    +
    +

    Kirby 2 has reached its end of life and is no longer supported by us.

    +
    + +
    +
  • +
  • +
    +
    +

    Since 2019

    +

    Kirby 3

    +
    +
    +

    Kirby 3 is the latest version of Kirby.
    Start new projects with Kirby 3!

    +
    + +
    +
  • + - + diff --git a/site/templates/buy.php b/site/templates/buy.php old mode 100755 new mode 100644 index 4dc2909cff..10ff2454d8 --- a/site/templates/buy.php +++ b/site/templates/buy.php @@ -1,75 +1,115 @@ - + -
    -
    -
    - 'center']) ?> -
    -
    +
    +
    - -

    - +

    + The transparency of open‑source meets a fair pricing model +

    - - -

    We like to keep things simple: One price, all features, no fees, no subscription.

    -

    - - - Buy now - -

    - -
    + + +
    +
    + +

    + +

    -
    -
    -
    -

    FAQ

    -
      - find('answers')->children()->listed() as $question): ?> -
    • -

      title()->widont() ?>

      -
      - text()->kt() ?> -
      +
      +

      Let's keep it simple

      +
        +
      • +
        + One price +
      • +
      • +
        + All features +
      • +
      • +
        + No hidden fees +
      • +
      • +
        + No subscription
      • -
      -
    -
    -
    + + + - - + + diff --git a/site/templates/case.php b/site/templates/case.php deleted file mode 100644 index 7682a96e35..0000000000 --- a/site/templates/case.php +++ /dev/null @@ -1 +0,0 @@ -link()->toUrl()) ?> diff --git a/site/templates/cases.json.php b/site/templates/cases.json.php new file mode 100644 index 0000000000..7d1d79e714 --- /dev/null +++ b/site/templates/cases.json.php @@ -0,0 +1,13 @@ +children() as $child) { + $cases[] = [ + 'id' => $child->slug(), + 'title' => $child->title()->value(), + 'url' => $child->link()->value(), + ]; +} + +echo json($cases); diff --git a/site/templates/cases.php b/site/templates/cases.php index 235cdbfede..fa0343ea0a 100644 --- a/site/templates/cases.php +++ b/site/templates/cases.php @@ -1,38 +1,31 @@ - + -
    -
    +
    +

    You built something with Kirby?

    +

    + Share your work in our forum +

    +
    - + diff --git a/site/templates/code.php b/site/templates/code.php deleted file mode 100755 index 3a20559516..0000000000 --- a/site/templates/code.php +++ /dev/null @@ -1,76 +0,0 @@ - false]) ?> - - - - -
    -
    -
    - - - -
    - text()->kt() ?> -
    -
    - - diff --git a/site/templates/contact.php b/site/templates/contact.php deleted file mode 100755 index f1e4d802d6..0000000000 --- a/site/templates/contact.php +++ /dev/null @@ -1,26 +0,0 @@ - - -
    -
    -
    -
    -
    -

    Contact

    -
    -
    - contact()->kt() ?> -
    -
    -
    -
    -

    Disclaimer

    -
    -
    - disclaimer()->kt() ?> -
    -
    -
    -
    -
    - - diff --git a/site/templates/contributors.php b/site/templates/contributors.php deleted file mode 100644 index e435076513..0000000000 --- a/site/templates/contributors.php +++ /dev/null @@ -1,88 +0,0 @@ - - -
    - - -
    - - -
    - -
    -

    Core Team

    -

    - Kirby grew from a one-man show to a team of dedicated developers, designers and writers. -

    -
    - -
      - -
    • - -
      - - image()->html(['alt' => $mate->title()]) ?> - -
      - -

      title() ?>

      - -

      - role() ?> -

      - - - -
    • - -
    - -
    -
    -

    Contributors

    -

    - We are very lucky to have a really supportive group of developers and translators, who build plugins and help us test and plan new features for Kirby. -

    -
    - -
    - -
    - -
    - -
    - - diff --git a/site/templates/cookbook-category.php b/site/templates/cookbook-category.php index f42e0af472..8886f7624d 100644 --- a/site/templates/cookbook-category.php +++ b/site/templates/cookbook-category.php @@ -1 +1,11 @@ -parent()->url() . '?category=' . $page->slug()) ?> + + + +title() ?> recipes + + + + $recipes +]) ?> + diff --git a/site/templates/cookbook-recipe.php b/site/templates/cookbook-recipe.php old mode 100755 new mode 100644 index 36170c5d8d..1eb8e60ca9 --- a/site/templates/cookbook-recipe.php +++ b/site/templates/cookbook-recipe.php @@ -1,52 +1,12 @@ - + -
    -
    -
    - - - - -
    -

    title()->widont() ?>

    -
    - description()->kt() ?> -
    - text()->headlines('h2')) ?> -
    - text()->kt()->anchorHeadlines() ?> -
    - - -
    -
    -
    -
    - - diff --git a/site/templates/cookbook.php b/site/templates/cookbook.php old mode 100755 new mode 100644 index 25e46f2278..5cf9013039 --- a/site/templates/cookbook.php +++ b/site/templates/cookbook.php @@ -1,51 +1,16 @@ - - -
    - -
    - -
    -

    Cookbook

    - -
    - -
    - -
    -

    - - Category: ' . $category->title()) ?> - - recipes - -

    - $recipes]) ?> - -
    -
    - -
    - -
    - - + + + +Recipes + + + + $page + ->children() + ->listed() + ->children() + ->listed() + ->sortBy('published', 'desc') +]) ?> + diff --git a/site/templates/default.php b/site/templates/default.php old mode 100755 new mode 100644 index 22688de962..b995f685c3 --- a/site/templates/default.php +++ b/site/templates/default.php @@ -1,12 +1,8 @@ - + -
    -
    - 'center']) ?> -
    - text()->kt()->anchorHeadlines() ?> -
    -
    -
    - - +
    +

    title() ?>

    +
    + text()->kt() ?> +
    +
    diff --git a/site/templates/error.php b/site/templates/error.php index f281c12b5e..6d82592fa9 100644 --- a/site/templates/error.php +++ b/site/templates/error.php @@ -1,13 +1,13 @@ - + -
    -
    - 'center']) ?> - -
    - text()->kt() ?> -
    -
    -
    - - +
    +

    + Not found 😔 +

    +
    + + +
    +
    diff --git a/site/templates/features-for-clients.php b/site/templates/features-for-clients.php new file mode 100644 index 0000000000..4cd708e7a0 --- /dev/null +++ b/site/templates/features-for-clients.php @@ -0,0 +1,7 @@ + + + + + + + diff --git a/site/templates/features-for-creators.php b/site/templates/features-for-creators.php new file mode 100644 index 0000000000..2bf7fc5739 --- /dev/null +++ b/site/templates/features-for-creators.php @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/site/templates/features-for-designers.php b/site/templates/features-for-designers.php new file mode 100644 index 0000000000..ddf2642c38 --- /dev/null +++ b/site/templates/features-for-designers.php @@ -0,0 +1,20 @@ + + + + + + + [ + 'panel', + 'field-blocks', + 'plugins', + 'languages', + 'users', + 'assets', + 'templates', + 'publish-workflow', + 'cookbook', + 'docs' + ] +]) ?> diff --git a/site/templates/features-for-developers.php b/site/templates/features-for-developers.php new file mode 100644 index 0000000000..eaeca2b112 --- /dev/null +++ b/site/templates/features-for-developers.php @@ -0,0 +1,24 @@ + + + + + + + + + + + [ + 'routes', + 'cache', + 'email', + 'languages', + 'publish-workflow', + 'authentication', + 'virtual-pages', + 'hooks', + 'content-representations', + 'multi-site' + ] +]) ?> diff --git a/site/templates/features.php b/site/templates/features.php deleted file mode 100644 index d68922ffa1..0000000000 --- a/site/templates/features.php +++ /dev/null @@ -1,621 +0,0 @@ - 'dark' ]) ?> - -
    - -
    - 'left', 'theme' => 'dark']) ?> -
    - -
    - -
    - 'The Panel', - 'id' => 'panel', - 'subheading' => 'A headquarter that adapts to your needs' - ]) ?> - -
    - 6, - 'rows' => 4, - 'class' => 'center', - 'image' => page('home')->image('dashboard.jpg')->resize(1200), - 'alt' => 'A screenshot of Kirby\'s admin interface' - ]) ?> - - 'Make it yours', - 'rows' => 3, - 'text' => 'Kirby lets you create a control panel for yourself and your editors that is tailored to your site. Make the Panel reflect the unique structure of your content, use cases and users—not the other way around.', - 'link' => 'docs/guide/blueprints/introduction' - ]) ?> - - 4, - 'rows' => 3, - 'image' => $page->image('blueprints.png'), - 'class' => 'center', - 'link' => 'docs/guide/blueprints/introduction', - 'alt' => 'An illustration of Kirby\'s flexible blueprint system' - ]) ?> - - 'User-friendly', - 'text' => 'The Panel is optimized to make editors more happy and productive. There\'s no need for long training sessions and on-boarding new editors is a breeze.' - ]) ?> - - 'Secure', - 'text' => 'Extensive permissions, brute-force login protection and state of the art session management keeps your panel protected. Customize the panel URL or even switch it off on your production server for even less attack vectors.' - ]) ?> - - 'Mobile-ready', - 'text' => 'You want to edit your site on the go? The Panel works nicely on mobile browsers in iOS and Android.' - ]) ?> - - 4, - 'rows' => 2, - 'code' => $page->bp(), - ]) ?> - - 'Blueprints', - 'text' => 'Configure the Panel interface with our unique blueprint system. Add sections, fields, tabs and create intuitive interface layouts right from your editor.', - 'link' => 'docs/guide/blueprints/introduction' - ]) ?> - - 'Quicksearch', - 'text' => 'Quickly access all pages, users and files with the global search and navigate around with ease.', - 'alt' => 'A screenshot of the quicksearch in the Panel' - ]) ?> - - 4, - 'image' => $page->image('search.jpg'), - 'class' => 'stretch', - ]) ?> - -
    -
    -
    - -
    -
    - - 'More than just pages', - 'id' => 'pages', - 'subheading' => 'Articles, albums, events, products – you name it' - ]) ?> - -
    - 6, - 'rows' => 4, - 'image' => page('home')->image('microsite.jpg')->resize(1200), - 'class' => 'center', - 'alt' => 'A screenshot of a Panel setup for blog articles' - ]) ?> - - 'On display, tailor-made', - 'text' => 'Display pages the way that fits them best: articles, albums, blogs, events, products, docs etc.

    Create individual layouts and add sections so that your pages reflect their nature right in the Panel.', - 'cols' => 3 - ]) ?> - - 3, - 'heading' => 'Drag & Drop sorting', - 'text' => 'Sorting pages or files is a breeze: Pick them up and drop them where you want them to be. It shouldn\'t be more complicated than that.' - ]) ?> - - 4, - 'rows' => 4, - 'image' => $page->image('status.png'), - 'class' => 'center autosize', - 'alt' => 'A screenshot of Kirby\'s modal window to switch a page status from draft to public' - ]) ?> - - 'Drafts', - 'text' => 'Prepare your content and only publish it when everything is in place with the click of a button. Send preview links to others so they can review your drafts before they go live.', - 'rows' => 2 - ]) ?> - - 'Publishing workflows', - 'rows' => 2, - 'text' => 'Your pages can have three different states: draft, unlisted and listed. Those states can be customized to fit your publishing workflow.', - 'link' => 'docs/guide/content/publishing-workflow', - ]) ?> - - 'Custom layouts', - 'rows' => 2, - 'text' => 'You want more? Create your own plugins to display pages. Complex tables, gallery grids, maybe even a kanban board? Build your own pages section plugins and get creative.', - 'link' => 'docs/reference/plugins/extensions/sections' - ]) ?> - - 4, - 'rows' => 2, - 'class' => 'stretch', - 'image' => $page->image('pagetable.jpg'), - 'link' => 'https://github.com/sylvainjule/kirby-pagetable', - 'alt' => 'A screenshot of the PageTable plugin by Sylvain Julé', - ]) ?> - -
    -
    -
    - -
    -
    - 'Content management', - 'id' => 'content', - 'subheading' => 'Structure your content like never before' - ]) ?> - -
    - 6, - 'rows' => 4, - 'image' => page('home')->image('article.jpg')->resize(1200), - 'class' => 'stretch', - 'alt' => 'An example of a more complex panel layout with multiple custom fields' - ]) ?> - - 'Custom Fields', - 'text' => 'Kirby comes with a wide variety of fields that help you build intuitive forms for your content editors and find the right input type for your data.', - 'link' => 'docs/reference/panel/fields' - ]) ?> - - 'Auto-saving', - 'text' => 'Don\'t worry about unsaved changes. The Panel stores them for you automatically—even when you go offline—and you can save them later.', - 'link' => 'docs/guide/content/publishing-workflow#unsaved-changes', - ]) ?> - - 'Content-locking', - 'text' => 'Collaborate with peace of mind: Kirby\'s advanced content locking features make sure that unsaved changes are never overwritten by your team mates.', - 'link' => 'docs/guide/content/publishing-workflow#content-locking', - ]) ?> - -
    -
    -
    - -
    -
    - 'Next level editing', - 'id' => 'editor', - 'subheading' => 'Write with style, stay in style' - ]) ?> - -
    - 'Writing', - 'text' => 'Content editors love the flexibility and intuitive features of our blocks field. Write without distraction and add formatting you can trust. The result will be clean, accessible and polished for the web.', - 'link' => 'docs/reference/panel/fields/blocks', - ]) ?> - - 4, - 'rows' => 6, - 'class' => 'stretch', - 'image' => $page->image('blocks.jpg'), - 'link' => 'docs/reference/panel/fields/blocks', - 'alt' => 'A screenshot of Kirby\'s visual block editor' - ]) ?> - - 'Full control', - 'text' => 'As a developer, you decide how each individual block type is rendered. You control the markup and the design. Nothing happens by accident and all content stays structured.', - 'link' => 'docs/reference/panel/fields/blocks' - ]) ?> - - 'Extensible', - 'text' => 'Add new block types: You need a call to action button, product previews or a table block? No problem! Our powerful block component API, based on Vue.js, is here for you.', - 'link' => 'docs/reference/panel/fields/blocks' - ]) ?> -
    -
    -
    - -
    -
    - 'Asset managament', - 'id' => 'assets', - 'subheading' => 'Images, documents, videos, spreadsheets, etc.' - ]) ?> - -
    - 6, - 'rows' => 4, - 'image' => page('home')->image('interface-4.jpg')->resize(1200), - 'alt' => 'An example of a photo gallery setup in the Panel' - ]) ?> - - 'Your files', - 'text' => 'Add galleries, covers, hero images, PDF downloads and more right on your page with files sections.', - 'link' => 'docs/guide/content/files' - ]) ?> - - 'Drag & Drop uploads', - 'text' => 'Editors can upload multiple new files at once with the intuitive drag & drop uploader.', - ]) ?> - - 'Quality assurance', - 'text' => 'Add fine-grained upload validators and check for image dimensions, file types, file size and more to avoid unwanted uploads.', - 'link' => 'docs/reference/panel/blueprints/file#accept', - ]) ?> - - 'Metadata', - 'text' => 'Add custom metadata to your files. Define different file types and customize the metadata fields for each type. An image might need a caption and some alternative text. A PDF catalogue download could have an additional pricing list. You can even use those fields for internal notes in your team.', - 'rows' => 4, - 'link' => 'docs/reference/panel/blueprints/file', - 'alt' => 'The file metadata editor in the Panel' - ]) ?> - - 4, - 'rows' => 4, - 'image' => $page->image('metadata.jpg'), - 'class' => 'center stretch', - 'link' => 'docs/reference/panel/blueprints/file', - ]) ?> - - 4, - 'rows' => 4, - 'code' => $page->media()->kt(), - ]) ?> - - 'Media API', - 'text' => 'Kirby comes with an asynchronous media modification API. Resize, crop and convert your images right on the fly in your templates. Start prototyping with different image formats in the browser. Make sure that every visitor gets the perfect image size.', - 'rows' => 4, - 'link' => 'docs/guide/templates/resize-images-on-the-fly', - ]) ?> -
    -
    -
    - -
    -
    - 'At the core: Files & Folders', - 'id' => 'no-database', - 'subheading' => 'A rock solid, yet simple foundation' - ]) ?> - -
    - - 4, - 'rows' => 6, - 'code' => $page->filesystem(), - ]) ?> - - 'Simple', - 'text' => 'Stay in control over your data. Kirby stores your data in files and folders. Universally accessible in each operating system and editable with any text editor.', - 'link' => 'docs/guide/content/introduction' - ]) ?> - - 'Fast', - 'text' => 'The file system is much faster than you might think. Most often even way faster than a database. Add SSD drives to your server and you have a system that can fly.' - ]) ?> - - 'Resilient', - 'text' => 'Files and folders are probably the most future-proof way to store your data. Add version control via Git, simple backup options and syncing via tools like rsync.' - ]) ?> - -
    -
    -
    - -
    -
    - 'Templating', - 'id' => 'templating', - 'subheading' => 'Stay in control of your markup. Keep your projects lean.' - ]) ?> - -
    - - 4, - 'heading' => 'Templates', - 'text' => 'Kirby comes with a powerful PHP-based template engine. Optimized for speed and equipped with an ultra flexible and intuitive PHP API, you can build your perfect frontend the way you like.', - 'link' => 'docs/guide/templates/basics' - ]) ?> - - 4, - 'rows' => 4, - 'code' => $page->templates(), - ]) ?> - - 'Controllers', - 'text' => 'Too much logic for your templates? Use Kirby\'s controllers to handle complex data collections, form handling, URL query-based filters and more without cluttering your templates. Marie Kondō agrees.', - 'link' => 'docs/guide/templates/controllers' - ]) ?> - - 'Models', - 'text' => 'Super-charge your pages with additional functionalities. Page models extend our default page class and offer unlimited opportunities to customize what a page represents.', - 'link' => 'docs/guide/templates/page-models' - ]) ?> - - 'Collections', - 'text' => 'Keep your code DRY with collections. Featured articles, upcoming events, team members – create reusable collections and use them in your templates or plugins.', - 'link' => 'docs/guide/templates/collections' - ]) ?> - - 4, - 'rows' => 4, - 'code' => $page->twig(), - ]) ?> - - 4, - 'heading' => 'Bring your own engine', - 'text' => 'Your team is familiar with Twig, Blade or your own template engine? No problem! Our engine can be swapped out with an existing plugin or you can even create your own.', - 'link' => 'docs/reference/plugins/components/template' - ]) ?> - -
    -
    -
    - -
    -
    - 'Go headless', - 'id' => 'api', - 'subheading' => 'Modern publishing possibilities at your fingertips' - ]) ?> - -
    - 'REST-ful by nature', - 'text' => 'Use Kirby like a classic CMS or convert it into a powerful, headless content container. Connect it to mobile applications, static site generators or your custom frontend.', - 'link' => 'docs/guide/api/introduction' - ]) ?> - - 4, - 'rows' => 6, - 'code' => $page->api(), - ]) ?> - - 'Extensible', - 'text' => 'Define your own API endpoints and objects. Integrate external data from databases, files or other APIs with data from Kirby into one seamless data-source.', - 'link' => 'docs/reference/plugins/extensions/api' - ]) ?> - - 'Secure', - 'text' => 'Use our built-in authentication methods to connect securely from the same server or a remote application.', - 'link' => 'docs/guide/api/authentication' - ]) ?> - -
    -
    -
    - -
    -
    - 'Go global', - 'id' => 'languages', - 'subheading' => 'Built-in internationalization' - ]) ?> - -
    - $page->image('languages.png'), - 'cols' => 3, - 'rows' => 3, - 'heading' => 'Language management', - 'text' => 'Create new content languages right in the Panel and start translating your pages immediately. Start with a single language and move to multiple languages later, or go global immediately—it\'s up to your project.', - 'link' => 'docs/guide/languages/introduction', - 'alt' => 'Kirby\'s language manager in the Panel' - ]) ?> - - 'Create & Translate', - 'image' => $page->image('translations.jpg'), - 'cols' => 3, - 'rows' => 3, - 'text' => 'Internationalization is built into the core of Kirby. Switch intuitively between different language versions and translate your content together with your team or on your own.', - 'link' => 'docs/guide/languages/translating-content', - 'alt' => 'The translation switcher in the Panel' - ]) ?> - - 'Translatable URLs', - 'text' => 'You can customize the main URL for each language, including subdomains. Combine this with translatable paths for pages to make your visitors feel at home.', - 'link' => 'docs/guide/languages/translating-urls', - ]) ?> - - 'Language detection', - 'text' => 'Switch to automatic language detection and let Kirby figure out which language works best for your current visitor.' - ]) ?> - - 'Integrate', - 'text' => 'Are you using a translation service like Memsource? Use the amazing Memsource plugin to import and export translations for your translators right from the Panel.', - 'link' => 'https://github.com/OblikStudio/kirby-memsource' - ]) ?> -
    -
    -
    - -
    -
    - 'User management', - 'id' => 'users', - 'subheading' => 'You are not alone in this' - ]) ?> - -
    - 'From the backend...', - 'text' => 'The Panel offers you an easy way to manage your users and set up permissions based on different roles. Create different user types and store metadata to your users.', - 'link' => 'docs/guide/users/managing-users', - ]) ?> - - $page->image('users.jpg'), - 'cols' => 4, - 'rows' => 2, - 'link' => 'docs/guide/users/managing-users', - 'alt' => 'A screenshot of the user management in the Panel' - ]) ?> - - 4, - 'rows' => 2, - 'code' => $page->users(), - ]) ?> - - '...to the front stage', - 'text' => 'Integrate user permissions in your site to create protected sections on your site. Or launch whole communities based on Kirby\'s user system.' - ]) ?> -
    -
    -
    - -
    -
    - 'Plugins', - 'id' => 'plugins', - 'subheading' => 'Endless options for projects without roadblocks' - ]) ?> - -
    - 4, - 'rows' => 3, - 'image' => $page->image('matomo.jpg'), - 'link' => 'https://github.com/sylvainjule/kirby-matomo', - 'alt' => 'A screenshot of the Matomo section plugin by Sylvain Julé' - ]) ?> - - 3, - 'heading' => 'Custom sections', - 'text' => 'Add entirely new interface elements to the Panel with custom sections. Integrate data from analytics tools, your ERM system, third-party services and more and use them seamlessly alongside your content. Use the power of Vue.js to create truly interactive plugins.', - 'link' => 'https://getkirby.com/docs/reference/plugins/extensions/sections' - ]) ?> - - 'Routes', - 'text' => 'Routing has never been easier: Kirby comes with a powerful router that can be extended to adjust the URL scheme, handle form submissions, add webhook endpoints or create virtual pages.', - 'link' => 'docs/guide/routing' - ]) ?> - - 'Hooks', - 'text' => 'React to specific events with hooks and trigger your own actions. Resize a file on upload, add data to a newly created page, add custom content validations and more.', - 'link' => 'docs/reference/plugins/extensions/hooks' - ]) ?> - - 'Field methods', - 'text' => 'Register additional methods to work with content fields. Transform content directly in your templates and clean up your template code along the way.', - 'link' => 'docs/reference/plugins/extensions/field-methods' - ]) ?> - - 3, - 'heading' => 'Custom fields', - 'text' => 'Extend your forms with your own fields or use plugins from other developers. Data editing on steroids: locations, colors, annotations etc.', - 'link' => 'docs/reference/plugins/extensions/fields' - ]) ?> - - 4, - 'rows' => 3, - 'image' => $page->image('locator.jpg'), - 'link' => 'https://github.com/sylvainjule/kirby-locator', - 'alt' => 'A screenshot of the Locator field plugin by Sylvain Julé' - ]) ?> - - 'Core components', - 'text' => 'You don\'t like our template engine, Markdown parser or media API? Simply swap out major parts of the Kirby system with your own plugins.', - 'link' => 'docs/reference/plugins/extensions/core-components' - ]) ?> - - 'KirbyTags', - 'text' => 'When Markdown isn\'t enough, add your own KirbyTags to simplify plain text formatting and to inject complex custom components into long-form text.', - 'link' => 'docs/reference/plugins/extensions/kirbytags' - ]) ?> - - 'Caching', - 'text' => 'Kirby comes with mighty caching on board. Not fitting for your project? Add your cache driver of choice and reduce page loading times in the blink of an eye.', - 'link' => 'docs/guide/cache' - ]) ?> - - 4, - 'rows' => 3, - 'class' => 'center', - 'image' => $page->image('retour.jpg'), - 'link' => 'https://github.com/distantnative/retour-for-kirby', - 'alt' => 'A screenshot of the Retour view plugin by Nico Hoffmann' - ]) ?> - - 3, - 'heading' => 'Custom views', - 'text' => 'Add whole new views and menu items to the Panel. Use Vue.js to super-charge it as an admin framework for your own integrated applications.', - 'link' => 'docs/reference/plugins/extensions/panel-views' - ]) ?> - -
    -
    -
    - -
    -
    - -
    -
    - -
    - - 'dark']) ?> diff --git a/site/templates/glossary-entry.php b/site/templates/glossary-entry.php deleted file mode 100755 index 6acdb740c8..0000000000 --- a/site/templates/glossary-entry.php +++ /dev/null @@ -1 +0,0 @@ -parent()->url() . '/#' . $page->slug()) ?> diff --git a/site/templates/glossary.php b/site/templates/glossary.php index 793be35419..b7ccee199e 100755 --- a/site/templates/glossary.php +++ b/site/templates/glossary.php @@ -1,28 +1,19 @@ - + -
    - -
    - -
    -

    title() ?>

    -
    - - - -
    - -
    - - + diff --git a/site/templates/guide.php b/site/templates/guide.php old mode 100755 new mode 100644 index 65fe167f18..d080df47cd --- a/site/templates/guide.php +++ b/site/templates/guide.php @@ -1,57 +1,9 @@ - - -
    - -
    -
    - - - -
    -

    Guide

    - page('docs/guide')->children()->listed()]) ?> -
    - - - -
    - -
    -

    title()->html()->widont() ?>

    -
    - - intro()->isNotEmpty()): ?> -
    - intro()->kt() ?> -
    - - - text()->headlines('h2')) ?> - -
    - text()->kt()->anchorHeadlines() ?> -
    - - subpages()->isTrue()): ?> - - - - - - -
    - -
    -
    -
    - - + + + + 'Guide', + 'link' => '/docs/guide', + 'menu' => page('docs/guide')->children()->listed(), +]) ?> + diff --git a/site/templates/guides.php b/site/templates/guides.php index 5a2477735b..56bdbb0997 100644 --- a/site/templates/guides.php +++ b/site/templates/guides.php @@ -1,38 +1,26 @@ - - -
    - -
    - -
    -

    title() ?>

    -
    - - structure()->yaml() as $categoryTitle => $categoryPages): ?> -
    -

    - - - -
    - - -
    - -
    - - + + +
    +

    Guide

    + +
    + + diff --git a/site/templates/home.php b/site/templates/home.php index 52eb7954f5..c9246e6143 100644 --- a/site/templates/home.php +++ b/site/templates/home.php @@ -1,217 +1,29 @@ - 'dark' ]) ?> - -
    - - -
    -
    -
    -
    -

    Kirby: the CMS that adapts to any project, loved by developers and editors alike

    - -
    -
    - $chameleon, - 'srcset' => [450, 800], - ]) ?> -
    -
    -
    - $hero, - 'srcset' => [640, 800, 1024, 1600, 1824], - ]) ?> -
    -
    -
    - -
    -

    You define the interface for your content

    -
    -

    - With Kirby, you build your own - ideal interface. Combine forms, galleries, articles, spreadsheets - and more into an amazing editing experience. -

    -
    - $components, - 'srcset' => [1200, 2000], - ]) ?> -
    -
    -
    - - -
    -

    Kirby’s control panel

    -
    -
    - - - - -
    -
    -
    - - -
    -

    Plugins

    -
    -
    -

    And if you ever run out of ideas or possibilities? Get a plugin or build your own interface elements.

    -

    …like this fantastic Matomo plugin
    by Sylvain Julé

    -
    -
    - $matomo, - 'link' => 'https://github.com/sylvainjule/kirby-matomo', - 'srcset' => [600, 1200], - ]) ?> -
    -
    -
    - - -
    -

    Highlights

    -
    -
    -
    -

    - Just files and folders -

    - - filesystem()->kt() ?> - -
      -
    • Drag & Drop installation via FTP
    • -
    • Very robust and easy to back up
    • -
    • Simple version control via Git
    • -
    • Incredible performance
    • -
    • Super fast development process
    • -
    -
    -
    -

    - Your markup on fire -

    - - templates()->kt() ?> - -
      -
    • High-performance PHP template engine
    • -
    • Powerful chainable PHP API
    • -
    • Combine data from everywhere on your site
    • -
    • Built-in image manipulation
    • -
    • Replaceable template engine (bring your own engine)
    • -
    -
    -
    - -
    -
    - - -
    -

    Features

    -
    -
      - find('features')->children() as $feature): ?> -
    • -
      - image()->read() ?> -
      -

      title() ?>

      -
      text()->kt() ?>
      -
    • - -
    -

    Not convinced yet? Find out why Kirby is made for you ›

    -
    -
    - - -
    - - -
    -
    -

    - Don't take our word for it: -

    - - -
    -
    - -
    -
    -

    Kirby is trusted by brands world-wide

    - -
    -
    - - -
    -

    Get started

    - - - Try Kirby 3 now - - - - Buy a license - -
    - -
    - - -
    -
    -
    -

    We publish a monthly newsletter called Kosmos with all kinds of news about Kirby and the web.

    - -
    -
    -
    - -
    - - 'dark']) ?> + + + +
    +
    + + + + + +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    + + diff --git a/site/templates/konf.php b/site/templates/konf.php deleted file mode 100755 index 0681c32c1c..0000000000 --- a/site/templates/konf.php +++ /dev/null @@ -1,186 +0,0 @@ - 'dark' ]) ?> - -
    - -
    -
    -
    -
    - 'left', 'theme' => 'dark']) ?> - - - - Tickets - -
    - -
    - image('3st.jpg')->resize(800) ?> -
    -
    -
    - -
    - -
    -
    -
    - Kirby Konf is the first official conference for Kirby developers. - A cosy single-day event, packed with interesting sessions and time to meet the team & community -
    - -
    -

    Conference Family gathering

    - -
    -
    - image('agency-1.jpg')->crop(900, 500) ?> -
    - -
    -

    - The Kirby community has always felt like a very friendly family and this event is our first family gathering. -

    -

    - Inspired by the spirit of indie web camps, it's all about meeting other Kirby developers, sharing tips and tricks, learning and working together. -

    -

    With just 50 available tickets, we intentionally want to keep it small.

    -
    - -
    -

    - 3st digital invited us to host the first Kirby Konf at their beautiful office and it couldn't be a better match for this concept. -

    -

    - A 15 minute walk from the Mainz train station, the agency is located directly at the river Rhine with a beautiful view. The modernized warehouse offers unique, friendly spaces that invite to hang out and work together. -

    -
    -
    - image('agency-2.jpg')->crop(900, 500) ?> -
    - -
    - image('mainz.jpg')->crop(900, 500) ?> -
    -
    -

    - Mainz is the capital of Rhineland-Palatinate. Well known for its world-famous vineyards, beautiful landscapes and picturesque villages, this area in Southern Germany is definitely worth a visit and an extended stay. -

    - Mainz is well connected via train, Autobahn and close to the Frankfurt Airport (FRA). -

    -

    - Google Maps › -

    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    -

    Schedule

    - -
    -
    -

    Warm-up

    -
    -

    - We are currently planning a warm-up event on Friday 20th before the conference. The warm-up will start at about 19:00. -

    -

    Please register for the warm-up when you get your ticket. The warm-up will be free, but we need to plan ahead how many people will attend.

    -

    - We haven't found a venue for it yet. Stay tuned for updates! -

    -
    -
    -
    -

    Conference

    -
    -

    - Registration:
    09:00 -

    -

    - Keynote by Bastian:
    10:00 -

    -

    - Morning Sessions:
    11:00 - 13:00 -

    -

    - Lunch:
    13:00 - 14:30 -

    -

    - Afternoon Sessions:
    14:30 - 17:00 -

    -

    - Next to our own sessions, we are currently collecting ideas for community-driven sessions. You are invited to add your own ideas! -

    -
    -
    -
    -

    After party

    -
    -

    - We will keep it cosy for the after party. Let's have drinks at the venue together and then move out for dinner and explore Mainz. -

    -

    - There's no registration.
    We keep this simple. -

    -
    -
    -
    - -
    -

    Tickets

    - - - - - - -
    -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -

    Links

    - -
    -
    -
    -
    - -
    - - 'dark']) ?> diff --git a/site/templates/kosmos-issue.php b/site/templates/kosmos-issue.php index eccafa3e3e..12f8db138f 100644 --- a/site/templates/kosmos-issue.php +++ b/site/templates/kosmos-issue.php @@ -1,40 +1,50 @@ - 'dark' ]) ?> - -
    -
    - - - -
    -

    - Kirby Kosmos
    -

    - -
    - - -
    -
    - text()->kt()->anchorHeadlines() ?> -
    -
    - -
    - -
    - - 'dark']) ?> + + + + + + + + + +
    +

    Episode slug() ?>

    + date()->toDate('d M Y') ?> +
    + + + + 'In this episode']) ?> + + + +
    +

    Join 3,000+ readers

    + +
    + diff --git a/site/templates/kosmos.php b/site/templates/kosmos.php old mode 100755 new mode 100644 index 9495b1683e..4f7dad8b9e --- a/site/templates/kosmos.php +++ b/site/templates/kosmos.php @@ -1,13 +1,35 @@ - 'dark']) ?> + -
    -
    - 'left', 'theme' => 'dark']) ?> - + -

    All issues

    - $page->children()->listed()->flip()]) ?> -
    -
    +
    +
    +
    +

    Kosmos is our monthly newsletter about Kirby and the web

    + page('voices/ryan-gorley')]) ?> +
    + - 'dark']) ?> +
    + +
    +

    Past episodes

    +
      + children()->flip() as $issue): ?> +
    • + $issue]) ?> +
    • + +
    +
    +
    diff --git a/site/templates/legacy.php b/site/templates/legacy.php deleted file mode 100755 index 1c873bd43b..0000000000 --- a/site/templates/legacy.php +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/site/templates/page.php b/site/templates/page.php deleted file mode 100755 index 9fa2e648ab..0000000000 --- a/site/templates/page.php +++ /dev/null @@ -1,54 +0,0 @@ - - -
    - -
    -
    - - - -
    -

    title() ?>

    - $root->children()]) ?> -
    - - - -
    - -
    -

    headline()->or($page->title())->html()->widont() ?>

    -
    - - intro()->isNotEmpty()): ?> -
    - intro()->kt() ?> -
    - - - text()->headlines('h2')) ?> - -
    - text()->kt()->anchorHeadlines() ?> -
    - - subpages()->isTrue()): ?> - - - -
    - -
    -
    -
    - - diff --git a/site/templates/plugin-developer.php b/site/templates/plugin-developer.php deleted file mode 100644 index 7571bbfe33..0000000000 --- a/site/templates/plugin-developer.php +++ /dev/null @@ -1 +0,0 @@ -parent()->url()) ?> diff --git a/site/templates/plugin.json.php b/site/templates/plugin.json.php deleted file mode 100644 index 2e4b405b11..0000000000 --- a/site/templates/plugin.json.php +++ /dev/null @@ -1 +0,0 @@ -toJson(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); diff --git a/site/templates/plugin.php b/site/templates/plugin.php index 4e44eb652f..399057e530 100644 --- a/site/templates/plugin.php +++ b/site/templates/plugin.php @@ -1,87 +1,53 @@ - 'dark' ]) ?> + -
    +
    -
    +
    -
    -
    - - images()->findBy('name', 'screenshot')): ?> -
    -
    -

    title() ?> Plugin

    -
    - description()->kt() ?> -
    +
    +
    +

    title() ?>

    +
    +
    + description()->kt()->widont() ?>
    -
    - -
    -
    - -

    title() ?> Plugin

    -
    - description()->kt() ?>
    - -
    -
    -
    -
    - -
    + screenshot()): ?> +
    + + resize(600)->html(['class' => 'shadow-2xl']) ?> + +
    +
    - count()): ?> -
    -
    -

    Other plugins by title() ?>

    - $authorPlugins ]) ?> -
    -
    - - - count()): ?> -
    -
    -

    Related plugins

    - $relatedPlugins]) ?> -
    -
    - -
    - -
    - - 'dark' ]) ?> + + + count()): ?> +
    +

    Other plugins by title() ?>

    + $authorPlugins ]) ?> +
    + + + count()): ?> +
    +

    Related plugins

    + $relatedPlugins]) ?> +
    + + diff --git a/site/templates/plugins.json.php b/site/templates/plugins.json.php index c5085e6174..89ce6345c4 100644 --- a/site/templates/plugins.json.php +++ b/site/templates/plugins.json.php @@ -2,8 +2,8 @@ $plugins = []; -foreach ($page->grandChildren() as $plugin) { +foreach ($page->grandChildren()->sortBy('title', 'asc') as $plugin) { $plugins[] = $plugin->toJson(true); } -echo json_encode($plugins, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); +echo json($plugins); diff --git a/site/templates/plugins.php b/site/templates/plugins.php index cbefbbfdb1..70e691f3c6 100644 --- a/site/templates/plugins.php +++ b/site/templates/plugins.php @@ -1,53 +1,4 @@ - + -
    - -
    - -
    -

    Plugins

    - -
    - -
    - -
    - - -

    - Category: ' . $category) ?> - by: ' . $developer) ?> -

    - $plugins, 'class' => 'plugins-directory']) ?> - - -

    All plugins

    - $plugins, 'featured' => false, 'class' => 'plugins-directory']) ?> - - - -
    -
    - -
    - -
    - - +

    + $plugins]) ?> diff --git a/site/templates/press.php b/site/templates/press.php index cf63658fdb..18d6844d83 100755 --- a/site/templates/press.php +++ b/site/templates/press.php @@ -1,47 +1,40 @@ - + -
    - -
    - - + diff --git a/site/templates/reference-article.php b/site/templates/reference-article.php old mode 100755 new mode 100644 index 2698f7db7e..5fc3f6d299 --- a/site/templates/reference-article.php +++ b/site/templates/reference-article.php @@ -1,11 +1,5 @@ - + - text()->headlines('h2')) ?> - -
    - text()->kt()->anchorHeadlines() ?> -
    - - - - +
    + text()->kt() ?> +
    diff --git a/site/templates/reference-block.php b/site/templates/reference-block.php index cec13f3717..86e82d60a0 100644 --- a/site/templates/reference-block.php +++ b/site/templates/reference-block.php @@ -1,6 +1,6 @@ - + -
    + - - - - diff --git a/site/templates/reference-class.php b/site/templates/reference-class.php deleted file mode 100755 index 752e46202a..0000000000 --- a/site/templates/reference-class.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference-classaliases.php b/site/templates/reference-classaliases.php new file mode 100644 index 0000000000..42edc4eecc --- /dev/null +++ b/site/templates/reference-classaliases.php @@ -0,0 +1,5 @@ + + +
    + $page->children()]) ?> +
    diff --git a/site/templates/reference-classmethod.php b/site/templates/reference-classmethod.php old mode 100755 new mode 100644 index 3ff4a75792..195487623c --- a/site/templates/reference-classmethod.php +++ b/site/templates/reference-classmethod.php @@ -1,17 +1,8 @@ - + - $page->methodCall()]) ?> +
    + + -
    - - $page->parameters()]) ?> - $page->returnType()]) ?> - $page->throws()]) ?> - - text()->kt()->anchorHeadlines() ?> - - $page->inheritedFrom()]) ?> - $page->githubSource()]) ?> -
    - - + text()->kt() ?> +
    diff --git a/site/templates/reference-component.php b/site/templates/reference-component.php old mode 100755 new mode 100644 index 57e5026ec3..407b3ac151 --- a/site/templates/reference-component.php +++ b/site/templates/reference-component.php @@ -1,16 +1,9 @@ - + -
    +
    + text()->kt() ?> - text()->kt()->anchorHeadlines() ?> + + +
    - $page->parameters()]) ?> - $page->returnType()]) ?> - - $page->githubSource()]) ?> - -
    - - - - diff --git a/site/templates/reference-endpoint.php b/site/templates/reference-endpoint.php deleted file mode 100755 index 3f483b437c..0000000000 --- a/site/templates/reference-endpoint.php +++ /dev/null @@ -1,20 +0,0 @@ - - -
    -
    request() ?>
    - - text()->kt()->anchorHeadlines() ?> - - response()->isNotEmpty()): ?> -

    Example response

    - -
    -
    info() ?>: example()->or($page->title()) ?>
    -
    response() ?>
    -
    - -
    - - - - diff --git a/site/templates/reference-endpoints.php b/site/templates/reference-endpoints.php deleted file mode 100755 index 5bc455f702..0000000000 --- a/site/templates/reference-endpoints.php +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/site/templates/reference-extension.php b/site/templates/reference-extension.php deleted file mode 100755 index 3440f13c10..0000000000 --- a/site/templates/reference-extension.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference-extensions.php b/site/templates/reference-extensions.php deleted file mode 100755 index 752e46202a..0000000000 --- a/site/templates/reference-extensions.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference-fieldmethod.php b/site/templates/reference-fieldmethod.php old mode 100755 new mode 100644 index dbcbd335e4..4b97fb0aab --- a/site/templates/reference-fieldmethod.php +++ b/site/templates/reference-fieldmethod.php @@ -1,26 +1,9 @@ - + - $page->methodCall()]) ?> +
    + + -
    - $page->parameters()]) ?> - $page->returnType()]) ?> + text()->kt() ?> +
    - aliases()) === false): ?> -

    Aliases

    -

    You can use the following aliases for this field method in your template.

    -
      - aliases() as $alias): ?> -
    • $field->( ... )
    • - -
    - - - text()->kt()->anchorHeadlines() ?> - - $page->githubSource()]) ?> -
    - - - - diff --git a/site/templates/reference-fieldmethods.php b/site/templates/reference-fieldmethods.php deleted file mode 100755 index 752e46202a..0000000000 --- a/site/templates/reference-fieldmethods.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference-helper.php b/site/templates/reference-helper.php old mode 100755 new mode 100644 index 3d4e9e2841..3f956a1181 --- a/site/templates/reference-helper.php +++ b/site/templates/reference-helper.php @@ -1,18 +1,6 @@ - + - $page->methodCall()]) ?> - -
    - - $page->parameters()]) ?> - $page->returnType()]) ?> - - text()->kt()->anchorHeadlines() ?> - - $page->githubSource()]) ?> - -
    - - - - +
    + + text()->kt() ?> +
    diff --git a/site/templates/reference-helpers.php b/site/templates/reference-helpers.php deleted file mode 100755 index 752e46202a..0000000000 --- a/site/templates/reference-helpers.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference-hook.php b/site/templates/reference-hook.php old mode 100755 new mode 100644 index 26dba6837b..2f2001e56a --- a/site/templates/reference-hook.php +++ b/site/templates/reference-hook.php @@ -1,9 +1,6 @@ - + -
    -

    Example

    - example()->kt() ?> - details()->kt() ?> -
    - - +
    + example()->kt() ?> + details()->kt() ?> +
    diff --git a/site/templates/reference-hooks.php b/site/templates/reference-hooks.php deleted file mode 100755 index 752e46202a..0000000000 --- a/site/templates/reference-hooks.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference-icon.php b/site/templates/reference-icon.php old mode 100755 new mode 100644 index 1ff687c1bc..3054220a0a --- a/site/templates/reference-icon.php +++ b/site/templates/reference-icon.php @@ -1,26 +1,50 @@ - $page->parent()->svg()]) ?> + -
    - text()->kt()->anchorHeadlines() ?> +
    + text()->kt() ?> +
    - -
    -

    -
      - -
    • -

      px

      -
      - - - -
      -
    • - -
    -
    + +
    +

    + + + +

    +
      + +
    • +

      px

      +
      + + + +
      +
    • +
    +
    + -
    - - + diff --git a/site/templates/reference-icons.php b/site/templates/reference-icons.php deleted file mode 100755 index 87943e9f0e..0000000000 --- a/site/templates/reference-icons.php +++ /dev/null @@ -1,4 +0,0 @@ -svg(); -require 'reference-section.php'; -?> \ No newline at end of file diff --git a/site/templates/reference-kirbytag.php b/site/templates/reference-kirbytag.php old mode 100755 new mode 100644 index de250f786d..00f7e9add8 --- a/site/templates/reference-kirbytag.php +++ b/site/templates/reference-kirbytag.php @@ -1,22 +1,18 @@ - + -
    - -

    Attributes

    +
    + attributes()) > 0): ?> +

    Attributes

    +
    - + attributes() as $attribute): ?>
    - - - text()->kt()->anchorHeadlines() ?> - - $page->githubSource()]) ?>
    + - - - + text()->kt() ?> +
    diff --git a/site/templates/reference-kirbytags.php b/site/templates/reference-kirbytags.php deleted file mode 100755 index 752e46202a..0000000000 --- a/site/templates/reference-kirbytags.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference-packages.php b/site/templates/reference-packages.php index c5d1397ffa..06e6cbbaec 100644 --- a/site/templates/reference-packages.php +++ b/site/templates/reference-packages.php @@ -1,32 +1,8 @@ - - - - - + + +children()->listed() as $package): ?> +
    +

    title() ?>

    + children()->listed()) ?> +
    + diff --git a/site/templates/reference-panelsection.php b/site/templates/reference-panelsection.php deleted file mode 100755 index 36cfe1ea88..0000000000 --- a/site/templates/reference-panelsection.php +++ /dev/null @@ -1,11 +0,0 @@ - - - text()->headlines('h2')) ?> - -
    - text()->kt()->anchorHeadlines('h2') ?> -
    - - - - diff --git a/site/templates/reference-panelsections.php b/site/templates/reference-panelsections.php deleted file mode 100755 index 752e46202a..0000000000 --- a/site/templates/reference-panelsections.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference-root.php b/site/templates/reference-root.php deleted file mode 100755 index 6273137f4a..0000000000 --- a/site/templates/reference-root.php +++ /dev/null @@ -1,15 +0,0 @@ - - -
    -

    Example

    - example()->kt() ?> - -

    Custom root setup

    - parent()->custom()->replace(['root' => $page->slug()])->kt() ?> - - text()->kt() ?> -
    - - - - diff --git a/site/templates/reference-roots.php b/site/templates/reference-roots.php deleted file mode 100755 index 752e46202a..0000000000 --- a/site/templates/reference-roots.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference-section.php b/site/templates/reference-section.php old mode 100755 new mode 100644 index c93e995cdf..6247022b01 --- a/site/templates/reference-section.php +++ b/site/templates/reference-section.php @@ -1,43 +1,17 @@ - $icons ?? null]) ?> + -
    + + -
    - -
    + +
    + + +
    -
    + -
    -

    title() ?>

    - - excerpt()->isNotEmpty()): ?> -
    - excerpt()->kt() ?> -
    - - - -
    - -
    - children()->hasAdvanced()): ?> - - - $page, - 'excerpt' => $excerpt ?? false, - ]) ?> -
    - - text()->isNotEmpty()): ?> -
    - text()->kt()->anchorHeadlines() ?> -
    - - -
    - -
    - - +
    + text()->kt() ?> +
    + diff --git a/site/templates/reference-system.php b/site/templates/reference-system.php new file mode 100644 index 0000000000..8c37f810d2 --- /dev/null +++ b/site/templates/reference-system.php @@ -0,0 +1,11 @@ + + +
    +

    Example

    + example()->kt() ?> + +

    Custom setup

    + setup() ?> + + text()->kt() ?> +
    diff --git a/site/templates/reference-ui.php b/site/templates/reference-ui.php deleted file mode 100755 index 3440f13c10..0000000000 --- a/site/templates/reference-ui.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference-url.php b/site/templates/reference-url.php deleted file mode 100755 index 077b295f79..0000000000 --- a/site/templates/reference-url.php +++ /dev/null @@ -1,15 +0,0 @@ - - -
    -

    Example

    - example()->kt() ?> - -

    Custom Url setup

    - parent()->custom()->replace(['url' => $page->slug()])->kt() ?> - - text()->kt() ?> -
    - - - - diff --git a/site/templates/reference-urls.php b/site/templates/reference-urls.php deleted file mode 100755 index 752e46202a..0000000000 --- a/site/templates/reference-urls.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference-validator.php b/site/templates/reference-validator.php old mode 100755 new mode 100644 index c76596776d..3f956a1181 --- a/site/templates/reference-validator.php +++ b/site/templates/reference-validator.php @@ -1,16 +1,6 @@ - + -
    - $page->methodCall()]) ?> - - $page->parameters()]) ?> - 'bool']) ?> - - text()->kt() ?> - - $page->githubSource()]) ?> -
    - - - - +
    + + text()->kt() ?> +
    diff --git a/site/templates/reference-validators.php b/site/templates/reference-validators.php deleted file mode 100755 index 752e46202a..0000000000 --- a/site/templates/reference-validators.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/reference.php b/site/templates/reference.php index 6b38ecaeb0..c4d2c7fbe3 100644 --- a/site/templates/reference.php +++ b/site/templates/reference.php @@ -1,32 +1,18 @@ - + -
    -
    - -
    -
    +collection('reference') as $group): ?> +
    +

    title() ?>

    - collection('reference') as $group): ?> -

    title() ?>

    - - children()->listed() as $section): ?> -
    -

    - - title() ?> - -

    - svg(); ?> - $section - ]); - ?> -
    - - - -
    -
    - - + children()->listed() as $section): ?> +
    +

    + + title() ?> + +

    + children()->listed()) ?> +
    + + + diff --git a/site/templates/release-35.php b/site/templates/release-35.php index 739ccda3a3..9648e785d7 100755 --- a/site/templates/release-35.php +++ b/site/templates/release-35.php @@ -1,314 +1,273 @@ - - - - - Kirby 3.5 is here 🚀 + - - - - true]) ?> - - + -
    -
    -
    -
    -
    -
    -

    Builder + Editor = Blocks

    -

    A match made in heaven

    -
    -
    -

    Our brand new Blocks field is the perfect solution for complex single-column layouts and long-form text.

    -

    It brings the best of the Editor and the Builder plugins into the core. Combining a great WYSIWYG editing experience with fully customizable blocks.

    -
    - -

    Learn more

    -
    -
    - - image('blocks.jpg')): ?> - The new blocks field - - -
    -
    -
    -
    +
    +

    3.5

    -
    -
    -
    -
    - - image('layouts.jpg')): ?> - The new layouts field - - -
    -
    -
    -

    Layout

    -

    Yes you can

    -
    -
    -

    Together with the new Blocks field we are also introducing a powerful new Layout field. Arrange blocks in multiple columns and build complex page layouts. Assign custom layout settings and fine-tune the generated HTML in your templates.

    -
    - -

    Learn more

    -
    -
    -
    -
    + [ + [ + 'text' => 'Try now', + 'link' => '/try', + 'icon' => 'download', + 'style' => 'outlined' + ], + ], + 'center' => false, + 'mb' => 0 + ]) ?> -
    -
    -

    Authentication

    +
    -
    -
    -
    -

    Passwordless login

    -
    -
    -

    3.5 comes with major enhancements for your login flow. Enable password-less login for secure, one-time code authentication.

    - $page->image('login-passwordless.jpg') - ]) ?> - $page->image('login-code.jpg') - ]) ?> -

    Learn more

    -
    -
    +
    +
    + 'Builder + Editor = Blocks', + 'subtitle' => 'A match made in heaven' + ]) ?> +
    +

    Our brand-new Blocks field is the perfect solution for complex single-column layouts and long-form text.

    +

    It brings the best of the Editor and the Builder plugins into the core. Combining a great WYSIWYG editing experience with fully customizable blocks. Learn more →

    +
    + +
    +
    + + image('blocks.jpg')): ?> + The new blocks field + + +
    +
    -
    -
    -

    Password reset

    -
    -
    -

    The new authentication enhancements now offer a secure way for your users to reset their passwords.

    - $page->image('password-reset-email.jpg') - ]) ?> - $page->image('password-reset-code.jpg') - ]) ?> - $page->image('password-reset.jpg') - ]) ?> -

    Learn more

    -
    -
    +
    +
    + + image('layouts.jpg')): ?> + The new layouts field + + +
    +
    + 'Layout', + 'subtitle' => 'Yes you can' + ]) ?> +
    +

    Together with the new Blocks field we are also introducing a powerful new Layout field. Arrange blocks in multiple columns and build complex page layouts. Assign custom layout settings and fine-tune the generated HTML in your templates. Learn more →

    +
    + +
    +
    -
    -
    -

    2FA

    -
    -
    -

    Secure standard password-based authentication with an additional one-time code verification layer for increased security.

    - $page->image('login.jpg') - ]) ?> - $page->image('login-code.jpg') - ]) ?> -

    Learn more

    -
    -
    +
    +

    Authentication

    -
    +
    +
    +
    +

    Passwordless login

    +
    +
    +

    3.5 comes with major enhancements for your login flow. Enable password-less login for secure, one-time code authentication.

    - -
    -
    - 'Date & Time', - 'image' => $page->image('date.jpg'), - 'text' => 'The new date and time fields are a joy to work with and open completely new ways to enter dates with custom date formats and intervals.', - 'link' => 'docs/reference/panel/fields/date' +
    + $page->image('login-passwordless.jpg') ]) ?> +
    - 'Quicksearch', - 'image' => $page->image('search.jpg'), - 'text' => 'The Panel search has been redesigned and now shows nice previews for pages, files and users.' +
    + $page->image('login-code.jpg') ]) ?> +
    + +
    - 'Writer field', - 'image' => $page->image('writer.jpg'), - 'text' => 'You don’t need the full power of the Blocks? Maybe just some inline HTML? Then the new Writer field is here for you. Create single-line HTML with formats like bold, italic, underline or links.', - 'link' => 'docs/reference/panel/fields/writer' +
    +
    +

    Password reset

    +
    +
    +

    The new authentication enhancements now offer a secure way for your users to reset their passwords.

    +
    +
    + $page->image('password-reset-email.jpg'), ]) ?> - - 'List field', - 'image' => $page->image('list.jpg'), - 'text' => 'The new list field can be used if you want to create simple ordered or unordered lists in a more visual way than with Markdown.', - 'link' => 'docs/reference/panel/fields/list' +
    +
    + $page->image('password-reset-code.jpg') ]) ?> - - 'Title & URL', - 'image' => $page->image('unified-dialog.jpg'), - 'text' => 'Changing the page title or the page URL is now done in the same dialog. With this simplified workflow you can instantly see when your page title and slug no longer match and should be updated.' +
    +
    + $page->image('password-reset.jpg') ]) ?> +
    + +
    - 'Status icons', - 'image' => $page->image('status-icons.jpg'), - 'text' => 'Kirby\'s page status icons now have distinctive forms to make them accessible for people with color blindness.' +
    +
    +

    2FA

    +
    +
    +

    Secure standard password-based authentication with an additional one-time code verification layer for increased security.

    +
    +
    + $page->image('login.jpg') ]) ?> - - 'New starterkit', - 'image' => $page->image('starterkit.jpg'), - 'class' => 'shadow', - 'text' => 'We completely overhauled Kirby’s Starterkit to feature a new design together with the new blocks and layout fields.', - 'link' => 'https://github.com/getkirby/starterkit' +
    +
    + $page->image('login-code.jpg') ]) ?>
    - - -
    -
    -

    The fine print

    -
    -
    -

    More new features

    -
    - features()->kt() ?> -
    -
    -
    -

    Enhancements

    -
    - enhancements()->kt() ?> -
    -
    -
    -

    Bug fixes

    -
    - bugs()->kt() ?> -
    -
    -
    -

    Breaking changes

    -
    -
    - breaking()->kt() ?> -
    -
    - deprecated()->kt() ?> -
    -
    -
    -
    -

    Stats

    -
    - stats()->kt() ?> -
    -
    -
    -

    Thank you

    -
    - thanks()->kt() ?> -
    -
    -
    + -
    +
    -
    +
    + -
    -
    +
    +

    There’s more …

    +
    + 'Date & Time', + 'image' => $page->image('date.jpg'), + 'text' => 'The new date and time fields are a joy to work with and open completely new ways to enter dates with custom date formats and intervals.', + 'link' => 'docs/reference/panel/fields/date' + ]) ?> -

    - Kirby: the file-based CMS that adapts to any project, loved by developers and editors alike -

    + 'Writer field', + 'image' => $page->image('writer.jpg'), + 'text' => 'You don’t need the full power of the Blocks? Maybe just some inline HTML? Then the new Writer field is here for you. Create single-line HTML with formats like bold, italic, underline or links.', + 'link' => 'docs/reference/panel/fields/writer' + ]) ?> - -
    -
    + 'Quicksearch', + 'image' => $page->image('search.jpg'), + 'text' => 'The Panel search has been redesigned and now shows nice previews for pages, files and users.' + ]) ?> + + 'Title & URL', + 'image' => $page->image('unified-dialog.jpg'), + 'text' => 'Changing the page title or the page URL is now done in the same dialog. With this simplified workflow you can instantly see when your page title and slug no longer match and should be updated.' + ]) ?> - + 'Status icons', + 'image' => $page->image('status-icons.jpg'), + 'text' => 'Kirby\'s page status icons now have distinctive forms to make them accessible for people with color blindness.' + ]) ?> - + 'New starterkit', + 'image' => $page->image('starterkit.jpg'), + 'class' => 'shadow', + 'text' => 'We completely overhauled Kirby’s Starterkit to feature a new design together with the new blocks and layout fields.', + 'link' => 'https://github.com/getkirby/starterkit' + ]) ?> +
    + - - +
    +
    +
    +

    More new features

    +
    + features()->kt() ?> +
    +
    +
    +

    Enhancements

    +
    + enhancements()->kt() ?> +
    +
    +
    +

    Bug fixes

    +
    + bugs()->kt() ?> +
    +
    +
    +

    Breaking changes

    +
    +
    + breaking()->kt() ?> +
    +
    + deprecated()->kt() ?> +
    +
    +
    +
    +

    Stats

    +
    + stats()->kt() ?> +
    +
    +
    +

    Thank you

    +
    + thanks()->kt() ?> +
    +
    +
    +
    diff --git a/site/templates/release.php b/site/templates/release.php deleted file mode 100755 index 85e3f048c8..0000000000 --- a/site/templates/release.php +++ /dev/null @@ -1,14 +0,0 @@ - - -
    -
    - 'center']) ?> - -
    -
    - text()->kt()->anchorHeadlines() ?> -
    -
    -
    - - diff --git a/site/templates/search.php b/site/templates/search.php index 96a4c61f8c..1037a94f3a 100644 --- a/site/templates/search.php +++ b/site/templates/search.php @@ -1,83 +1,88 @@ - - -
    - -
    - - - - - -
    - - - - -
    -

    Suggestions …

    -
    - -
    -
    - - -
    - - - -
    - -
      - -
    1. - - title() ?>:
      - - objectID() ?> - - -
      -
    2. - -
    - + + + + +
    +
    + +
    +
    + +
    - - - - - pagination()) ?> - - +
      + $areaLabel): ?> +
    • + + class="mr-3" + id="area-" + name="area" + type="radio" + value="" + > + +
    • + +
    + +
    +

    + Use / anywhere on the site to open the search dialog. +

    +

    Our search is powered by Algolia

    +

    It's a great solution if you want to integrate meaningful search features in your Kirby site.

    +
    -
    - - + + + + diff --git a/site/templates/security.json.php b/site/templates/security.json.php index 87244190c8..bf83ac170c 100644 --- a/site/templates/security.json.php +++ b/site/templates/security.json.php @@ -10,8 +10,8 @@ $data = [ 'latest' => $kirby->version(), 'latestUrl' => 'https://github.com/getkirby/kirby/releases/tag/' . $kirby->version(), - 'supported' => array_values($supported->toArray($idFilter)), - 'incidents' => array_values($incidents->toArray($idFilter)) + 'supported' => array_values($page->supported()->toArray($idFilter)), + 'incidents' => array_values($page->incidents()->toArray($idFilter)) ]; -echo json_encode($data, JSON_UNESCAPED_SLASHES); +echo json($data); diff --git a/site/templates/security.php b/site/templates/security.php index 4d92858858..36a446d107 100644 --- a/site/templates/security.php +++ b/site/templates/security.php @@ -1,20 +1 @@ - - -
    -
    - - - -
    - -
    - kt()->anchorHeadlines(); ?> -
    -
    - -
    -
    - - + diff --git a/site/templates/styleguide.php b/site/templates/styleguide.php deleted file mode 100755 index edf1497bf8..0000000000 --- a/site/templates/styleguide.php +++ /dev/null @@ -1,51 +0,0 @@ - true ]) ?> - -
    - -
    - - - - text()->headlines('h2'); - - $headlines->add(new Obj([ - 'id' => '#icons', - 'url' => '#icons', - 'text' => 'Available icons', - ])); - - snippet('toc', $headlines); - - ?> - -
    - text()->kt()->anchorHeadlines('h2') ?> - -

    Available Icons

    - -

    The table below gives an overview of all icons available on the site. This section is mostly aimed at template developers and/or contributors who want to make suggestions to style updates.

    - - - - - - - - - - - - dimensions() ?> - - - -
    PreviewNameSize
    width() ?> × height() ?>
    - -
    - -
    -
    - - diff --git a/site/templates/text.php b/site/templates/text.php old mode 100755 new mode 100644 index d75c0df199..4e493bd433 --- a/site/templates/text.php +++ b/site/templates/text.php @@ -1,20 +1,2 @@ - - -
    -
    - - - -
    - -
    - text()->kt()->anchorHeadlines(); ?> -
    -
    - -
    -
    - - + +text()->kt() ?> diff --git a/site/templates/try.php b/site/templates/try.php old mode 100755 new mode 100644 index f5bbbbdda2..ca0661fdc5 --- a/site/templates/try.php +++ b/site/templates/try.php @@ -1,100 +1,93 @@ - + -
    -
    +
    +
    +

    + Try Kirby +

    - -
    - -

    :

    -

    -
    + + +
    -
    -

    Try Kirby for free

    -
    - intro()->kt() ?> -
    -
    +
    -
    -
    -
    -

    Personal Demo

    -
    - -
    + +

    + Instant online demo +

    -
    -
    -

    You are one click away from your personal demo. Give Kirby a spin and explore the Panel and our six example projects.

    -
    -
    -

    Questions? Please let us know: support@getkirby.com

    -
    -
    -

    - 'Start the demo', - 'icon' => 'panel', - 'button' => true - ]) ?> -

    -
    -
    -
    -

    Kirby on your computer

    -
    -

    - You can install Kirby on your computer or a test server and evaluate it as long as you need.
    - Get up and running … -

    -
    +

    + You are one click away from your personal demo. Explore the Panel and get to know Kirby with our six example projects. +

    + + + + + -
    -

    - Starterkit
    - Fully annotated example site – for everyone who wants to explore Kirby's capabilities. -

    -

    - 'Download', - 'icon' => 'download', - 'link' => 'https://github.com/getkirby/starterkit/archive/main.zip' - ]) ?> -

    -
    +
    +

    On your computer

    -
    -

    - Plainkit
    - Start from scratch. No templates, no content, no styles – just you, Kirby and your imagination.
    -

    -

    - 'Download', - 'icon' => 'download', - 'link' => 'https://github.com/getkirby/plainkit/archive/main.zip' - ]) ?> -

    -
    +

    + Install Kirby on your computer or a test server and + evaluate it as long as you need. How? Get up and running … +

    + +
    +
    +

    Starterkit

    +

    Fully annotated sample site for everyone who wants to learn about Kirby's capabilities.

    + + + Download + +
    + +
    +

    Plainkit

    +

    No templates, no content, no styles – just you, Kirby and your imagination.

    + + + Download + +
    -
    + +
    + +
    +

    Frequently asked questions

    + +
    +
    -
    -
    + +
    +

    We are preparing your demo 🎉

    +

    This can take a few seconds. Please don't close this window!
    You will be redirected automatically ...

    +
    +
    - + diff --git a/site/templates/voice.php b/site/templates/voice.php deleted file mode 100755 index 7d9fa5af1a..0000000000 --- a/site/templates/voice.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/site/templates/voices.php b/site/templates/voices.php new file mode 100644 index 0000000000..da06fbb49d --- /dev/null +++ b/site/templates/voices.php @@ -0,0 +1,14 @@ + + + + +
    +

    Voices

    +
      + children()->listed() as $voice): ?> +
    • + $voice]) ?> +
    • + +
    +
    diff --git a/site/templates/why.php b/site/templates/why.php deleted file mode 100755 index 69c4058c5d..0000000000 --- a/site/templates/why.php +++ /dev/null @@ -1,73 +0,0 @@ - - -
    -
    - -
    - -
    - -
    -
    -

    Made for clients & agencies

    - -
      - clients()->toStructure() as $item): ?> -
    • -

      headline() ?>

      - text()->kt() ?> -
    • - -
    -
    -
    - -
    -
    -

    Made for content creators

    - -
      - editors()->toStructure() as $item): ?> -
    • -

      headline() ?>

      - text()->kt() ?> -
    • - -
    -
    -
    - -
    -
    -

    Made for developers

    - -
      - developers()->toStructure() as $item): ?> -
    • -

      headline() ?>

      - text()->kt() ?> -
    • - -
    -
    -
    - -
    -
    -

    Made for designers

    - -
      - designers()->toStructure() as $item): ?> -
    • -

      headline() ?>

      - text()->kt() ?> -
    • - -
    -
    -
    - -
    -
    - - diff --git a/src/images/components/kosmos/galaxy.jpg b/src/images/components/kosmos/galaxy.jpg deleted file mode 100644 index f3a66f51ad..0000000000 Binary files a/src/images/components/kosmos/galaxy.jpg and /dev/null differ diff --git a/src/images/icons/github.svg b/src/images/icons/github.svg deleted file mode 100644 index 916c01a5f6..0000000000 --- a/src/images/icons/github.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/images/icons/search-white.svg b/src/images/icons/search-white.svg deleted file mode 100644 index 0063911ce0..0000000000 --- a/src/images/icons/search-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/images/icons/search.svg b/src/images/icons/search.svg deleted file mode 100644 index 09f965713c..0000000000 --- a/src/images/icons/search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/images/patterns/burgerman-white.jpg b/src/images/patterns/burgerman-white.jpg deleted file mode 100644 index 0c9df18623..0000000000 Binary files a/src/images/patterns/burgerman-white.jpg and /dev/null differ diff --git a/src/js/components/affiliates.js b/src/js/components/affiliates.js deleted file mode 100644 index 5f9d12b520..0000000000 --- a/src/js/components/affiliates.js +++ /dev/null @@ -1,35 +0,0 @@ -/* global Paddle */ -import loadjs from "loadjs"; - -const PADDLE_VENDOR_ID = 1129; -const PADDLE_SCRIPT_URL = "https://cdn.paddle.com/paddle/paddle.js"; - -function setAffiliate() { - - if ("Paddle" in window || document.querySelector(`script[src="${PADDLE_SCRIPT_URL}"]`) !== null) { - // don’t do anything further, if the current page already contains - // the Paddle.js script. - return; - } - - const p = new URLSearchParams(window.location.search); - - if (p.has("status") && p.has("expires") && - p.has("seller") && p.has("affiliate") && - p.has("link") && p.has("p_tok")) { - // load paddle.js and set vendor id, if coming from an affiliate - // link, so the script can store affiliate tracking information - // in a cookie. - loadjs(PADDLE_SCRIPT_URL, () => { - Paddle.Setup({ - vendor: PADDLE_VENDOR_ID, - }); - }); - } -} - -// Only execute after page was loaded and if browser -// supports `URLSearchParams` interface (i.e. not in IE 11) -if ("URLSearchParams" in window) { - window.addEventListener("load", setAffiliate); -} diff --git a/src/js/components/code.js b/src/js/components/code.js deleted file mode 100644 index 7cd9430276..0000000000 --- a/src/js/components/code.js +++ /dev/null @@ -1,151 +0,0 @@ -/* global Prism */ -import throttle from "../utils/throttle"; - -// Auto-Update - -const POSSIBLE_CODEBLOCKS = document.getElementsByTagName("code"); - -async function checkCodeBlocks() { - for (let i = 0, l = POSSIBLE_CODEBLOCKS.length; i < l; i++) { - // console.log(POSSIBLE_CODEBLOCKS[i]); - const block = POSSIBLE_CODEBLOCKS[i]; - const parent = block.parentElement; - - if (parent.tagName !== "PRE") { - // exclude all inline code (=not inside
     element)
    -      continue;
    -    }
    -
    -    if (parent.className.match(/(^|\b)language-([^\b]|$)/)) {
    -      // skip if code element does not have a language defined
    -      // for highlighting. This is checked by searching the parent
    -      // node for a "language-*"-class, which gets added by
    -      // Prism after highlighting.
    -      continue;
    -    }
    -
    -    Prism.highlightElement(block);
    -  }
    -}
    -
    -function initAutoUpdate() {
    -  // The MutationObserver listend to all DOM changes and
    -  // triggers auto-update, if new code blocks have been added,
    -  // e.g. using AJAX/fetch().
    -
    -  const throttledCheckCodeBlocks = throttle(checkCodeBlocks, 250);
    -
    -  new MutationObserver(throttledCheckCodeBlocks).observe(
    -    document.documentElement, {
    -      childList: true,
    -      subtree: true,
    -      attributes: false,
    -      characterData: false
    -    }
    -  );
    -
    -  throttledCheckCodeBlocks();
    -}
    -
    -// Init
    -
    -const initPrismLanguages = ([, ClipboardJS]) => {
    -
    -  Prism.languages.kirbytext = Prism.languages.extend("markdown", {});
    -
    -  Prism.languages.insertBefore("kirbytext", "prolog", {
    -    "kirbytag": {
    -      pattern: /\([a-z0-9_-]+:.*?\)/i,
    -      inside: {
    -        "kirbytag-bracket": /^\(|\)$/,
    -
    -        "kirbytag-name": {
    -          pattern: /^[a-z0-9_-]+:/i,
    -        },
    -
    -        "kirbytag-attr": {
    -          pattern: /([^:]\s+)[a-z0-9_-]+:/i,
    -          lookbehind: true,
    -        },
    -      }
    -    },
    -  });
    -
    -  Prism.languages.kirbycontent = {
    -    "delimiter": /\n----\s*\n*/,
    -    "property": {
    -      pattern: /(^\n*|\n----\s*\n*)[a-zA-Z0-9_\-\u0020]+:/,
    -      lookbehind: true,
    -    }
    -  };
    -
    -  Prism.plugins.customClass.prefix("code-");
    -
    -  Prism.plugins.toolbar.registerButton("copy-to-clipboard", function(env) {
    -
    -    var linkCopy = document.createElement("a");
    -    linkCopy.classList.add("link-reset");
    -    linkCopy.insertAdjacentHTML("beforeend", ' ');
    -
    -    var linkText = document.createElement("span");
    -    linkText.textContent = "Copy";
    -    linkCopy.appendChild(linkText);
    -
    -    function registerClipboard() {
    -
    -      var clip = new ClipboardJS(linkCopy, {
    -        "text": function () {
    -          return env.code;
    -        }
    -      });
    -
    -      clip.on("success", () => {
    -        linkText.textContent = "Copied!";
    -        resetText();
    -      });
    -
    -      clip.on("error", () => {
    -        linkText.textContent = "Press Ctrl+C/⌘+C to copy";
    -        resetText();
    -      });
    -    }
    -
    -    function resetText() {
    -      setTimeout(() => {
    -        linkText.textContent = "Copy";
    -      }, 5000);
    -    }
    -
    -    registerClipboard();
    -
    -    return linkCopy;
    -
    -  });
    -}
    -
    -export default () => {
    -
    -  const codeBlocks = document.querySelectorAll('pre code[class^="language-"], pre code[class*=" language-"], pre.code > code');
    -  const languageClassPattern = /(?:^| )language(-[a-z])( |$)*/i;
    -
    -  for (let code, i = 0, l = codeBlocks.length; i < l && (code = codeBlocks[i]); i++) {
    -    if (!languageClassPattern.test(code.className)) {
    -      code.classList.add("language-plaintext");
    -    }
    -  }
    -
    -  Promise.all([
    -    import(
    -      /* webpackChunkName: "code" */
    -      /* webpackMode: "lazy" */
    -      "../vendor/prism"
    -    ),
    -    import(
    -      /* webpackChunkName: "code" */
    -      /* webpackMode: "lazy" */
    -      "clipboard"
    -    ),
    -  ]).then(initPrismLanguages)
    -    .then(initAutoUpdate);
    -
    -};
    diff --git a/src/js/components/config.js b/src/js/components/config.js
    deleted file mode 100644
    index e1193f39a3..0000000000
    --- a/src/js/components/config.js
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -if ("kirbyConfig" in window && window.kirbyConfig.assetsPath) {
    -  // Overrides the public path for lazy-loaded/dynamic imports,
    -  // so they load from the correct CDN location.
    -  __webpack_public_path__ = window.kirbyConfig.assetsPath; // eslint-disable-line
    -}
    diff --git a/src/js/components/copyfix.js b/src/js/components/copyfix.js
    deleted file mode 100644
    index d07949fcf1..0000000000
    --- a/src/js/components/copyfix.js
    +++ /dev/null
    @@ -1,89 +0,0 @@
    -/**
    - * This script is intended to remove invisible characters
    - * from from selected text, before copying it to the clipboard.
    - * It was included with the ZERO-WIDTH SPACE and SOFT HYPHEN
    - * characters in mind, that are used at some places in the
    - * reference.
    - */
    -
    -// Removal function based on Hyphenator 5.2.0(devel)
    -// Copyright (C) 2015  Mathias Nater, Zürich (mathiasnater at gmail dot com)
    -// https://github.com/mnater/Hyphenator
    -//  Released under the MIT license
    -// http://mnater.github.io/Hyphenator/LICENSE.txt
    -
    -const HYPHEN     = String.fromCharCode(173);
    -const URL_HYPHEN = String.fromCharCode(8203);
    -
    -function removeHyphenationFromElement(el) {
    -  var h, u, i = 0, n;
    -  switch (HYPHEN) {
    -  case "|":
    -      h = "\\|";
    -      break;
    -  case "+":
    -      h = "\\+";
    -      break;
    -  case "*":
    -      h = "\\*";
    -      break;
    -  default:
    -      h = HYPHEN;
    -  }
    -  switch (URL_HYPHEN) {
    -  case "|":
    -      u = "\\|";
    -      break;
    -  case "+":
    -      u = "\\+";
    -      break;
    -  case "*":
    -      u = "\\*";
    -      break;
    -  default:
    -      u = URL_HYPHEN;
    -  }
    -  n = el.childNodes[i];
    -  while (n) {
    -      if (n.nodeType === 3) {
    -          n.data = n.data.replace(new RegExp(h, "g"), "");
    -          n.data = n.data.replace(new RegExp(u, "g"), "");
    -      } else if (n.nodeType === 1) {
    -          removeHyphenationFromElement(n);
    -      }
    -      i += 1;
    -      n = el.childNodes[i];
    -  }
    -}
    -
    -// Based on: http://bavotasan.com/2010/add-a-copyright-notice-to-copied-text/
    -function fixBeforeCopy(e) {
    -  e.stopPropagation();
    -
    -  var selection = window.getSelection(),
    -      range = selection.getRangeAt(0),
    -      dummy = document.createElement("div");
    -
    -  dummy.style.cssText =
    -    "position: absolute;" +
    -    "left: -1000px;" +
    -    "width: 900px;" +
    -    "overflow: hidden;";
    -
    -  document.body.appendChild(dummy);
    -
    -  dummy.appendChild(range.cloneContents());
    -
    -  removeHyphenationFromElement(dummy);
    -  selection.selectAllChildren(dummy);
    -
    -  window.setTimeout(function () {
    -    dummy.parentNode.removeChild(dummy);
    -    selection.removeAllRanges(); // IE9 needs that
    -    selection.addRange(range);
    -  }, 0);
    -}
    -
    -if ("getSelection" in window) {
    -  document.addEventListener("copy", fixBeforeCopy);
    -}
    diff --git a/src/js/components/lazyloading.js b/src/js/components/lazyloading.js
    deleted file mode 100644
    index 7d7801dcfc..0000000000
    --- a/src/js/components/lazyloading.js
    +++ /dev/null
    @@ -1 +0,0 @@
    -import "lazysizes";
    diff --git a/src/js/components/menu-search.js b/src/js/components/menu-search.js
    deleted file mode 100644
    index c25af0b89d..0000000000
    --- a/src/js/components/menu-search.js
    +++ /dev/null
    @@ -1,186 +0,0 @@
    -import ready from "../utils/ready";
    -import delay from "../utils/delay";
    -
    -const ALGOLIA_APP   = "S7OGBIAJTV";
    -const ALGOLIA_KEY   = "d161a2f4cd2d69247c529a3371ad3050";
    -const ALGOLIA_INDEX = "getkirby-3";
    -
    -// Placeholder string used to distinguish the "view all" preudo-result
    -// from regular search results
    -const VIEW_ALL_RESULTS_LABEL = "VIEW_ALL_RESULTS_UXfpeDFlmye9rXkXP5wd";
    -const SEARCH_ERROR_LABEL     = "SEARCH_ERROR_UXfpeDFlmye9rXkXP5wd";
    -const CHEVRON_RIGHT_SVG      = '';
    -
    -ready(() => {
    -
    -  const searchForm  = document.querySelector(".js-menu-search");
    -
    -  if(!searchForm) {
    -    // abort initialization if there’s no search form
    -    return;
    -  }
    -
    -  const searchInput = document.querySelector(".js-menu-search-input");
    -
    -  Promise.all([
    -    import(
    -      /* webpackChunkName: "search" */
    -      /* webpackMode: "lazy" */
    -      "algoliasearch/lite"
    -    ),
    -    import(
    -      /* webpackChunkName: "search" */
    -      /* webpackMode: "lazy" */
    -      "awesomplete"
    -    )
    -  ]).then(([algoliasearch, Awesomeplete]) => {
    -
    -    const client      = algoliasearch(ALGOLIA_APP, ALGOLIA_KEY);
    -    const index       = client.initIndex(ALGOLIA_INDEX);
    -
    -    let lastValue   = "";
    -    let list        = [];
    -
    -    const awesome = new Awesomeplete(searchInput, {
    -      list: [],
    -      filter: () => true,
    -      sort: false,
    -      item: (text /*, input */) => {
    -
    -        const item = document.createElement("li");
    -
    -        if(text.label === VIEW_ALL_RESULTS_LABEL) {
    -          // view all link
    -          item.classList.add("menu-search-view-all");
    -          item.innerHTML = `View all results${CHEVRON_RIGHT_SVG}`;
    -        } else if(text.label === SEARCH_ERROR_LABEL) {
    -          // error message link
    -          item.classList.add("menu-search-error");
    -          item.innerHTML = `Sorry, an error occured. Please try advanced search instead.${CHEVRON_RIGHT_SVG}`;
    -        } else {
    -          // regular result
    -          item.innerHTML = `${text.label} ${text.value}`;
    -        }
    -
    -        return item;
    -      }
    -    });
    -
    -    searchInput.addEventListener("focus", () => {
    -      // helper class used by the cheatsheet templates’ CSS
    -      document.documentElement.classList.add("is-menu-search-open");
    -    });
    -
    -    searchInput.addEventListener("blur", () => {
    -      document.documentElement.classList.remove("is-menu-search-open");
    -    });
    -
    -    searchInput.addEventListener("keypress", (e) => {
    -      if((e.key && (e.key === "Enter")) || e.keyCode === 13) {
    -        searchForm.submit();
    -      }
    -    });
    -
    -    searchInput.addEventListener("keyup", () => {
    -
    -      const value = searchInput.value.trim();
    -
    -      if(value === lastValue) {
    -        return true;
    -      } else if(value === "") {
    -        lastValue = "";
    -        list      = [];
    -        awesome.list = list;
    -        awesome.evaluate();
    -        return true;
    -      }
    -
    -      lastValue = value;
    -
    -      if(value.length <= 2) {
    -        // don't search for very short words
    -        return true;
    -      }
    -
    -      delay(250).then(() => {
    -
    -        const params = {
    -          hitsPerPage: 5
    -        };
    -
    -        const filters = searchInput.getAttribute("data-filters");
    -
    -        if (filters) {
    -          params.filters = filters;
    -        }
    -
    -        /* eslint-disable handle-callback-err */
    -        index.search(value, params, (err, content) => {
    -
    -          list = [];
    -
    -          if(err) {
    -
    -            /* eslint-disable no-console */
    -            if("console" in window) {
    -              console.error("Quicksearch error", err);
    -            }
    -            /* eslint-enable no-console */
    -
    -            list.push({
    -              label: SEARCH_ERROR_LABEL,
    -              value: 0,
    -            });
    -
    -            awesome.list = list
    -            awesome.evaluate();
    -            awesome.open();
    -
    -            return;
    -          }
    -
    -
    -          for(var i = 0, l = content.hits.length; i < l; i++) {
    -            const item = content.hits[i];
    -            list.push({
    -              label: item.title,
    -              value: item.objectID,
    -            });
    -          }
    -
    -          if(content.nbHits > 0 && content.nbHits > content.hitsPerPage) {
    -            // Show View all item if there are any hits and
    -            // there are more hits than those displayed in the popup.
    -            list.push({
    -              label: VIEW_ALL_RESULTS_LABEL,
    -              value: content.nbHits,
    -            });
    -          }
    -
    -          awesome.list = list;
    -          awesome.evaluate();
    -          awesome.open();
    -
    -        });
    -        /* eslint-enable handle-callback-err */
    -
    -      });
    -
    -    });
    -
    -    searchInput.addEventListener("awesomplete-select", (e /*, item */) => {
    -
    -      e.preventDefault();
    -
    -      if(e.text.label === VIEW_ALL_RESULTS_LABEL || e.text.label === SEARCH_ERROR_LABEL) {
    -        // When the "view all results" or "error" entry was clicked/selected,
    -        // submit the form to go to the regular search results page.
    -        searchForm.submit();
    -      } else {
    -        // Regular search result selected.
    -        window.location.href = `/${e.text.value}`;
    -      }
    -    });
    -
    -  });
    -});
    diff --git a/src/js/components/menu.js b/src/js/components/menu.js
    deleted file mode 100644
    index c170faf3e6..0000000000
    --- a/src/js/components/menu.js
    +++ /dev/null
    @@ -1,174 +0,0 @@
    -import { $, $$ } from "../utils/selector";
    -import ready from "../utils/ready";
    -
    -class Menu {
    -
    -  constructor(el) {
    -    this.el     = el;
    -    this.mobileToggleButton = $("button[aria-controls]");
    -    this.menu   = $("#menu");
    -    this.isOpen = false;
    -    this.submenuItems = this.menu.querySelectorAll(".menu-item.has-dropdown");
    -    this.handleGlobalClickForMobileMenuBound = this.handleGlobalClickForMobileMenu.bind(this);
    -    this.handleGlobalEventForSubmenusBound = this.handleGlobalEventForSubmenus.bind(this);
    -
    -    this.currentSubmenu = null;
    -
    -    this.mediaQuery = matchMedia("(min-width: 56em)");
    -    this.mediaQuery.addListener(this.toggleDesktopAndMobileMenu.bind(this));
    -    this.init();
    -  }
    -
    -  init() {
    -    this.mobileToggleButton.addEventListener("click", (e) => {
    -      e.preventDefault();
    -      this.toggleMobilePopup();
    -    });
    -
    -    for (let i = 0, l = this.submenuItems.length; i < l; i++) {
    -      const item = this.submenuItems[i];
    -      const link = item.querySelector("a");
    -
    -      link.addEventListener("touchend", (e) => {
    -          if (!this.isDesktop()) {
    -            return;
    -          }
    -
    -          e.preventDefault();
    -          this.toggleSubmenu(item);
    -      });
    -
    -      link.addEventListener("mouseenter", (e) => {
    -        if (!this.isDesktop()) {
    -          return;
    -        }
    -        this.toggleSubmenu(item, true);
    -      });
    -
    -      link.addEventListener("focus", (e) => {
    -        if (!this.isDesktop()) {
    -          return;
    -        }
    -        this.toggleSubmenu(item, true);
    -      });
    -
    -      item.addEventListener("mouseleave", (e) => {
    -        if (!this.isDesktop()) {
    -          return;
    -        }
    -        this.toggleSubmenu(item, false);
    -      });
    -    }
    -
    -    this.toggleDesktopAndMobileMenu();
    -  }
    -
    -  handleGlobalEventForSubmenus(e) {
    -    if (this.currentSubmenu === null) {
    -      return;
    -    }
    -
    -    if (this.currentSubmenu.contains(e.target) === false) {
    -      this.toggleSubmenu(this.currentSubmenu, false);
    -    }
    -  }
    -
    -  toggleDesktopAndMobileMenu() {
    -    if(this.isDesktop()) {
    -      this.mobileToggleButton.setAttribute("aria-hidden", "true");
    -      this.mobileToggleButton.hidden = true;
    -    } else {
    -      this.mobileToggleButton.removeAttribute("aria-hidden");
    -      this.mobileToggleButton.hidden = false;
    -    }
    -  }
    -
    -  isDesktop() {
    -    return this.mediaQuery.matches;
    -  }
    -
    -  closeAllSubmenus() {
    -    for (let i = 0, l = this.submenuItems.length; i < l; i++) {
    -      const subItem = this.submenuItems[i];
    -      this.toggleSubmenu(subItem, false);
    -    }
    -  }
    -
    -  toggleSubmenu(item, force) {
    -
    -    let newState = !item.classList.contains("is-open");
    -
    -    if (typeof force !== "undefined") {
    -      if (force !== newState) {
    -        return;
    -      }
    -      newState = force;
    -    }
    -
    -    if (newState === true) {
    -      for (let i = 0, l = this.submenuItems.length; i < l; i++) {
    -        const subItem = this.submenuItems[i];
    -        this.toggleSubmenu(subItem, false);
    -      }
    -    }
    -
    -    item.classList.toggle("is-open", newState);
    -
    -    if (this.currentSubmenu === null) {
    -      window.addEventListener("focusin", this.handleGlobalEventForSubmenusBound);
    -      document.body.addEventListener("click", this.handleGlobalEventForSubmenusBound);
    -      document.body.addEventListener("touchstart", this.handleGlobalEventForSubmenusBound);
    -    }
    -
    -    this.currentSubmenu = newState ? item : null;
    -
    -    if (this.currentSubmenu === null) {
    -      window.removeEventListener("focusin", this.handleGlobalEventForSubmenusBound);
    -      document.body.removeEventListener("click", this.handleGlobalEventForSubmenusBound);
    -      document.body.removeEventListener("touchstart", this.handleGlobalEventForSubmenusBound);
    -    }
    -  }
    -
    -  toggleMobilePopup(force) {
    -
    -    let newState = !this.isOpen;
    -
    -    if (typeof force !== "undefined") {
    -      if (force === this.isOpen) {
    -        return;
    -      }
    -      newState = force;
    -    }
    -
    -    this.mobileToggleButton.setAttribute("aria-expanded", newState ? "true" : "false");
    -    this.mobileToggleButton.setAttribute("aria-label", newState ? "Close menu" : "Open menu");
    -
    -    setTimeout(() => {
    -      if (newState) {
    -        window.addEventListener("click", this.handleGlobalClickForMobileMenuBound);
    -      } else {
    -        window.removeEventListener("click", this.handleGlobalClickForMobileMenuBound);
    -      }
    -    }, 0);
    -
    -    this.isOpen = newState;
    -  }
    -
    -  handleGlobalClickForMobileMenu(e) {
    -    if (!this.menu.contains(e.target)) {
    -      e.preventDefault();
    -      this.toggleMobilePopup(false);
    -    }
    -  }
    -
    -}
    -
    -ready(() => {
    -
    -  const menu = $(".menu");
    -
    -  if (menu) {
    -    new Menu(menu);
    -  }
    -
    -});
    diff --git a/src/js/components/sidebar.js b/src/js/components/sidebar.js
    deleted file mode 100644
    index 1661700f0e..0000000000
    --- a/src/js/components/sidebar.js
    +++ /dev/null
    @@ -1,65 +0,0 @@
    -import { on } from "../utils/events";
    -import ready from "../utils/ready";
    -
    -function enableSubmenuLinks(submenu) {
    -  for(let i = 0, items = submenu.querySelectorAll("a"), l = items.length; i < l; i++) {
    -    items[i].setAttribute("tabindex", "0");
    -  }
    -}
    -
    -function disableSubmenuLinks(submenu) {
    -  for(let i = 0, items = submenu.querySelectorAll("a"), l = items.length; i < l; i++) {
    -    items[i].setAttribute("tabindex", "-1");
    -  }
    -}
    -
    -function toggleSubmenu(item) {
    -
    -  const toggle = item.querySelector("[aria-expanded]");
    -
    -  if(!toggle) {
    -    return false;
    -  }
    -
    -  const submenu = item.querySelector(".js-sidebar-submenu");
    -  const isOpen  = !submenu.hidden;
    -
    -  if(!isOpen) {
    -    // show submenu
    -    toggle.setAttribute("aria-expanded", "true");
    -    submenu.hidden = false;
    -    enableSubmenuLinks(submenu);
    -  } else {
    -    // hide submenu
    -    submenu.hidden = true
    -    toggle.setAttribute("aria-expanded", "false");
    -
    -    disableSubmenuLinks(submenu);
    -  }
    -
    -  return true;
    -
    -}
    -
    -ready().then(() => {
    -
    -  const sidebar = document.querySelector(".js-sidebar");
    -
    -  if(!sidebar) {
    -    return;
    -  }
    -
    -  on(sidebar, "keydown", "a.sidebar-item-link", function (e) {
    -    if ((e.key && (e.key === "ArrowRight" || e.key === "ArrowLeft")) || (e.keyCode === 39 || e.keyCode === 37)) {
    -      if (toggleSubmenu(this.parentNode)) {
    -        e.preventDefault();
    -      }
    -    }
    -  });
    -
    -  on(sidebar, "click", ".js-sidebar-toggle", function (e) {
    -    e.preventDefault();
    -    toggleSubmenu(this.parentNode);
    -  });
    -
    -});
    diff --git a/src/js/components/tooltip.js b/src/js/components/tooltip.js
    deleted file mode 100644
    index 002048c976..0000000000
    --- a/src/js/components/tooltip.js
    +++ /dev/null
    @@ -1,72 +0,0 @@
    -import ready from "../utils/ready";
    -import throttle from "../utils/throttle";
    -
    -function getTippyOptions() {
    -  return {
    -    animation: "shift-away",
    -    arrow: true,
    -    delay: [150, 300],
    -    distance: 10,
    -    duration: [200, 150],
    -    interactive: true,
    -    maxWidth: "25rem",
    -    theme: "kirby",
    -    // trigger: "click", // Useful for layout debugging, as the tooltip will not fade away if this is active.
    -  }
    -}
    -
    -function checkTooltips(tippy) {
    -  const tooltips = document.querySelectorAll("[data-tooltip]");
    -
    -  if(!tooltips.length) {
    -    // stop here if page does not contain any tooltips
    -    return;
    -  }
    -
    -  for(let i = 0, l = tooltips.length; i < l; i++) {
    -    const tooltip   = tooltips[i];
    -    const htmlTitle = tooltip.getAttribute("data-tooltip");
    -    const htmlContent = `
    ${htmlTitle}
    `; - - // tooltip.setAttribute("title", htmlContent); - - const options = getTippyOptions(); - - options.content = htmlContent; - - tippy(tooltip, options); - } -} - -ready().then(() => { - Promise.all([ - import( - /* webpackChunkName: "tooltip" */ - /* webpackMode: "lazy" */ - "tippy.js" - ), - ]).then(([{ default: tippy }]) => { - initAutoUpdate(tippy); - }); -}); - -function initAutoUpdate(tippy) { - // The MutationObserver listend to all DOM changes and - // triggers auto-update, if new code blocks have been added, - // e.g. using AJAX/fetch(). - - const throttledCheckTooltips = throttle(() => { - checkTooltips(tippy); - }, 250); - - new MutationObserver(throttledCheckTooltips).observe( - document.documentElement, { - childList: true, - subtree: true, - attributes: false, - characterData: false - } - ); - - throttledCheckTooltips(); -} diff --git a/src/js/index.js b/src/js/index.js deleted file mode 100644 index b7585f596b..0000000000 --- a/src/js/index.js +++ /dev/null @@ -1,27 +0,0 @@ -// Load config package first, to set CDN path. The -// corresponding code has to be in its own package, otherwise -// it would not execute before any other imports are resolved. -import "./components/config"; - -/* ----- Polyfills -------------------------------------------------------- */ - -// Displays focus ring when user tabs, but not when user -// clicks in sth. -import "focus-visible"; - -/* ----- Components -------------------------------------------------------- */ - -import "./components/affiliates"; -// import "./components/copyfix"; -import "./components/lazyloading"; -import "./components/menu"; -import "./components/menu-search"; -import "./components/sidebar"; -import "./components/tooltip"; - - -/* ----- Code Highlighting -------------------------------------------------------- */ - -import highlight from "./components/code"; - -highlight(); diff --git a/src/js/polyfills/promise.js b/src/js/polyfills/promise.js deleted file mode 100644 index a9a479d57f..0000000000 --- a/src/js/polyfills/promise.js +++ /dev/null @@ -1,2 +0,0 @@ -import { Promise } from "es6-promise"; -window.Promise = Promise; diff --git a/src/js/polyfills/respimage.js b/src/js/polyfills/respimage.js deleted file mode 100644 index d62b5ebb9e..0000000000 --- a/src/js/polyfills/respimage.js +++ /dev/null @@ -1 +0,0 @@ -import "respimage"; diff --git a/src/js/templates/cheatsheet.js b/src/js/templates/cheatsheet.js deleted file mode 100644 index 02744404de..0000000000 --- a/src/js/templates/cheatsheet.js +++ /dev/null @@ -1,150 +0,0 @@ -/* global Prism */ -import { $, $$ } from "../utils/selector.js"; -import "../components/code.js"; -import { /* enableBodyScroll,*/ disableBodyScroll, clearAllBodyScrollLocks } from "body-scroll-lock"; - -const cheatsheet = $(".cheatsheet"); - -const buttons = () => { - $$(".cheatsheet-panel-header button").forEach((button) => { - button.addEventListener("click", () => { - const show = button.getAttribute("data-show"); - cheatsheet.setAttribute("data-show", show); - }); - }); -}; - -const load = (link) => { - // start loading - cheatsheet.classList.add("is-loading"); - - fetch(link.href + "?plain=true"). - then((response) => { - return response.text(); - }). - then((html) => { - // Scroll locks need to be cleared before replacing parts of the page - // using AJAX. Otherwise, the replaced content will become un-scrollable - // in Mobile Safari (tested with iOS 12.2) - clearScrollLocks(); - - $(".cheatsheet-article").innerHTML = html; - $(".cheatsheet-entries a[aria-current]").removeAttribute("aria-current"); - - // change the currently active link - link.setAttribute("aria-current", "page"); - - // stop loading - cheatsheet.classList.remove("is-loading"); - - // stop showing the menu or overview - cheatsheet.removeAttribute("data-show"); - - // get the title - const title = link.getAttribute("data-title"); - - document.title = title + " | Kirby"; - - // link header buttons - buttons(); - - // re-enable scroll locks - setScrollLocks(); - }); - -}; - -function setScrollLocks() { - // Disable page scrolling, except for the designated scrolling areas. This - // also ensures, that iOS does not accidently scroll the whole viewport - // and hides parts of the page. - disableBodyScroll($(".cheatsheet-main-scrollarea")); - disableBodyScroll($(".cheatsheet-sections .cheatsheet-panel-scrollarea")); - - const entriesScrollarea = $(".cheatsheet-entries-scrollarea"); - - if (entriesScrollarea !== null) { - disableBodyScroll(entriesScrollarea); - } -} - -function clearScrollLocks() { - clearAllBodyScrollLocks(); -} - - -window.addEventListener("popstate", (e) => { - if (e.state && e.state.slug) { - const link = $("a[data-slug='" + e.state.slug + "']"); - - if (link) { - load(link); - } - } -}); - -$$(".cheatsheet-entries a").forEach((link) => { - - link.addEventListener("click", (e) => { - e.preventDefault(); - load(link); - - // change the browser history - history.pushState({ - link: link.href, - slug: link.getAttribute("data-slug") - }, "", link.href); - - }, true); - -}); - -buttons(); - -const currentSections = $(".cheatsheet-panel-scrollarea"); -const currentSection = $(".cheatsheet-sections a[aria-current]"); -const currentEntry = $(".cheatsheet-entries a[aria-current]"); - -function setScroll() { - localStorage.setItem('getkirby$reference$scroll', currentSections.scrollTop); -} - -function unsetScroll() { - localStorage.removeItem('getkirby$reference$scroll'); -} - -if (currentSections) { - const scroll = localStorage.getItem('getkirby$reference$scroll'); - - if (scroll) { - currentSections.scroll(0, scroll); - unsetScroll(); - } - - else if(currentSection && currentSections.scrollIntoView) { - const group = currentSection.parentNode.parentNode.parentNode; - - if (group.scrollIntoView) { - const linkRect = currentSection.getBoundingClientRect(); - const sidebarRect = currentSections.getBoundingClientRect(); - group.scrollIntoView(linkRect.top < sidebarRect.top); - } - } - - // store current scroll position - setScroll(); - - // update scroll position dynamically - currentSections.addEventListener('click', setScroll); -} - -if (currentEntry && currentEntry.scrollIntoView) { - currentEntry.scrollIntoView(); -} - -// Fix for Mobil Safari on iOS/iPad (tested with v10.3), because its -// scrolls the whole body when using scrollIntoView on a nested scrolling -// container. -document.body.scrollTo(0, 0); - -setScrollLocks(); diff --git a/src/js/templates/cookbook.js b/src/js/templates/cookbook.js deleted file mode 100644 index cf33973d55..0000000000 --- a/src/js/templates/cookbook.js +++ /dev/null @@ -1,12 +0,0 @@ -import List from "list.js"; - -var options = { - listClass: "recipe-cards", - valueNames: [ - "recipe-card-title", - "recipe-card-description", - "recipe-card-footer" - ] -}; - -new List("cookbook", options); diff --git a/src/js/templates/home.js b/src/js/templates/home.js deleted file mode 100644 index 0e1ffae614..0000000000 --- a/src/js/templates/home.js +++ /dev/null @@ -1,24 +0,0 @@ -import ready from "../utils/ready"; -import { $, $$ } from "../utils/selector"; - -ready(() => { - - const galleryImage = $(".home-panel-gallery .screenshot"); - const galleryLinks = $$(".home-panel-gallery-links a"); - - galleryLinks.forEach(function (galleryLink) { - galleryLink.addEventListener("click", function (e) { - e.preventDefault(); - $(".home-panel-gallery-links a[aria-current]").removeAttribute("aria-current"); - - while (galleryImage.firstChild) { - galleryImage.removeChild(galleryImage.firstChild); - } - - galleryImage.appendChild(this.querySelector(".intrinsic").cloneNode(true)); - - galleryLink.setAttribute("aria-current", "true"); - }, true); - }); - -}); diff --git a/src/js/templates/plugins.js b/src/js/templates/plugins.js deleted file mode 100644 index f49ed67326..0000000000 --- a/src/js/templates/plugins.js +++ /dev/null @@ -1,22 +0,0 @@ -import List from 'list.js'; - -var options = { - listClass: "plugins-directory", - valueNames: [ - "plugin-card-title", - "plugin-card-author", - "plugin-card-description", - "plugin-card-footer", - ], -}; - -var list = new List('plugins', options); -var container = document.getElementById('plugins'); - -list.on("updated", function (event) { - if (event.searched === true) { - container.classList.add("searching"); - } else { - container.classList.remove("searching"); - } -}); diff --git a/src/js/templates/search.js b/src/js/templates/search.js deleted file mode 100644 index 94e92a4a30..0000000000 --- a/src/js/templates/search.js +++ /dev/null @@ -1,4 +0,0 @@ -import { focusWithin } from "../utils/polyfills"; - -focusWithin(document.querySelector(".js-search-field")); - diff --git a/src/js/templates/try.js b/src/js/templates/try.js deleted file mode 100644 index 59ba74b898..0000000000 --- a/src/js/templates/try.js +++ /dev/null @@ -1,3 +0,0 @@ -document.querySelector('form.demo').addEventListener('submit', function(e) { - this.setAttribute("disabled", true); -}); diff --git a/src/js/utils/debounce.js b/src/js/utils/debounce.js deleted file mode 100644 index a517f58599..0000000000 --- a/src/js/utils/debounce.js +++ /dev/null @@ -1,17 +0,0 @@ -export default function debounce(func, wait, scope) { - - let timeout = null; - - return function () { - const context = scope || this; - const args = arguments; /* eslint-disable-line prefer-rest-params */ - - const later = function () { - timeout = null; - func.apply(context, args); - }; - - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; -} diff --git a/src/js/utils/delay.js b/src/js/utils/delay.js deleted file mode 100644 index c95155de5d..0000000000 --- a/src/js/utils/delay.js +++ /dev/null @@ -1,14 +0,0 @@ -const delay = (function() { - - let timer = 0; - - return function(ms) { - return new Promise((resolve) => { - clearTimeout(timer); - timer = setTimeout(resolve(), ms); - }); - } - -})(); - -export default delay; \ No newline at end of file diff --git a/src/js/utils/events.js b/src/js/utils/events.js deleted file mode 100644 index bd6b70a83d..0000000000 --- a/src/js/utils/events.js +++ /dev/null @@ -1,24 +0,0 @@ -function on(element, eventName, selector, fn) { - - element.addEventListener(eventName, (event) => { - - const possibleTargets = element.querySelectorAll(selector); - const target = event.target; - - for(let i = 0, l = possibleTargets.length; i < l; i++) { - let el = target; - const p = possibleTargets[i]; - - while(el && el !== element) { - if(el === p) { - return fn.call(p, event); - } - - el = el.parentNode; - } - } - - }); -} - -export { on }; \ No newline at end of file diff --git a/src/js/utils/polyfills.js b/src/js/utils/polyfills.js deleted file mode 100644 index b5be993428..0000000000 --- a/src/js/utils/polyfills.js +++ /dev/null @@ -1,35 +0,0 @@ -// if browser does not support `:focus-within` -// pseudo-selector, inits a polyfill (IE/Edge) -const focusWithin = (function () { - - try { - // if `document.querySelector()` does not throw an error, - // an empty function is returned, because the browser - // supports the `:focus-within` pseudo-selector and thus - // does not need a polyfill. - document.querySelector(":focus-within"); - return function() {}; /* eslint-disable-line no-empty-function */ - } catch (err) { - - return function (node) { - - if(document.activeElement && node.contains(document.activeElement)) { - node.classList.add("is-focus-within"); - } - - node.addEventListener("focus", function () { - node.classList.add("is-focus-within"); - }, true); - - node.addEventListener("blur", function () { - if(!node.contains(document.activeElement)) { - node.classList.remove("is-focus-within"); - } - }, true); - - }; - } -})(); - -export { focusWithin }; - diff --git a/src/js/utils/ready.js b/src/js/utils/ready.js deleted file mode 100644 index 192d4f8608..0000000000 --- a/src/js/utils/ready.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Executes an optional callback function and always returns a promise, which resolves - * once the DOM is ready. - * - * @param {function} fn An optional callback function. - * @return {Promice} A promise which resolves once the DOM is ready. - */ -export default function ready(fn = function() {}) { /* eslint-disable-line no-empty-function */ - return new Promise((resolve) => { - if (document.readyState !== "loading") { - fn(); - resolve(); - } else { - document.addEventListener("DOMContentLoaded", () => { - fn(); - resolve(); - }); - } - }); - -} diff --git a/src/js/utils/selector.js b/src/js/utils/selector.js deleted file mode 100644 index 2058ee3264..0000000000 --- a/src/js/utils/selector.js +++ /dev/null @@ -1,9 +0,0 @@ -const $ = (selector) => { - return document.querySelector(selector); -}; - -const $$ = (selector) => { - return [].slice.call(document.querySelectorAll(selector)); -}; - -export { $, $$ }; diff --git a/src/js/utils/throttle.js b/src/js/utils/throttle.js deleted file mode 100644 index 1eb71e5db5..0000000000 --- a/src/js/utils/throttle.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Rate-limites a function. - * - * @param {function} fn A callback function. - * @param {Number} limit How often the function may be executed. - * @return {undefined} - */ -export default function(fn, limit) { - - let inThrottle = false; - - return function () { - if(!inThrottle) { - fn(); - inThrottle = true; - - setTimeout(function() { - inThrottle = false; - }, limit); - - } - }; -} \ No newline at end of file diff --git a/src/js/vendor/prism.js b/src/js/vendor/prism.js deleted file mode 100755 index 24cba4b723..0000000000 --- a/src/js/vendor/prism.js +++ /dev/null @@ -1,2030 +0,0 @@ -/* eslint-disable */ -/* PrismJS 1.17.1 -https://prismjs.com/download.html#themes=prism-dark&languages=markup+css+clike+javascript+bash+markup-templating+php+markdown+php-extras+scss+yaml&plugins=custom-class+toolbar+copy-to-clipboard */ -var _self = (typeof window !== 'undefined') - ? window // if in browser - : ( - (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) - ? self // if in worker - : {} // if in node js - ); - -/** - * Prism: Lightweight, robust, elegant syntax highlighting - * MIT license http://www.opensource.org/licenses/mit-license.php/ - * @author Lea Verou http://lea.verou.me - */ - -var Prism = (function (_self){ - -// Private helper vars -var lang = /\blang(?:uage)?-([\w-]+)\b/i; -var uniqueId = 0; - -var _ = { - manual: _self.Prism && _self.Prism.manual, - disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler, - util: { - encode: function (tokens) { - if (tokens instanceof Token) { - return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias); - } else if (Array.isArray(tokens)) { - return tokens.map(_.util.encode); - } else { - return tokens.replace(/&/g, '&').replace(/ text.length) { - // Something went terribly wrong, ABORT, ABORT! - return; - } - - if (str instanceof Token) { - continue; - } - - if (greedy && i != strarr.length - 1) { - pattern.lastIndex = pos; - var match = pattern.exec(text); - if (!match) { - break; - } - - var from = match.index + (lookbehind ? match[1].length : 0), - to = match.index + match[0].length, - k = i, - p = pos; - - for (var len = strarr.length; k < len && (p < to || (!strarr[k].type && !strarr[k - 1].greedy)); ++k) { - p += strarr[k].length; - // Move the index i to the element in strarr that is closest to from - if (from >= p) { - ++i; - pos = p; - } - } - - // If strarr[i] is a Token, then the match starts inside another Token, which is invalid - if (strarr[i] instanceof Token) { - continue; - } - - // Number of tokens to delete and replace with the new match - delNum = k - i; - str = text.slice(pos, p); - match.index -= pos; - } else { - pattern.lastIndex = 0; - - var match = pattern.exec(str), - delNum = 1; - } - - if (!match) { - if (oneshot) { - break; - } - - continue; - } - - if(lookbehind) { - lookbehindLength = match[1] ? match[1].length : 0; - } - - var from = match.index + lookbehindLength, - match = match[0].slice(lookbehindLength), - to = from + match.length, - before = str.slice(0, from), - after = str.slice(to); - - var args = [i, delNum]; - - if (before) { - ++i; - pos += before.length; - args.push(before); - } - - var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy); - - args.push(wrapped); - - if (after) { - args.push(after); - } - - Array.prototype.splice.apply(strarr, args); - - if (delNum != 1) - _.matchGrammar(text, strarr, grammar, i, pos, true, token); - - if (oneshot) - break; - } - } - } - }, - - tokenize: function(text, grammar) { - var strarr = [text]; - - var rest = grammar.rest; - - if (rest) { - for (var token in rest) { - grammar[token] = rest[token]; - } - - delete grammar.rest; - } - - _.matchGrammar(text, strarr, grammar, 0, 0, false); - - return strarr; - }, - - hooks: { - all: {}, - - add: function (name, callback) { - var hooks = _.hooks.all; - - hooks[name] = hooks[name] || []; - - hooks[name].push(callback); - }, - - run: function (name, env) { - var callbacks = _.hooks.all[name]; - - if (!callbacks || !callbacks.length) { - return; - } - - for (var i=0, callback; callback = callbacks[i++];) { - callback(env); - } - } - }, - - Token: Token -}; - -_self.Prism = _; - -function Token(type, content, alias, matchedStr, greedy) { - this.type = type; - this.content = content; - this.alias = alias; - // Copy of the full string this token was created from - this.length = (matchedStr || "").length|0; - this.greedy = !!greedy; -} - -Token.stringify = function(o, language) { - if (typeof o == 'string') { - return o; - } - - if (Array.isArray(o)) { - return o.map(function(element) { - return Token.stringify(element, language); - }).join(''); - } - - var env = { - type: o.type, - content: Token.stringify(o.content, language), - tag: 'span', - classes: ['token', o.type], - attributes: {}, - language: language - }; - - if (o.alias) { - var aliases = Array.isArray(o.alias) ? o.alias : [o.alias]; - Array.prototype.push.apply(env.classes, aliases); - } - - _.hooks.run('wrap', env); - - var attributes = Object.keys(env.attributes).map(function(name) { - return name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"'; - }).join(' '); - - return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + ''; -}; - -if (!_self.document) { - if (!_self.addEventListener) { - // in Node.js - return _; - } - - if (!_.disableWorkerMessageHandler) { - // In worker - _self.addEventListener('message', function (evt) { - var message = JSON.parse(evt.data), - lang = message.language, - code = message.code, - immediateClose = message.immediateClose; - - _self.postMessage(_.highlight(code, _.languages[lang], lang)); - if (immediateClose) { - _self.close(); - } - }, false); - } - - return _; -} - -//Get current script and highlight -var script = document.currentScript || [].slice.call(document.getElementsByTagName("script")).pop(); - -if (script) { - _.filename = script.src; - - if (!_.manual && !script.hasAttribute('data-manual')) { - if(document.readyState !== "loading") { - if (window.requestAnimationFrame) { - window.requestAnimationFrame(_.highlightAll); - } else { - window.setTimeout(_.highlightAll, 16); - } - } - else { - document.addEventListener('DOMContentLoaded', _.highlightAll); - } - } -} - -return _; - -})(_self); - -if (typeof module !== 'undefined' && module.exports) { - module.exports = Prism; -} - -// hack for components to work correctly in node.js -if (typeof global !== 'undefined') { - global.Prism = Prism; -} -; -Prism.languages.markup = { - 'comment': //, - 'prolog': /<\?[\s\S]+?\?>/, - 'doctype': //i, - 'cdata': //i, - 'tag': { - pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i, - greedy: true, - inside: { - 'tag': { - pattern: /^<\/?[^\s>\/]+/i, - inside: { - 'punctuation': /^<\/?/, - 'namespace': /^[^\s>\/:]+:/ - } - }, - 'attr-value': { - pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i, - inside: { - 'punctuation': [ - /^=/, - { - pattern: /^(\s*)["']|["']$/, - lookbehind: true - } - ] - } - }, - 'punctuation': /\/?>/, - 'attr-name': { - pattern: /[^\s>\/]+/, - inside: { - 'namespace': /^[^\s>\/:]+:/ - } - } - - } - }, - 'entity': /&#?[\da-z]{1,8};/i -}; - -Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = - Prism.languages.markup['entity']; - -// Plugin to make entity title show the real entity, idea by Roman Komarov -Prism.hooks.add('wrap', function(env) { - - if (env.type === 'entity') { - env.attributes['title'] = env.content.replace(/&/, '&'); - } -}); - -Object.defineProperty(Prism.languages.markup.tag, 'addInlined', { - /** - * Adds an inlined language to markup. - * - * An example of an inlined language is CSS with `