diff --git a/.bowerrc b/.bowerrc
deleted file mode 100644
index 7ece54886..000000000
--- a/.bowerrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "directory" : "src/DebugBar/Resources/vendor"
-}
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..56b1781c0
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,17 @@
+# top-most EditorConfig file
+root = true
+
+# Unix-style newlines with a newline ending every file
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+
+# 4 space indentation
+[{*.php,*.js}]
+indent_style = space
+indent_size = 4
+
+[{*.yml,*.neon}]
+indent_style = space
+indent_size = 4
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
index dfd71db96..00611dfed 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,15 +1,25 @@
* text=auto
+/.github export-ignore
/docs export-ignore
/demo export-ignore
/tests export-ignore
/build export-ignore
+/.editorconfig export-ignore
/.bowerrc export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
+/.nvmrc export-ignore
+/.php-cs-fixer.dist.php export-ignore
/.travis.yml export-ignore
/bower.json export-ignore
/phpunit.xml.dist export-ignore
/CHANGELOG.md export-ignore
/CONTRIBUTING.md export-ignore
/README.md export-ignore
+/mkdocs.yml export-ignore
+/eslint.config.js export-ignore
+/package.json export-ignore
+/package-lock.json export-ignore
+/phpstan.neon export-ignore
+/UPGRADE.md export-ignore
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 000000000..4d29bc6e1
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,3 @@
+# These are supported funding model platforms
+github: barryvdh
+custom: ['https://fruitcake.nl']
diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml
new file mode 100644
index 000000000..223e946c6
--- /dev/null
+++ b/.github/workflows/build-assets.yml
@@ -0,0 +1,58 @@
+name: Check Minified Files
+
+on:
+ push:
+ branches:
+ - master
+ paths:
+ - 'resources/**'
+ pull_request:
+ branches:
+ - "*"
+ paths:
+ - 'resources/**'
+
+permissions:
+ contents: write
+
+jobs:
+ build-assets:
+ runs-on: ubuntu-24.04
+ timeout-minutes: 15
+
+ name: Build Minified Files
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v6
+ with:
+ node-version: '24'
+ cache: 'npm'
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: 8.4
+
+ - name: Install dependencies
+ env:
+ COMPOSER_ROOT_VERSION: dev-master
+ run: composer update --prefer-dist --no-progress
+
+ - name: Build all files
+ run: npm run lint:fix
+
+ - name: Build all files
+ run: npm run build
+
+ - name: Commit Compiled Files
+ uses: stefanzweifel/git-auto-commit-action@v7
+ continue-on-error: true
+ with:
+ commit_message: Update Assets
diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
new file mode 100644
index 000000000..0e258f413
--- /dev/null
+++ b/.github/workflows/build-docs.yml
@@ -0,0 +1,58 @@
+name: Build docs
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - master
+ paths:
+ - 'resources/**'
+ - 'docs/**'
+ - 'demo/**'
+
+permissions:
+ contents: write
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+
+ - name: Configure Git Credentials
+ run: |
+ git config user.name github-actions[bot]
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: 8.2
+ coverage: none
+ tools: composer:v2
+
+ - name: Install dependencies
+ env:
+ COMPOSER_ROOT_VERSION: dev-master
+ run: composer update --prefer-dist --no-progress
+
+ - name: Run Tests for Docs
+ run: vendor/bin/phpunit --filter=testDocs
+
+ - name: Run build script
+ run: php build/build-docs.php
+
+ - uses: actions/setup-python@v6
+ with:
+ python-version: 3.x
+
+ - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
+
+ - uses: actions/cache@v5
+ with:
+ key: mkdocs-material-${{ env.cache_id }}
+ path: .cache
+ restore-keys: |
+ mkdocs-material-
+
+ - run: pip install mkdocs-material
+
+ - run: mkdocs gh-deploy --force
diff --git a/.github/workflows/check-code-style.yml b/.github/workflows/check-code-style.yml
new file mode 100644
index 000000000..5f308ce4c
--- /dev/null
+++ b/.github/workflows/check-code-style.yml
@@ -0,0 +1,37 @@
+name: Check Code Style
+
+on:
+ pull_request:
+ branches:
+ - "*"
+ paths:
+ - '**.php'
+
+jobs:
+ cs-check:
+ runs-on: ubuntu-24.04
+ timeout-minutes: 15
+ env:
+ COMPOSER_NO_INTERACTION: 1
+
+ name: Check Code Style
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: 8.2
+ coverage: none
+ tools: composer:v2
+
+ - name: Install dependencies
+ env:
+ COMPOSER_ROOT_VERSION: dev-master
+ run: composer update --prefer-dist --no-progress
+
+ - name: Fix Code Style
+ run: vendor/bin/php-cs-fixer check -v --diff
+ continue-on-error: true
diff --git a/.github/workflows/coverage-report.yml b/.github/workflows/coverage-report.yml
new file mode 100644
index 000000000..ed1fb9224
--- /dev/null
+++ b/.github/workflows/coverage-report.yml
@@ -0,0 +1,45 @@
+name: Code Coverage
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - "*"
+
+jobs:
+ coverage-report:
+ runs-on: ubuntu-24.04
+
+ name: PHP Code Coverage
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: 8.2
+ tools: composer:v2
+ extensions: mbstring
+ coverage: pcov
+
+ - name: Install dependencies
+ env:
+ COMPOSER_ROOT_VERSION: dev-master
+ run: |
+ composer update --prefer-dist --no-interaction --no-suggest --with-all-dependencies
+
+ - name: Check Code Coverage
+ uses: nick-fields/retry@v3
+ with:
+ max_attempts: 3
+ timeout_seconds: 60
+ command: vendor/bin/phpunit --coverage-text --coverage-clover=clover.xml
+
+ - uses: actions/upload-artifact@v6
+ with:
+ name: coverage
+ path: clover.xml
diff --git a/.github/workflows/fix-code-style.yml b/.github/workflows/fix-code-style.yml
new file mode 100644
index 000000000..0cf47c1ea
--- /dev/null
+++ b/.github/workflows/fix-code-style.yml
@@ -0,0 +1,44 @@
+name: Fix Code Style
+
+on:
+ push:
+ branches:
+ - master
+ paths:
+ - '**.php'
+
+permissions:
+ contents: write
+
+jobs:
+ cs-fix:
+ runs-on: ubuntu-24.04
+ timeout-minutes: 15
+ env:
+ COMPOSER_NO_INTERACTION: 1
+
+ name: Check Code Style
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: 8.2
+ coverage: none
+ tools: composer:v2
+
+ - name: Install dependencies
+ env:
+ COMPOSER_ROOT_VERSION: dev-master
+ run: composer update --prefer-dist --no-progress
+
+ - name: Fix Code Style
+ run: vendor/bin/php-cs-fixer fix -v --diff
+
+ - name: Commit changes
+ uses: stefanzweifel/git-auto-commit-action@v7
+ with:
+ commit_message: Fix CS
diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml
new file mode 100644
index 000000000..dd9c0fb99
--- /dev/null
+++ b/.github/workflows/integration-tests.yml
@@ -0,0 +1,61 @@
+name: Integration
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - "*"
+
+jobs:
+ integration-tests:
+ runs-on: ubuntu-24.04
+ timeout-minutes: 15
+ env:
+ COMPOSER_NO_INTERACTION: 1
+
+ strategy:
+ matrix:
+ php: [8.5, 8.4, 8.3, 8.2]
+ symfony: ['*']
+ include:
+ - php: 8.2
+ symfony: ^5.4
+ - php: 8.2
+ symfony: ^6.4
+ - php: 8.2
+ symfony: ^7.3
+ - php: 8.4
+ symfony: ^7.3
+
+ name: Integration PHP${{ matrix.php }} Symfony${{ matrix.symfony }}
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php }}
+ coverage: none
+ tools: composer:v2
+ extensions: pdo_sqlite
+
+ - name: Require specific Symfony version
+ if: matrix.symfony != '*'
+ run: composer require "symfony/var-dumper:${{ matrix.symfony }}" --no-interaction --no-update
+
+ - name: Install dependencies
+ env:
+ COMPOSER_ROOT_VERSION: dev-master
+ run: |
+ composer update --prefer-dist --no-progress
+
+ - name: Execute Unit Tests
+ uses: nick-fields/retry@v3
+ with:
+ max_attempts: 3
+ timeout_seconds: 30
+ command: vendor/bin/phpunit --testsuite=Browser
diff --git a/.github/workflows/screenshots.yml b/.github/workflows/screenshots.yml
new file mode 100644
index 000000000..6187fd779
--- /dev/null
+++ b/.github/workflows/screenshots.yml
@@ -0,0 +1,53 @@
+name: Screenshots
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - "*"
+
+jobs:
+ screenshots:
+ runs-on: ubuntu-24.04
+ timeout-minutes: 15
+ env:
+ COMPOSER_NO_INTERACTION: 1
+
+ strategy:
+ matrix:
+ php: [8.4]
+
+ name: PHP${{ matrix.php }}
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php }}
+ coverage: none
+ tools: composer:v2
+ extensions: pdo_sqlite
+
+ - name: Install dependencies
+ env:
+ COMPOSER_ROOT_VERSION: dev-master
+ run: |
+ composer update --prefer-dist --no-progress
+
+ - name: Execute Unit Tests
+ uses: nick-fields/retry@v3
+ with:
+ max_attempts: 3
+ timeout_seconds: 30
+ command: vendor/bin/phpunit --testsuite=Browser
+
+ - name: Upload screenshots
+ uses: actions/upload-artifact@v6
+ with:
+ name: debugbar-screenshots
+ path: tests/screenshots
diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml
new file mode 100644
index 000000000..5e0920fb3
--- /dev/null
+++ b/.github/workflows/static-analysis.yml
@@ -0,0 +1,37 @@
+name: Code Analysis
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - "*"
+
+jobs:
+ static-analysis:
+ runs-on: ubuntu-24.04
+ timeout-minutes: 15
+ env:
+ COMPOSER_NO_INTERACTION: 1
+
+ name: PHPStan Analysis
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: 8.2
+ tools: composer:v2
+ coverage: none
+
+ - name: Install dependencies
+ env:
+ COMPOSER_ROOT_VERSION: dev-master
+ run: composer update --prefer-stable --prefer-dist --no-interaction --no-progress
+
+ - name: Analyse with PHPStan
+ run: vendor/bin/phpstan --no-progress --error-format=github
diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml
new file mode 100644
index 000000000..6cfb0600a
--- /dev/null
+++ b/.github/workflows/unit-tests.yml
@@ -0,0 +1,64 @@
+name: Tests
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - "*"
+
+jobs:
+ unit-tests:
+ runs-on: ${{ matrix.os }}
+ timeout-minutes: 15
+ env:
+ COMPOSER_NO_INTERACTION: 1
+
+ strategy:
+ matrix:
+ os: [ubuntu-24.04]
+ php: [8.5, 8.4, 8.3, 8.2]
+ symfony: ['*']
+ include:
+ - php: 8.2
+ symfony: ^5.4
+ os: ubuntu-latest
+ - php: 8.2
+ symfony: ^6
+ os: ubuntu-latest
+ - php: 8.2
+ symfony: ^7
+ os: ubuntu-latest
+ - php: 8.4
+ symfony: ^7
+ os: ubuntu-latest
+ - php: 8.4
+ symfony: ^7
+ os: windows-latest
+
+ name: Unit PHP${{ matrix.php }} Symfony${{ matrix.symfony }} ${{ matrix.os }}
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php }}
+ coverage: none
+ tools: composer:v2
+ extensions: pdo_sqlite, zip
+
+ - name: Require specific Symfony version
+ if: matrix.symfony != '*'
+ run: composer require "symfony/var-dumper:${{ matrix.symfony }}" --no-interaction --no-update
+
+ - name: Install dependencies
+ env:
+ COMPOSER_ROOT_VERSION: dev-master
+ run: composer update --prefer-dist --no-progress
+
+ - name: Execute Unit Tests
+ run: vendor/bin/phpunit --testsuite=Unit
diff --git a/.gitignore b/.gitignore
index 6494aeb9e..1ca86c47a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,20 @@
composer.lock
/vendor
-/src/DebugBar/Resources/vendor
\ No newline at end of file
+/demo/bridge/*/vendor
+/demo/bridge/doctrine/db.sqlite
+/demo/profiles
+/src/DebugBar/Resources/vendor
+.phpunit.result.cache
+/drivers
+/chromedriver
+.phpunit.cache/
+/tests/screenshots
+/node_modules
+.DS_Store
+.php-cs-fixer.cache
+clover.xml
+/docs/overrides/__pycache__/
+/docs/assets/dist/
+/site
+/build/docs
+debugbar.sqlite
\ No newline at end of file
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 000000000..a45fd52cc
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+24
diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php
new file mode 100644
index 000000000..e8c21eb02
--- /dev/null
+++ b/.php-cs-fixer.dist.php
@@ -0,0 +1,66 @@
+setParallelConfig(ParallelConfigFactory::detect()) // @TODO 4.0 no need to call this manually
+ ->setRiskyAllowed(true)
+ ->setRules([
+ '@auto' => true,
+ '@PER-CS' => true,
+ '@PHP8x2Migration' => true,
+ '@PHPUnit10x0Migration:risky' => true,
+ //Modernize code
+ 'array_push' => true,
+ 'modernize_strpos' => true,
+ 'modernize_types_casting' => true,
+ //Align arrays
+ 'trim_array_spaces' => true,
+ //Casting
+ 'no_short_bool_cast' => true,
+ 'cast_spaces' => true,
+
+ // Class names
+ 'no_leading_namespace_whitespace' => true,
+ 'no_unused_imports' => true,
+ 'single_space_around_construct' => true,
+
+ //Remove unneeded code
+ 'no_unneeded_braces' => true,
+ 'no_useless_else' => true,
+ 'no_useless_return' => true,
+ 'no_extra_blank_lines' => true,
+
+ //PHPdocs
+ 'no_superfluous_phpdoc_tags' => true,
+ 'no_empty_phpdoc' => true,
+ 'phpdoc_align' => true,
+ 'phpdoc_separation' => true,
+ 'phpdoc_to_param_type' => true,
+ 'phpdoc_to_return_type' => true,
+
+ // Strict
+ 'declare_strict_types' => true,
+ 'return_type_declaration' => true,
+ 'nullable_type_declaration_for_default_null_value' => true,
+ ])
+ // π‘ by default, Fixer looks for `*.php` files excluding `./vendor/` - here, you can groom this config
+ ->setFinder(
+ (new Finder())
+ // π‘ root folder to check
+ ->in([__DIR__ . '/src', __DIR__ . '/tests', __DIR__ . '/demo'])
+ // π‘ additional files, eg bin entry file
+ // ->append([__DIR__.'/bin-entry-file'])
+ // π‘ folders to exclude, if any
+ // ->exclude([/* ... */])
+ // π‘ path patterns to exclude, if any
+ // ->notPath([/* ... */])
+ // π‘ extra configs
+ // ->ignoreDotFiles(false) // true by default in v3, false in v4 or future mode
+ // ->ignoreVCS(true) // true by default
+ )
+;
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index ceecd9090..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: php
-
-php:
- - 5.6
- - 7.0
- - 7.1
- - 7.2
-
-sudo: false
-
-## Cache composer
-cache:
- directories:
- - $HOME/.composer/cache
-
-before_script:
- - travis_retry composer install --no-interaction --prefer-dist
-
-script:
- - vendor/bin/phpunit
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0e51a580c..acc75d1d2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,43 +1,62 @@
# Changelog
+2025-11-25
+
+ - Add Antigravity editor link template
+
+2025-06-26
+
+ - Add Windsurf editor link template
+
+2023-09-08
+
+ - Add SymfonyMailCollector (#554)
+
+2021-12-21
+
+ - Add support for `symfony/var-dumper^6` package
+
+2019-05 (1.10.3)
+
+- New implementation for `dump()` in SwiftLogCollector (#265)
2014-12 (1.10.2):
- Use Symfony VarDumper instead of kintLite as DataFormatter (#179)
- Better resize handling (#185)
-
+
2014-11 (1.10.1):
- Add disableVendor() option to JavascriptRenderer to remove a specific vendor (#182)
- Fix macros in Twig Collector (#167, #177)
- - Update Font Awesome to 4.2.0
+ - Update Font Awesome to 4.2.0
2014-10 (1.10.0):
- Add bindToXHR() as alternative to jQuery ajax handling.
- Extend TemplateWidget to show more information + parameters
- Extend TimeDataCollector to show parameters + collector source
-
+
2014-08:
- Replace image files with inline data in css
- Tweak OpenHandler display
-
+
2014-06-10:
- Add LocalizationCollector
-
+
2014-03-29:
- Add hasMeasure() method to TimeDataCollector
-
+
2014-03-25:
- Duplicate SQL detection
-
+
2014-03-23:
- Add syntax highlighting
-
+
2014-03-22:
- added AssetProvider interface
diff --git a/README.md b/README.md
index af5de688b..ae992f07f 100644
--- a/README.md
+++ b/README.md
@@ -1,49 +1,68 @@
# PHP Debug Bar
-[](https://packagist.org/packages/maximebf/debugbar) [](https://packagist.org/packages/maximebf/debugbar) [](https://packagist.org/packages/maximebf/debugbar) [](https://travis-ci.org/maximebf/php-debugbar)
+[](https://packagist.org/packages/php-debugbar/php-debugbar) [](https://packagist.org/packages/php-debugbar/php-debugbar) [](https://packagist.org/packages/php-debugbar/php-debugbar) [](https://github.com/php-debugbar/php-debugbar/actions/workflows/run-tests.yml)
Displays a debug bar in the browser with information from php.
No more `var_dump()` in your code!
-
+> **Note: Debug Bar is for development use only. Never install this on websites that are publicly accessible.**
+
+> Debugbar has had significant updates in 3.x (January 2026).
+> See the [Release Notes](https://php-debugbar.com/docs/release-notes/) for more information and breaking changes.
+
+
**Features:**
- - Generic debug bar
+ - Generic Debug Bar for PHP projects
- Easy to integrate with any project
- Clean, fast and easy to use interface
- Handles AJAX request
- Includes generic data collectors and collectors for well known libraries
- - The client side bar is 100% coded in javascript
+ - The client side bar is 100% coded in plain javascript
- Easily create your own collectors and their associated view in the bar
- Save and re-open previous requests
- - [Very well documented](http://phpdebugbar.com/docs)
+ - [Very well documented](http://php-debugbar.com/docs/)
Includes collectors for:
-
+ - Messages
+ - Config
+ - Time
+ - Memory
+ - Exceptions
+ - PHP Info
+ - Request Data
+ - Templates
+ - Object Count
- [PDO](http://php.net/manual/en/book.pdo.php)
- - [CacheCache](http://maximebf.github.io/CacheCache/)
- - [Doctrine](http://doctrine-project.org)
- [Monolog](https://github.com/Seldaek/monolog)
- - [Propel](http://propelorm.org/)
- - [Slim](http://slimframework.com)
- - [Swift Mailer](http://swiftmailer.org/)
- - [Twig](http://twig.sensiolabs.org/)
+ - [Symfony Mailer](https://symfony.com/doc/current/mailer.html)
+ - [Symfony HttpFoundation](https://symfony.com/doc/current/components/http_foundation.html)
-Checkout the [demo](https://github.com/maximebf/php-debugbar/tree/master/demo) for
-examples and [phpdebugbar.com](http://phpdebugbar.com) for a live example.
+Checkout the [demo](https://github.com/php-debugbar/php-debugbar/tree/master/demo) for
+examples and [php-debugbar.com](http://php-debugbar.com) for a live example.
+
+Additional collectors are available here:
+ - [Twig](https://github.com/php-debugbar/twig-bridge)
+ - [Doctrine](https://github.com/php-debugbar/doctrine-bridge)
+ - [Monolog](https://github.com/php-debugbar/monolog-bridge)
+ - [Symfony](https://github.com/php-debugbar/symfony-bridge)
Integrations with other frameworks:
- [Laravel](https://github.com/barryvdh/laravel-debugbar)
- - [Atomik](http://atomikframework.com/docs/error-log-debug.html#debug-bar)
- - [XOOPS](http://xoops.org/modules/news/article.php?storyid=6538)
- [Zend Framework 2](https://github.com/snapshotpl/ZfSnapPhpDebugBar)
- [Phalcon](https://github.com/snowair/phalcon-debugbar)
- [SilverStripe](https://github.com/lekoala/silverstripe-debugbar)
- [Grav CMS](https://getgrav.org)
- [TYPO3](https://github.com/Konafets/typo3_debugbar)
- - Framework-agnostic middleware and PSR-7 with [php-middleware/phpdebugbar](https://github.com/php-middleware/phpdebugbar).
+ - [Joomla](https://github.com/joomla/joomla-cms/blob/4.0-dev/plugins/system/debug/debug.php)
+ - [Drupal](https://www.drupal.org/project/debugbar)
+ - [October CMS](https://github.com/rainlab/debugbar-plugin)
+ - [Winter CMS](https://packagist.org/packages/winter/wn-debugbar-plugin)
+ - [ZubZet Framework (From v1.2.0+)](https://zubzet.com/)
+ - Framework-agnostic middleware and PSR-7 with [php-middleware/phpdebugbar](https://github.com/php-middleware/phpdebugbar)
+ - [Dotkernel Frontend Application](https://github.com/dotkernel/dot-debugbar)
*(drop me a message or submit a PR to add your DebugBar related project here)*
@@ -52,7 +71,9 @@ Integrations with other frameworks:
The best way to install DebugBar is using [Composer](http://getcomposer.org)
with the following command:
-```composer require maximebf/debugbar```
+```bash
+composer require --dev php-debugbar/php-debugbar
+```
## Quick start
@@ -100,4 +121,33 @@ $debugbar["messages"]->addMessage("hello world!");
- `TimeDataCollector` (*time*)
- `ExceptionsCollector` (*exceptions*)
-Learn more about DebugBar in the [docs](http://phpdebugbar.com/docs).
+Learn more about DebugBar in the [docs](http://php-debugbar.com/docs/).
+
+## Demo
+
+To run the demo, clone this repository and start the Built-In PHP webserver from the demo folder:
+
+```
+composer run demo
+```
+
+Then visit http://localhost:8000/
+
+## Testing
+
+To test, run `php vendor/bin/phpunit`.
+To debug Browser tests, you can run `PANTHER_NO_HEADLESS=1 vendor/bin/phpunit --debug`. Run `vendor/bin/bdi detect drivers` to download the latest drivers.
+
+## Contributing
+When contributing to the JavaScript codebase:
+
+1. Run `npm run lint` and `npm run build` before committing
+2. Fix any errors (warnings are acceptable but should be minimized)
+3. Use `npm run lint:fix` for automatic fixes where possible
+4. Follow the ES6+ patterns established in the codebase
+
+When contributing to the PHP codebase:
+
+1. Run `composer check-style` and `composer analyse` before committing.
+2. Make sure the tests pass (see above)
+3. Verify that the demo works correctly (`php -S localhost:8000 demo/`)
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..9426c818b
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,3 @@
+# Security Policy
+
+If you find a security issue, please report it to barryvdh [at] gmail [dot] com.
\ No newline at end of file
diff --git a/UPGRADE.md b/UPGRADE.md
new file mode 100644
index 000000000..43a534add
--- /dev/null
+++ b/UPGRADE.md
@@ -0,0 +1,42 @@
+# Upgrade Guide
+
+## 2.x to 3.x
+
+### Removed Bridge collectors
+
+Version 3.x removes all bridge collectors (Twig, Doctrine, Propel, CacheCache and Slim.
+Doctrine can be installed with: https://github.com/php-debugbar/doctrine-bridge
+Twig Bridge can be installed with: https://github.com/php-debugbar/twig-bridge
+Monolog Bridge can be installed with: https://github.com/php-debugbar/monolog-bridge
+Symfony Bridge can be installed with: https://github.com/php-debugbar/symfony-bridge
+
+This makes it easier to updates these collectors for specific versions. Other bridges have not been ported, but community contributions are welcome.
+
+### Changes to widgets
+ - jQuery is removed, and widgets are now Javascript classes. Custom widgets should be updated.
+ - FontAwesome is removed, and replaced by SVG icons from Tabler, included in CSS. Only the icons used by the default widgets are included, so packages extending the debugbar should add their own icons.
+ - Typehints are added to all widgets, so you might need to update your widgets.
+ - Widgets are rendered when opening a tab, not when loading the page.
+
+### Changes to DataCollectors
+- TimeDataCollector is removed from the constructors, but a setTimeDataCollector method is added.
+- useHtmlVarDumper is removed. The HtmlDataFormatter is used by default. To use plain-text, the the default formatter to DataFormatter.
+
+### Remove obsolete methods
+ - Removed get/setBindAjaxHandlerToJquery (Use bind to fetch/xhr instead)
+ - Removed Assetic collection (use getAssets() directly if needed)
+ - Removed RequireJS support
+ - Removed captureVar and renderCapturedVar from DebugBarVarDumper
+
+### Breaking changes to methods/interfaces
+- All code is typehinted, so you might need to update your code for custom collectors.
+- getAssets() removed the `$type` parameter and always returns all assets.
+- OpenHandler requires the `op` parameter to be always set.
+- The DataFormatterInterface has a 2nd 'deep' parameter to formatVar.
+- The StorageInterface has a new 'prune' method
+
+### Other changes
+ - Storage now uses json instead of serialize, so old data cannot be read.
+ - StorageInterface now has a prune() method
+ - ReuqestIdGenerator now returns a Lexicographically Sortable string. Other generators should also do this, to improve storage performance.
+ - PDO now quotes using the PDO connection when available. The quotation char is now always `'`. Methods have moved to the QueryFormatter instead of TracedStatement.
diff --git a/bower.json b/bower.json
deleted file mode 100644
index 821e1d3bc..000000000
--- a/bower.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "maximebf/php-debugbar",
- "dependencies": {
- "jquery": "^3.3",
- "font-awesome": "^4.7"
- }
-}
diff --git a/build/build-assets.php b/build/build-assets.php
new file mode 100644
index 000000000..da7074a39
--- /dev/null
+++ b/build/build-assets.php
@@ -0,0 +1,21 @@
+getJavascriptRenderer();
+
+$assets = $debugbarRenderer->getDistIncludedAssets();
+$debugbarRenderer->dumpAssets(files: $assets['css'], targetFilename: __DIR__ . '/../resources/dist/debugbar.css');
+$debugbarRenderer->dumpAssets(files: $assets['js'], targetFilename: __DIR__ . '/../resources/dist/debugbar.js');
diff --git a/build/build-docs.php b/build/build-docs.php
new file mode 100644
index 000000000..bc2d130e9
--- /dev/null
+++ b/build/build-docs.php
@@ -0,0 +1,135 @@
+', '');
+// Remove first style/script
+$generatedScripts = explode('', $generatedScripts, 2)[1];
+
+// Read the main.html template
+$templatePath = __DIR__ . '/../docs/overrides/main.html';
+$template = file_get_contents($templatePath);
+
+// Replace the scripts block content between specific markers
+$startMarker = "";
+$endMarker = "";
+
+// Find the positions
+$startPos = strpos($template, $startMarker);
+$endPos = strpos($template, $endMarker);
+
+if ($startPos !== false && $endPos !== false) {
+ $startPos += strlen($startMarker);
+
+ // Replace the content between markers
+ $newTemplate = substr($template, 0, $startPos)
+ . "\n{% raw %}\n" . $generatedScripts . "\n{% endraw %}\n"
+ . substr($template, $endPos);
+
+ // Write back to the file
+ file_put_contents($templatePath, $newTemplate);
+
+ echo "β Updated docs/overrides/main.html with generated debugbar scripts\n";
+} else {
+ echo "β Could not find script markers in main.html\n";
+ exit(1);
+}
+
+// Copy dist folder to docs/assets/dist
+$distSource = __DIR__ . '/../resources/dist';
+$distDest = __DIR__ . '/../docs/assets/dist';
+
+if (!is_dir($distSource)) {
+ echo "β dist folder not found at $distSource\n";
+ exit(1);
+}
+
+// Create docs/assets directory if it doesn't exist
+if (!is_dir(__DIR__ . '/../docs/assets')) {
+ mkdir(__DIR__ . '/../docs/assets', 0755, true);
+}
+
+// Remove existing dist folder if it exists
+if (is_dir($distDest)) {
+ deleteDirectory($distDest);
+}
+
+// Copy dist folder
+copyDirectory($distSource, $distDest);
+
+echo "β Copied dist folder to docs/assets/dist\n";
+
+// Update mkdocs.yml with current timestamp
+$mkdocsPath = __DIR__ . '/../mkdocs.yml';
+$mkdocsContent = file_get_contents($mkdocsPath);
+$timestamp = time();
+
+$mkdocsContent = preg_replace(
+ '/debugbar\.min\.css\?v=\d+/',
+ 'debugbar.min.css?v=' . $timestamp,
+ $mkdocsContent
+);
+
+$mkdocsContent = preg_replace(
+ '/debugbar\.min\.js\?v=\d+/',
+ 'debugbar.min.js?v=' . $timestamp,
+ $mkdocsContent
+);
+
+file_put_contents($mkdocsPath, $mkdocsContent);
+
+echo "β Updated mkdocs.yml with timestamp: $timestamp\n";
+
+function copyDirectory($source, $dest) {
+ mkdir($dest, 0755, true);
+
+ $iterator = new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
+ RecursiveIteratorIterator::SELF_FIRST
+ );
+
+ foreach ($iterator as $item) {
+ $destPath = $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathname();
+ if ($item->isDir()) {
+ mkdir($destPath, 0755, true);
+ } else {
+ copy($item, $destPath);
+ }
+ }
+}
+
+function deleteDirectory($dir) {
+ if (!is_dir($dir)) {
+ return;
+ }
+
+ $iterator = new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
+ RecursiveIteratorIterator::CHILD_FIRST
+ );
+
+ foreach ($iterator as $item) {
+ if ($item->isDir()) {
+ rmdir($item);
+ } else {
+ unlink($item);
+ }
+ }
+
+ rmdir($dir);
+}
diff --git a/build/build-hljs.js b/build/build-hljs.js
new file mode 100644
index 000000000..a68ed9e6b
--- /dev/null
+++ b/build/build-hljs.js
@@ -0,0 +1,39 @@
+// Build custom highlight.js bundle with specific languages
+import hljs from 'highlight.js/lib/core';
+import php from 'highlight.js/lib/languages/php';
+import phpTemplate from 'highlight.js/lib/languages/php-template';
+import javascript from 'highlight.js/lib/languages/javascript';
+import sql from 'highlight.js/lib/languages/sql';
+import shell from 'highlight.js/lib/languages/shell';
+import css from 'highlight.js/lib/languages/css';
+import plaintext from 'highlight.js/lib/languages/plaintext';
+import xml from 'highlight.js/lib/languages/xml';
+import yaml from 'highlight.js/lib/languages/yaml';
+
+hljs.registerLanguage('php', php);
+hljs.registerLanguage('php-template', phpTemplate);
+hljs.registerLanguage('javascript', javascript);
+hljs.registerLanguage('sql', sql);
+hljs.registerLanguage('shell', shell);
+hljs.registerLanguage('css', css);
+hljs.registerLanguage('plaintext', plaintext);
+hljs.registerLanguage('xml', xml);
+hljs.registerLanguage('yaml', yaml);
+
+
+const sqlLang = hljs.getLanguage('sql');
+
+//Extend sql keywords
+sqlLang.keywords.keyword = Array.from(new Set([
+ ...sqlLang.keywords.keyword,
+ 'if','ifnull','limit','aes_decrypt','aes_encrypt','ascii','bin','bit_and','bit_count','bit_length','bit_or','bit_xor','coercibility','concat','group_concat','concat_ws','connection_id','conv','curdate','curtime','database','date_add','date_format','date_sub','dayname','dayofmonth','dayofweek','dayofyear','elt','export_set','field','find_in_set','format','from_base64','from_days','from_unixtime','get_lock','greatest','hex','ifnull','inet_aton','inet_ntoa','instr','isnull','last_insert_id','least','lpad','ltrim','make_set','md5','monthname','now','oct','ord','password','quote','release_lock','repeat','replace','reverse','rpad','rtrim','sec_to_time','sha1','sha2','sleep','soundex','space','straight_join','strcmp','str_to_date','substr','sysdate','time_format','time_to_sec','to_base64','to_days','unix_timestamp','updatexml','version','week','weekday','yearweek','length','substring_index','json_unquote','json_extract','json_contains'
+]));
+sqlLang.keywords.type = Array.from(new Set([
+ ...sqlLang.keywords.type,
+ 'longtext',
+]));
+
+// Configure to use custom CSS class prefix
+hljs.configure({ classPrefix: 'phpdebugbar-hljs-' });
+
+globalThis.phpdebugbar_hljs = hljs.default;
diff --git a/build/build-icons.js b/build/build-icons.js
new file mode 100644
index 000000000..90aac6e1c
--- /dev/null
+++ b/build/build-icons.js
@@ -0,0 +1,128 @@
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+
+// Tabler icons to include
+const icons = [
+ // Data collector icons
+ 'adjustments',
+ 'adjustments-horizontal',
+ 'arrow-right',
+ 'arrows-left-right',
+ 'bolt',
+ 'bookmark',
+ 'box',
+ 'briefcase',
+ 'bug',
+ 'calendar',
+ 'chart-infographic',
+ 'clock',
+ 'code',
+ 'database',
+ 'file-code',
+ 'flag',
+ 'history',
+ 'inbox',
+ 'leaf',
+ 'list',
+ 'logs',
+ 'mobiledata',
+ 'search',
+ 'server-cog',
+ 'share-3',
+ 'tags',
+ 'x',
+
+ // UI control icons
+ 'arrows-maximize',
+ 'arrows-minimize',
+ 'chevron-down',
+ 'chevron-up',
+ 'folder-open',
+ 'brand-php',
+ 'refresh',
+
+ // Widget-specific icons
+ 'cpu', // memory/performance
+ 'table', // row count
+ 'link', // statement ID
+ 'copy', // copy to clipboard
+ 'circle-check', // copy success confirmation
+ 'external-link', // editor link
+];
+
+const svgDir = path.join(__dirname, '../node_modules/@tabler/icons/icons/outline');
+const outputFile = path.join(__dirname, '../resources/icons.css');
+const defaultStrokeWidth = 2; // Tabler default stroke width
+const brandStrokeWidth = 1.5; // For brands, use 1.5
+
+function svgToDataUri(svgContent, strokeWidth) {
+ // Remove XML comments
+ svgContent = svgContent.replace(//g, '');
+
+ // Ensure consistent stroke-width
+ svgContent = svgContent.replace(/stroke-width="[^"]*"/g, `stroke-width="${strokeWidth}"`);
+
+ // Remove unnecessary attributes for mask usage (but not stroke-width!)
+ svgContent = svgContent.replace(/\s+class="[^"]*"/g, '');
+ svgContent = svgContent.replace(/\s+width="[^"]*"/g, '');
+ svgContent = svgContent.replace(/\s+height="[^"]*"/g, '');
+
+ // Minify: remove newlines and extra spaces
+ svgContent = svgContent.replace(/\s+/g, ' ').trim();
+
+ // URL encode for data URI
+ const encoded = encodeURIComponent(svgContent)
+ .replace(/'/g, '%27')
+ .replace(/"/g, '%22');
+ return `data:image/svg+xml,${encoded}`;
+}
+
+function generateIconsCSS() {
+ let css = `/* Generated file - do not edit manually */\n/* Generated from Tabler Icons */\n\n`;
+
+ // First, define all CSS variables with the SVG data URIs
+ css += `:root {\n`;
+ for (const icon of icons) {
+ const svgPath = path.join(svgDir, `${icon}.svg`);
+
+ if (!fs.existsSync(svgPath)) {
+ console.warn(`Warning: SVG file not found for icon "${icon}" at ${svgPath}`);
+ continue;
+ }
+
+ const svgContent = fs.readFileSync(svgPath, 'utf8');
+ let strokeWidth = icon.indexOf('brand-') === 0 ? brandStrokeWidth : defaultStrokeWidth
+ const dataUri = svgToDataUri(svgContent, strokeWidth);
+
+ css += ` --debugbar-icon-${icon}: url('${dataUri}');\n`;
+ }
+ css += `}\n\n`;
+
+ // Then, apply the variables to the icon classes
+ for (const icon of icons) {
+ const svgPath = path.join(svgDir, `${icon}.svg`);
+
+ if (!fs.existsSync(svgPath)) {
+ continue;
+ }
+
+ css += `.phpdebugbar-icon-${icon}::before {\n`;
+ css += ` -webkit-mask-image: var(--debugbar-icon-${icon});\n`;
+ css += ` mask-image: var(--debugbar-icon-${icon});\n`;
+ css += `}\n\n`;
+ }
+
+ fs.writeFileSync(outputFile, css, 'utf8');
+ console.log(`β Generated ${outputFile} with ${icons.length} icons`);
+}
+
+try {
+ generateIconsCSS();
+} catch (error) {
+ console.error('Error generating icons:', error);
+ process.exit(1);
+}
diff --git a/build/build-minify.js b/build/build-minify.js
new file mode 100644
index 000000000..936618cad
--- /dev/null
+++ b/build/build-minify.js
@@ -0,0 +1,72 @@
+// Build minified debugbar.min.js and debugbar.min.css
+import * as esbuild from 'esbuild';
+import * as fs from 'fs';
+import * as path from 'path';
+import { fileURLToPath } from 'url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+
+const distDir = path.join(__dirname, '../resources/dist');
+
+// Minify JavaScript files
+async function minifyJS() {
+ console.log('Building debugbar.min.js...');
+
+ const tempFile = path.join(distDir, 'debugbar.js');
+
+ try {
+ // Minify using esbuild
+ await esbuild.build({
+ entryPoints: [path.join(distDir, 'debugbar.js')],
+ outfile: path.join(distDir, 'debugbar.min.js'),
+ minify: true,
+ target: 'es2015',
+ format: 'iife',
+ bundle: false
+ });
+
+ console.log('β debugbar.min.js created successfully');
+ } finally {
+ // Clean up temp file
+ fs.unlinkSync(tempFile);
+ }
+}
+
+// Minify CSS files
+async function minifyCSS() {
+ console.log('Building debugbar.min.css...');
+
+ const tempFile = path.join(distDir, 'debugbar.css');
+
+ try {
+ // Minify using esbuild
+ await esbuild.build({
+ entryPoints: [tempFile],
+ outfile: path.join(distDir, 'debugbar.min.css'),
+ minify: true,
+ loader: {
+ '.css': 'css'
+ }
+ });
+
+ console.log('β debugbar.min.css created successfully');
+ } finally {
+ // Clean up temp file
+ fs.unlinkSync(tempFile);
+ }
+}
+
+// Run both builds
+async function build() {
+ try {
+ await minifyJS();
+ await minifyCSS();
+ console.log('\nβ All builds completed successfully!');
+ } catch (error) {
+ console.error('Build failed:', error);
+ process.exit(1);
+ }
+}
+
+build();
diff --git a/build/build-sqlformatter.js b/build/build-sqlformatter.js
new file mode 100644
index 000000000..fcbd07278
--- /dev/null
+++ b/build/build-sqlformatter.js
@@ -0,0 +1,4 @@
+// Build sql-formatter bundle
+import sqlFormatter from '@sqltools/formatter';
+
+globalThis.phpdebugbar_sqlformatter = sqlFormatter.default;
diff --git a/build/namespaceFontAwesome.php b/build/namespaceFontAwesome.php
deleted file mode 100644
index ed252204d..000000000
--- a/build/namespaceFontAwesome.php
+++ /dev/null
@@ -1,19 +0,0 @@
-=5.6",
- "psr/log": "^1.0",
- "symfony/var-dumper": "^2.6|^3|^4"
+ "php": "^8.2",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^5.4|^6|^7|^8"
+ },
+ "suggest": {
+ "php-debugbar/doctrine-bridge": "To integrate Doctrine with php-debugbar.",
+ "php-debugbar/monolog-bridge": "To integrate Monolog with php-debugbar.",
+ "php-debugbar/symfony-bridge": "To integrate Symfony with php-debugbar.",
+ "php-debugbar/twig-bridge": "To integrate Twig with php-debugbar."
+ },
+ "replace": {
+ "maximebf/debugbar": "self.version"
},
"require-dev": {
- "phpunit/phpunit": "^5"
+ "dbrekelmans/bdi": "^1.4",
+ "friendsofphp/php-cs-fixer": "^3.92",
+ "monolog/monolog": "^3.9",
+ "php-debugbar/doctrine-bridge": "^3@dev",
+ "php-debugbar/monolog-bridge": "^1@dev",
+ "php-debugbar/symfony-bridge": "^1@dev",
+ "php-debugbar/twig-bridge": "^2@dev",
+ "phpstan/phpstan": "^2.1",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^10",
+ "predis/predis": "^3.3",
+ "shipmonk/phpstan-rules": "^4.3",
+ "symfony/browser-kit": "^6.4|7.0",
+ "symfony/dom-crawler": "^6.4|^7",
+ "symfony/event-dispatcher": "^5.4|^6.4|^7.3|^8.0",
+ "symfony/http-foundation": "^5.4|^6.4|^7.3|^8.0",
+ "symfony/mailer": "^5.4|^6.4|^7.3|^8.0",
+ "symfony/panther": "^1|^2.1",
+ "twig/twig": "^3.11.2"
},
"autoload": {
"psr-4": {
- "DebugBar\\": "src/DebugBar/"
+ "DebugBar\\": "src/"
}
},
- "suggest": {
- "kriswallsmith/assetic": "The best way to manage assets",
- "monolog/monolog": "Log using Monolog",
- "predis/predis": "Redis storage"
+ "autoload-dev": {
+ "psr-4": {
+ "DebugBar\\Tests\\": "tests/Tests"
+ }
+ },
+ "scripts": {
+ "analyse": "@php vendor/bin/phpstan analyse --memory-limit=1G",
+ "demo": [
+ "Composer\\Config::disableProcessTimeout",
+ "@php -t demo -S localhost:8000"
+ ],
+ "unit-test": "@php vendor/bin/phpunit --testsuite=Unit",
+ "browser-test": "@php vendor/bin/phpunit --testsuite=Browser",
+ "check-style": "vendor/bin/php-cs-fixer check -v --diff",
+ "fix-style": "vendor/bin/php-cs-fixer fix -v --diff",
+ "browser-debug": [
+ "@putenv PANTHER_NO_HEADLESS=1",
+ "@php vendor/bin/phpunit --testsuite=Browser --debug"
+ ]
},
"extra": {
"branch-alias": {
- "dev-master": "1.15-dev"
+ "dev-master": "3.8-dev"
}
+ },
+ "config": {
+ "sort-packages": true
}
}
diff --git a/demo/ajax_exception.php b/demo/ajax_exception.php
index 31b623a6d..b8c1543e2 100644
--- a/demo/ajax_exception.php
+++ b/demo/ajax_exception.php
@@ -2,14 +2,22 @@
include 'bootstrap.php';
-try {
+function doSomething()
+{
throw new Exception('Something failed!');
+}
+try {
+ doSomething();
} catch (Exception $e) {
$debugbar['exceptions']->addException($e);
}
+try {
+ doSomething();
+} catch (Exception $e) {
+ $debugbar['exceptions']->addException($e);
+}
+http_response_code(500);
+$debugbar->sendDataInHeaders(true);
?>
error from AJAX
-render(false);
-?>
diff --git a/demo/ajax_render.php b/demo/ajax_render.php
new file mode 100644
index 000000000..4b029feee
--- /dev/null
+++ b/demo/ajax_render.php
@@ -0,0 +1,12 @@
+addMessage('hello from rendered ajax');
+
+?>
+hello from AJAX
+
+= $debugbar->getJavascriptRenderer()->render(false); ?>
diff --git a/demo/ajax_stack.php b/demo/ajax_stack.php
new file mode 100644
index 000000000..01d734a29
--- /dev/null
+++ b/demo/ajax_stack.php
@@ -0,0 +1,15 @@
+addMessage('Hello from redirected AJAX');
+
+$debugbar->stackData();
+
+header('Location: ajax.php');
diff --git a/demo/assets.php b/demo/assets.php
new file mode 100644
index 000000000..4867e40db
--- /dev/null
+++ b/demo/assets.php
@@ -0,0 +1,14 @@
+handle($_GET);
diff --git a/demo/bootstrap.php b/demo/bootstrap.php
index 3af47052a..c0947aed2 100644
--- a/demo/bootstrap.php
+++ b/demo/bootstrap.php
@@ -1,39 +1,141 @@
addCollector(new PdoCollector());
+$debugbar->addCollector(new TemplateCollector());
+$debugbar->addCollector(new HttpCollector());
+$debugbar->addCollector(new SymfonyMailCollector());
+
+// Apply TimeCollector to available collectors
+foreach ($debugbar->getCollectors() as $collector) {
+ if (method_exists($collector, 'setTimeDataCollector')) {
+ $collector->setTimeDataCollector($timeCollector);
+ }
+}
+
$debugbarRenderer = $debugbar->getJavascriptRenderer()
- ->setBaseUrl('../src/DebugBar/Resources')
- ->setEnableJqueryNoConflict(false);
+ ->setAssetHandlerUrl('assets.php')
+ ->setAjaxHandlerEnableTab(true)
+ ->setHideEmptyTabs(true)
+ ->setUseDistFiles(false)
+ ->setIncludeVendors(true)
+ ->setCspNonce('demo')
+ ->setTheme($_GET['theme'] ?? 'auto');
//
// create a writable profiles folder in the demo directory to uncomment the following lines
//
-// $debugbar->setStorage(new DebugBar\Storage\FileStorage(__DIR__ . '/profiles'));
+$debugbar->setStorage(new DebugBar\Storage\FileStorage(__DIR__ . '/profiles'));
+
// $debugbar->setStorage(new DebugBar\Storage\RedisStorage(new Predis\Client()));
-// $debugbarRenderer->setOpenHandlerUrl('open.php');
-function render_demo_page(Closure $callback = null)
+//$debugbar->setStorage($storage = new SQliteStorage(
+// filepath: __DIR__ . '/../debugbar.sqlite',
+// tableName: 'phpdebugbar',
+//));
+
+$debugbarRenderer->setOpenHandlerUrl('open.php');
+
+// configs
+if (isset($_GET['formatter'])) {
+ $formatter = $_GET['formatter'];
+ $_SESSION['formatter'] = $formatter;
+}
+
+$formatter = $_SESSION['formatter'] ?? 'json';
+
+$dataFormatter = match ($formatter) {
+ 'json' => new \DebugBar\DataFormatter\JsonDataFormatter(),
+ 'html' => new \DebugBar\DataFormatter\HtmlDataFormatter(),
+ 'base' => new \DebugBar\DataFormatter\DataFormatter(),
+};
+\DebugBar\DataCollector\DataCollector::setDefaultDataFormatter($dataFormatter);
+// $debugbar->setEditor('vscode');
+// $debugbar->setEditor('vscode');
+// $debugbar->setRemoteReplacements(['/remote/demo/' => '/home/demo/']);
+// $debugbar['messages']->collectFileTrace();
+// $debugbar['time']->showMemoryUsage();
+
+function render_demo_page(?Closure $callback = null)
{
global $debugbarRenderer;
-?>
+ ?>
- renderHead() ?>
-
@@ -41,10 +143,15 @@ function render_demo_page(Closure $callback = null)
DebugBar Demo
DebugBar at the bottom of the page
-
+
+
render();
- ?>
+ echo $debugbarRenderer->renderHead();
+ echo $debugbarRenderer->render();
+ ?>
+
setBaseUrl('../../../src/DebugBar/Resources');
-
-$cache = new CacheCache\Cache(new CacheCache\Backends\Memory());
-
-$debugbar->addCollector(new DebugBar\Bridge\CacheCacheCollector($cache));
-
-$cache->set('foo', 'bar');
-$cache->get('foo');
-$cache->get('bar');
-
-render_demo_page();
diff --git a/demo/bridge/doctrine/bootstrap.php b/demo/bridge/doctrine/bootstrap.php
deleted file mode 100644
index 17f7ce6f2..000000000
--- a/demo/bridge/doctrine/bootstrap.php
+++ /dev/null
@@ -1,22 +0,0 @@
- 'pdo_sqlite',
- 'path' => __DIR__ . '/db.sqlite',
-);
-
-// obtaining the entity manager
-$entityManager = EntityManager::create($conn, $config);
diff --git a/demo/bridge/doctrine/build.sh b/demo/bridge/doctrine/build.sh
deleted file mode 100755
index d8932a06d..000000000
--- a/demo/bridge/doctrine/build.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-
-php vendor/bin/doctrine orm:schema-tool:update --force
diff --git a/demo/bridge/doctrine/cli-config.php b/demo/bridge/doctrine/cli-config.php
deleted file mode 100644
index 546dba5cb..000000000
--- a/demo/bridge/doctrine/cli-config.php
+++ /dev/null
@@ -1,9 +0,0 @@
- new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
- 'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
-));
diff --git a/demo/bridge/doctrine/composer.json b/demo/bridge/doctrine/composer.json
deleted file mode 100644
index 1e9beade4..000000000
--- a/demo/bridge/doctrine/composer.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "require": {
- "doctrine/orm": "2.*",
- "symfony/yaml": "2.*"
- },
- "autoload": {
- "psr-0": {"": "src/"}
- }
-}
diff --git a/demo/bridge/doctrine/index.php b/demo/bridge/doctrine/index.php
deleted file mode 100644
index 183d9ae46..000000000
--- a/demo/bridge/doctrine/index.php
+++ /dev/null
@@ -1,18 +0,0 @@
-setBaseUrl('../../../src/DebugBar/Resources');
-
-$debugStack = new Doctrine\DBAL\Logging\DebugStack();
-$entityManager->getConnection()->getConfiguration()->setSQLLogger($debugStack);
-$debugbar->addCollector(new DebugBar\Bridge\DoctrineCollector($debugStack));
-
-$product = new Demo\Product();
-$product->setName("foobar");
-
-$entityManager->persist($product);
-$entityManager->flush();
-
-render_demo_page();
diff --git a/demo/bridge/doctrine/src/Demo/Product.php b/demo/bridge/doctrine/src/Demo/Product.php
deleted file mode 100644
index c7d8f08d5..000000000
--- a/demo/bridge/doctrine/src/Demo/Product.php
+++ /dev/null
@@ -1,29 +0,0 @@
-id;
- }
-
- public function getName()
- {
- return $this->name;
- }
-
- public function setName($name)
- {
- $this->name = $name;
- }
-}
diff --git a/demo/bridge/monolog/composer.json b/demo/bridge/monolog/composer.json
deleted file mode 100644
index e7e55ef45..000000000
--- a/demo/bridge/monolog/composer.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "require": {
- "monolog/monolog": "*"
- }
-}
diff --git a/demo/bridge/monolog/index.php b/demo/bridge/monolog/index.php
deleted file mode 100644
index 1fec6b09a..000000000
--- a/demo/bridge/monolog/index.php
+++ /dev/null
@@ -1,14 +0,0 @@
-setBaseUrl('../../../src/DebugBar/Resources');
-
-$logger = new Monolog\Logger('demo');
-
-$debugbar->addCollector(new DebugBar\Bridge\MonologCollector($logger));
-
-$logger->info('hello world');
-
-render_demo_page();
diff --git a/demo/bridge/propel/build.properties b/demo/bridge/propel/build.properties
deleted file mode 100644
index 3b346fa07..000000000
--- a/demo/bridge/propel/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-# Database driver
-propel.database = sqlite
-
-# Project name
-propel.project = demo
-
-propel.database.url = sqlite:demo.db
diff --git a/demo/bridge/propel/build.sh b/demo/bridge/propel/build.sh
deleted file mode 100755
index 39489ca34..000000000
--- a/demo/bridge/propel/build.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-vendor/bin/propel-gen
-sqlite3 demo.db < build/sql/schema.sql
diff --git a/demo/bridge/propel/composer.json b/demo/bridge/propel/composer.json
deleted file mode 100644
index 7095dd2a1..000000000
--- a/demo/bridge/propel/composer.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "require": {
- "propel/propel1": "*"
- }
-}
diff --git a/demo/bridge/propel/index.php b/demo/bridge/propel/index.php
deleted file mode 100644
index e0ee6aff6..000000000
--- a/demo/bridge/propel/index.php
+++ /dev/null
@@ -1,23 +0,0 @@
-setBaseUrl('../../../src/DebugBar/Resources');
-
-use DebugBar\Bridge\PropelCollector;
-
-$debugbar->addCollector(new PropelCollector());
-
-Propel::init('build/conf/demo-conf.php');
-set_include_path("build/classes" . PATH_SEPARATOR . get_include_path());
-
-PropelCollector::enablePropelProfiling();
-
-$user = new User();
-$user->setName('foo');
-$user->save();
-
-$firstUser = UserQuery::create()->findPK(1);
-
-render_demo_page();
diff --git a/demo/bridge/propel/runtime-conf.xml b/demo/bridge/propel/runtime-conf.xml
deleted file mode 100644
index 671d05192..000000000
--- a/demo/bridge/propel/runtime-conf.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
- sqlite
-
- DebugPDO
- sqlite:demo.db
-
-
-
-
-
diff --git a/demo/bridge/propel/schema.xml b/demo/bridge/propel/schema.xml
deleted file mode 100644
index fa42ffb84..000000000
--- a/demo/bridge/propel/schema.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/demo/bridge/slim/composer.json b/demo/bridge/slim/composer.json
deleted file mode 100644
index 77a6eea07..000000000
--- a/demo/bridge/slim/composer.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "require": {
- "slim/slim": "*"
- }
-}
diff --git a/demo/bridge/slim/index.php b/demo/bridge/slim/index.php
deleted file mode 100644
index 11f409fd7..000000000
--- a/demo/bridge/slim/index.php
+++ /dev/null
@@ -1,16 +0,0 @@
-setBaseUrl('../../../src/DebugBar/Resources');
-
-$app = new \Slim\Slim();
-$app->get('/', function () use ($app) {
- $app->getLog()->info('hello world');
- render_demo_page();
-});
-
-$debugbar->addCollector(new DebugBar\Bridge\SlimCollector($app));
-
-$app->run();
diff --git a/demo/bridge/swiftmailer/composer.json b/demo/bridge/swiftmailer/composer.json
deleted file mode 100644
index 33f0b390e..000000000
--- a/demo/bridge/swiftmailer/composer.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "require": {
- "swiftmailer/swiftmailer": "*"
- }
-}
diff --git a/demo/bridge/swiftmailer/index.php b/demo/bridge/swiftmailer/index.php
deleted file mode 100644
index 8dc78ec41..000000000
--- a/demo/bridge/swiftmailer/index.php
+++ /dev/null
@@ -1,24 +0,0 @@
-setBaseUrl('../../../src/DebugBar/Resources');
-
-use DebugBar\Bridge\SwiftMailer\SwiftLogCollector;
-use DebugBar\Bridge\SwiftMailer\SwiftMailCollector;
-
-$mailer = Swift_Mailer::newInstance(Swift_NullTransport::newInstance());
-
-$debugbar['messages']->aggregate(new SwiftLogCollector($mailer));
-$debugbar->addCollector(new SwiftMailCollector($mailer));
-
-$message = Swift_Message::newInstance('Wonderful Subject')
- ->setFrom(array('john@doe.com' => 'John Doe'))
- ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
- ->setBody('Here is the message itself');
-
-$mailer->send($message);
-
-
-render_demo_page();
diff --git a/demo/bridge/twig/composer.json b/demo/bridge/twig/composer.json
deleted file mode 100644
index 02dc3a087..000000000
--- a/demo/bridge/twig/composer.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "require": {
- "twig/twig": "*"
- }
-}
diff --git a/demo/bridge/twig/foobar.html b/demo/bridge/twig/foobar.html
deleted file mode 100644
index 323fae03f..000000000
--- a/demo/bridge/twig/foobar.html
+++ /dev/null
@@ -1 +0,0 @@
-foobar
diff --git a/demo/bridge/twig/hello.html b/demo/bridge/twig/hello.html
deleted file mode 100644
index 296b3f631..000000000
--- a/demo/bridge/twig/hello.html
+++ /dev/null
@@ -1,2 +0,0 @@
-Hello {{ name }}
-{% include "foobar.html" %}
diff --git a/demo/bridge/twig/index.php b/demo/bridge/twig/index.php
deleted file mode 100644
index af483d883..000000000
--- a/demo/bridge/twig/index.php
+++ /dev/null
@@ -1,15 +0,0 @@
-setBaseUrl('../../../src/DebugBar/Resources');
-
-$loader = new Twig_Loader_Filesystem('.');
-$twig = new DebugBar\Bridge\Twig\TraceableTwigEnvironment(new Twig_Environment($loader), $debugbar['time']);
-
-$debugbar->addCollector(new DebugBar\Bridge\Twig\TwigCollector($twig));
-
-render_demo_page(function() use ($twig) {
- echo $twig->render('hello.html', array('name' => 'peter pan'));
-});
diff --git a/demo/collectors/counter.php b/demo/collectors/counter.php
new file mode 100644
index 000000000..445665146
--- /dev/null
+++ b/demo/collectors/counter.php
@@ -0,0 +1,14 @@
+addCollector(new \DebugBar\DataCollector\ObjectCountCollector());
+$debugbar['counter']->collectCountSummary(true);
+$debugbar['counter']->setKeyMap($classEvent);
+for ($i = 0; $i <= 20; $i++) {
+ $debugbar['counter']->countClass($classDemo[rand(0, 2)], 1, $classEvent[rand(0, 2)]);
+}
diff --git a/demo/collectors/http.php b/demo/collectors/http.php
new file mode 100644
index 000000000..bb4faaf81
--- /dev/null
+++ b/demo/collectors/http.php
@@ -0,0 +1,27 @@
+addRequest(
+ 'GET',
+ 'https://packagist.org/packages/php-debugbar/php-debugbar/stats.json',
+ 200,
+ 0.00684,
+ [
+ 'response' => $data,
+ 'headers' => [
+ 'Data' => 'Mon, 05 Jan 2026 21:07:36 GMT',
+ 'Content-Type' => 'application/json',
+ ],
+ ]
+);
diff --git a/demo/collectors/monolog.php b/demo/collectors/monolog.php
new file mode 100644
index 000000000..0b8317264
--- /dev/null
+++ b/demo/collectors/monolog.php
@@ -0,0 +1,11 @@
+addCollector(new DebugBar\Bridge\Monolog\MonologCollector($logger));
+
+$logger->info('hello world');
diff --git a/demo/collectors/pdo.php b/demo/collectors/pdo.php
new file mode 100644
index 000000000..7b40c9e22
--- /dev/null
+++ b/demo/collectors/pdo.php
@@ -0,0 +1,39 @@
+addConnection($pdo, 'write');
+$pdoCollector->enableBacktrace();
+$pdoCollector->setDurationBackground(true);
+$pdoCollector->setRenderSqlWithParams();
+$pdoCollector->addConnection($pdoRead, 'read');
+
+$pdo->exec('create table users (id integer, name varchar, email varchar)');
+$pdoRead->exec('create table users (id integer, name varchar, email varchar)');
+
+$stmt = $pdo->prepare('insert into users (name) values (?)');
+$stmt->execute(['foo']);
+$stmt->execute(['bar']);
+
+$users = $pdo->query('select * from users')->fetchAll();
+$stmt = $pdo->prepare('select * from users where name=?');
+$stmt->execute(['foo']);
+$stmt->execute(['foo']);
+$foo = $stmt->fetch();
+
+$stmt = $pdoRead->prepare('select * from users where name=:name and email=:email');
+$stmt->execute(['name' => 'Barry', ':email' => '']);
+$foo = $stmt->fetch();
+
+$pdo->exec('delete from users');
diff --git a/demo/collectors/symfony_mailer.php b/demo/collectors/symfony_mailer.php
new file mode 100644
index 000000000..1fec5b95b
--- /dev/null
+++ b/demo/collectors/symfony_mailer.php
@@ -0,0 +1,50 @@
+showMessageBody();
+$logger = new MessagesCollector('mails');
+$debugbar['messages']->aggregate($logger);
+
+// Add even listener for SentMessageEvent
+$dispatcher = new EventDispatcher();
+$dispatcher->addListener(SentMessageEvent::class, function (SentMessageEvent $event) use ($mailCollector): void {
+ $mailCollector->addSymfonyMessage($event->getMessage());
+});
+
+// Creates NullTransport Mailer for testing
+$mailer = new Mailer(new class ($dispatcher, $logger) extends AbstractTransport {
+ protected function doSend(\Symfony\Component\Mailer\SentMessage $message): void
+ {
+ $this->getLogger()->debug('Sending message "' . $message->getOriginalMessage()->getSubject() . '"', ['message' => $message]);
+ }
+ public function __toString(): string
+ {
+ return 'null://';
+ }
+});
+
+$email = (new Email())
+ ->from('john@doe.com')
+ ->to('you@example.com')
+ //->cc('cc@example.com')
+ //->bcc('bcc@example.com')
+ //->replyTo('fabien@example.com')
+ //->priority(Email::PRIORITY_HIGH)
+ ->subject('Wonderful Subject')
+ ->html('Here is the message itself
');
+
+$mailer->send($email);
diff --git a/demo/collectors/templates.php b/demo/collectors/templates.php
new file mode 100644
index 000000000..a48fb2fb6
--- /dev/null
+++ b/demo/collectors/templates.php
@@ -0,0 +1,13 @@
+addTemplate('index.php', ['foo' => 'bar', 'items' => ['a' => 1, 'b' => 2]], 'php', __FILE__);
+$templateCollector->addTemplate('docs.php', ['demo' => 'true'], 'php', __FILE__);
diff --git a/demo/dump_assets.php b/demo/dump_assets.php
deleted file mode 100644
index cee79ad55..000000000
--- a/demo/dump_assets.php
+++ /dev/null
@@ -1,15 +0,0 @@
-dumpCssAssets();
-} else if ($_GET['type'] == 'js') {
- header('content-type', 'text/javascript');
- $debugbarRenderer->dumpJsAssets();
-}
diff --git a/demo/iframes/iframe1.php b/demo/iframes/iframe1.php
new file mode 100644
index 000000000..182a17574
--- /dev/null
+++ b/demo/iframes/iframe1.php
@@ -0,0 +1,17 @@
+setAssetHandlerUrl('../assets.php')
+ ->setOpenHandlerUrl('../open.php');
+
+$debugbar['messages']->addMessage('I\'m a IFRAME');
+
+render_demo_page(function () {
+ ?>
+
+setAssetHandlerUrl('../assets.php')
+ ->setOpenHandlerUrl('../open.php');
+
+$debugbar['messages']->addMessage('I\'m a Deeper Hidden Iframe');
+
+render_demo_page(function () {
+ ?>
+
+setAssetHandlerUrl('../assets.php')
+ ->setOpenHandlerUrl('../open.php');
+
+$debugbar['messages']->addMessage('Top Page(Main debugbar)');
+
+render_demo_page(function () {
+ ?>
+
+addMessage('hello');
+// PSR Interpolation
+$debugbar['messages']->log('info', 'Hello {name}!', ['name' => 'World', 'location' => 'Earth']);
+$debugbar['messages']->addLink('Checkout the documentation on phpdebugbar.com', 'https://phpdebugbar.com');
$debugbar['time']->startMeasure('op1', 'sleep 500');
usleep(300);
$debugbar['time']->startMeasure('op2', 'sleep 400');
usleep(200);
-$debugbar['time']->stopMeasure('op1');
+$debugbar['time']->stopMeasure('op1', ['foo' => 'bar']);
usleep(200);
$debugbar['time']->stopMeasure('op2');
-$debugbar['messages']->addMessage('world', 'warning');
-$debugbar['messages']->addMessage(array('toto' => array('titi', 'tata')));
-$debugbar['messages']->addMessage('oups', 'error');
+$debugbar['messages']->addMessage('This is a demo', 'warning');
+
+// Object with extra context
+$debugbar['messages']->addMessage(['toto' => ['titi']], 'debug', ['foo' => 'bar']);
+
+$debugbar['messages']->addMessage($debugbar);
+$debugbar['messages']->addMessage('welcome!', 'success');
+$debugbar['messages']->addMessage('panic!', 'critical');
+$debugbar["messages"]->addMessage("
+{% block extrahead %}
+{{ super() }}
+
+{% if page.is_homepage %}
+
+{% elif page.meta and page.meta.title %}
+
+{% elif page.title and not page.is_homepage %}
+
+{% else %}
+
+{% endif %}
+
+{% if page.meta and page.meta.description %}
+
+{% elif config.site_description %}
+
+{% endif %}
+
+
+{% if page.canonical_url %}
+
+{% endif %}
+
+{% if page.meta and page.meta.preview_image %}
+
+{% else %}
+
+{% endif %}
+
+{% endblock %}
+
+{% block scripts %}
+
+{{ super() }}
+
+
+{% raw %}
+
+
+
+{% endraw %}
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/docs/overrides/shortcodes.py b/docs/overrides/shortcodes.py
new file mode 100644
index 000000000..f440cc700
--- /dev/null
+++ b/docs/overrides/shortcodes.py
@@ -0,0 +1,271 @@
+# Copyright (c) 2016-2024 Martin Donath
+# Copy from https://github.com/squidfunk/mkdocs-material/blob/master/src/overrides/hooks/shortcodes.py
+
+# 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 NON-INFRINGEMENT. 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.
+
+from __future__ import annotations
+
+import posixpath
+import re
+
+from mkdocs.config.defaults import MkDocsConfig
+from mkdocs.structure.files import File, Files
+from mkdocs.structure.pages import Page
+from re import Match
+
+# -----------------------------------------------------------------------------
+# Hooks
+# -----------------------------------------------------------------------------
+
+# @todo
+def on_page_markdown(
+ markdown: str, *, page: Page, config: MkDocsConfig, files: Files
+):
+
+ # Replace callback
+ def replace(match: Match):
+ type, args = match.groups()
+ args = args.strip()
+ if type == "version":
+ if args.startswith("insiders-"):
+ return _badge_for_version_insiders(args, page, files)
+ else:
+ return _badge_for_version(args, page, files)
+ elif type == "sponsors": return _badge_for_sponsors(page, files)
+ elif type == "flag": return flag(args, page, files)
+ elif type == "option": return option(args)
+ elif type == "setting": return setting(args)
+ elif type == "feature": return _badge_for_feature(args, page, files)
+ elif type == "plugin": return _badge_for_plugin(args, page, files)
+ elif type == "extension": return _badge_for_extension(args, page, files)
+ elif type == "utility": return _badge_for_utility(args, page, files)
+ elif type == "example": return _badge_for_example(args, page, files)
+ elif type == "default":
+ if args == "none": return _badge_for_default_none(page, files)
+ elif args == "computed": return _badge_for_default_computed(page, files)
+ else: return _badge_for_default(args, page, files)
+
+ # Otherwise, raise an error
+ raise RuntimeError(f"Unknown shortcode: {type}")
+
+ # Find and replace all external asset URLs in current page
+ return re.sub(
+ r"",
+ replace, markdown, flags = re.I | re.M
+ )
+
+# -----------------------------------------------------------------------------
+# Helper functions
+# -----------------------------------------------------------------------------
+
+# Create a flag of a specific type
+def flag(args: str, page: Page, files: Files):
+ type, *_ = args.split(" ", 1)
+ if type == "experimental": return _badge_for_experimental(page, files)
+ elif type == "required": return _badge_for_required(page, files)
+ elif type == "customization": return _badge_for_customization(page, files)
+ elif type == "metadata": return _badge_for_metadata(page, files)
+ elif type == "multiple": return _badge_for_multiple(page, files)
+ raise RuntimeError(f"Unknown type: {type}")
+
+# Create a linkable option
+def option(type: str):
+ _, *_, name = re.split(r"[.:]", type)
+ return f"[`{name}`](#+{type}){{ #+{type} }}\n\n"
+
+# Create a linkable setting - @todo append them to the bottom of the page
+def setting(type: str):
+ _, *_, name = re.split(r"[.*]", type)
+ return f"`{name}` {{ #{type} }}\n\n[{type}]: #{type}\n\n"
+
+# -----------------------------------------------------------------------------
+
+# Resolve path of file relative to given page - the posixpath always includes
+# one additional level of `..` which we need to remove
+def _resolve_path(path: str, page: Page, files: Files):
+ path, anchor, *_ = f"{path}#".split("#")
+ path = _resolve(files.get_file_from_path(path), page)
+ return "#".join([path, anchor]) if anchor else path
+
+# Resolve path of file relative to given page - the posixpath always includes
+# one additional level of `..` which we need to remove
+def _resolve(file: File, page: Page):
+ path = posixpath.relpath(file.src_uri, page.file.src_uri)
+ return posixpath.sep.join(path.split(posixpath.sep)[1:])
+
+# -----------------------------------------------------------------------------
+
+# Create badge
+def _badge(icon: str, text: str = "", type: str = ""):
+ classes = f"mdx-badge mdx-badge--{type}" if type else "mdx-badge"
+ return "".join([
+ f"",
+ *([f"{icon}"] if icon else []),
+ *([f"{text}"] if text else []),
+ f"",
+ ])
+
+# Create sponsors badge
+def _badge_for_sponsors(page: Page, files: Files):
+ icon = "material-heart"
+ href = _resolve_path("features.md", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Sponsors only')",
+ type = "heart"
+ )
+
+# Create badge for version
+def _badge_for_version(text: str, page: Page, files: Files):
+ spec = text
+ path = f"https://github.com/barryvdh/laravel-debugbar/releases/tag/{spec}"
+
+ # Return badge
+ icon = "material-tag-outline"
+ href = f"{path}"
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Minimum version')",
+ text = f"[{text}]({path})" if spec else ""
+ )
+
+# Create badge for feature
+def _badge_for_feature(text: str, page: Page, files: Files):
+ icon = "material-toggle-switch"
+ href = _resolve_path("features.md#config", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Configurable feature')",
+ text = text
+ )
+
+# Create badge for plugin
+def _badge_for_plugin(text: str, page: Page, files: Files):
+ icon = "material-floppy"
+ href = _resolve_path("features.md#plugin", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Plugin')",
+ text = text
+ )
+
+# Create badge for extension
+def _badge_for_extension(text: str, page: Page, files: Files):
+ icon = "material-language-markdown"
+ href = _resolve_path("features.md#extension", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Markdown extension')",
+ text = text
+ )
+
+# Create badge for utility
+def _badge_for_utility(text: str, page: Page, files: Files):
+ icon = "material-package-variant"
+ href = _resolve_path("features.md#utility", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Third-party utility')",
+ text = text
+ )
+
+# Create badge for example
+def _badge_for_example(text: str, page: Page, files: Files):
+ return "\n".join([
+ _badge_for_example_download(text, page, files),
+ _badge_for_example_view(text, page, files)
+ ])
+
+# Create badge for example view
+def _badge_for_example_view(text: str, page: Page, files: Files):
+ icon = "material-folder-eye"
+ href = f"https://mkdocs-material.github.io/examples/{text}/"
+ return _badge(
+ icon = f"[:{icon}:]({href} 'View example')",
+ type = "right"
+ )
+
+# Create badge for example download
+def _badge_for_example_download(text: str, page: Page, files: Files):
+ icon = "material-folder-download"
+ href = f"https://mkdocs-material.github.io/examples/{text}.zip"
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Download example')",
+ text = f"[`.zip`]({href})",
+ type = "right"
+ )
+
+# Create badge for default value
+def _badge_for_default(text: str, page: Page, files: Files):
+ icon = "material-water"
+ href = _resolve_path("features.md#config", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Default value')",
+ text = text
+ )
+
+# Create badge for empty default value
+def _badge_for_default_none(page: Page, files: Files):
+ icon = "material-water-outline"
+ href = _resolve_path("features.md#config", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Default value is empty')"
+ )
+
+# Create badge for computed default value
+def _badge_for_default_computed(page: Page, files: Files):
+ icon = "material-water-check"
+ href = _resolve_path("features.md#default", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Default value is computed')"
+ )
+
+# Create badge for metadata property flag
+def _badge_for_metadata(page: Page, files: Files):
+ icon = "material-list-box-outline"
+ href = _resolve_path("features.md#metadata", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Metadata property')"
+ )
+
+# Create badge for required value flag
+def _badge_for_required(page: Page, files: Files):
+ icon = "material-alert"
+ href = _resolve_path("features.md#required", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Required value')"
+ )
+
+# Create badge for customization flag
+def _badge_for_customization(page: Page, files: Files):
+ icon = "material-brush-variant"
+ href = _resolve_path("features.md#custom", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Customization')"
+ )
+
+# Create badge for multiple instance flag
+def _badge_for_multiple(page: Page, files: Files):
+ icon = "material-inbox-multiple"
+ href = _resolve_path("features.md#multiple", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Multiple instances')"
+ )
+
+# Create badge for experimental flag
+def _badge_for_experimental(page: Page, files: Files):
+ icon = "material-flask-outline"
+ href = _resolve_path("features.md#experimental", page, files)
+ return _badge(
+ icon = f"[:{icon}:]({href} 'Experimental')"
+ )
\ No newline at end of file
diff --git a/docs/screenshot.png b/docs/screenshot.png
index adddef193..ca8b676d2 100644
Binary files a/docs/screenshot.png and b/docs/screenshot.png differ
diff --git a/docs/storage.md b/docs/storage.md
deleted file mode 100644
index 8f84cfd53..000000000
--- a/docs/storage.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Storage
-
-DebugBar supports storing collected data for later analysis.
-You'll need to set a storage handler using `setStorage()` on your `DebugBar` instance.
-
- $debugbar->setStorage(new DebugBar\Storage\FileStorage('/path/to/dir'));
-
-Each time `DebugBar::collect()` is called, the data will be persisted.
-
-## Available storage
-
-### File
-
-It will collect data as json files under the specified directory
-(which has to be writable).
-
- $storage = new DebugBar\Storage\FileStorage($directory);
-
-### Redis
-
-Stores data inside a Redis hash. Uses [Predis](http://github.com/nrk/predis).
-
- $storage = new DebugBar\Storage\RedisStorage($client);
-
-### PDO
-
-Stores data inside a database.
-
- $storage = new DebugBar\Storage\PdoStorage($pdo);
-
-The table name can be changed using the second argument and sql queries
-can be changed using `setSqlQueries()`.
-
-## Creating your own storage
-
-You can easily create your own storage handler by implementing the
-`DebugBar\Storage\StorageInterface`.
-
-## Request ID generator
-
-For each request, the debug bar will generate a unique id under which to store the
-collected data. This is perform using a `DebugBar\RequestIdGeneratorInterface` object.
-
-If none are defined, the debug bar will automatically use `DebugBar\RequestIdGenerator`
-which uses the `$_SERVER` array to generate the id.
diff --git a/docs/style.css b/docs/style.css
deleted file mode 100644
index 35f9149d8..000000000
--- a/docs/style.css
+++ /dev/null
@@ -1,28 +0,0 @@
-#page {
- width: 1000px;
- margin: 0 auto;
-}
-
-#header {
- background: none;
- border: 0;
- padding: 30px 0 50px;
- height: auto;
-}
-
-#sidebar {
- padding: 0;
- padding-right: 20px;
-}
-
-#content {
- width: 729px;
- padding: 0;
- padding-left: 20px;
-}
-
-#header h1 a {
- color: #4ad7ff;
- text-decoration: none;
- text-shadow: none;
-}
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 000000000..6dd20b7c8
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,93 @@
+import antfu from '@antfu/eslint-config';
+import globals from 'globals';
+
+export default antfu(
+ {
+ type: 'app',
+
+ // Disable TypeScript, Vue, etc. since this is vanilla JS
+ typescript: false,
+ vue: false,
+ react: false,
+ jsonc: false,
+ yaml: false,
+ markdown: false,
+
+ ignores: [
+ 'vendor/**',
+ 'tests/**',
+ 'docs/**',
+ 'resources/vendor/**'
+ ],
+
+ // Stylistic formatting rules
+ stylistic: {
+ indent: 4,
+ quotes: 'single',
+ semi: true
+ }
+ },
+
+ // Custom rules for the project
+ {
+ rules: {
+ // Allow console in debug library
+ 'no-console': 'off',
+
+ // Allow unused vars with _ prefix or Widget suffix
+ 'unused-imports/no-unused-vars': ['error', {
+ args: 'none',
+ varsIgnorePattern: '^(_|.*Widget)$',
+ caughtErrors: 'none'
+ }],
+ 'no-unused-vars': ['error', {
+ args: 'none',
+ varsIgnorePattern: '^(_|.*Widget)$',
+ caughtErrors: 'none'
+ }],
+
+ // Code style
+ 'style/brace-style': ['error', '1tbs'],
+ 'style/comma-dangle': ['error', 'never'],
+ 'style/no-mixed-operators': 'off',
+ 'style/max-statements-per-line': 'off',
+
+ // Relax some rules for legacy patterns
+ 'no-prototype-builtins': 'off',
+ 'no-sequences': 'off',
+ 'no-unused-expressions': 'off',
+ 'no-use-before-define': ['error', { functions: false, classes: true, variables: true }],
+ 'unicorn/no-array-for-each': 'off',
+
+ // JSDoc relaxed rules
+ 'jsdoc/require-returns-description': 'off',
+ 'jsdoc/check-param-names': 'off',
+
+ // Allow function expressions (for Widget.extend pattern)
+ 'func-style': 'off',
+ 'antfu/consistent-list-newline': 'off',
+
+ // Modern JavaScript requirements
+ 'prefer-const': 'error',
+ 'no-var': 'error',
+ 'prefer-arrow-callback': 'warn',
+ 'prefer-template': 'warn',
+ 'object-shorthand': 'warn'
+ }
+ },
+
+ // Custom config for resources folder
+ {
+ files: ['resources/**/*.js'],
+ languageOptions: {
+ ecmaVersion: 2020,
+ sourceType: 'script',
+ globals: {
+ ...globals.browser,
+ PhpDebugBar: 'writable',
+ phpdebugbar_hljs: 'readonly',
+ phpdebugbar_sqlformatter: 'readonly'
+ }
+ }
+ }
+);
diff --git a/mkdocs.yml b/mkdocs.yml
new file mode 100644
index 000000000..fddb4b680
--- /dev/null
+++ b/mkdocs.yml
@@ -0,0 +1,93 @@
+site_name: PHP Debug Bar
+site_author: Barry vd. Heuvel
+site_description: PHP Debug Bar
+site_url: https://php-debugbar.com
+repo_url: https://github.com/php-debugbar/php-debugbar
+copyright: Copyright © Barry vd. Heuvel & Maxime Bouroumeau-Fuseau
+
+nav:
+ - DebugBar: index.md
+ - Documentation:
+ - Getting started: docs/index.md
+ - docs/release-notes.md
+ - docs/data-collectors.md
+ - docs/rendering.md
+ - docs/ajax-and-stack.md
+ - docs/data-formatter.md
+ - docs/storage.md
+ - docs/openhandler.md
+ - docs/http-drivers.md
+ - docs/javascript-bar.md
+ - Collectors:
+ - collectors/base.md
+ - collectors/bridge.md
+
+theme:
+ name: material
+ custom_dir: docs/overrides
+ logo: assets/logo_white.png
+ favicon: assets/favicon.png
+ palette:
+ - primary: custom
+ accent: custom
+ scheme: default
+ features:
+ - navigation.tabs
+ - navigation.tabs.sticky
+# - navigation.instant
+ - navigation.tracking
+# - navigation.indexes
+ - navigation.top
+ - navigation.footer
+ - navigation.sections
+ - navigation.expand
+ - content.tooltips
+ - content.code.copy
+ - toc.follow
+ - toc.integrate
+ - search.highlight
+ - meta
+extra_css:
+ - assets/dist/debugbar.min.css?v=1772714179
+ - assets/extra.css
+extra_javascript:
+ - assets/dist/debugbar.min.js?v=1772714179
+markdown_extensions:
+ - admonition
+ - abbr
+ - attr_list
+ - pymdownx.emoji:
+ emoji_index: !!python/name:material.extensions.emoji.twemoji
+ emoji_generator: !!python/name:material.extensions.emoji.to_svg
+ - pymdownx.highlight:
+ use_pygments: true
+ anchor_linenums: true
+ line_spans: __span
+ pygments_lang_class: true
+ extend_pygments_lang:
+ - name: php
+ lang: php
+ options:
+ startinline: true
+ - pymdownx.inlinehilite
+ - pymdownx.snippets
+ - pymdownx.superfences
+ - pymdownx.details
+ - toc:
+ permalink: true
+ - pymdownx.magiclink:
+ normalize_issue_symbols: true
+ repo_url_shorthand: true
+ user: php-debugbar
+ repo: php-debugbar
+
+extra:
+ analytics:
+ provider: google
+ property: G-RRZHNXY76R
+ social:
+ - icon: fontawesome/brands/github
+ link: https://github.com/php-debugbar/php-debugbar
+
+hooks:
+ - docs/overrides/shortcodes.py
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 000000000..edcc5ec0a
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,5351 @@
+{
+ "name": "php-debugbar",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "php-debugbar",
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "@sqltools/formatter": "^1.2.5",
+ "@tabler/icons": "^3.36.0",
+ "highlight.js": "^11.11.1"
+ },
+ "devDependencies": {
+ "@antfu/eslint-config": "^6.7.1",
+ "@eslint/js": "^9.39.2",
+ "esbuild": "^0.27.2",
+ "eslint": "^9.39.2",
+ "eslint-plugin-jquery": "^1.5.1",
+ "globals": "^16.5.0"
+ }
+ },
+ "node_modules/@antfu/eslint-config": {
+ "version": "6.7.3",
+ "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-6.7.3.tgz",
+ "integrity": "sha512-0tYYzY59uLnxWgbP9xpuxpvodTcWDacj439kTAJZB3sn7O0BnPfVxTnRvleGYaKCEALBZkzdC/wCho9FD7ICLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@antfu/install-pkg": "^1.1.0",
+ "@clack/prompts": "^0.11.0",
+ "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0",
+ "@eslint/markdown": "^7.5.1",
+ "@stylistic/eslint-plugin": "^5.6.1",
+ "@typescript-eslint/eslint-plugin": "^8.50.0",
+ "@typescript-eslint/parser": "^8.50.0",
+ "@vitest/eslint-plugin": "^1.5.4",
+ "ansis": "^4.2.0",
+ "cac": "^6.7.14",
+ "eslint-config-flat-gitignore": "^2.1.0",
+ "eslint-flat-config-utils": "^2.1.4",
+ "eslint-merge-processors": "^2.0.0",
+ "eslint-plugin-antfu": "^3.1.1",
+ "eslint-plugin-command": "^3.4.0",
+ "eslint-plugin-import-lite": "^0.4.0",
+ "eslint-plugin-jsdoc": "^61.5.0",
+ "eslint-plugin-jsonc": "^2.21.0",
+ "eslint-plugin-n": "^17.23.1",
+ "eslint-plugin-no-only-tests": "^3.3.0",
+ "eslint-plugin-perfectionist": "^4.15.1",
+ "eslint-plugin-pnpm": "^1.4.3",
+ "eslint-plugin-regexp": "^2.10.0",
+ "eslint-plugin-toml": "^0.12.0",
+ "eslint-plugin-unicorn": "^62.0.0",
+ "eslint-plugin-unused-imports": "^4.3.0",
+ "eslint-plugin-vue": "^10.6.2",
+ "eslint-plugin-yml": "^1.19.1",
+ "eslint-processor-vue-blocks": "^2.0.0",
+ "globals": "^16.5.0",
+ "jsonc-eslint-parser": "^2.4.2",
+ "local-pkg": "^1.1.2",
+ "parse-gitignore": "^2.0.0",
+ "toml-eslint-parser": "^0.10.1",
+ "vue-eslint-parser": "^10.2.0",
+ "yaml-eslint-parser": "^1.3.2"
+ },
+ "bin": {
+ "eslint-config": "bin/index.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@eslint-react/eslint-plugin": "^2.0.1",
+ "@next/eslint-plugin-next": ">=15.0.0",
+ "@prettier/plugin-xml": "^3.4.1",
+ "@unocss/eslint-plugin": ">=0.50.0",
+ "astro-eslint-parser": "^1.0.2",
+ "eslint": "^9.10.0",
+ "eslint-plugin-astro": "^1.2.0",
+ "eslint-plugin-format": ">=0.1.0",
+ "eslint-plugin-jsx-a11y": ">=6.10.2",
+ "eslint-plugin-react-hooks": "^7.0.0",
+ "eslint-plugin-react-refresh": "^0.4.19",
+ "eslint-plugin-solid": "^0.14.3",
+ "eslint-plugin-svelte": ">=2.35.1",
+ "eslint-plugin-vuejs-accessibility": "^2.4.1",
+ "prettier-plugin-astro": "^0.14.0",
+ "prettier-plugin-slidev": "^1.0.5",
+ "svelte-eslint-parser": ">=0.37.0"
+ },
+ "peerDependenciesMeta": {
+ "@eslint-react/eslint-plugin": {
+ "optional": true
+ },
+ "@next/eslint-plugin-next": {
+ "optional": true
+ },
+ "@prettier/plugin-xml": {
+ "optional": true
+ },
+ "@unocss/eslint-plugin": {
+ "optional": true
+ },
+ "astro-eslint-parser": {
+ "optional": true
+ },
+ "eslint-plugin-astro": {
+ "optional": true
+ },
+ "eslint-plugin-format": {
+ "optional": true
+ },
+ "eslint-plugin-jsx-a11y": {
+ "optional": true
+ },
+ "eslint-plugin-react-hooks": {
+ "optional": true
+ },
+ "eslint-plugin-react-refresh": {
+ "optional": true
+ },
+ "eslint-plugin-solid": {
+ "optional": true
+ },
+ "eslint-plugin-svelte": {
+ "optional": true
+ },
+ "eslint-plugin-vuejs-accessibility": {
+ "optional": true
+ },
+ "prettier-plugin-astro": {
+ "optional": true
+ },
+ "prettier-plugin-slidev": {
+ "optional": true
+ },
+ "svelte-eslint-parser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@antfu/install-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz",
+ "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "package-manager-detector": "^1.3.0",
+ "tinyexec": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
+ "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@clack/core": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.5.0.tgz",
+ "integrity": "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "sisteransi": "^1.0.5"
+ }
+ },
+ "node_modules/@clack/prompts": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.11.0.tgz",
+ "integrity": "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@clack/core": "0.5.0",
+ "picocolors": "^1.0.0",
+ "sisteransi": "^1.0.5"
+ }
+ },
+ "node_modules/@es-joy/jsdoccomment": {
+ "version": "0.84.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.84.0.tgz",
+ "integrity": "sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.8",
+ "@typescript-eslint/types": "^8.54.0",
+ "comment-parser": "1.4.5",
+ "esquery": "^1.7.0",
+ "jsdoc-type-pratt-parser": "~7.1.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@es-joy/resolve.exports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+ "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz",
+ "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz",
+ "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz",
+ "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz",
+ "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz",
+ "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz",
+ "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz",
+ "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz",
+ "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz",
+ "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz",
+ "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz",
+ "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz",
+ "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz",
+ "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz",
+ "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz",
+ "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz",
+ "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz",
+ "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz",
+ "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz",
+ "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz",
+ "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz",
+ "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-plugin-eslint-comments": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.7.1.tgz",
+ "integrity": "sha512-Ql2nJFwA8wUGpILYGOQaT1glPsmvEwE0d+a+l7AALLzQvInqdbXJdx7aSu0DpUX9dB1wMVBMhm99/++S3MdEtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^4.0.0",
+ "ignore": "^7.0.5"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/compat": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.0.3.tgz",
+ "integrity": "sha512-SjIJhGigp8hmd1YGIBwh7Ovri7Kisl42GYFjrOyHhtfYGGoLW6teYi/5p8W50KSsawUPpuLOSmsq1bD0NGQLBw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.1.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "peerDependencies": {
+ "eslint": "^8.40 || 9 || 10"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@eslint/compat/node_modules/@eslint/core": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz",
+ "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.5"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-array/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/config-array/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.14.0",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.5",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/markdown": {
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-7.5.1.tgz",
+ "integrity": "sha512-R8uZemG9dKTbru/DQRPblbJyXpObwKzo8rv1KYGGuPUPtjM4LXBYM9q5CIZAComzZupws3tWbDwam5AFpPLyJQ==",
+ "dev": true,
+ "license": "MIT",
+ "workspaces": [
+ "examples/*"
+ ],
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "@eslint/plugin-kit": "^0.4.1",
+ "github-slugger": "^2.0.0",
+ "mdast-util-from-markdown": "^2.0.2",
+ "mdast-util-frontmatter": "^2.0.1",
+ "mdast-util-gfm": "^3.1.0",
+ "micromark-extension-frontmatter": "^2.0.0",
+ "micromark-extension-gfm": "^3.0.0",
+ "micromark-util-normalize-identifier": "^2.0.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@pkgr/core": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz",
+ "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/pkgr"
+ }
+ },
+ "node_modules/@sindresorhus/base62": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz",
+ "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@sqltools/formatter": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz",
+ "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==",
+ "license": "MIT"
+ },
+ "node_modules/@stylistic/eslint-plugin": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz",
+ "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/types": "^8.56.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "estraverse": "^5.3.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": "^9.0.0 || ^10.0.0"
+ }
+ },
+ "node_modules/@tabler/icons": {
+ "version": "3.41.1",
+ "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.41.1.tgz",
+ "integrity": "sha512-OaRnVbRmH2nHtFeg+RmMJ/7m2oBIF9XCJAUD5gQnMrpK9f05ydj8MZrAf3NZQqOXyxGN1UBL0D5IKLLEUfr74Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/codecalm"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
+ "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz",
+ "integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.58.0",
+ "@typescript-eslint/type-utils": "8.58.0",
+ "@typescript-eslint/utils": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.0",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.58.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.0.tgz",
+ "integrity": "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.58.0",
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.0.tgz",
+ "integrity": "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.58.0",
+ "@typescript-eslint/types": "^8.58.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/rule-tester": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-8.58.0.tgz",
+ "integrity": "sha512-a/J72Cxeo5ug5sbey7+Dcna6tMBc4Z4eYwBEKM6MVuBqbxnROpLm8yn/j00lPZc75joPZJVR5oiTZxbK95zp+w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/parser": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0",
+ "@typescript-eslint/utils": "8.58.0",
+ "ajv": "^6.12.6",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "4.6.2",
+ "semver": "^7.7.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz",
+ "integrity": "sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz",
+ "integrity": "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz",
+ "integrity": "sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0",
+ "@typescript-eslint/utils": "8.58.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz",
+ "integrity": "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz",
+ "integrity": "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.58.0",
+ "@typescript-eslint/tsconfig-utils": "8.58.0",
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.0",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.0.tgz",
+ "integrity": "sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.58.0",
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz",
+ "integrity": "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.58.0",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@vitest/eslint-plugin": {
+ "version": "1.6.14",
+ "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.6.14.tgz",
+ "integrity": "sha512-PXZ5ysw4eHU9h8nDtBvVcGC7Z2C/T9CFdheqSw1NNXFYqViojub0V9bgdYI67iBTOcra2mwD0EYldlY9bGPf2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "^8.58.0",
+ "@typescript-eslint/utils": "^8.58.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "*",
+ "eslint": ">=8.57.0",
+ "typescript": ">=5.0.0",
+ "vitest": "*"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "vitest": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.31",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.31.tgz",
+ "integrity": "sha512-k/ueL14aNIEy5Onf0OVzR8kiqF/WThgLdFhxwa4e/KF/0qe38IwIdofoSWBTvvxQOesaz6riAFAUaYjoF9fLLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.2",
+ "@vue/shared": "3.5.31",
+ "entities": "^7.0.1",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.31",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.31.tgz",
+ "integrity": "sha512-BMY/ozS/xxjYqRFL+tKdRpATJYDTTgWSo0+AJvJNg4ig+Hgb0dOsHPXvloHQ5hmlivUqw1Yt2pPIqp4e0v1GUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.31",
+ "@vue/shared": "3.5.31"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.31",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.31.tgz",
+ "integrity": "sha512-M8wpPgR9UJ8MiRGjppvx9uWJfLV7A/T+/rL8s/y3QG3u0c2/YZgff3d6SuimKRIhcYnWg5fTfDMlz2E6seUW8Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.29.2",
+ "@vue/compiler-core": "3.5.31",
+ "@vue/compiler-dom": "3.5.31",
+ "@vue/compiler-ssr": "3.5.31",
+ "@vue/shared": "3.5.31",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.21",
+ "postcss": "^8.5.8",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.31",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.31.tgz",
+ "integrity": "sha512-h0xIMxrt/LHOvJKMri+vdYT92BrK3HFLtDqq9Pr/lVVfE4IyKZKvWf0vJFW10Yr6nX02OR4MkJwI0c1HDa1hog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.31",
+ "@vue/shared": "3.5.31"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.31",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.31.tgz",
+ "integrity": "sha512-nBxuiuS9Lj5bPkPbWogPUnjxxWpkRniX7e5UBQDWl6Fsf4roq9wwV+cR7ezQ4zXswNvPIlsdj1slcLB7XCsRAw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/ansis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz",
+ "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/are-docs-informative": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz",
+ "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.13",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.13.tgz",
+ "integrity": "sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/brace-expansion": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "baseline-browser-mapping": "^2.10.12",
+ "caniuse-lite": "^1.0.30001782",
+ "electron-to-chromium": "^1.5.328",
+ "node-releases": "^2.0.36",
+ "update-browserslist-db": "^1.2.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/builtin-modules": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz",
+ "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001784",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz",
+ "integrity": "sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/change-case": {
+ "version": "5.4.4",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz",
+ "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
+ "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/clean-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz",
+ "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/clean-regexp/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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/comment-parser": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz",
+ "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/confbox": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz",
+ "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.49.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz",
+ "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.28.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
+ "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.331",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz",
+ "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/empathic": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz",
+ "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.20.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz",
+ "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
+ "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.7",
+ "@esbuild/android-arm": "0.27.7",
+ "@esbuild/android-arm64": "0.27.7",
+ "@esbuild/android-x64": "0.27.7",
+ "@esbuild/darwin-arm64": "0.27.7",
+ "@esbuild/darwin-x64": "0.27.7",
+ "@esbuild/freebsd-arm64": "0.27.7",
+ "@esbuild/freebsd-x64": "0.27.7",
+ "@esbuild/linux-arm": "0.27.7",
+ "@esbuild/linux-arm64": "0.27.7",
+ "@esbuild/linux-ia32": "0.27.7",
+ "@esbuild/linux-loong64": "0.27.7",
+ "@esbuild/linux-mips64el": "0.27.7",
+ "@esbuild/linux-ppc64": "0.27.7",
+ "@esbuild/linux-riscv64": "0.27.7",
+ "@esbuild/linux-s390x": "0.27.7",
+ "@esbuild/linux-x64": "0.27.7",
+ "@esbuild/netbsd-arm64": "0.27.7",
+ "@esbuild/netbsd-x64": "0.27.7",
+ "@esbuild/openbsd-arm64": "0.27.7",
+ "@esbuild/openbsd-x64": "0.27.7",
+ "@esbuild/openharmony-arm64": "0.27.7",
+ "@esbuild/sunos-x64": "0.27.7",
+ "@esbuild/win32-arm64": "0.27.7",
+ "@esbuild/win32-ia32": "0.27.7",
+ "@esbuild/win32-x64": "0.27.7"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.2",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.5",
+ "@eslint/js": "9.39.4",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.5",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-compat-utils": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz",
+ "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-config-flat-gitignore": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-2.3.0.tgz",
+ "integrity": "sha512-bg4ZLGgoARg1naWfsINUUb/52Ksw/K22K+T16D38Y8v+/sGwwIYrGvH/JBjOin+RQtxxC9tzNNiy4shnGtGyyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint/compat": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "eslint": "^9.5.0 || ^10.0.0"
+ }
+ },
+ "node_modules/eslint-flat-config-utils": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/eslint-flat-config-utils/-/eslint-flat-config-utils-2.1.4.tgz",
+ "integrity": "sha512-bEnmU5gqzS+4O+id9vrbP43vByjF+8KOs+QuuV4OlqAuXmnRW2zfI/Rza1fQvdihQ5h4DUo0NqFAiViD4mSrzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/eslint-json-compat-utils": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.3.tgz",
+ "integrity": "sha512-RbBmDFyu7FqnjE8F0ZxPNzx5UaptdeS9Uu50r7A+D7s/+FCX+ybiyViYEgFUaFIFqSWJgZRTpL5d8Kanxxl2lQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esquery": "^1.6.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "jsonc-eslint-parser": "^2.4.0 || ^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@eslint/json": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-merge-processors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-merge-processors/-/eslint-merge-processors-2.0.0.tgz",
+ "integrity": "sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ }
+ },
+ "node_modules/eslint-plugin-antfu": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-antfu/-/eslint-plugin-antfu-3.2.2.tgz",
+ "integrity": "sha512-Qzixht2Dmd/pMbb5EnKqw2V8TiWHbotPlsORO8a+IzCLFwE0RxK8a9k4DCTFPzBwyxJzH+0m2Mn8IUGeGQkyUw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ }
+ },
+ "node_modules/eslint-plugin-command": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-command/-/eslint-plugin-command-3.5.2.tgz",
+ "integrity": "sha512-PA59QAkQDwvcCMEt5lYLJLI3zDGVKJeC4id/pcRY2XdRYhSGW7iyYT1VC1N3bmpuvu6Qb/9QptiS3GJMjeGTJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@es-joy/jsdoccomment": "^0.84.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/rule-tester": "*",
+ "@typescript-eslint/typescript-estree": "*",
+ "@typescript-eslint/utils": "*",
+ "eslint": "*"
+ }
+ },
+ "node_modules/eslint-plugin-es-x": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+ "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/ota-meshi",
+ "https://opencollective.com/eslint"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.1.2",
+ "@eslint-community/regexpp": "^4.11.0",
+ "eslint-compat-utils": "^0.5.1"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=8"
+ }
+ },
+ "node_modules/eslint-plugin-es-x/node_modules/eslint-compat-utils": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+ "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-import-lite": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import-lite/-/eslint-plugin-import-lite-0.4.0.tgz",
+ "integrity": "sha512-My0ReAg8WbHXYECIHVJkWB8UxrinZn3m72yonOYH6MFj40ZN1vHYQj16iq2Fd8Wrt/vRZJwDX2xm/BzDk1FzTg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=9.0.0",
+ "typescript": ">=4.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-jquery": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jquery/-/eslint-plugin-jquery-1.5.1.tgz",
+ "integrity": "sha512-L7v1eaK5t80C0lvUXPFP9MKnBOqPSKhCOYyzy4LZ0+iK+TJwN8S9gAkzzP1AOhypRIwA88HF6phQ9C7jnOpW8w==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=5.4.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc": {
+ "version": "61.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.7.1.tgz",
+ "integrity": "sha512-36DpldF95MlTX//n3/naULFVt8d1cV4jmSkx7ZKrE9ikkKHAgMLesuWp1SmwpVwAs5ndIM6abKd6PeOYZUgdWg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@es-joy/jsdoccomment": "~0.78.0",
+ "@es-joy/resolve.exports": "1.2.0",
+ "are-docs-informative": "^0.0.2",
+ "comment-parser": "1.4.1",
+ "debug": "^4.4.3",
+ "escape-string-regexp": "^4.0.0",
+ "espree": "^11.0.0",
+ "esquery": "^1.7.0",
+ "html-entities": "^2.6.0",
+ "object-deep-merge": "^2.0.0",
+ "parse-imports-exports": "^0.2.4",
+ "semver": "^7.7.3",
+ "spdx-expression-parse": "^4.0.0",
+ "to-valid-identifier": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20.11.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/node_modules/@es-joy/jsdoccomment": {
+ "version": "0.78.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.78.0.tgz",
+ "integrity": "sha512-rQkU5u8hNAq2NVRzHnIUUvR6arbO0b6AOlvpTNS48CkiKSn/xtNfOzBK23JE4SiW89DgvU7GtxLVgV4Vn2HBAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.8",
+ "@typescript-eslint/types": "^8.46.4",
+ "comment-parser": "1.4.1",
+ "esquery": "^1.6.0",
+ "jsdoc-type-pratt-parser": "~7.0.0"
+ },
+ "engines": {
+ "node": ">=20.11.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/node_modules/comment-parser": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+ "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/node_modules/espree": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^5.0.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/node_modules/jsdoc-type-pratt-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.0.0.tgz",
+ "integrity": "sha512-c7YbokssPOSHmqTbSAmTtnVgAVa/7lumWNYqomgd5KOMyPrRve2anx6lonfOsXEQacqF9FKVUj7bLg4vRSvdYA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsonc": {
+ "version": "2.21.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.21.1.tgz",
+ "integrity": "sha512-dbNR5iEnQeORwsK2WZzr3QaMtFCY3kKJVMRHPzUpKzMhmVy2zIpVgFDpX8MNoIdoqz6KCpCfOJavhfiSbZbN+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.5.1",
+ "diff-sequences": "^27.5.1",
+ "eslint-compat-utils": "^0.6.4",
+ "eslint-json-compat-utils": "^0.2.1",
+ "espree": "^9.6.1 || ^10.3.0",
+ "graphemer": "^1.4.0",
+ "jsonc-eslint-parser": "^2.4.0",
+ "natural-compare": "^1.4.0",
+ "synckit": "^0.6.2 || ^0.7.3 || ^0.11.5"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-n": {
+ "version": "17.24.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz",
+ "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.5.0",
+ "enhanced-resolve": "^5.17.1",
+ "eslint-plugin-es-x": "^7.8.0",
+ "get-tsconfig": "^4.8.1",
+ "globals": "^15.11.0",
+ "globrex": "^0.1.2",
+ "ignore": "^5.3.2",
+ "semver": "^7.6.3",
+ "ts-declaration-location": "^1.0.6"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": ">=8.23.0"
+ }
+ },
+ "node_modules/eslint-plugin-n/node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-plugin-n/node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/eslint-plugin-no-only-tests": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz",
+ "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=5.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-perfectionist": {
+ "version": "4.15.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.15.1.tgz",
+ "integrity": "sha512-MHF0cBoOG0XyBf7G0EAFCuJJu4I18wy0zAoT1OHfx2o6EOx1EFTIzr2HGeuZa1kDcusoX0xJ9V7oZmaeFd773Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "^8.38.0",
+ "@typescript-eslint/utils": "^8.38.0",
+ "natural-orderby": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=8.45.0"
+ }
+ },
+ "node_modules/eslint-plugin-pnpm": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-pnpm/-/eslint-plugin-pnpm-1.6.0.tgz",
+ "integrity": "sha512-dxmt9r3zvPaft6IugS4i0k16xag3fTbOvm/road5uV9Y8qUCQT0xzheSh3gMlYAlC6vXRpfArBDsTZ7H7JKCbg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "empathic": "^2.0.0",
+ "jsonc-eslint-parser": "^3.1.0",
+ "pathe": "^2.0.3",
+ "pnpm-workspace-yaml": "1.6.0",
+ "tinyglobby": "^0.2.15",
+ "yaml": "^2.8.2",
+ "yaml-eslint-parser": "^2.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^9.0.0 || ^10.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-pnpm/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-pnpm/node_modules/jsonc-eslint-parser": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-3.1.0.tgz",
+ "integrity": "sha512-75EA7EWZExL/j+MDKQrRbdzcRI2HOkRlmUw8fZJc1ioqFEOvBsq7Rt+A6yCxOt9w/TYNpkt52gC6nm/g5tFIng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.5.0",
+ "eslint-visitor-keys": "^5.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ }
+ },
+ "node_modules/eslint-plugin-pnpm/node_modules/yaml-eslint-parser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-2.0.0.tgz",
+ "integrity": "sha512-h0uDm97wvT2bokfwwTmY6kJ1hp6YDFL0nRHwNKz8s/VD1FH/vvZjAKoMUE+un0eaYBSG7/c6h+lJTP+31tjgTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^5.0.0",
+ "yaml": "^2.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ }
+ },
+ "node_modules/eslint-plugin-regexp": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-2.10.0.tgz",
+ "integrity": "sha512-ovzQT8ESVn5oOe5a7gIDPD5v9bCSjIFJu57sVPDqgPRXicQzOnYfFN21WoQBQF18vrhT5o7UMKFwJQVVjyJ0ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.11.0",
+ "comment-parser": "^1.4.0",
+ "jsdoc-type-pratt-parser": "^4.0.0",
+ "refa": "^0.12.1",
+ "regexp-ast-analysis": "^0.7.1",
+ "scslre": "^0.3.0"
+ },
+ "engines": {
+ "node": "^18 || >=20"
+ },
+ "peerDependencies": {
+ "eslint": ">=8.44.0"
+ }
+ },
+ "node_modules/eslint-plugin-regexp/node_modules/jsdoc-type-pratt-parser": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz",
+ "integrity": "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-toml": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-toml/-/eslint-plugin-toml-0.12.0.tgz",
+ "integrity": "sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "eslint-compat-utils": "^0.6.0",
+ "lodash": "^4.17.19",
+ "toml-eslint-parser": "^0.10.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-unicorn": {
+ "version": "62.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-62.0.0.tgz",
+ "integrity": "sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@eslint-community/eslint-utils": "^4.9.0",
+ "@eslint/plugin-kit": "^0.4.0",
+ "change-case": "^5.4.4",
+ "ci-info": "^4.3.1",
+ "clean-regexp": "^1.0.0",
+ "core-js-compat": "^3.46.0",
+ "esquery": "^1.6.0",
+ "find-up-simple": "^1.0.1",
+ "globals": "^16.4.0",
+ "indent-string": "^5.0.0",
+ "is-builtin-module": "^5.0.0",
+ "jsesc": "^3.1.0",
+ "pluralize": "^8.0.0",
+ "regexp-tree": "^0.1.27",
+ "regjsparser": "^0.13.0",
+ "semver": "^7.7.3",
+ "strip-indent": "^4.1.1"
+ },
+ "engines": {
+ "node": "^20.10.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
+ },
+ "peerDependencies": {
+ "eslint": ">=9.38.0"
+ }
+ },
+ "node_modules/eslint-plugin-unused-imports": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.4.1.tgz",
+ "integrity": "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0",
+ "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-vue": {
+ "version": "10.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.8.0.tgz",
+ "integrity": "sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.1.1",
+ "postcss-selector-parser": "^7.1.0",
+ "semver": "^7.6.3",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0",
+ "@typescript-eslint/parser": "^7.0.0 || ^8.0.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "vue-eslint-parser": "^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@stylistic/eslint-plugin": {
+ "optional": true
+ },
+ "@typescript-eslint/parser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-yml": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.1.tgz",
+ "integrity": "sha512-bYkOxyEiXh9WxUhVYPELdSHxGG5pOjCSeJOVkfdIyj6tuiHDxrES2WAW1dBxn3iaZQey57XflwLtCYRcNPOiOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.2",
+ "diff-sequences": "^27.5.1",
+ "escape-string-regexp": "4.0.0",
+ "eslint-compat-utils": "^0.6.0",
+ "natural-compare": "^1.4.0",
+ "yaml-eslint-parser": "^1.2.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-processor-vue-blocks": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-processor-vue-blocks/-/eslint-processor-vue-blocks-2.0.0.tgz",
+ "integrity": "sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/compiler-sfc": "^3.3.0",
+ "eslint": ">=9.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint/node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/exsolve": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz",
+ "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/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,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fault": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz",
+ "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "format": "^0.2.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-up-simple": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz",
+ "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.13.7",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz",
+ "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/github-slugger": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
+ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+ "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "11.11.1",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
+ "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
+ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-builtin-module": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz",
+ "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "builtin-modules": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdoc-type-pratt-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.1.tgz",
+ "integrity": "sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/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,
+ "license": "MIT"
+ },
+ "node_modules/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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsonc-eslint-parser": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz",
+ "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "acorn": "^8.5.0",
+ "eslint-visitor-keys": "^3.0.0",
+ "espree": "^9.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ }
+ },
+ "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/jsonc-eslint-parser/node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/local-pkg": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz",
+ "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mlly": "^1.7.4",
+ "pkg-types": "^2.3.0",
+ "quansync": "^0.2.11"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/markdown-table": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
+ "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-frontmatter": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz",
+ "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-extension-frontmatter": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mdast-util-gfm": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
+ "mdast-util-gfm-footnote": "^2.0.0",
+ "mdast-util-gfm-strikethrough": "^2.0.0",
+ "mdast-util-gfm-table": "^2.0.0",
+ "mdast-util-gfm-task-list-item": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-find-and-replace": "^3.0.0",
+ "micromark-util-character": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "markdown-table": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
+ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
+ "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-frontmatter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz",
+ "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fault": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
+ "micromark-extension-gfm-footnote": "^2.0.0",
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
+ "micromark-extension-gfm-table": "^2.0.0",
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-strikethrough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-tagfilter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
+ "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
+ "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^1.3.1",
+ "ufo": "^1.6.3"
+ }
+ },
+ "node_modules/mlly/node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mlly/node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/natural-orderby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz",
+ "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.37",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz",
+ "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/object-deep-merge": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz",
+ "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-manager-detector": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz",
+ "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-gitignore": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-2.0.0.tgz",
+ "integrity": "sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/parse-imports-exports": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+ "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse-statements": "1.0.11"
+ }
+ },
+ "node_modules/parse-statements": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+ "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz",
+ "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.2.2",
+ "exsolve": "^1.0.7",
+ "pathe": "^2.0.3"
+ }
+ },
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pnpm-workspace-yaml": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/pnpm-workspace-yaml/-/pnpm-workspace-yaml-1.6.0.tgz",
+ "integrity": "sha512-uUy4dK3E11sp7nK+hnT7uAWfkBMe00KaUw8OG3NuNlYQoTk4sc9pcdIy1+XIP85v9Tvr02mK3JPaNNrP0QyRaw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "yaml": "^2.8.2"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
+ "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/quansync": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
+ "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/refa": {
+ "version": "0.12.1",
+ "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz",
+ "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.8.0"
+ },
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/regexp-ast-analysis": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz",
+ "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.8.0",
+ "refa": "^0.12.1"
+ },
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/regexp-tree": {
+ "version": "0.1.27",
+ "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
+ "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "regexp-tree": "bin/regexp-tree"
+ }
+ },
+ "node_modules/regjsparser": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz",
+ "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.1.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/reserved-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz",
+ "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/scslre": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz",
+ "integrity": "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.8.0",
+ "refa": "^0.12.0",
+ "regexp-ast-analysis": "^0.7.0"
+ },
+ "engines": {
+ "node": "^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "dev": true,
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+ "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.23",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz",
+ "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/strip-indent": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz",
+ "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/synckit": {
+ "version": "0.11.12",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz",
+ "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@pkgr/core": "^0.2.9"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/synckit"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz",
+ "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tinyexec": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz",
+ "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/to-valid-identifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz",
+ "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/base62": "^1.0.0",
+ "reserved-identifiers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/toml-eslint-parser": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/toml-eslint-parser/-/toml-eslint-parser-0.10.1.tgz",
+ "integrity": "sha512-9mjy3frhioGIVGcwamlVlUyJ9x+WHw/TXiz9R4YOlmsIuBN43r9Dp8HZ35SF9EKjHrn3BUZj04CF+YqZ2oJ+7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.0.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ }
+ },
+ "node_modules/toml-eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/ts-declaration-location": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz",
+ "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "ko-fi",
+ "url": "https://ko-fi.com/rebeccastevens"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/ts-declaration-location"
+ }
+ ],
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "picomatch": "^4.0.2"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.0.0"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz",
+ "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
+ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vue-eslint-parser": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz",
+ "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "debug": "^4.4.0",
+ "eslint-scope": "^8.2.0 || ^9.0.0",
+ "eslint-visitor-keys": "^4.2.0 || ^5.0.0",
+ "espree": "^10.3.0 || ^11.0.0",
+ "esquery": "^1.6.0",
+ "semver": "^7.6.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yaml-eslint-parser": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.2.tgz",
+ "integrity": "sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.0.0",
+ "yaml": "^2.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ }
+ },
+ "node_modules/yaml-eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 000000000..e36d5b710
--- /dev/null
+++ b/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "php-debugbar",
+ "version": "1.0.0",
+ "description": "[](https://packagist.org/packages/php-debugbar/php-debugbar) [](https://packagist.org/packages/php-debugbar/php-debugbar) [](https://packagist.org/packages/php-debugbar/php-debugbar) [](https://github.com/php-debugbar/php-debugbar/actions/workflows/run-tests.yml)",
+ "main": "index.js",
+ "directories": {
+ "doc": "docs",
+ "test": "tests"
+ },
+ "type": "module",
+ "scripts": {
+ "build": "npm run build:hljs && npm run build:sqlformatter && npm run build:icons && npm run build:assets && npm run build:minify",
+ "build:assets": "php build/build-assets.php",
+ "build:hljs": "esbuild build/build-hljs.js --bundle --minify --format=iife --outfile=resources/vendor/highlightjs/highlight.pack.js",
+ "build:sqlformatter": "esbuild build/build-sqlformatter.js --bundle --minify --format=iife --outfile=resources/vendor/sql-formatter/sql-formatter.min.js",
+ "build:icons": "node build/build-icons.js",
+ "build:minify": "php build/build-assets.php && node build/build-minify.js",
+ "docs": "npm run build && php vendor/bin/phpunit --filter=testDocs && php build/build-docs.php && mkdocs build",
+ "lint": "eslint resources/**/*.js",
+ "lint:fix": "eslint resources/**/*.js --fix",
+ "lint:report": "eslint resources/**/*.js --output-file eslint-report.txt --format unix",
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "devDependencies": {
+ "@antfu/eslint-config": "^6.7.1",
+ "@eslint/js": "^9.39.2",
+ "esbuild": "^0.27.2",
+ "eslint": "^9.39.2",
+ "eslint-plugin-jquery": "^1.5.1",
+ "globals": "^16.5.0"
+ },
+ "dependencies": {
+ "@sqltools/formatter": "^1.2.5",
+ "@tabler/icons": "^3.36.0",
+ "highlight.js": "^11.11.1"
+ }
+}
diff --git a/phpstan.neon b/phpstan.neon
new file mode 100644
index 000000000..ccec565a5
--- /dev/null
+++ b/phpstan.neon
@@ -0,0 +1,31 @@
+parameters:
+ level: 6
+# treatPhpDocTypesAsCertain: false
+ paths:
+ - src
+ - tests
+ bootstrapFiles:
+ - tests/phpstan-stubs.php
+ strictRules:
+ dynamicCallOnStaticMethod: false
+ booleansInConditions: false
+ disallowedShortTernary: false
+ noVariableVariables: false
+ strictArrayFilter: false
+ shipmonkRules:
+ enableAllRules: false
+ enforceNativeReturnTypehint:
+ enabled: true
+ ignoreErrors:
+ -
+ identifier: missingType.iterableValue
+ -
+ identifier: cast.useless
+ -
+ identifier: missingType.parameter
+ path: src/DataFormatter/VarDumper/DebugBarJsonDumper.php
+includes:
+ - vendor/phpstan/phpstan-phpunit/extension.neon
+ - vendor/phpstan/phpstan-strict-rules/rules.neon
+ - vendor/shipmonk/phpstan-rules/rules.neon
+
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 77d237350..d04f9da49 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -1,25 +1,27 @@
-
-
-
- ./tests/DebugBar/
-
-
-
-
-
- ./src/DebugBar/
-
-
+
+
+ ./tests/Tests
+ ./tests/Tests/Browser
+
+
+ ./tests/Tests/Browser
+
+
+
+
+
+
+
+
+ ./src/
+
+
diff --git a/resources/debugbar.css b/resources/debugbar.css
new file mode 100644
index 000000000..b993e41c0
--- /dev/null
+++ b/resources/debugbar.css
@@ -0,0 +1,731 @@
+/* Hide debugbar when printing a page */
+@media print {
+ div.phpdebugbar {
+ display: none;
+ }
+}
+
+div.phpdebugbar,
+div.phpdebugbar-openhandler,
+div.phpdebugbar-widgets-datasets-panel {
+ --debugbar-background: #F7F7F7;
+ --debugbar-background-alt: #EFEFEF;
+ --debugbar-text: #222;
+ --debugbar-text-muted: #888;
+ --debugbar-border: #eee;
+
+ --debugbar-header: #efefef;
+ --debugbar-header-text: #555;
+ --debugbar-header-border: #ddd;
+
+ --debugbar-active: #ccc;
+ --debugbar-active-text: #666;
+
+ --debugbar-icons: #555;
+ --debugbar-badge: #ccc;
+ --debugbar-badge-text: #555;
+
+ --debugbar-badge-active: #477e96;
+ --debugbar-badge-active-text: #fff;
+
+ --debugbar-link: #888;
+ --debugbar-hover: #aaa;
+
+ --debugbar-accent: #6BB7D8;
+ --debugbar-accent-border: #477e96;
+
+ --debugbar-font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --debugbar-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --debugbar-icon-brand: var(--debugbar-icon-brand-php);
+}
+
+div.phpdebugbar[data-theme='dark'],
+div.phpdebugbar-openhandler[data-theme='dark'],
+div.phpdebugbar-widgets-datasets-panel[data-theme='dark'] {
+ --debugbar-background: #2a2a2a;
+ --debugbar-background-alt: #333333;
+ --debugbar-text: #e0e0e0;
+ --debugbar-text-muted: #aaaaaa;
+ --debugbar-border: #3a3a3a;
+
+ --debugbar-header: #1e1e1e;
+ --debugbar-header-text: #cccccc;
+ --debugbar-header-border: #444;
+
+ --debugbar-active: #444;
+ --debugbar-active-text: #e0e0e0;
+
+ --debugbar-icons: #cccccc;
+ --debugbar-badge: #444;
+ --debugbar-badge-text: #cccccc;
+
+ --debugbar-badge-active: #4F8FB3;
+ --debugbar-badge-active-text: #1e1e1e;
+
+ --debugbar-accent: #4F8FB3;
+ --debugbar-accent-border: #3F7A94;
+
+ --debugbar-link: #aaaaaa;
+ --debugbar-hover: #888888;
+}
+
+
+div.phpdebugbar {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ border-top: 0;
+ font-family: var(--debugbar-font-sans);
+ background: var(--debugbar-background);
+ z-index: 100000000;
+ font-size: 13px;
+ color: var(--debugbar-text);
+ text-align: left;
+ line-height: 1.2em;
+ letter-spacing: normal;
+ direction: ltr;
+}
+
+div.phpdebugbar.phpdebugbar-fullscreen,
+div.phpdebugbar.phpdebugbar-fullscreen[data-toolbarPosition="top"] {
+ top: 0;
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+}
+
+div.phpdebugbar.phpdebugbar-fullscreen .phpdebugbar-body {
+ flex: 1;
+ height: calc(100% - 32px) !important
+}
+
+div.phpdebugbar.phpdebugbar-fullscreen .phpdebugbar-resize-handle {
+ display: none;
+}
+
+.phpdebugbar [hidden] {
+ display: none !important;
+}
+
+div.phpdebugbar[data-openBtnPosition="bottomRight"].phpdebugbar-closed,
+div.phpdebugbar[data-openBtnPosition="topRight"].phpdebugbar-closed {
+ left:auto;
+ right: 0;
+}
+
+div.phpdebugbar[data-openBtnPosition="topRight"].phpdebugbar-closed,
+div.phpdebugbar[data-openBtnPosition="topLeft"].phpdebugbar-closed {
+ bottom:auto;
+ top: 0;
+ border-bottom: 1px solid var(--debugbar-header-border);
+}
+
+div.phpdebugbar[data-openBtnPosition="bottomRight"].phpdebugbar-closed,
+div.phpdebugbar[data-openBtnPosition="bottomLeft"].phpdebugbar-closed {
+ border-top: 1px solid var(--debugbar-header-border);
+}
+
+.phpdebugbar-closed[data-openBtnPosition="bottomLeft"],
+.phpdebugbar-closed[data-openBtnPosition="topLeft"] {
+ border-right: 1px solid var(--debugbar-header-border);
+}
+.phpdebugbar-closed[data-openBtnPosition="bottomRight"],
+.phpdebugbar-closed[data-openBtnPosition="topRight"] {
+ border-left: 1px solid var(--debugbar-header-border);
+}
+
+div.phpdebugbar a,
+div.phpdebugbar-openhandler {
+ cursor: pointer;
+}
+
+div.phpdebugbar-drag-capture {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ z-index: 100000001;
+ background: none;
+ display: none;
+ cursor: row-resize;
+}
+
+div.phpdebugbar-closed {
+ width: auto;
+}
+
+div.phpdebugbar * {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-weight: normal;
+ text-decoration: none;
+ clear: initial;
+ width: auto;
+ direction: ltr;
+ text-align: left;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+div.phpdebugbar select, div.phpdebugbar input {
+ appearance: auto;
+}
+
+div.phpdebugbar ol, div.phpdebugbar ul {
+ list-style: none;
+}
+
+div.phpdebugbar ul li, div.phpdebugbar ol li, div.phpdebugbar dl li {
+ line-height: normal;
+}
+
+div.phpdebugbar table, .phpdebugbar-openhandler table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ color: inherit;
+}
+
+div.phpdebugbar input[type='text'], div.phpdebugbar input[type='password'], div.phpdebugbar select {
+ font-family: var(--debugbar-font-sans);
+ background: var(--debugbar-background);
+ font-size: 14px;
+ color: var(--debugbar-text);
+ padding: 0;
+ border: 1px solid var(--debugbar-border);
+ border-radius: 0.25rem;
+ margin: 0;
+}
+
+div.phpdebugbar code, div.phpdebugbar pre, div.phpdebugbar samp {
+ background: none;
+ font-family: var(--debugbar-font-mono);
+ font-size: 1em;
+ border: 0 !important;
+ padding: 0;
+ margin: 0;
+}
+
+div.phpdebugbar code, div.phpdebugbar pre {
+ color: var(--debugbar-text);
+}
+
+div.phpdebugbar pre.sf-dump {
+ background: none !important;
+ z-index: 0 !important;
+ display: block !important;
+ color: #a0a000;
+ outline: 0;
+}
+
+div.phpdebugbar pre.sf-dump .sf-dump-private {
+ color: grey;
+}
+
+div.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-public {
+ color: #ffcc00;
+}
+
+div.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-protected {
+ color: #a0a000;
+}
+
+div.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-private {
+ color: #9d9266;
+}
+
+a.phpdebugbar-restore-btn {
+ float: left;
+ padding: 4px 4px;
+ font-size: 14px;
+ color: var(--debugbar-icons);
+ text-decoration: none;
+ width: 24px;
+ height: 24px;
+}
+
+div.phpdebugbar-resize-handle {
+ height: 4px;
+ margin-top: -4px;
+ width: 100%;
+ background: none;
+ border-bottom: 1px solid var(--debugbar-header-border);
+ cursor: row-resize;
+}
+div.phpdebugbar-minimized div.phpdebugbar-resize-handle {
+ cursor: auto;
+}
+
+div.phpdebugbar-resize-handle.phpdebugbar-resize-handle-bottom {
+ margin-top: 4px;
+}
+
+div.phpdebugbar-minimized{
+ border-top: 1px solid var(--debugbar-header-border);
+}
+
+div.phpdebugbar-minimized[data-toolbarPosition="top"]{
+ border-top: 0;
+ border-bottom: 1px solid var(--debugbar-header-border);
+}
+
+
+div.phpdebugbar[data-toolbarPosition="top"] {
+ bottom: auto;
+ top: 0;
+}
+
+div.phpdebugbar[data-toolbarPosition="top"] div.phpdebugbar-resize-handle-top {
+ height:0;
+ display: none;
+}
+div.phpdebugbar[data-toolbarPosition="top"] div.phpdebugbar-resize-handle-bottom {
+ margin-top: 0;
+}
+div.phpdebugbar[data-toolbarPosition="bottom"] div.phpdebugbar-resize-handle-bottom {
+ height:0;
+ margin-top: 0;
+}
+
+
+/* -------------------------------------- */
+
+a.phpdebugbar-restore-btn:after {
+ -webkit-mask-image: var(--debugbar-icon-brand);
+ mask-image: var(--debugbar-icon-brand);
+ -webkit-mask-size: 20px 20px;
+ mask-size: 20px 20px;
+ background-color: var(--debugbar-icons);
+}
+div.phpdebugbar-header {
+ background-color: var(--debugbar-header);
+ min-height: 32px;
+ line-height: 16px;
+}
+div.phpdebugbar-header:before, div.phpdebugbar-header:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+div.phpdebugbar-header:after {
+ clear: both;
+}
+div.phpdebugbar-header-left {
+ float: left;
+}
+div.phpdebugbar-header-right {
+ float: right;
+}
+div.phpdebugbar-header > div > * {
+ padding: 5px;
+ font-size: 13px;
+ height: 22px;
+ color: var(--debugbar-header-text);
+ text-decoration: none;
+}
+div.phpdebugbar-header-left > *,
+div.phpdebugbar-header-right > * {
+ line-height: 0;
+ display: flex;
+ align-items: center;
+}
+div.phpdebugbar-header-left > * {
+ float: left;
+}
+div.phpdebugbar-header-right > * {
+ float: right;
+}
+div.phpdebugbar-header-right select {
+ padding: 0;
+ line-height: 1em;
+ background-color: var(--debugbar-header);
+ color: var(--debugbar-header-text);
+}
+
+/* -------------------------------------- */
+
+span.phpdebugbar-indicator,
+a.phpdebugbar-indicator
+{
+ border-right: 1px solid var(--debugbar-header-border);
+}
+
+.phpdebugbar[data-hideEmptyTabs=true] .phpdebugbar-tab[data-empty=true]:not(.phpdebugbar-active) {
+ display: none;
+}
+
+a.phpdebugbar-tab.phpdebugbar-active {
+ background: var(--debugbar-active);
+ color: var(--debugbar-active-text);
+}
+ a.phpdebugbar-tab .phpdebugbar-text {
+ font-size: 14px;
+ }
+ a.phpdebugbar-tab span.phpdebugbar-badge {
+ display: none;
+ margin-left: 5px;
+ font-size: 11px;
+ line-height: 14px;
+ padding: 0 6px;
+ background: var(--debugbar-badge);
+ border-radius: 4px;
+ color: var(--debugbar-badge-text);
+ font-weight: normal;
+ text-shadow: none;
+ }
+ a.phpdebugbar-tab.phpdebugbar-active span.phpdebugbar-badge {
+ background: var(--debugbar-badge-active);
+ color: var(--debugbar-badge-active-text);
+ }
+
+ a.phpdebugbar-tab i {
+ display: none;
+ vertical-align: middle;
+ }
+
+.phpdebugbar-icon,
+i.phpdebugbar-icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+/* Icon base styles */
+.phpdebugbar-icon::before,
+i.phpdebugbar-icon::before {
+ content: "";
+ display: block;
+ justify-content: center;
+ flex-shrink: 0;
+ width: 1.3em;
+ height: 1.3em;
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center;
+ vertical-align: middle;
+ /* Use mask to allow currentColor to work */
+ -webkit-mask-size: contain;
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-position: center;
+ mask-size: contain;
+ mask-repeat: no-repeat;
+ mask-position: center;
+ background-color: currentColor;
+}
+
+.phpdebugbar-icon-brand::before {
+ -webkit-mask-image: var(--debugbar-icon-brand);
+ mask-image: var(--debugbar-icon-brand);
+}
+
+ a.phpdebugbar-tab span.phpdebugbar-badge.phpdebugbar-visible {
+ display: inline;
+ }
+ a.phpdebugbar-tab span.phpdebugbar-badge.phpdebugbar-important {
+ background: #ed6868;
+ color: white;
+ }
+
+a.phpdebugbar-close-btn,
+a.phpdebugbar-open-btn,
+a.phpdebugbar-fullscreen-btn,
+a.phpdebugbar-minimize-btn,
+a.phpdebugbar-maximize-btn,
+a.phpdebugbar-tab.phpdebugbar-tab-history,
+a.phpdebugbar-tab.phpdebugbar-tab-settings {
+ width: 16px;
+ height: 22px;
+ position: relative;
+}
+
+a.phpdebugbar-close-btn:after,
+a.phpdebugbar-open-btn:after,
+a.phpdebugbar-restore-btn:after,
+a.phpdebugbar-fullscreen-btn:after,
+a.phpdebugbar-minimize-btn:after,
+a.phpdebugbar-maximize-btn:after {
+ content: " ";
+ display: block;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ background-color: var(--debugbar-icons);
+ -webkit-mask-repeat: no-repeat;
+ mask-repeat: no-repeat;
+ -webkit-mask-position: center;
+ mask-position: center;
+ -webkit-mask-size: 18px 18px;
+ mask-size: 18px 18px;
+}
+
+a.phpdebugbar-restore-btn:after {
+ -webkit-mask-size: 24px 24px;
+ mask-size: 24px 24px;
+ mask-repeat: no-repeat;
+ mask-position: center;
+ position: relative;
+}
+
+a.phpdebugbar-minimize-btn:after {
+ -webkit-mask-image: var(--debugbar-icon-chevron-down);
+ mask-image: var(--debugbar-icon-chevron-down);
+}
+
+a.phpdebugbar-maximize-btn:after {
+ -webkit-mask-image: var(--debugbar-icon-chevron-up);
+ mask-image: var(--debugbar-icon-chevron-up);
+}
+
+div.phpdebugbar[data-toolbarPosition="top"] a.phpdebugbar-minimize-btn:after {
+ -webkit-mask-image: var(--debugbar-icon-chevron-up);
+ mask-image: var(--debugbar-icon-chevron-up);
+}
+
+div.phpdebugbar[data-toolbarPosition="top"] a.phpdebugbar-maximize-btn:after {
+ -webkit-mask-image: var(--debugbar-icon-chevron-down);
+ mask-image: var(--debugbar-icon-chevron-down);
+}
+
+a.phpdebugbar-close-btn:after {
+ -webkit-mask-image: var(--debugbar-icon-x);
+ mask-image: var(--debugbar-icon-x);
+}
+
+a.phpdebugbar-fullscreen-btn:after {
+ -webkit-mask-image: var(--debugbar-icon-arrows-maximize);
+ mask-image: var(--debugbar-icon-arrows-maximize);
+}
+
+div.phpdebugbar.phpdebugbar-fullscreen a.phpdebugbar-fullscreen-btn:after {
+ -webkit-mask-image: var(--debugbar-icon-arrows-minimize);
+ mask-image: var(--debugbar-icon-arrows-minimize);
+}
+
+a.phpdebugbar-open-btn:after {
+ -webkit-mask-image: var(--debugbar-icon-folder-open);
+ mask-image: var(--debugbar-icon-folder-open);
+}
+
+.phpdebugbar-indicator {
+ position: relative;
+ cursor: pointer;
+}
+ .phpdebugbar-indicator span.phpdebugbar-text {
+ margin-left: 5px;
+ }
+ .phpdebugbar-indicator span.phpdebugbar-tooltip {
+ display: none;
+ position: absolute;
+ bottom: 38px;
+ background: var(--debugbar-header);
+ border: 1px solid var(--debugbar-header-border);
+ color: var(--debugbar-header-text);
+ font-size: 11px;
+ padding: 2px 6px;
+ z-index: 100000001;
+ text-align: center;
+ white-space: nowrap;
+ right: 0;
+ line-height: 1.5;
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+ }
+ .phpdebugbar-indicator:hover span.phpdebugbar-tooltip:not(.phpdebugbar-disabled) {
+ display: block;
+ }
+ .phpdebugbar-indicator span.phpdebugbar-tooltip dl {
+ display: grid;
+ grid-gap: 4px 10px;
+ grid-template-columns: max-content;
+ }
+ .phpdebugbar-indicator span.phpdebugbar-tooltip dl dt {
+ font-weight: bold;
+ text-align: left;
+ }
+ .phpdebugbar-indicator span.phpdebugbar-tooltip dl dd {
+ margin: 0;
+ grid-column-start: 2;
+ text-align: left;
+ }
+
+.phpdebugbar .phpdebugbar-datasets-switcher {
+ float: right;
+}
+
+.phpdebugbar .phpdebugbar-datasets-switcher select {
+ max-width: 200px;
+ height: 22px;
+ padding: 4px 0;
+ border: none;
+}
+
+.phpdebugbar button,
+.phpdebugbar-openhandler button {
+ color: var(--debugbar-header-text);
+ background-color: var(--debugbar-header);
+ border: 1px solid var(--debugbar-header-border);
+ border-radius: 0.25rem;
+ margin: 0 5px;
+ padding: 0 12px;
+ height: 20px;
+ line-height: normal;
+ cursor: pointer;
+}
+
+/* -------------------------------------- */
+
+div.phpdebugbar-body {
+ border-top: 1px solid var(--debugbar-header-border);
+ position: relative;
+ height: 300px;
+}
+
+/* -------------------------------------- */
+
+div.phpdebugbar-panel {
+ height: 100%;
+ overflow: auto;
+ width: 100%;
+}
+div.phpdebugbar-panel.phpdebugbar-active {
+ display: block;
+}
+
+/* -------------------------------------- */
+
+div.phpdebugbar-mini-design a.phpdebugbar-tab {
+ position: relative;
+ border-right: 1px solid var(--debugbar-header-border);
+}
+ div.phpdebugbar-mini-design a.phpdebugbar-tab span.phpdebugbar-text {
+ display: none;
+ }
+ div.phpdebugbar-mini-design a.phpdebugbar-tab:hover span.phpdebugbar-text {
+ display: block;
+ position: absolute;
+ top: -30px;
+ background: var(--debugbar-background);
+ opacity: 1;
+ border: 1px solid var(--debugbar-header-border);
+ color: var(--debugbar-header-text);
+ font-size: 11px;
+ padding: 2px 6px;
+ z-index: 100000001;
+ text-align: center;
+ right: 0;
+ line-height: 1.5;
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+ }
+ div.phpdebugbar-mini-design a.phpdebugbar-tab i {
+ display:inline-block;
+ }
+
+/* -------------------------------------- */
+
+ a.phpdebugbar-tab.phpdebugbar-tab-history {
+ width: auto;
+ min-width: 22px;
+ }
+ a.phpdebugbar-tab.phpdebugbar-tab-history,
+ a.phpdebugbar-tab.phpdebugbar-tab-settings {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ a.phpdebugbar-tab.phpdebugbar-tab-history .phpdebugbar-text,
+ a.phpdebugbar-tab.phpdebugbar-tab-settings .phpdebugbar-text {
+ display: none;
+ white-space: nowrap;
+ }
+ a.phpdebugbar-tab.phpdebugbar-tab-history i,
+ a.phpdebugbar-tab.phpdebugbar-tab-settings i{
+ display:inline-block;
+ }
+ .phpdebugbar-widgets-dataset-history table {
+ width: 100%;
+ table-layout: fixed;
+ }
+ .phpdebugbar-widgets-dataset-history table th {
+ font-weight: bold;
+ }
+ .phpdebugbar-widgets-dataset-history table td, .phpdebugbar-widgets-dataset-history table th {
+ padding: 6px 3px;
+ border-bottom: 1px solid var(--debugbar-border);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .phpdebugbar-widgets-dataset-history table td a{
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ .phpdebugbar-widgets-dataset-history table tr.phpdebugbar-widgets-active {
+ background: var(--debugbar-active);
+ color: var(--debugbar-active-text);
+ }
+ .phpdebugbar-widgets-dataset-history span.phpdebugbar-badge {
+ margin: 0 5px 0 2px;
+ font-size: 11px;
+ line-height: 14px;
+ padding: 0 6px;
+ background: var(--debugbar-badge);
+ border-radius: 4px;
+ color: var(--debugbar-badge-text);
+ font-weight: normal;
+ text-shadow: none;
+ vertical-align: middle;
+ }
+ .phpdebugbar-widgets-dataset-history .phpdebugbar-widgets-dataset-actions {
+ text-align: center;
+ padding: 7px 0;
+ position: sticky;
+ top: 0;
+ background: var(--debugbar-background);
+ }
+ .phpdebugbar-widgets-dataset-history .phpdebugbar-widgets-dataset-actions a {
+ margin: 0 10px;
+ }
+ .phpdebugbar-widgets-dataset-history .phpdebugbar-widgets-dataset-actions input {
+ margin: 5px;
+ }
+
+
+/* -------------------------------------- */
+
+
+.phpdebugbar-settings .phpdebugbar-form-row {
+ display: block;
+ border-top: 1px solid var(--debugbar-border);
+ min-height: 17px;
+ padding: 5px 10px;
+}
+.phpdebugbar-settings .phpdebugbar-form-label {
+ width: 200px;
+ font-weight: bold;
+ display: inline-block;
+ clear: none;
+}
+.phpdebugbar-settings .phpdebugbar-form-input {
+ font-weight: bold;
+ display: inline-block;
+ clear: none;
+}
+.phpdebugbar-settings input[type="text"],
+.phpdebugbar-settings select
+{
+ margin: 0 5px;
+ min-width: 200px;
+}
+
+.phpdebugbar-settings input[type="checkbox"]
+{
+ margin: 0 5px;
+}
+
diff --git a/resources/debugbar.js b/resources/debugbar.js
new file mode 100644
index 000000000..23919ae47
--- /dev/null
+++ b/resources/debugbar.js
@@ -0,0 +1,1978 @@
+window.PhpDebugBar = window.PhpDebugBar || {};
+
+(function () {
+ const PhpDebugBar = window.PhpDebugBar;
+ PhpDebugBar.utils = PhpDebugBar.utils || {};
+
+ /**
+ * Returns the value from an object property.
+ * Using dots in the key, it is possible to retrieve nested property values.
+ *
+ * Note: This returns `defaultValue` only when the path is missing (null/undefined),
+ * not when the value is falsy (0/false/"").
+ *
+ * @param {Record} dict
+ * @param {string} key
+ * @param {any} [defaultValue]
+ * @returns {any}
+ */
+ const getDictValue = PhpDebugBar.utils.getDictValue = function (dict, key, defaultValue) {
+ if (dict === null || dict === undefined) {
+ return defaultValue;
+ }
+
+ const parts = String(key).split('.');
+ let d = dict;
+
+ for (const part of parts) {
+ if (d === null || d === undefined) {
+ return defaultValue;
+ }
+ d = d[part];
+ if (d === undefined) {
+ return defaultValue;
+ }
+ }
+
+ return d;
+ };
+
+ /**
+ * Returns a prefixed CSS class name (or selector).
+ *
+ * If `cls` contains spaces, each class is prefixed.
+ * If `cls` starts with ".", the dot is preserved (selector form).
+ *
+ * @param {string} cls
+ * @param {string} prefix
+ * @returns {string}
+ */
+ PhpDebugBar.utils.csscls = function (cls, prefix) {
+ const s = String(cls).trim();
+
+ if (s.includes(' ')) {
+ return s
+ .split(/\s+/)
+ .filter(Boolean)
+ .map(c => PhpDebugBar.utils.csscls(c, prefix))
+ .join(' ');
+ }
+
+ if (s.startsWith('.')) {
+ return `.${prefix}${s.slice(1)}`;
+ }
+
+ return prefix + s;
+ };
+
+ /**
+ * Creates a partial function of csscls where the second
+ * argument is already defined
+ *
+ * @param {string} prefix
+ * @return {Function}
+ */
+ PhpDebugBar.utils.makecsscls = function (prefix) {
+ return cls => PhpDebugBar.utils.csscls(cls, prefix);
+ };
+
+ const csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-');
+
+ PhpDebugBar.utils.sfDump = function (el) {
+ if (typeof window.Sfdump == 'function') {
+ el.querySelectorAll('pre.sf-dump[id]').forEach((pre) => {
+ window.Sfdump(pre.id, { maxDepth: 0 });
+ });
+ }
+ };
+
+ PhpDebugBar.utils.schedule = function (cb) {
+ if (window.requestIdleCallback) {
+ return window.requestIdleCallback(cb, { timeout: 1000 });
+ }
+
+ return setTimeout(cb, 0);
+ };
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Base class for all elements with a visual component
+ */
+ class Widget {
+ get tagName() {
+ return 'div';
+ }
+
+ constructor(options = {}) {
+ this._attributes = { ...this.defaults };
+ this._boundAttributes = {};
+ this.el = document.createElement(this.tagName);
+ if (this.className) {
+ this.el.classList.add(...this.className.split(' '));
+ }
+ this.initialize(options);
+ this.render();
+ }
+
+ /**
+ * Called after the constructor
+ *
+ * @param {object} options
+ */
+ initialize(options) {
+ this.set(options);
+ }
+
+ /**
+ * Called after the constructor to render the element
+ */
+ render() {}
+
+ /**
+ * Sets the value of an attribute
+ *
+ * @param {string | object} attr Attribute name or object with multiple attributes
+ * @param {*} [value] Attribute value (optional if attr is an object)
+ */
+ set(attr, value) {
+ const attrs = typeof attr === 'string' ? { [attr]: value } : attr;
+
+ const callbacks = [];
+ for (const attr in attrs) {
+ value = attrs[attr];
+ this._attributes[attr] = value;
+ if (this._boundAttributes[attr]) {
+ for (const callback of this._boundAttributes[attr]) {
+ // Make sure to run the callback only once per attribute change
+ if (!callbacks.includes(callback)) {
+ callback.call(this, value);
+ callbacks.push(callback);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Checks if an attribute exists and is not null
+ *
+ * @param {string} attr
+ * @return {boolean}
+ */
+ has(attr) {
+ return this._attributes[attr] !== undefined && this._attributes[attr] !== null;
+ }
+
+ /**
+ * Returns the value of an attribute
+ *
+ * @param {string} attr
+ * @return {*}
+ */
+ get(attr) {
+ return this._attributes[attr];
+ }
+
+ /**
+ * Registers a callback function that will be called whenever the value of the attribute changes
+ *
+ * If cb is a HTMLElement element, textContent will be used to fill the element
+ *
+ * @param {string | Array} attr
+ * @param {Function | HTMLElement} cb
+ */
+ bindAttr(attr, cb) {
+ if (Array.isArray(attr)) {
+ for (const a of attr) {
+ this.bindAttr(a, cb);
+ }
+ return;
+ }
+
+ if (!this._boundAttributes[attr]) {
+ this._boundAttributes[attr] = [];
+ }
+ if (cb instanceof HTMLElement) {
+ const el = cb;
+ cb = value => el.textContent = value || '';
+ }
+ this._boundAttributes[attr].push(cb);
+ if (this.has(attr)) {
+ cb.call(this, this._attributes[attr]);
+ }
+ }
+
+ /**
+ * Creates a subclass
+ *
+ * Code from Backbone.js
+ *
+ * @param {object} props Prototype properties
+ * @return {Function}
+ */
+ static extend(props) {
+ const Parent = this;
+ class Child extends Parent {}
+
+ // Use defineProperties to handle getters/setters properly
+ for (const key in props) {
+ const descriptor = Object.getOwnPropertyDescriptor(props, key);
+ if (descriptor) {
+ Object.defineProperty(Child.prototype, key, descriptor);
+ }
+ }
+ Object.assign(Child, Parent);
+ Child.__super__ = Parent.prototype;
+
+ return Child;
+ }
+ }
+ Widget.prototype.defaults = {};
+
+ PhpDebugBar.Widget = Widget;
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Tab
+ *
+ * A tab is composed of a tab label which is always visible and
+ * a tab panel which is visible only when the tab is active.
+ *
+ * The panel must contain a widget. A widget is an object which has
+ * an element property containing something appendable to a HTMLElement object.
+ *
+ * Options:
+ * - title
+ * - badge
+ * - widget
+ * - data: forward data to widget data
+ */
+ class Tab extends Widget {
+ get className() {
+ return csscls('panel');
+ }
+
+ render() {
+ this.active = false;
+ this.tab = document.createElement('a');
+ this.tab.classList.add(csscls('tab'));
+
+ this.icon = document.createElement('i');
+ this.tab.append(this.icon);
+ this.bindAttr('icon', function (icon) {
+ if (icon) {
+ this.icon.className = `phpdebugbar-icon phpdebugbar-icon-${icon}`;
+ } else {
+ this.icon.className = '';
+ }
+ });
+
+ const title = document.createElement('span');
+ title.classList.add(csscls('text'));
+ this.tab.append(title);
+ this.bindAttr('title', title);
+
+ this.badge = document.createElement('span');
+ this.badge.classList.add(csscls('badge'));
+ this.tab.append(this.badge);
+
+ this.bindAttr('badge', function (value) {
+ if (value !== null) {
+ this.badge.textContent = value;
+ this.badge.classList.add(csscls('visible'));
+ } else {
+ this.badge.classList.remove(csscls('visible'));
+ }
+ });
+
+ this.bindAttr('widget', function (widget) {
+ this.el.innerHTML = '';
+ this.el.append(widget.el);
+ });
+
+ this.widgetRendered = false;
+ this.bindAttr('data', function (data) {
+ if (this.has('widget')) {
+ this.tab.setAttribute('data-empty', Object.keys(data).length === 0 || data.count === 0);
+ if (!this.widgetRendered && this.active && data != null) {
+ this.renderWidgetData();
+ } else {
+ this.widgetRendered = false;
+ }
+ }
+ });
+ }
+
+ renderWidgetData() {
+ const data = this.get('data');
+ const widget = this.get('widget');
+ if (data == null || !widget) {
+ return;
+ }
+
+ widget.set('data', data);
+ PhpDebugBar.utils.schedule(() => {
+ PhpDebugBar.utils.sfDump(widget.el);
+ });
+
+ this.widgetRendered = true;
+ }
+
+ show() {
+ const activeClass = csscls('active');
+ this.tab.classList.add(activeClass);
+ this.tab.hidden = false;
+ this.el.classList.add(activeClass);
+ this.el.hidden = false;
+ this.active = true;
+
+ if (!this.widgetRendered) {
+ this.renderWidgetData();
+ }
+ }
+
+ hide() {
+ const activeClass = csscls('active');
+ this.tab.classList.remove(activeClass);
+ this.el.classList.remove(activeClass);
+ this.el.hidden = true;
+ this.active = false;
+ }
+ }
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Indicator
+ *
+ * An indicator is a text and an icon to display single value information
+ * right inside the always visible part of the debug bar
+ *
+ * Options:
+ * - icon
+ * - title
+ * - tooltip
+ * - data: alias of title
+ */
+ class Indicator extends Widget {
+ get tagName() {
+ return 'span';
+ }
+
+ get className() {
+ return csscls('indicator');
+ }
+
+ render() {
+ this.icon = document.createElement('i');
+ this.el.append(this.icon);
+ this.bindAttr('icon', function (icon) {
+ if (icon) {
+ this.icon.className = `phpdebugbar-icon phpdebugbar-icon-${icon}`;
+ } else {
+ this.icon.className = '';
+ }
+ });
+
+ this.bindAttr('link', function (link) {
+ if (link) {
+ this.el.addEventListener('click', () => {
+ this.get('debugbar').showTab(link);
+ });
+ this.el.style.cursor = 'pointer';
+ } else {
+ this.el.style.cursor = '';
+ }
+ });
+
+ const textSpan = document.createElement('span');
+ textSpan.classList.add(csscls('text'));
+ this.el.append(textSpan);
+ this.bindAttr(['title', 'data'], textSpan);
+
+ this.tooltip = document.createElement('span');
+ this.tooltip.classList.add(csscls('tooltip'), csscls('disabled'));
+ this.el.append(this.tooltip);
+ this.bindAttr('tooltip', function (tooltip) {
+ if (tooltip) {
+ if (Array.isArray(tooltip) || typeof tooltip === 'object') {
+ const dl = document.createElement('dl');
+ for (const [key, value] of Object.entries(tooltip)) {
+ const dt = document.createElement('dt');
+ dt.textContent = key;
+ dl.append(dt);
+
+ const dd = document.createElement('dd');
+ dd.textContent = value;
+ dl.append(dd);
+ }
+ this.tooltip.innerHTML = '';
+ this.tooltip.append(dl);
+ this.tooltip.classList.remove(csscls('disabled'));
+ } else {
+ this.tooltip.textContent = tooltip;
+ this.tooltip.classList.remove(csscls('disabled'));
+ }
+ } else {
+ this.tooltip.classList.add(csscls('disabled'));
+ }
+ });
+ }
+ }
+
+ /**
+ * Displays datasets in a table
+ *
+ */
+ class Settings extends Widget {
+ get tagName() {
+ return 'form';
+ }
+
+ get className() {
+ return csscls('settings');
+ }
+
+ initialize(options) {
+ this.set(options);
+
+ const debugbar = this.get('debugbar');
+ this.settings = JSON.parse(localStorage.getItem('phpdebugbar-settings')) || {};
+
+ for (const key in debugbar.options) {
+ if (key in this.settings) {
+ debugbar.options[key] = this.settings[key];
+ }
+
+ // Theme requires dark/light mode detection
+ if (key === 'theme') {
+ debugbar.setTheme(debugbar.options[key]);
+ } else {
+ debugbar.el.setAttribute(`data-${key}`, debugbar.options[key]);
+ }
+ }
+ }
+
+ clearSettings() {
+ const debugbar = this.get('debugbar');
+
+ // Remove item from storage
+ localStorage.removeItem('phpdebugbar-settings');
+ localStorage.removeItem('phpdebugbar-ajaxhandler-autoshow');
+ this.settings = {};
+
+ // Reset options
+ debugbar.options = { ...debugbar.defaultOptions };
+
+ // Reset ajax handler
+ if (debugbar.ajaxHandler) {
+ const autoshow = debugbar.ajaxHandler.defaultAutoShow;
+ debugbar.ajaxHandler.setAutoShow(autoshow);
+ this.set('autoshow', autoshow);
+ if (debugbar.controls.__datasets) {
+ debugbar.controls.__datasets.get('widget').set('autoshow', this.autoshow.checked);
+ }
+ }
+
+ this.initialize(debugbar.options);
+ }
+
+ storeSetting(key, value) {
+ this.settings[key] = value;
+
+ const debugbar = this.get('debugbar');
+ debugbar.options[key] = value;
+ if (key !== 'theme') {
+ debugbar.el.setAttribute(`data-${key}`, value);
+ }
+
+ localStorage.setItem('phpdebugbar-settings', JSON.stringify(this.settings));
+ }
+
+ render() {
+ this.el.innerHTML = '';
+
+ const debugbar = this.get('debugbar');
+ const self = this;
+
+ const fields = {};
+
+ // Set Theme
+ const themeSelect = document.createElement('select');
+ themeSelect.innerHTML = ''
+ + ''
+ + '';
+ themeSelect.value = debugbar.options.theme;
+ themeSelect.addEventListener('change', function () {
+ self.storeSetting('theme', this.value);
+ debugbar.setTheme(this.value);
+ });
+ fields.Theme = themeSelect;
+
+ // Open Button Position
+ const positionSelect = document.createElement('select');
+ positionSelect.innerHTML = ''
+ + ''
+ + ''
+ + '';
+ positionSelect.value = debugbar.options.openBtnPosition;
+ positionSelect.addEventListener('change', function () {
+ self.storeSetting('openBtnPosition', this.value);
+ if (this.value === 'topLeft' || this.value === 'topRight') {
+ self.storeSetting('toolbarPosition', 'top');
+ } else {
+ self.storeSetting('toolbarPosition', 'bottom');
+ }
+ self.get('debugbar').recomputeBottomOffset();
+ });
+ fields['Toolbar Position'] = positionSelect;
+
+ // Hide Empty Tabs
+ this.hideEmptyTabs = document.createElement('input');
+ this.hideEmptyTabs.type = 'checkbox';
+ this.hideEmptyTabs.checked = debugbar.options.hideEmptyTabs;
+ this.hideEmptyTabs.addEventListener('click', function () {
+ self.storeSetting('hideEmptyTabs', this.checked);
+ // Reset button size
+ self.get('debugbar').respCSSSize = 0;
+ self.get('debugbar').resize();
+ });
+
+ const hideEmptyTabsLabel = document.createElement('label');
+ hideEmptyTabsLabel.append(this.hideEmptyTabs, 'Hide empty tabs until they have data');
+ fields['Hide Empty Tabs'] = hideEmptyTabsLabel;
+
+ // Fullscreen button
+ const fullscreenCheck = document.createElement('input');
+ fullscreenCheck.type = 'checkbox';
+ fullscreenCheck.checked = debugbar.options.showFullscreenBtn;
+ fullscreenCheck.addEventListener('click', function () {
+ self.storeSetting('showFullscreenBtn', this.checked);
+ debugbar.toggleFullscreenBtn(this.checked);
+ });
+ const fullscreenLabel = document.createElement('label');
+ fullscreenLabel.append(fullscreenCheck, 'Show fullscreen button in toolbar');
+ fields.Fullscreen = fullscreenLabel;
+
+ // Autoshow
+ this.autoshow = document.createElement('input');
+ this.autoshow.type = 'checkbox';
+ this.autoshow.checked = debugbar.ajaxHandler && debugbar.ajaxHandler.autoShow;
+ this.autoshow.addEventListener('click', function () {
+ if (debugbar.ajaxHandler) {
+ debugbar.ajaxHandler.setAutoShow(this.checked);
+ }
+ if (debugbar.controls.__datasets) {
+ debugbar.controls.__datasets.get('widget').set('autoshow', this.checked);
+ }
+ // Update dataset switcher widget
+ if (debugbar.datasetSwitcherWidget) {
+ debugbar.datasetSwitcherWidget.set('autoshow', this.checked);
+ }
+ });
+
+ this.bindAttr('autoshow', function () {
+ this.autoshow.checked = this.get('autoshow');
+ const row = this.autoshow.closest(`.${csscls('form-row')}`);
+ if (row) {
+ row.style.display = '';
+ }
+ });
+
+ const autoshowLabel = document.createElement('label');
+ autoshowLabel.append(this.autoshow, 'Automatically show new incoming Ajax requests');
+ fields.Autoshow = autoshowLabel;
+
+ // Reset button
+ const resetButton = document.createElement('button');
+ resetButton.textContent = 'Reset settings';
+ resetButton.addEventListener('click', (e) => {
+ e.preventDefault();
+ self.clearSettings();
+ self.render();
+ });
+ fields['Reset to defaults'] = resetButton;
+
+ for (const [key, value] of Object.entries(fields)) {
+ const formRow = document.createElement('div');
+ formRow.classList.add(csscls('form-row'));
+
+ const formLabel = document.createElement('div');
+ formLabel.classList.add(csscls('form-label'));
+ formLabel.textContent = key;
+ formRow.append(formLabel);
+
+ const formInput = document.createElement('div');
+ formInput.classList.add(csscls('form-input'));
+ if (value instanceof HTMLElement) {
+ formInput.append(value);
+ } else {
+ formInput.innerHTML = value;
+ }
+ formRow.append(formInput);
+
+ self.el.append(formRow);
+ }
+
+ if (!debugbar.ajaxHandler) {
+ this.autoshow.closest(`.${csscls('form-row')}`).style.display = 'none';
+ }
+ }
+ }
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Dataset title formater
+ *
+ * Formats the title of a dataset for the select box
+ */
+ class DatasetTitleFormater {
+ constructor(debugbar) {
+ this.debugbar = debugbar;
+ }
+
+ /**
+ * Formats the title of a dataset
+ *
+ * @param {string} id
+ * @param {object} data
+ * @param {string} suffix
+ * @param {number} nb
+ * @return {string}
+ */
+ format(id, data, suffix, nb) {
+ suffix = suffix ? ` ${suffix}` : '';
+ nb = nb || Object.keys(this.debugbar.datasets).length;
+
+ if (data.__meta === undefined) {
+ return `#${nb}${suffix}`;
+ }
+
+ const uri = data.__meta.uri.split('/');
+ let filename = uri.pop();
+
+ // URI ends in a trailing /, avoid returning an empty string
+ if (!filename) {
+ filename = `${uri.pop() || ''}/`; // add the trailing '/' back
+ }
+
+ // filename is a number, path could be like /action/{id}
+ if (uri.length && !Number.isNaN(filename)) {
+ filename = `${uri.pop()}/${filename}`;
+ }
+
+ // truncate the filename in the label, if it's too long
+ const maxLength = 150;
+ if (filename.length > maxLength) {
+ filename = `${filename.substr(0, maxLength)}...`;
+ }
+
+ const label = `#${nb} ${filename}${suffix} (${data.__meta.datetime.split(' ')[1]})`;
+ return label;
+ }
+ }
+
+ PhpDebugBar.DatasetTitleFormater = DatasetTitleFormater;
+
+ // ------------------------------------------------------------------
+
+ /**
+ * DebugBar
+ *
+ * Creates a bar that appends itself to the body of your page
+ * and sticks to the bottom.
+ *
+ * The bar can be customized by adding tabs and indicators.
+ * A data map is used to fill those controls with data provided
+ * from datasets.
+ */
+ class DebugBar extends Widget {
+ get className() {
+ return `phpdebugbar`;
+ }
+
+ initialize(options = {}) {
+ this.options = Object.assign({
+ bodyBottomInset: true,
+ theme: 'auto',
+ toolbarPosition: 'bottom',
+ openBtnPosition: 'bottomLeft',
+ hideEmptyTabs: false,
+ showFullscreenBtn: false,
+ spaNavigationEvents: []
+ }, options);
+ this.defaultOptions = { ...this.options };
+ this.controls = {};
+ this.dataMap = {};
+ this.datasets = {};
+ this.firstTabName = null;
+ this.activePanelName = null;
+ this.activeDatasetId = null;
+ this.pendingDataSetId = null;
+ this.datesetTitleFormater = new DatasetTitleFormater(this);
+ const bodyStyles = window.getComputedStyle(document.body);
+ this.bodyPaddingBottomHeight = Number.parseInt(bodyStyles.paddingBottom);
+ this.bodyPaddingTopHeight = Number.parseInt(bodyStyles.paddingTop);
+
+ try {
+ this.isIframe = window.self !== window.top && window.top.PhpDebugBar && window.top.PhpDebugBar;
+ } catch (_error) {
+ this.isIframe = false;
+ }
+ this.registerResizeHandler();
+ this.registerMediaListener();
+ this.registerNavigationListener();
+
+ // Attach settings
+ this.settingsControl = new PhpDebugBar.DebugBar.Tab({ icon: 'adjustments-horizontal', title: 'Settings', widget: new Settings({
+ debugbar: this
+ }) });
+ }
+
+ /**
+ * Register resize event, for resize debugbar with reponsive css.
+ *
+ * @this {DebugBar}
+ */
+ registerResizeHandler() {
+ if (this.resize.bind === undefined || this.isIframe) {
+ return;
+ }
+
+ const f = this.resize.bind(this);
+ this.respCSSSize = 0;
+ window.addEventListener('resize', f);
+ setTimeout(f, 20);
+ }
+
+ registerMediaListener() {
+ const mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
+ mediaQueryList.addEventListener('change', (event) => {
+ if (this.options.theme === 'auto') {
+ this.setTheme('auto');
+ }
+ });
+ }
+
+ /**
+ * Register navigation event listeners for SPA frameworks.
+ *
+ * Listens for events configured via the `spaNavigationEvents` option
+ * and recalculates body padding after navigation completes.
+ */
+ registerNavigationListener() {
+ const events = this.options.spaNavigationEvents;
+ if (!events || !events.length) {
+ return;
+ }
+
+ for (const eventName of events) {
+ document.addEventListener(eventName, () => {
+ this.recalculateBodyPadding();
+ });
+ }
+ }
+
+ /**
+ * Recalculates and caches the body's original padding values.
+ */
+ recalculateBodyPadding() {
+ if (!this.options.bodyBottomInset) {
+ return;
+ }
+
+ // Clear inline styles to read the page's actual CSS values
+ document.body.style.paddingTop = '';
+ document.body.style.paddingBottom = '';
+
+ // Read the new page's padding values
+ const bodyStyles = window.getComputedStyle(document.body);
+ this.bodyPaddingTopHeight = Number.parseFloat(bodyStyles.paddingTop);
+ this.bodyPaddingBottomHeight = Number.parseFloat(bodyStyles.paddingBottom);
+
+ // Reapply the debugbar offset with the new values
+ this.recomputeBottomOffset();
+ }
+
+ setTheme(theme) {
+ this.options.theme = theme;
+
+ if (theme === 'auto') {
+ const mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
+ theme = mediaQueryList.matches ? 'dark' : 'light';
+ }
+
+ this.el.setAttribute('data-theme', theme);
+ if (this.openHandler) {
+ this.openHandler.el.setAttribute('data-theme', theme);
+ }
+ if (this.datasetSwitcherWidget && this.datasetSwitcherWidget.panel) {
+ this.datasetSwitcherWidget.panel.setAttribute('data-theme', theme);
+ }
+ }
+
+ /**
+ * Resizes the debugbar to fit the current browser window
+ */
+ resize() {
+ if (this.isIframe) {
+ return;
+ }
+
+ let contentSize = this.respCSSSize;
+ if (this.respCSSSize === 0) {
+ const visibleChildren = Array.from(this.header.children).filter((el) => {
+ return el.offsetParent !== null;
+ });
+ for (const child of visibleChildren) {
+ const styles = window.getComputedStyle(child);
+ contentSize += child.offsetWidth
+ + Number.parseFloat(styles.marginLeft)
+ + Number.parseFloat(styles.marginRight);
+ }
+ }
+
+ const currentSize = this.header.offsetWidth;
+ const cssClass = csscls('mini-design');
+ const bool = this.header.classList.contains(cssClass);
+
+ if (currentSize <= contentSize && !bool) {
+ this.respCSSSize = contentSize;
+ this.header.classList.add(cssClass);
+ } else if (contentSize < currentSize && bool) {
+ this.respCSSSize = 0;
+ this.header.classList.remove(cssClass);
+ }
+
+ // Reset height to ensure bar is still visible
+ const currentHeight = this.body.clientHeight || Number.parseInt(localStorage.getItem('phpdebugbar-height'), 10) || 300;
+ this.setHeight(currentHeight);
+ }
+
+ /**
+ * Initialiazes the UI
+ *
+ * @this {DebugBar}
+ */
+ render() {
+ if (this.isIframe) {
+ this.el.hidden = true;
+ }
+
+ const self = this;
+ document.body.append(this.el);
+
+ this.dragCapture = document.createElement('div');
+ this.dragCapture.classList.add(csscls('drag-capture'));
+ this.el.append(this.dragCapture);
+
+ this.resizeHandle = document.createElement('div');
+ this.resizeHandle.classList.add(csscls('resize-handle'));
+ this.resizeHandle.classList.add(csscls('resize-handle-top'));
+ this.el.append(this.resizeHandle);
+
+ this.header = document.createElement('div');
+ this.header.classList.add(csscls('header'));
+ this.el.append(this.header);
+
+ this.headerBtn = document.createElement('a');
+ this.headerBtn.classList.add(csscls('restore-btn'));
+ this.header.append(this.headerBtn);
+ this.headerBtn.addEventListener('click', () => {
+ self.close();
+ });
+
+ this.headerLeft = document.createElement('div');
+ this.headerLeft.classList.add(csscls('header-left'));
+ this.header.append(this.headerLeft);
+
+ this.headerRight = document.createElement('div');
+ this.headerRight.classList.add(csscls('header-right'));
+ this.header.append(this.headerRight);
+
+ this.body = document.createElement('div');
+ this.body.classList.add(csscls('body'));
+ this.el.append(this.body);
+ this.recomputeBottomOffset();
+
+ this.resizeHandleBottom = document.createElement('div');
+ this.resizeHandleBottom.classList.add(csscls('resize-handle'));
+ this.resizeHandleBottom.classList.add(csscls('resize-handle-bottom'));
+ this.el.append(this.resizeHandleBottom);
+
+ // dragging of resize handle
+ let pos_y, orig_h;
+ const mousemove = (e) => {
+ const h = orig_h + (pos_y - e.pageY);
+ self.setHeight(h);
+ };
+ const mousemoveBottom = (e) => {
+ const h = orig_h - (pos_y - e.pageY);
+ self.setHeight(h);
+ };
+ const mouseup = () => {
+ document.removeEventListener('mousemove', mousemove);
+ document.removeEventListener('mousemove', mousemoveBottom);
+ document.removeEventListener('mouseup', mouseup);
+ self.dragCapture.style.display = 'none';
+ };
+ this.resizeHandle.addEventListener('mousedown', (e) => {
+ orig_h = self.body.offsetHeight;
+ pos_y = e.pageY;
+ document.addEventListener('mousemove', mousemove);
+ document.addEventListener('mouseup', mouseup);
+ self.dragCapture.style.display = '';
+ e.preventDefault();
+ });
+ this.resizeHandleBottom.addEventListener('mousedown', (e) => {
+ orig_h = self.body.offsetHeight;
+ pos_y = e.pageY;
+ document.addEventListener('mousemove', mousemoveBottom);
+ document.addEventListener('mouseup', mouseup);
+ self.dragCapture.style.display = '';
+ e.preventDefault();
+ });
+
+ // close button
+ this.closebtn = document.createElement('a');
+ this.closebtn.classList.add(csscls('close-btn'));
+ this.headerRight.append(this.closebtn);
+ this.closebtn.addEventListener('click', () => {
+ self.close();
+ });
+
+ // fullscreen button (visually left of close)
+ this.fullscreenbtn = document.createElement('a');
+ this.fullscreenbtn.classList.add(csscls('fullscreen-btn'));
+ this.fullscreenbtn.hidden = !this.options.showFullscreenBtn;
+ this.headerRight.append(this.fullscreenbtn);
+ this.fullscreenbtn.addEventListener('click', () => {
+ self.toggleFullscreen();
+ });
+
+ // minimize button
+ this.minimizebtn = document.createElement('a');
+ this.minimizebtn.classList.add(csscls('minimize-btn'));
+ this.minimizebtn.hidden = !this.isMinimized();
+ this.headerRight.append(this.minimizebtn);
+ this.minimizebtn.addEventListener('click', () => {
+ self.minimize();
+ });
+
+ // maximize button
+ this.maximizebtn = document.createElement('a');
+ this.maximizebtn.classList.add(csscls('maximize-btn'));
+ this.maximizebtn.hidden = this.isMinimized();
+ this.headerRight.append(this.maximizebtn);
+ this.maximizebtn.addEventListener('click', () => {
+ self.restore();
+ });
+
+ // restore button
+ this.restorebtn = document.createElement('a');
+ this.restorebtn.classList.add(csscls('restore-btn'));
+ this.restorebtn.hidden = true;
+ this.el.append(this.restorebtn);
+ this.restorebtn.addEventListener('click', () => {
+ self.restore();
+ });
+
+ // open button
+ this.openbtn = document.createElement('a');
+ this.openbtn.classList.add(csscls('open-btn'));
+ this.openbtn.hidden = true;
+ this.headerRight.append(this.openbtn);
+ this.openbtn.addEventListener('click', () => {
+ self.openHandler.show((id, dataset) => {
+ self.addDataSet(dataset, id, '(opened)');
+ });
+ });
+
+ // select box for data sets (only if AJAX handler is not used)
+ this.datasetsSelectSpan = document.createElement('span');
+ this.datasetsSelectSpan.classList.add(csscls('datasets-switcher'));
+ this.datasetsSelectSpan.setAttribute('name', 'datasets-switcher');
+ this.datasetsSelect = document.createElement('select');
+ this.datasetsSelect.hidden = true;
+
+ this.datasetsSelectSpan.append(this.datasetsSelect);
+
+ this.headerRight.append(this.datasetsSelectSpan);
+ this.datasetsSelect.addEventListener('change', function () {
+ self.showDataSet(this.value);
+ });
+
+ this.controls.__settings = this.settingsControl;
+ this.settingsControl.tab.classList.add(csscls('tab-settings'));
+ this.settingsControl.tab.setAttribute('data-collector', '__settings');
+ this.settingsControl.el.setAttribute('data-collector', '__settings');
+ this.settingsControl.el.hidden = true;
+
+ this.maximizebtn.after(this.settingsControl.tab);
+ this.settingsControl.tab.hidden = false;
+ this.settingsControl.tab.addEventListener('click', () => {
+ if (!this.isMinimized() && this.activePanelName === '__settings' && !this.isFullscreen()) {
+ this.minimize();
+ } else {
+ this.showTab('__settings');
+ this.settingsControl.get('widget').render();
+ }
+ });
+ this.body.append(this.settingsControl.el);
+ }
+
+ /**
+ * Sets the height of the debugbar body section
+ * Forces the height to lie within a reasonable range
+ * Stores the height in local storage so it can be restored
+ * Resets the document body bottom offset
+ *
+ * @this {DebugBar}
+ */
+ setHeight(height) {
+ if (this.isFullscreen()) return;
+ const min_h = 40;
+ const max_h = window.innerHeight - this.header.offsetHeight - 10;
+ height = Math.min(height, max_h);
+ height = Math.max(height, min_h);
+ this.body.style.height = `${height}px`;
+ localStorage.setItem('phpdebugbar-height', height);
+ this.recomputeBottomOffset();
+ }
+
+ /**
+ * Restores the state of the DebugBar using localStorage
+ * This is not called by default in the constructor and
+ * needs to be called by subclasses in their init() method
+ *
+ * @this {DebugBar}
+ */
+ restoreState() {
+ if (this.isIframe) {
+ return;
+ }
+ // bar height
+ const height = localStorage.getItem('phpdebugbar-height');
+ this.setHeight(Number.parseInt(height) || this.body.offsetHeight);
+
+ // bar visibility
+ const open = localStorage.getItem('phpdebugbar-open');
+ if (open && open === '0') {
+ this.close();
+ } else {
+ const visible = localStorage.getItem('phpdebugbar-visible');
+ if (visible && visible === '1') {
+ const tab = localStorage.getItem('phpdebugbar-tab');
+ if (this.isTab(tab)) {
+ this.showTab(tab);
+ } else {
+ this.showTab();
+ }
+ } else {
+ this.minimize();
+ }
+ }
+
+ // Restore fullscreen if it was active this session
+ if (this.options.showFullscreenBtn && sessionStorage.getItem('phpdebugbar-fullscreen') === '1') {
+ this.toggleFullscreen();
+ }
+ }
+
+ /**
+ * Creates and adds a new tab
+ *
+ * @this {DebugBar}
+ * @param {string} name Internal name
+ * @param {object} widget A widget object with an element property
+ * @param {string} title The text in the tab, if not specified, name will be used
+ * @return {Tab}
+ */
+ createTab(name, widget, title) {
+ const tab = new Tab({
+ title: title || (name.replace(/[_-]/g, ' ').charAt(0).toUpperCase() + name.slice(1)),
+ widget
+ });
+ return this.addTab(name, tab);
+ }
+
+ /**
+ * Adds a new tab
+ *
+ * @this {DebugBar}
+ * @param {string} name Internal name
+ * @param {Tab} tab Tab object
+ * @return {Tab}
+ */
+ addTab(name, tab) {
+ if (this.isControl(name)) {
+ throw new Error(`${name} already exists`);
+ }
+
+ const self = this;
+ this.headerLeft.append(tab.tab);
+ tab.tab.addEventListener('click', () => {
+ if (!self.isMinimized() && self.activePanelName === name && !self.isFullscreen()) {
+ self.minimize();
+ } else {
+ self.restore();
+ self.showTab(name);
+ }
+ });
+ tab.tab.setAttribute('data-empty', true);
+ tab.tab.setAttribute('data-collector', name);
+ tab.el.setAttribute('data-collector', name);
+ this.body.append(tab.el);
+
+ this.controls[name] = tab;
+ if (this.firstTabName === null) {
+ this.firstTabName = name;
+ }
+ return tab;
+ }
+
+ /**
+ * Creates and adds an indicator
+ *
+ * @this {DebugBar}
+ * @param {string} name Internal name
+ * @param {string} icon
+ * @param {string | object} tooltip
+ * @param {string} position "right" or "left", default is "right"
+ * @return {Indicator}
+ */
+ createIndicator(name, icon, tooltip, position) {
+ const indicator = new Indicator({
+ icon,
+ tooltip
+ });
+ return this.addIndicator(name, indicator, position);
+ }
+
+ /**
+ * Adds an indicator
+ *
+ * @this {DebugBar}
+ * @param {string} name Internal name
+ * @param {Indicator} indicator Indicator object
+ * @return {Indicator}
+ */
+ addIndicator(name, indicator, position) {
+ if (this.isControl(name)) {
+ throw new Error(`${name} already exists`);
+ }
+
+ indicator.set('debugbar', this);
+
+ if (position === 'left') {
+ this.headerLeft.prepend(indicator.el);
+ } else {
+ this.headerRight.append(indicator.el);
+ }
+
+ this.controls[name] = indicator;
+ return indicator;
+ }
+
+ /**
+ * Returns a control
+ *
+ * @param {string} name
+ * @return {object}
+ */
+ getControl(name) {
+ if (this.isControl(name)) {
+ return this.controls[name];
+ }
+ }
+
+ /**
+ * Checks if there's a control under the specified name
+ *
+ * @this {DebugBar}
+ * @param {string} name
+ * @return {boolean}
+ */
+ isControl(name) {
+ return this.controls[name] !== undefined;
+ }
+
+ /**
+ * Checks if a tab with the specified name exists
+ *
+ * @this {DebugBar}
+ * @param {string} name
+ * @return {boolean}
+ */
+ isTab(name) {
+ return this.isControl(name) && this.controls[name] instanceof Tab;
+ }
+
+ /**
+ * Checks if an indicator with the specified name exists
+ *
+ * @this {DebugBar}
+ * @param {string} name
+ * @return {boolean}
+ */
+ isIndicator(name) {
+ return this.isControl(name) && this.controls[name] instanceof Indicator;
+ }
+
+ /**
+ * Removes all tabs and indicators from the debug bar and hides it
+ *
+ * @this {DebugBar}
+ */
+ reset() {
+ this.minimize();
+ for (const [name, control] of Object.entries(this.controls)) {
+ if (this.isTab(name)) {
+ control.tab.remove();
+ }
+ control.el.remove();
+ }
+ this.controls = {};
+ }
+
+ /**
+ * Open the debug bar and display the specified tab
+ *
+ * @this {DebugBar}
+ * @param {string} name If not specified, display the first tab
+ */
+ showTab(name) {
+ if (!name) {
+ if (this.activePanelName) {
+ name = this.activePanelName;
+ } else {
+ name = this.firstTabName;
+ }
+ }
+
+ if (!this.isTab(name)) {
+ throw new Error(`Unknown tab '${name}'`);
+ }
+
+ this.body.hidden = false;
+
+ this.recomputeBottomOffset();
+
+ for (const [controleName, control] of Object.entries(this.controls)) {
+ if (control instanceof Tab) {
+ if (controleName === name) {
+ control.show();
+ } else {
+ control.hide();
+ }
+ }
+ }
+
+ this.activePanelName = name;
+
+ this.el.classList.remove(csscls('minimized'));
+ localStorage.setItem('phpdebugbar-visible', '1');
+ localStorage.setItem('phpdebugbar-tab', name);
+
+ this.maximize();
+ }
+
+ /**
+ * Hide panels and minimize the debug bar
+ *
+ * @this {DebugBar}
+ */
+ minimize() {
+ this.exitFullscreen();
+ const activeClass = csscls('active');
+ const headerActives = this.header.querySelectorAll(`:scope > div > .${activeClass}`);
+ for (const el of headerActives) {
+ el.classList.remove(activeClass);
+ }
+ this.body.hidden = true;
+ this.minimizebtn.hidden = true;
+ this.maximizebtn.hidden = false;
+
+ this.recomputeBottomOffset();
+ localStorage.setItem('phpdebugbar-visible', '0');
+ this.el.classList.add(csscls('minimized'));
+ this.resize();
+ }
+
+ /**
+ * Show panels and maxime the debug bar
+ *
+ * @this {DebugBar}
+ */
+ maximize() {
+ this.header.hidden = false;
+ this.restorebtn.hidden = true;
+ this.body.hidden = false;
+ this.minimizebtn.hidden = false;
+ this.maximizebtn.hidden = true;
+
+ this.recomputeBottomOffset();
+ localStorage.setItem('phpdebugbar-visible', '1');
+ localStorage.setItem('phpdebugbar-open', '1');
+ this.el.classList.remove(csscls('minimized'));
+ this.el.classList.remove(csscls('closed'));
+
+ this.resize();
+ }
+
+ /**
+ * Checks if the panel is minimized
+ *
+ * @return {boolean}
+ */
+ isMinimized() {
+ return this.el.classList.contains(csscls('minimized'));
+ }
+
+ /**
+ * Toggle fullscreen mode β debugbar fills the entire browser viewport
+ */
+ toggleFullscreen() {
+ if (this.isFullscreen()) {
+ this.exitFullscreen();
+ } else {
+ this._preFullscreenHeight = this.body.offsetHeight;
+ this.el.classList.add(csscls('fullscreen'));
+ this.body.style.height = '';
+ sessionStorage.setItem('phpdebugbar-fullscreen', '1');
+ this.recomputeBottomOffset();
+ }
+ }
+
+ exitFullscreen() {
+ if (!this.isFullscreen()) return;
+ this.el.classList.remove(csscls('fullscreen'));
+ if (this._preFullscreenHeight) {
+ this.body.style.height = `${this._preFullscreenHeight}px`;
+ }
+ sessionStorage.removeItem('phpdebugbar-fullscreen');
+ this.recomputeBottomOffset();
+ }
+
+ isFullscreen() {
+ return this.el.classList.contains(csscls('fullscreen'));
+ }
+
+ toggleFullscreenBtn(show) {
+ this.fullscreenbtn.hidden = !show;
+ if (!show) this.exitFullscreen();
+ }
+
+ /**
+ * Close the debug bar
+ *
+ * @this {DebugBar}
+ */
+ close() {
+ this.exitFullscreen();
+ this.header.hidden = true;
+ this.body.hidden = true;
+ this.restorebtn.hidden = false;
+ localStorage.setItem('phpdebugbar-open', '0');
+ this.el.classList.add(csscls('closed'));
+ this.recomputeBottomOffset();
+ }
+
+ /**
+ * Checks if the panel is closed
+ *
+ * @return {boolean}
+ */
+ isClosed() {
+ return this.el.classList.contains(csscls('closed'));
+ }
+
+ /**
+ * Restore the debug bar
+ *
+ * @this {DebugBar}
+ */
+ restore() {
+ const tab = localStorage.getItem('phpdebugbar-tab');
+ if (this.pendingDataSetId) {
+ this.dataChangeHandler(this.datasets[this.pendingDataSetId]);
+ this.pendingDataSetId = null;
+ }
+ if (this.isTab(tab)) {
+ this.showTab(tab);
+ } else {
+ this.showTab();
+ }
+ }
+
+ /**
+ * Recomputes the margin-bottom css property of the body so
+ * that the debug bar never hides any content
+ */
+ recomputeBottomOffset() {
+ if (this.options.bodyBottomInset) {
+ if (this.isClosed()) {
+ document.body.style.paddingBottom = this.bodyPaddingBottomHeight ? `${this.bodyPaddingBottomHeight}px` : '';
+ document.body.style.paddingTop = this.bodyPaddingTopHeight ? `${this.bodyPaddingTopHeight}px` : '';
+ return;
+ }
+
+ if (this.options.toolbarPosition === 'top') {
+ const offset = this.el.offsetHeight + (this.bodyPaddingTopHeight || 0);
+ document.body.style.paddingTop = `${offset}px`;
+ document.body.style.paddingBottom = this.bodyPaddingBottomHeight ? `${this.bodyPaddingBottomHeight}px` : '';
+ } else {
+ const offset = this.el.offsetHeight + (this.bodyPaddingBottomHeight || 0);
+ document.body.style.paddingBottom = `${offset}px`;
+ document.body.style.paddingTop = this.bodyPaddingTopHeight ? `${this.bodyPaddingTopHeight}px` : '';
+ }
+ }
+ }
+
+ /**
+ * Sets the data map used by dataChangeHandler to populate
+ * indicators and widgets
+ *
+ * A data map is an object where properties are control names.
+ * The value of each property should be an array where the first
+ * item is the name of a property from the data object (nested properties
+ * can be specified) and the second item the default value.
+ *
+ * Example:
+ * {"memory": ["memory.peak_usage_str", "0B"]}
+ *
+ * @this {DebugBar}
+ * @param {object} map
+ */
+ setDataMap(map) {
+ this.dataMap = map;
+ }
+
+ /**
+ * Same as setDataMap() but appends to the existing map
+ * rather than replacing it
+ *
+ * @this {DebugBar}
+ * @param {object} map
+ */
+ addDataMap(map) {
+ Object.assign(this.dataMap, map);
+ }
+
+ /**
+ * Resets datasets and add one set of data
+ *
+ * For this method to be usefull, you need to specify
+ * a dataMap using setDataMap()
+ *
+ * @this {DebugBar}
+ * @param {object} data
+ * @return {string} Dataset's id
+ */
+ setData(data) {
+ this.datasets = {};
+ return this.addDataSet(data);
+ }
+
+ /**
+ * Adds a dataset
+ *
+ * If more than one dataset are added, the dataset selector
+ * will be displayed.
+ *
+ * For this method to be usefull, you need to specify
+ * a dataMap using setDataMap()
+ *
+ * @this {DebugBar}
+ * @param {object} data
+ * @param {string} id The name of this set, optional
+ * @param {string} suffix
+ * @param {Bool} show Whether to show the new dataset, optional (default: true)
+ * @return {string} Dataset's id
+ */
+ addDataSet(data, id, suffix, show) {
+ if (!data || !data.__meta) {
+ return;
+ }
+ if (this.isIframe && window.top.PhpDebugBar && window.top.PhpDebugBar.instance) {
+ window.top.PhpDebugBar.instance.addDataSet(data, id, `(iframe)${suffix || ''}`, show);
+ return;
+ }
+
+ const nb = Object.keys(this.datasets).length + 1;
+ id = id || nb;
+ data.__meta.nb = nb;
+ data.__meta.suffix = suffix;
+ this.datasets[id] = data;
+
+ const label = this.datesetTitleFormater.format(id, this.datasets[id], suffix, nb);
+
+ // Update dataset switcher widget (if AJAX handler is enabled)
+ if (this.datasetSwitcherWidget) {
+ this.datasetSwitcherWidget.set('data', this.datasets);
+ } else {
+ // Use old dropdown (if AJAX handler is not enabled)
+ const option = document.createElement('option');
+ option.value = id;
+ option.textContent = label;
+ this.datasetsSelect.append(option);
+ this.datasetsSelect.hidden = false;
+ }
+
+ if (show === undefined || show) {
+ this.showDataSet(id);
+ }
+
+ this.resize();
+
+ return id;
+ }
+
+ /**
+ * Loads a dataset using the open handler
+ *
+ * @param {string} id
+ * @param {Bool} show Whether to show the new dataset, optional (default: true)
+ */
+ loadDataSet(id, suffix, callback, show) {
+ if (!this.openHandler) {
+ throw new Error('loadDataSet() needs an open handler');
+ }
+ const self = this;
+ this.openHandler.load(id, (data) => {
+ self.addDataSet(data, id, suffix, show);
+ self.resize();
+ callback && callback(data);
+ });
+ }
+
+ /**
+ * Returns the data from a dataset
+ *
+ * @this {DebugBar}
+ * @param {string} id
+ * @return {object}
+ */
+ getDataSet(id) {
+ return this.datasets[id];
+ }
+
+ /**
+ * Switch the currently displayed dataset
+ *
+ * @this {DebugBar}
+ * @param {string} id
+ */
+ showDataSet(id) {
+ this.activeDatasetId = id;
+ if (this.isClosed()) {
+ this.pendingDataSetId = id;
+ } else {
+ this.dataChangeHandler(this.datasets[id]);
+ this.pendingDataSetId = null;
+ }
+
+ // Update dataset switcher widget to reflect current dataset
+ if (this.datasetSwitcherWidget) {
+ this.datasetSwitcherWidget.set('activeId', id);
+ } else {
+ // Update old dropdown
+ this.datasetsSelect.value = id;
+ }
+ }
+
+ /**
+ * Called when the current dataset is modified.
+ *
+ * @this {DebugBar}
+ * @param {object} data
+ */
+ dataChangeHandler(data) {
+ for (const [key, def] of Object.entries(this.dataMap)) {
+ const d = getDictValue(data, def[0], def[1]);
+ if (key.includes(':')) {
+ const parts = key.split(':');
+ this.getControl(parts[0]).set(parts[1], d);
+ } else {
+ this.getControl(key).set('data', d);
+ }
+ }
+
+ if (!this.isMinimized()) {
+ this.showTab();
+ }
+
+ this.resize();
+ }
+
+ /**
+ * Sets the handler to open past dataset
+ *
+ * @this {DebugBar}
+ * @param {object} handler
+ */
+ setOpenHandler(handler) {
+ this.openHandler = handler;
+ this.openHandler.el.setAttribute('data-theme', this.el.getAttribute('data-theme'));
+ this.openbtn.hidden = handler == null;
+ }
+
+ /**
+ * Returns the handler to open past dataset
+ *
+ * @this {DebugBar}
+ * @return {object}
+ */
+ getOpenHandler() {
+ return this.openHandler;
+ }
+
+ enableAjaxHandlerTab() {
+ // Hide the old dropdown
+ if (this.datasetsSelectSpan) {
+ this.datasetsSelectSpan.hidden = true;
+ }
+
+ // Create dataset switcher widget in header (after open button)
+ this.datasetSwitcherWidget = new PhpDebugBar.Widgets.DatasetWidget({
+ debugbar: this
+ });
+ this.openbtn.after(this.datasetSwitcherWidget.el);
+ }
+ }
+
+ PhpDebugBar.DebugBar = DebugBar;
+ DebugBar.Tab = Tab;
+ DebugBar.Indicator = Indicator;
+
+ // ------------------------------------------------------------------
+
+ /**
+ * AjaxHandler
+ *
+ * Extract data from headers of an XMLHttpRequest and adds a new dataset
+ *
+ * @param {Bool} autoShow Whether to immediately show new datasets, optional (default: true)
+ */
+ class AjaxHandler {
+ constructor(debugbar, headerName, autoShow) {
+ this.debugbar = debugbar;
+ this.headerName = headerName || 'phpdebugbar';
+ this.captureStreamed = false;
+ // Response Content-Types treated as streamed for the rid fallback.
+ // Set to null/[] to fall back on any response missing the id header.
+ this.streamedContentTypes = ['text/event-stream'];
+ this.autoShow = autoShow === undefined ? true : autoShow;
+ this.defaultAutoShow = this.autoShow;
+ if (localStorage.getItem('phpdebugbar-ajaxhandler-autoshow') !== null) {
+ this.autoShow = localStorage.getItem('phpdebugbar-ajaxhandler-autoshow') === '1';
+ }
+ if (debugbar.controls.__settings) {
+ debugbar.controls.__settings.get('widget').set('autoshow', this.autoShow);
+ }
+ }
+
+ /**
+ * Handles a Fetch API Response or an XMLHttpRequest
+ *
+ * @param {Response|XMLHttpRequest} response
+ * @param {string} [rid] Correlation id used as a fallback lookup when no response header is present
+ * @return {boolean}
+ */
+ handle(response, rid) {
+ const stack = this.getHeader(response, `${this.headerName}-stack`);
+ if (stack) {
+ const stackIds = JSON.parse(stack);
+ stackIds.forEach((id) => {
+ this.debugbar.loadDataSet(id, ' (stacked)', null, false);
+ });
+ }
+
+ if (this.loadFromId(response)) {
+ return true;
+ }
+
+ if (this.loadFromData(response)) {
+ return true;
+ }
+
+ if (rid && this.debugbar.openHandler && this.isStreamedResponse(response)) {
+ this.loadFromRequestId(rid);
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Whether a response should use the rid fallback lookup.
+ *
+ * Gated on the response Content-Type so we only query the open handler
+ * for responses that actually look streamed (by default SSE). Override
+ * `streamedContentTypes` to broaden this; set it to null/[] to fall back
+ * on any response missing the id header.
+ *
+ * @param {Response|XMLHttpRequest} response
+ * @return {boolean}
+ */
+ isStreamedResponse(response) {
+ const types = this.streamedContentTypes;
+ if (!types || !types.length) {
+ return true;
+ }
+ // Compare the base media type, ignoring any parameters such as
+ // "; charset=utf-8" (e.g. "text/event-stream; charset=utf-8").
+ const contentType = (this.getHeader(response, 'content-type') || '').split(';')[0].trim().toLowerCase();
+ return types.some(type => type.trim().toLowerCase() === contentType);
+ }
+
+ /**
+ * Checks whether a url is same-origin as the current page.
+ *
+ * @param {string} url
+ * @return {boolean}
+ */
+ sameOrigin(url) {
+ try {
+ return new URL(url, location.href).origin === location.origin;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ /**
+ * Whether a request may receive a correlation id.
+ *
+ * Excludes the open handler's own requests: injecting a rid there would
+ * make handle() fall back to loadFromRequestId() and re-query the open
+ * handler on every lookup, recursing indefinitely.
+ *
+ * @param {string} url
+ * @return {boolean}
+ */
+ canInjectRequestId(url) {
+ const oh = this.debugbar.openHandler;
+ if (oh && typeof oh.get === 'function') {
+ try {
+ const ohUrl = oh.get('url');
+ if (ohUrl && new URL(url, location.href).pathname === new URL(ohUrl, location.href).pathname) {
+ return false;
+ }
+ } catch (e) {}
+ }
+ return true;
+ }
+
+ /**
+ * Generates a new correlation id for a request.
+ *
+ * @return {string}
+ */
+ newRequestId() {
+ return (globalThis.crypto && typeof globalThis.crypto.randomUUID === 'function' && globalThis.crypto.randomUUID()) || (String(Date.now()) + Math.random().toString(16).slice(2));
+ }
+
+ /**
+ * Looks up a stored dataset by its correlation id via the open handler.
+ *
+ * Used as a fallback for streamed responses where the phpdebugbar-id
+ * response header is lost. Retries because the dataset may be persisted
+ * after the response is flushed (e.g. fastcgi_finish_request).
+ *
+ * @param {string} rid
+ * @param {number} [tries]
+ */
+ loadFromRequestId(rid, tries = 5) {
+ this.debugbar.openHandler.find({ rid }, 0, (data) => {
+ const match = Array.isArray(data) ? data.find(m => m && m.rid === rid && m.id) : null;
+ if (match) {
+ this.debugbar.loadDataSet(match.id, '(ajax)', undefined, this.autoShow);
+ } else if (tries > 0) {
+ setTimeout(() => this.loadFromRequestId(rid, tries - 1), 150);
+ }
+ });
+ }
+
+ /**
+ * Retrieves a response header from either a Fetch Response or XMLHttpRequest
+ *
+ * @param {Response|XMLHttpRequest} response - The response object from either fetch() or XHR
+ * @param {string} header - The name of the header to retrieve
+ * @returns {string|null} The header value, or null if not found
+ */
+ getHeader(response, header) {
+ if (response instanceof Response) {
+ return response.headers.get(header);
+ } else if (response instanceof XMLHttpRequest) {
+ return response.getResponseHeader(header);
+ }
+ return null;
+ }
+
+ setAutoShow(autoshow) {
+ this.autoShow = autoshow;
+ localStorage.setItem('phpdebugbar-ajaxhandler-autoshow', autoshow ? '1' : '0');
+ }
+
+ /**
+ * Checks if the HEADER-id exists and loads the dataset using the open handler
+ *
+ * @param {Response|XMLHttpRequest} response
+ * @return {boolean}
+ */
+ loadFromId(response) {
+ const id = this.extractIdFromHeaders(response);
+ if (id && this.debugbar.openHandler) {
+ this.debugbar.loadDataSet(id, '(ajax)', undefined, this.autoShow);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Extracts the id from the HEADER-id
+ *
+ * @param {Response|XMLHttpRequest} response
+ * @return {string}
+ */
+ extractIdFromHeaders(response) {
+ return this.getHeader(response, `${this.headerName}-id`);
+ }
+
+ /**
+ * Checks if the HEADER exists and loads the dataset
+ *
+ * @param {Response|XMLHttpRequest} response
+ * @return {boolean}
+ */
+ loadFromData(response) {
+ const raw = this.extractDataFromHeaders(response);
+ if (!raw) {
+ return false;
+ }
+
+ const data = this.parseHeaders(raw);
+ if (data.error) {
+ throw new Error(`Error loading debugbar data: ${data.error}`);
+ } else if (data.data) {
+ this.debugbar.addDataSet(data.data, data.id, '(ajax)', this.autoShow);
+ }
+ return true;
+ }
+
+ /**
+ * Extract the data as a string from headers of an XMLHttpRequest
+ *
+ * @param {Response|XMLHttpRequest} response
+ * @return {string}
+ */
+ extractDataFromHeaders(response) {
+ let data = this.getHeader(response, this.headerName);
+ if (!data) {
+ return;
+ }
+ for (let i = 1; ; i++) {
+ const header = this.getHeader(response, `${this.headerName}-${i}`);
+ if (!header) {
+ break;
+ }
+ data += header;
+ }
+ return decodeURIComponent(data);
+ }
+
+ /**
+ * Parses the string data into an object
+ *
+ * @param {string} data
+ * @return {object}
+ */
+ parseHeaders(data) {
+ return JSON.parse(data);
+ }
+
+ /**
+ * Attaches an event listener to fetch
+ */
+ bindToFetch() {
+ const self = this;
+
+ const proxied = window.fetch.__debugbar_original || window.fetch;
+ const original = proxied.bind(window);
+
+ function wrappedFetch(resource, init) {
+ let rid = null;
+ const url = resource instanceof Request ? resource.url : resource;
+ if (self.captureStreamed && self.sameOrigin(url) && self.canInjectRequestId(url)) {
+ rid = self.newRequestId();
+ const h = `${self.headerName}-request-id`;
+ if (resource instanceof Request) {
+ init = { ...(init || {}) };
+ const headers = new Headers(resource.headers);
+ new Headers(init.headers || {}).forEach((value, key) => headers.set(key, value));
+ headers.set(h, rid);
+ resource = new Request(resource, { ...init, headers });
+ init = undefined;
+ } else {
+ init = { ...(init || {}) };
+ const headers = new Headers(init.headers || {});
+ headers.set(h, rid);
+ init.headers = headers;
+ }
+ }
+ const p = original(resource, init);
+ p?.then?.(r => self.handle(r, rid)).catch(() => {});
+ return p;
+ }
+
+ wrappedFetch.__debugbar_wrapped = true;
+ wrappedFetch.__debugbar_original = proxied;
+
+ window.fetch = wrappedFetch;
+ }
+
+ /**
+ * Attaches an event listener to XMLHttpRequest
+ */
+ bindToXHR() {
+ const self = this;
+ const proto = XMLHttpRequest.prototype;
+
+ const proxied = (proto.open || {}).__debugbar_original || proto.open;
+ if (typeof proxied !== 'function') {
+ return;
+ }
+
+ function wrappedOpen(method, url, async = true, user = null, pass = null) {
+ if (!this.__debugbar_listener_attached) {
+ this.__debugbar_listener_attached = true;
+
+ this.addEventListener('readystatechange', () => {
+ if (this.readyState === 4) {
+ self.handle(this, this.__debugbar_rid);
+ }
+ });
+ }
+
+ const r = proxied.call(this, method, url, async, user, pass);
+ if (self.captureStreamed && self.sameOrigin(url) && self.canInjectRequestId(url)) {
+ this.__debugbar_rid = self.newRequestId();
+ try {
+ this.setRequestHeader(`${self.headerName}-request-id`, this.__debugbar_rid);
+ } catch (e) {}
+ }
+ return r;
+ }
+
+ wrappedOpen.__debugbar_wrapped = true;
+ wrappedOpen.__debugbar_original = proxied;
+
+ proto.open = wrappedOpen;
+ }
+ }
+
+ PhpDebugBar.AjaxHandler = AjaxHandler;
+})();
diff --git a/resources/dist/debugbar.min.css b/resources/dist/debugbar.min.css
new file mode 100644
index 000000000..b1efa9ef5
--- /dev/null
+++ b/resources/dist/debugbar.min.css
@@ -0,0 +1,19 @@
+:root{--debugbar-icon-adjustments: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M4%2010a2%202%200%201%200%204%200a2%202%200%200%200%20-4%200%22%20%2F%3E%20%3Cpath%20d%3D%22M6%204v4%22%20%2F%3E%20%3Cpath%20d%3D%22M6%2012v8%22%20%2F%3E%20%3Cpath%20d%3D%22M10%2016a2%202%200%201%200%204%200a2%202%200%200%200%20-4%200%22%20%2F%3E%20%3Cpath%20d%3D%22M12%204v10%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2018v2%22%20%2F%3E%20%3Cpath%20d%3D%22M16%207a2%202%200%201%200%204%200a2%202%200%200%200%20-4%200%22%20%2F%3E%20%3Cpath%20d%3D%22M18%204v1%22%20%2F%3E%20%3Cpath%20d%3D%22M18%209v11%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-adjustments-horizontal: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M12%206a2%202%200%201%200%204%200a2%202%200%201%200%20-4%200%22%20%2F%3E%20%3Cpath%20d%3D%22M4%206l8%200%22%20%2F%3E%20%3Cpath%20d%3D%22M16%206l4%200%22%20%2F%3E%20%3Cpath%20d%3D%22M6%2012a2%202%200%201%200%204%200a2%202%200%201%200%20-4%200%22%20%2F%3E%20%3Cpath%20d%3D%22M4%2012l2%200%22%20%2F%3E%20%3Cpath%20d%3D%22M10%2012l10%200%22%20%2F%3E%20%3Cpath%20d%3D%22M15%2018a2%202%200%201%200%204%200a2%202%200%201%200%20-4%200%22%20%2F%3E%20%3Cpath%20d%3D%22M4%2018l11%200%22%20%2F%3E%20%3Cpath%20d%3D%22M19%2018l1%200%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-arrow-right: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M5%2012l14%200%22%20%2F%3E%20%3Cpath%20d%3D%22M13%2018l6%20-6%22%20%2F%3E%20%3Cpath%20d%3D%22M13%206l6%206%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-arrows-left-right: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M21%2017l-18%200%22%20%2F%3E%20%3Cpath%20d%3D%22M6%2010l-3%20-3l3%20-3%22%20%2F%3E%20%3Cpath%20d%3D%22M3%207l18%200%22%20%2F%3E%20%3Cpath%20d%3D%22M18%2020l3%20-3l-3%20-3%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-bolt: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M13%203l0%207l6%200l-8%2011l0%20-7l-6%200l8%20-11%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-bookmark: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M18%207v14l-6%20-4l-6%204v-14a4%204%200%200%201%204%20-4h4a4%204%200%200%201%204%204%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-box: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M12%203l8%204.5l0%209l-8%204.5l-8%20-4.5l0%20-9l8%20-4.5%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2012l8%20-4.5%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2012l0%209%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2012l-8%20-4.5%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-briefcase: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M3%209a2%202%200%200%201%202%20-2h14a2%202%200%200%201%202%202v9a2%202%200%200%201%20-2%202h-14a2%202%200%200%201%20-2%20-2l0%20-9%22%20%2F%3E%20%3Cpath%20d%3D%22M8%207v-2a2%202%200%200%201%202%20-2h4a2%202%200%200%201%202%202v2%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2012l0%20.01%22%20%2F%3E%20%3Cpath%20d%3D%22M3%2013a20%2020%200%200%200%2018%200%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-bug: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M9%209v-1a3%203%200%200%201%206%200v1%22%20%2F%3E%20%3Cpath%20d%3D%22M8%209h8a6%206%200%200%201%201%203v3a5%205%200%200%201%20-10%200v-3a6%206%200%200%201%201%20-3%22%20%2F%3E%20%3Cpath%20d%3D%22M3%2013l4%200%22%20%2F%3E%20%3Cpath%20d%3D%22M17%2013l4%200%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2020l0%20-6%22%20%2F%3E%20%3Cpath%20d%3D%22M4%2019l3.35%20-2%22%20%2F%3E%20%3Cpath%20d%3D%22M20%2019l-3.35%20-2%22%20%2F%3E%20%3Cpath%20d%3D%22M4%207l3.75%202.4%22%20%2F%3E%20%3Cpath%20d%3D%22M20%207l-3.75%202.4%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-calendar: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M4%207a2%202%200%200%201%202%20-2h12a2%202%200%200%201%202%202v12a2%202%200%200%201%20-2%202h-12a2%202%200%200%201%20-2%20-2v-12%22%20%2F%3E%20%3Cpath%20d%3D%22M16%203v4%22%20%2F%3E%20%3Cpath%20d%3D%22M8%203v4%22%20%2F%3E%20%3Cpath%20d%3D%22M4%2011h16%22%20%2F%3E%20%3Cpath%20d%3D%22M11%2015h1%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2015v3%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-chart-infographic: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M3%207a4%204%200%201%200%208%200a4%204%200%201%200%20-8%200%22%20%2F%3E%20%3Cpath%20d%3D%22M7%203v4h4%22%20%2F%3E%20%3Cpath%20d%3D%22M9%2017l0%204%22%20%2F%3E%20%3Cpath%20d%3D%22M17%2014l0%207%22%20%2F%3E%20%3Cpath%20d%3D%22M13%2013l0%208%22%20%2F%3E%20%3Cpath%20d%3D%22M21%2012l0%209%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-clock: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M3%2012a9%209%200%201%200%2018%200a9%209%200%200%200%20-18%200%22%20%2F%3E%20%3Cpath%20d%3D%22M12%207v5l3%203%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-code: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M7%208l-4%204l4%204%22%20%2F%3E%20%3Cpath%20d%3D%22M17%208l4%204l-4%204%22%20%2F%3E%20%3Cpath%20d%3D%22M14%204l-4%2016%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-database: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M4%206a8%203%200%201%200%2016%200a8%203%200%201%200%20-16%200%22%20%2F%3E%20%3Cpath%20d%3D%22M4%206v6a8%203%200%200%200%2016%200v-6%22%20%2F%3E%20%3Cpath%20d%3D%22M4%2012v6a8%203%200%200%200%2016%200v-6%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-file-code: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M14%203v4a1%201%200%200%200%201%201h4%22%20%2F%3E%20%3Cpath%20d%3D%22M17%2021h-10a2%202%200%200%201%20-2%20-2v-14a2%202%200%200%201%202%20-2h7l5%205v11a2%202%200%200%201%20-2%202%22%20%2F%3E%20%3Cpath%20d%3D%22M10%2013l-1%202l1%202%22%20%2F%3E%20%3Cpath%20d%3D%22M14%2013l1%202l-1%202%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-flag: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M5%205a5%205%200%200%201%207%200a5%205%200%200%200%207%200v9a5%205%200%200%201%20-7%200a5%205%200%200%200%20-7%200v-9%22%20%2F%3E%20%3Cpath%20d%3D%22M5%2021v-7%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-history: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M12%208l0%204l2%202%22%20%2F%3E%20%3Cpath%20d%3D%22M3.05%2011a9%209%200%201%201%20.5%204m-.5%205v-5h5%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-inbox: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M4%206a2%202%200%200%201%202%20-2h12a2%202%200%200%201%202%202v12a2%202%200%200%201%20-2%202h-12a2%202%200%200%201%20-2%20-2l0%20-12%22%20%2F%3E%20%3Cpath%20d%3D%22M4%2013h3l3%203h4l3%20-3h3%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-leaf: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M5%2021c.5%20-4.5%202.5%20-8%207%20-10%22%20%2F%3E%20%3Cpath%20d%3D%22M9%2018c6.218%200%2010.5%20-3.288%2011%20-12v-2h-4.014c-9%200%20-11.986%204%20-12%209c0%201%200%203%202%205h3l.014%200%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-list: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M9%206l11%200%22%20%2F%3E%20%3Cpath%20d%3D%22M9%2012l11%200%22%20%2F%3E%20%3Cpath%20d%3D%22M9%2018l11%200%22%20%2F%3E%20%3Cpath%20d%3D%22M5%206l0%20.01%22%20%2F%3E%20%3Cpath%20d%3D%22M5%2012l0%20.01%22%20%2F%3E%20%3Cpath%20d%3D%22M5%2018l0%20.01%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-logs: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M4%2012h.01%22%20%2F%3E%20%3Cpath%20d%3D%22M4%206h.01%22%20%2F%3E%20%3Cpath%20d%3D%22M4%2018h.01%22%20%2F%3E%20%3Cpath%20d%3D%22M8%2018h2%22%20%2F%3E%20%3Cpath%20d%3D%22M8%2012h2%22%20%2F%3E%20%3Cpath%20d%3D%22M8%206h2%22%20%2F%3E%20%3Cpath%20d%3D%22M14%206h6%22%20%2F%3E%20%3Cpath%20d%3D%22M14%2012h6%22%20%2F%3E%20%3Cpath%20d%3D%22M14%2018h6%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-mobiledata: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M16%2012v-8%22%20%2F%3E%20%3Cpath%20d%3D%22M8%2020v-8%22%20%2F%3E%20%3Cpath%20d%3D%22M13%207l3%20-3l3%203%22%20%2F%3E%20%3Cpath%20d%3D%22M5%2017l3%203l3%20-3%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-search: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M3%2010a7%207%200%201%200%2014%200a7%207%200%201%200%20-14%200%22%20%2F%3E%20%3Cpath%20d%3D%22M21%2021l-6%20-6%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-server-cog: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M3%207a3%203%200%200%201%203%20-3h12a3%203%200%200%201%203%203v2a3%203%200%200%201%20-3%203h-12a3%203%200%200%201%20-3%20-3v-2%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2020h-6a3%203%200%200%201%20-3%20-3v-2a3%203%200%200%201%203%20-3h10.5%22%20%2F%3E%20%3Cpath%20d%3D%22M16%2018a2%202%200%201%200%204%200a2%202%200%201%200%20-4%200%22%20%2F%3E%20%3Cpath%20d%3D%22M18%2014.5v1.5%22%20%2F%3E%20%3Cpath%20d%3D%22M18%2020v1.5%22%20%2F%3E%20%3Cpath%20d%3D%22M21.032%2016.25l-1.299%20.75%22%20%2F%3E%20%3Cpath%20d%3D%22M16.27%2019l-1.3%20.75%22%20%2F%3E%20%3Cpath%20d%3D%22M14.97%2016.25l1.3%20.75%22%20%2F%3E%20%3Cpath%20d%3D%22M19.733%2019l1.3%20.75%22%20%2F%3E%20%3Cpath%20d%3D%22M7%208v.01%22%20%2F%3E%20%3Cpath%20d%3D%22M7%2016v.01%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-share-3: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M13%204v4c-6.575%201.028%20-9.02%206.788%20-10%2012c-.037%20.206%205.384%20-5.962%2010%20-6v4l8%20-7l-8%20-7%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-tags: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M3%208v4.172a2%202%200%200%200%20.586%201.414l5.71%205.71a2.41%202.41%200%200%200%203.408%200l3.592%20-3.592a2.41%202.41%200%200%200%200%20-3.408l-5.71%20-5.71a2%202%200%200%200%20-1.414%20-.586h-4.172a2%202%200%200%200%20-2%202%22%20%2F%3E%20%3Cpath%20d%3D%22M18%2019l1.592%20-1.592a4.82%204.82%200%200%200%200%20-6.816l-4.592%20-4.592%22%20%2F%3E%20%3Cpath%20d%3D%22M7%2010h-.01%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-x: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M18%206l-12%2012%22%20%2F%3E%20%3Cpath%20d%3D%22M6%206l12%2012%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-arrows-maximize: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M16%204l4%200l0%204%22%20%2F%3E%20%3Cpath%20d%3D%22M14%2010l6%20-6%22%20%2F%3E%20%3Cpath%20d%3D%22M8%2020l-4%200l0%20-4%22%20%2F%3E%20%3Cpath%20d%3D%22M4%2020l6%20-6%22%20%2F%3E%20%3Cpath%20d%3D%22M16%2020l4%200l0%20-4%22%20%2F%3E%20%3Cpath%20d%3D%22M14%2014l6%206%22%20%2F%3E%20%3Cpath%20d%3D%22M8%204l-4%200l0%204%22%20%2F%3E%20%3Cpath%20d%3D%22M4%204l6%206%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-arrows-minimize: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M5%209l4%200l0%20-4%22%20%2F%3E%20%3Cpath%20d%3D%22M3%203l6%206%22%20%2F%3E%20%3Cpath%20d%3D%22M5%2015l4%200l0%204%22%20%2F%3E%20%3Cpath%20d%3D%22M3%2021l6%20-6%22%20%2F%3E%20%3Cpath%20d%3D%22M19%209l-4%200l0%20-4%22%20%2F%3E%20%3Cpath%20d%3D%22M15%209l6%20-6%22%20%2F%3E%20%3Cpath%20d%3D%22M19%2015l-4%200l0%204%22%20%2F%3E%20%3Cpath%20d%3D%22M15%2015l6%206%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-chevron-down: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M6%209l6%206l6%20-6%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-chevron-up: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M6%2015l6%20-6l6%206%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-folder-open: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M5%2019l2.757%20-7.351a1%201%200%200%201%20.936%20-.649h12.307a1%201%200%200%201%20.986%201.164l-.996%205.211a2%202%200%200%201%20-1.964%201.625h-14.026a2%202%200%200%201%20-2%20-2v-11a2%202%200%200%201%202%20-2h4l3%203h7a2%202%200%200%201%202%202v2%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-brand-php: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%221.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M2%2012a10%209%200%201%200%2020%200a10%209%200%201%200%20-20%200%22%20%2F%3E%20%3Cpath%20d%3D%22M5.5%2015l.395%20-1.974l.605%20-3.026h1.32a1%201%200%200%201%20.986%201.164l-.167%201a1%201%200%200%201%20-.986%20.836h-1.653%22%20%2F%3E%20%3Cpath%20d%3D%22M15.5%2015l.395%20-1.974l.605%20-3.026h1.32a1%201%200%200%201%20.986%201.164l-.167%201a1%201%200%200%201%20-.986%20.836h-1.653%22%20%2F%3E%20%3Cpath%20d%3D%22M12%207.5l-1%205.5%22%20%2F%3E%20%3Cpath%20d%3D%22M11.6%2010h2.4l-.5%203%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-refresh: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M20%2011a8.1%208.1%200%200%200%20-15.5%20-2m-.5%20-4v4h4%22%20%2F%3E%20%3Cpath%20d%3D%22M4%2013a8.1%208.1%200%200%200%2015.5%202m.5%204v-4h-4%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-cpu: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M5%206a1%201%200%200%201%201%20-1h12a1%201%200%200%201%201%201v12a1%201%200%200%201%20-1%201h-12a1%201%200%200%201%20-1%20-1l0%20-12%22%20%2F%3E%20%3Cpath%20d%3D%22M9%209h6v6h-6l0%20-6%22%20%2F%3E%20%3Cpath%20d%3D%22M3%2010h2%22%20%2F%3E%20%3Cpath%20d%3D%22M3%2014h2%22%20%2F%3E%20%3Cpath%20d%3D%22M10%203v2%22%20%2F%3E%20%3Cpath%20d%3D%22M14%203v2%22%20%2F%3E%20%3Cpath%20d%3D%22M21%2010h-2%22%20%2F%3E%20%3Cpath%20d%3D%22M21%2014h-2%22%20%2F%3E%20%3Cpath%20d%3D%22M14%2021v-2%22%20%2F%3E%20%3Cpath%20d%3D%22M10%2021v-2%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-table: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M3%205a2%202%200%200%201%202%20-2h14a2%202%200%200%201%202%202v14a2%202%200%200%201%20-2%202h-14a2%202%200%200%201%20-2%20-2v-14%22%20%2F%3E%20%3Cpath%20d%3D%22M3%2010h18%22%20%2F%3E%20%3Cpath%20d%3D%22M10%203v18%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-link: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M9%2015l6%20-6%22%20%2F%3E%20%3Cpath%20d%3D%22M11%206l.463%20-.536a5%205%200%200%201%207.071%207.072l-.534%20.464%22%20%2F%3E%20%3Cpath%20d%3D%22M13%2018l-.397%20.534a5.068%205.068%200%200%201%20-7.127%200a4.972%204.972%200%200%201%200%20-7.071l.524%20-.463%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-copy: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M7%209.667a2.667%202.667%200%200%201%202.667%20-2.667h8.666a2.667%202.667%200%200%201%202.667%202.667v8.666a2.667%202.667%200%200%201%20-2.667%202.667h-8.666a2.667%202.667%200%200%201%20-2.667%20-2.667l0%20-8.666%22%20%2F%3E%20%3Cpath%20d%3D%22M4.012%2016.737a2.005%202.005%200%200%201%20-1.012%20-1.737v-10c0%20-1.1%20.9%20-2%202%20-2h10c.75%200%201.158%20.385%201.5%201%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-circle-check: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M3%2012a9%209%200%201%200%2018%200a9%209%200%201%200%20-18%200%22%20%2F%3E%20%3Cpath%20d%3D%22M9%2012l2%202l4%20-4%22%20%2F%3E%20%3C%2Fsvg%3E);--debugbar-icon-external-link: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%20%2F%3E%20%3Cpath%20d%3D%22M12%206h-6a2%202%200%200%200%20-2%202v10a2%202%200%200%200%202%202h10a2%202%200%200%200%202%20-2v-6%22%20%2F%3E%20%3Cpath%20d%3D%22M11%2013l9%20-9%22%20%2F%3E%20%3Cpath%20d%3D%22M15%204h5v5%22%20%2F%3E%20%3C%2Fsvg%3E)}.phpdebugbar-icon-adjustments:before{-webkit-mask-image:var(--debugbar-icon-adjustments);mask-image:var(--debugbar-icon-adjustments)}.phpdebugbar-icon-adjustments-horizontal:before{-webkit-mask-image:var(--debugbar-icon-adjustments-horizontal);mask-image:var(--debugbar-icon-adjustments-horizontal)}.phpdebugbar-icon-arrow-right:before{-webkit-mask-image:var(--debugbar-icon-arrow-right);mask-image:var(--debugbar-icon-arrow-right)}.phpdebugbar-icon-arrows-left-right:before{-webkit-mask-image:var(--debugbar-icon-arrows-left-right);mask-image:var(--debugbar-icon-arrows-left-right)}.phpdebugbar-icon-bolt:before{-webkit-mask-image:var(--debugbar-icon-bolt);mask-image:var(--debugbar-icon-bolt)}.phpdebugbar-icon-bookmark:before{-webkit-mask-image:var(--debugbar-icon-bookmark);mask-image:var(--debugbar-icon-bookmark)}.phpdebugbar-icon-box:before{-webkit-mask-image:var(--debugbar-icon-box);mask-image:var(--debugbar-icon-box)}.phpdebugbar-icon-briefcase:before{-webkit-mask-image:var(--debugbar-icon-briefcase);mask-image:var(--debugbar-icon-briefcase)}.phpdebugbar-icon-bug:before{-webkit-mask-image:var(--debugbar-icon-bug);mask-image:var(--debugbar-icon-bug)}.phpdebugbar-icon-calendar:before{-webkit-mask-image:var(--debugbar-icon-calendar);mask-image:var(--debugbar-icon-calendar)}.phpdebugbar-icon-chart-infographic:before{-webkit-mask-image:var(--debugbar-icon-chart-infographic);mask-image:var(--debugbar-icon-chart-infographic)}.phpdebugbar-icon-clock:before{-webkit-mask-image:var(--debugbar-icon-clock);mask-image:var(--debugbar-icon-clock)}.phpdebugbar-icon-code:before{-webkit-mask-image:var(--debugbar-icon-code);mask-image:var(--debugbar-icon-code)}.phpdebugbar-icon-database:before{-webkit-mask-image:var(--debugbar-icon-database);mask-image:var(--debugbar-icon-database)}.phpdebugbar-icon-file-code:before{-webkit-mask-image:var(--debugbar-icon-file-code);mask-image:var(--debugbar-icon-file-code)}.phpdebugbar-icon-flag:before{-webkit-mask-image:var(--debugbar-icon-flag);mask-image:var(--debugbar-icon-flag)}.phpdebugbar-icon-history:before{-webkit-mask-image:var(--debugbar-icon-history);mask-image:var(--debugbar-icon-history)}.phpdebugbar-icon-inbox:before{-webkit-mask-image:var(--debugbar-icon-inbox);mask-image:var(--debugbar-icon-inbox)}.phpdebugbar-icon-leaf:before{-webkit-mask-image:var(--debugbar-icon-leaf);mask-image:var(--debugbar-icon-leaf)}.phpdebugbar-icon-list:before{-webkit-mask-image:var(--debugbar-icon-list);mask-image:var(--debugbar-icon-list)}.phpdebugbar-icon-logs:before{-webkit-mask-image:var(--debugbar-icon-logs);mask-image:var(--debugbar-icon-logs)}.phpdebugbar-icon-mobiledata:before{-webkit-mask-image:var(--debugbar-icon-mobiledata);mask-image:var(--debugbar-icon-mobiledata)}.phpdebugbar-icon-search:before{-webkit-mask-image:var(--debugbar-icon-search);mask-image:var(--debugbar-icon-search)}.phpdebugbar-icon-server-cog:before{-webkit-mask-image:var(--debugbar-icon-server-cog);mask-image:var(--debugbar-icon-server-cog)}.phpdebugbar-icon-share-3:before{-webkit-mask-image:var(--debugbar-icon-share-3);mask-image:var(--debugbar-icon-share-3)}.phpdebugbar-icon-tags:before{-webkit-mask-image:var(--debugbar-icon-tags);mask-image:var(--debugbar-icon-tags)}.phpdebugbar-icon-x:before{-webkit-mask-image:var(--debugbar-icon-x);mask-image:var(--debugbar-icon-x)}.phpdebugbar-icon-arrows-maximize:before{-webkit-mask-image:var(--debugbar-icon-arrows-maximize);mask-image:var(--debugbar-icon-arrows-maximize)}.phpdebugbar-icon-arrows-minimize:before{-webkit-mask-image:var(--debugbar-icon-arrows-minimize);mask-image:var(--debugbar-icon-arrows-minimize)}.phpdebugbar-icon-chevron-down:before{-webkit-mask-image:var(--debugbar-icon-chevron-down);mask-image:var(--debugbar-icon-chevron-down)}.phpdebugbar-icon-chevron-up:before{-webkit-mask-image:var(--debugbar-icon-chevron-up);mask-image:var(--debugbar-icon-chevron-up)}.phpdebugbar-icon-folder-open:before{-webkit-mask-image:var(--debugbar-icon-folder-open);mask-image:var(--debugbar-icon-folder-open)}.phpdebugbar-icon-brand-php:before{-webkit-mask-image:var(--debugbar-icon-brand-php);mask-image:var(--debugbar-icon-brand-php)}.phpdebugbar-icon-refresh:before{-webkit-mask-image:var(--debugbar-icon-refresh);mask-image:var(--debugbar-icon-refresh)}.phpdebugbar-icon-cpu:before{-webkit-mask-image:var(--debugbar-icon-cpu);mask-image:var(--debugbar-icon-cpu)}.phpdebugbar-icon-table:before{-webkit-mask-image:var(--debugbar-icon-table);mask-image:var(--debugbar-icon-table)}.phpdebugbar-icon-link:before{-webkit-mask-image:var(--debugbar-icon-link);mask-image:var(--debugbar-icon-link)}.phpdebugbar-icon-copy:before{-webkit-mask-image:var(--debugbar-icon-copy);mask-image:var(--debugbar-icon-copy)}.phpdebugbar-icon-circle-check:before{-webkit-mask-image:var(--debugbar-icon-circle-check);mask-image:var(--debugbar-icon-circle-check)}.phpdebugbar-icon-external-link:before{-webkit-mask-image:var(--debugbar-icon-external-link);mask-image:var(--debugbar-icon-external-link)}@media print{div.phpdebugbar{display:none}}div.phpdebugbar,div.phpdebugbar-openhandler,div.phpdebugbar-widgets-datasets-panel{--debugbar-background: #F7F7F7;--debugbar-background-alt: #EFEFEF;--debugbar-text: #222;--debugbar-text-muted: #888;--debugbar-border: #eee;--debugbar-header: #efefef;--debugbar-header-text: #555;--debugbar-header-border: #ddd;--debugbar-active: #ccc;--debugbar-active-text: #666;--debugbar-icons: #555;--debugbar-badge: #ccc;--debugbar-badge-text: #555;--debugbar-badge-active: #477e96;--debugbar-badge-active-text: #fff;--debugbar-link: #888;--debugbar-hover: #aaa;--debugbar-accent: #6BB7D8;--debugbar-accent-border: #477e96;--debugbar-font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--debugbar-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--debugbar-icon-brand: var(--debugbar-icon-brand-php)}div.phpdebugbar[data-theme=dark],div.phpdebugbar-openhandler[data-theme=dark],div.phpdebugbar-widgets-datasets-panel[data-theme=dark]{--debugbar-background: #2a2a2a;--debugbar-background-alt: #333333;--debugbar-text: #e0e0e0;--debugbar-text-muted: #aaaaaa;--debugbar-border: #3a3a3a;--debugbar-header: #1e1e1e;--debugbar-header-text: #cccccc;--debugbar-header-border: #444;--debugbar-active: #444;--debugbar-active-text: #e0e0e0;--debugbar-icons: #cccccc;--debugbar-badge: #444;--debugbar-badge-text: #cccccc;--debugbar-badge-active: #4F8FB3;--debugbar-badge-active-text: #1e1e1e;--debugbar-accent: #4F8FB3;--debugbar-accent-border: #3F7A94;--debugbar-link: #aaaaaa;--debugbar-hover: #888888}div.phpdebugbar{position:fixed;bottom:0;left:0;width:100%;border-top:0;font-family:var(--debugbar-font-sans);background:var(--debugbar-background);z-index:100000000;font-size:13px;color:var(--debugbar-text);text-align:left;line-height:1.2em;letter-spacing:normal;direction:ltr}div.phpdebugbar.phpdebugbar-fullscreen,div.phpdebugbar.phpdebugbar-fullscreen[data-toolbarPosition=top]{top:0;bottom:0;display:flex;flex-direction:column}div.phpdebugbar.phpdebugbar-fullscreen .phpdebugbar-body{flex:1;height:calc(100% - 32px)!important}div.phpdebugbar.phpdebugbar-fullscreen .phpdebugbar-resize-handle{display:none}.phpdebugbar [hidden]{display:none!important}div.phpdebugbar[data-openBtnPosition=bottomRight].phpdebugbar-closed,div.phpdebugbar[data-openBtnPosition=topRight].phpdebugbar-closed{left:auto;right:0}div.phpdebugbar[data-openBtnPosition=topRight].phpdebugbar-closed,div.phpdebugbar[data-openBtnPosition=topLeft].phpdebugbar-closed{bottom:auto;top:0;border-bottom:1px solid var(--debugbar-header-border)}div.phpdebugbar[data-openBtnPosition=bottomRight].phpdebugbar-closed,div.phpdebugbar[data-openBtnPosition=bottomLeft].phpdebugbar-closed{border-top:1px solid var(--debugbar-header-border)}.phpdebugbar-closed[data-openBtnPosition=bottomLeft],.phpdebugbar-closed[data-openBtnPosition=topLeft]{border-right:1px solid var(--debugbar-header-border)}.phpdebugbar-closed[data-openBtnPosition=bottomRight],.phpdebugbar-closed[data-openBtnPosition=topRight]{border-left:1px solid var(--debugbar-header-border)}div.phpdebugbar a,div.phpdebugbar-openhandler{cursor:pointer}div.phpdebugbar-drag-capture{position:fixed;inset:0;z-index:100000001;background:none;display:none;cursor:row-resize}div.phpdebugbar-closed{width:auto}div.phpdebugbar *{margin:0;padding:0;border:0;font-weight:400;text-decoration:none;clear:initial;width:auto;direction:ltr;text-align:left;-moz-box-sizing:content-box;box-sizing:content-box}div.phpdebugbar select,div.phpdebugbar input{appearance:auto}div.phpdebugbar ol,div.phpdebugbar ul{list-style:none}div.phpdebugbar ul li,div.phpdebugbar ol li,div.phpdebugbar dl li{line-height:normal}div.phpdebugbar table,.phpdebugbar-openhandler table{border-collapse:collapse;border-spacing:0;color:inherit}div.phpdebugbar input[type=text],div.phpdebugbar input[type=password],div.phpdebugbar select{font-family:var(--debugbar-font-sans);background:var(--debugbar-background);font-size:14px;color:var(--debugbar-text);padding:0;border:1px solid var(--debugbar-border);border-radius:.25rem;margin:0}div.phpdebugbar code,div.phpdebugbar pre,div.phpdebugbar samp{background:none;font-family:var(--debugbar-font-mono);font-size:1em;border:0!important;padding:0;margin:0}div.phpdebugbar code,div.phpdebugbar pre{color:var(--debugbar-text)}div.phpdebugbar pre.sf-dump{background:none!important;z-index:0!important;display:block!important;color:#a0a000;outline:0}div.phpdebugbar pre.sf-dump .sf-dump-private{color:gray}div.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-public{color:#fc0}div.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-protected{color:#a0a000}div.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-private{color:#9d9266}a.phpdebugbar-restore-btn{float:left;padding:4px;font-size:14px;color:var(--debugbar-icons);text-decoration:none;width:24px;height:24px}div.phpdebugbar-resize-handle{height:4px;margin-top:-4px;width:100%;background:none;border-bottom:1px solid var(--debugbar-header-border);cursor:row-resize}div.phpdebugbar-minimized div.phpdebugbar-resize-handle{cursor:auto}div.phpdebugbar-resize-handle.phpdebugbar-resize-handle-bottom{margin-top:4px}div.phpdebugbar-minimized{border-top:1px solid var(--debugbar-header-border)}div.phpdebugbar-minimized[data-toolbarPosition=top]{border-top:0;border-bottom:1px solid var(--debugbar-header-border)}div.phpdebugbar[data-toolbarPosition=top]{bottom:auto;top:0}div.phpdebugbar[data-toolbarPosition=top] div.phpdebugbar-resize-handle-top{height:0;display:none}div.phpdebugbar[data-toolbarPosition=top] div.phpdebugbar-resize-handle-bottom{margin-top:0}div.phpdebugbar[data-toolbarPosition=bottom] div.phpdebugbar-resize-handle-bottom{height:0;margin-top:0}a.phpdebugbar-restore-btn:after{-webkit-mask-image:var(--debugbar-icon-brand);mask-image:var(--debugbar-icon-brand);-webkit-mask-size:20px 20px;mask-size:20px 20px;background-color:var(--debugbar-icons)}div.phpdebugbar-header{background-color:var(--debugbar-header);min-height:32px;line-height:16px}div.phpdebugbar-header:before,div.phpdebugbar-header:after{display:table;line-height:0;content:""}div.phpdebugbar-header:after{clear:both}div.phpdebugbar-header-left{float:left}div.phpdebugbar-header-right{float:right}div.phpdebugbar-header>div>*{padding:5px;font-size:13px;height:22px;color:var(--debugbar-header-text);text-decoration:none}div.phpdebugbar-header-left>*,div.phpdebugbar-header-right>*{line-height:0;display:flex;align-items:center}div.phpdebugbar-header-left>*{float:left}div.phpdebugbar-header-right>*{float:right}div.phpdebugbar-header-right select{padding:0;line-height:1em;background-color:var(--debugbar-header);color:var(--debugbar-header-text)}span.phpdebugbar-indicator,a.phpdebugbar-indicator{border-right:1px solid var(--debugbar-header-border)}.phpdebugbar[data-hideEmptyTabs=true] .phpdebugbar-tab[data-empty=true]:not(.phpdebugbar-active){display:none}a.phpdebugbar-tab.phpdebugbar-active{background:var(--debugbar-active);color:var(--debugbar-active-text)}a.phpdebugbar-tab .phpdebugbar-text{font-size:14px}a.phpdebugbar-tab span.phpdebugbar-badge{display:none;margin-left:5px;font-size:11px;line-height:14px;padding:0 6px;background:var(--debugbar-badge);border-radius:4px;color:var(--debugbar-badge-text);font-weight:400;text-shadow:none}a.phpdebugbar-tab.phpdebugbar-active span.phpdebugbar-badge{background:var(--debugbar-badge-active);color:var(--debugbar-badge-active-text)}a.phpdebugbar-tab i{display:none;vertical-align:middle}.phpdebugbar-icon,i.phpdebugbar-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.phpdebugbar-icon:before,i.phpdebugbar-icon:before{content:"";display:block;justify-content:center;flex-shrink:0;width:1.3em;height:1.3em;background-size:contain;background-repeat:no-repeat;background-position:center;vertical-align:middle;-webkit-mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;mask-size:contain;mask-repeat:no-repeat;mask-position:center;background-color:currentColor}.phpdebugbar-icon-brand:before{-webkit-mask-image:var(--debugbar-icon-brand);mask-image:var(--debugbar-icon-brand)}a.phpdebugbar-tab span.phpdebugbar-badge.phpdebugbar-visible{display:inline}a.phpdebugbar-tab span.phpdebugbar-badge.phpdebugbar-important{background:#ed6868;color:#fff}a.phpdebugbar-close-btn,a.phpdebugbar-open-btn,a.phpdebugbar-fullscreen-btn,a.phpdebugbar-minimize-btn,a.phpdebugbar-maximize-btn,a.phpdebugbar-tab.phpdebugbar-tab-history,a.phpdebugbar-tab.phpdebugbar-tab-settings{width:16px;height:22px;position:relative}a.phpdebugbar-close-btn:after,a.phpdebugbar-open-btn:after,a.phpdebugbar-restore-btn:after,a.phpdebugbar-fullscreen-btn:after,a.phpdebugbar-minimize-btn:after,a.phpdebugbar-maximize-btn:after{content:" ";display:block;left:0;position:absolute;top:0;width:100%;height:100%;background-color:var(--debugbar-icons);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:18px 18px;mask-size:18px 18px}a.phpdebugbar-restore-btn:after{-webkit-mask-size:24px 24px;mask-size:24px 24px;mask-repeat:no-repeat;mask-position:center;position:relative}a.phpdebugbar-minimize-btn:after{-webkit-mask-image:var(--debugbar-icon-chevron-down);mask-image:var(--debugbar-icon-chevron-down)}a.phpdebugbar-maximize-btn:after{-webkit-mask-image:var(--debugbar-icon-chevron-up);mask-image:var(--debugbar-icon-chevron-up)}div.phpdebugbar[data-toolbarPosition=top] a.phpdebugbar-minimize-btn:after{-webkit-mask-image:var(--debugbar-icon-chevron-up);mask-image:var(--debugbar-icon-chevron-up)}div.phpdebugbar[data-toolbarPosition=top] a.phpdebugbar-maximize-btn:after{-webkit-mask-image:var(--debugbar-icon-chevron-down);mask-image:var(--debugbar-icon-chevron-down)}a.phpdebugbar-close-btn:after{-webkit-mask-image:var(--debugbar-icon-x);mask-image:var(--debugbar-icon-x)}a.phpdebugbar-fullscreen-btn:after{-webkit-mask-image:var(--debugbar-icon-arrows-maximize);mask-image:var(--debugbar-icon-arrows-maximize)}div.phpdebugbar.phpdebugbar-fullscreen a.phpdebugbar-fullscreen-btn:after{-webkit-mask-image:var(--debugbar-icon-arrows-minimize);mask-image:var(--debugbar-icon-arrows-minimize)}a.phpdebugbar-open-btn:after{-webkit-mask-image:var(--debugbar-icon-folder-open);mask-image:var(--debugbar-icon-folder-open)}.phpdebugbar-indicator{position:relative;cursor:pointer}.phpdebugbar-indicator span.phpdebugbar-text{margin-left:5px}.phpdebugbar-indicator span.phpdebugbar-tooltip{display:none;position:absolute;bottom:38px;background:var(--debugbar-header);border:1px solid var(--debugbar-header-border);color:var(--debugbar-header-text);font-size:11px;padding:2px 6px;z-index:100000001;text-align:center;white-space:nowrap;right:0;line-height:1.5;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px)}.phpdebugbar-indicator:hover span.phpdebugbar-tooltip:not(.phpdebugbar-disabled){display:block}.phpdebugbar-indicator span.phpdebugbar-tooltip dl{display:grid;grid-gap:4px 10px;grid-template-columns:max-content}.phpdebugbar-indicator span.phpdebugbar-tooltip dl dt{font-weight:700;text-align:left}.phpdebugbar-indicator span.phpdebugbar-tooltip dl dd{margin:0;grid-column-start:2;text-align:left}.phpdebugbar .phpdebugbar-datasets-switcher{float:right}.phpdebugbar .phpdebugbar-datasets-switcher select{max-width:200px;height:22px;padding:4px 0;border:none}.phpdebugbar button,.phpdebugbar-openhandler button{color:var(--debugbar-header-text);background-color:var(--debugbar-header);border:1px solid var(--debugbar-header-border);border-radius:.25rem;margin:0 5px;padding:0 12px;height:20px;line-height:normal;cursor:pointer}div.phpdebugbar-body{border-top:1px solid var(--debugbar-header-border);position:relative;height:300px}div.phpdebugbar-panel{height:100%;overflow:auto;width:100%}div.phpdebugbar-panel.phpdebugbar-active{display:block}div.phpdebugbar-mini-design a.phpdebugbar-tab{position:relative;border-right:1px solid var(--debugbar-header-border)}div.phpdebugbar-mini-design a.phpdebugbar-tab span.phpdebugbar-text{display:none}div.phpdebugbar-mini-design a.phpdebugbar-tab:hover span.phpdebugbar-text{display:block;position:absolute;top:-30px;background:var(--debugbar-background);opacity:1;border:1px solid var(--debugbar-header-border);color:var(--debugbar-header-text);font-size:11px;padding:2px 6px;z-index:100000001;text-align:center;right:0;line-height:1.5;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px)}div.phpdebugbar-mini-design a.phpdebugbar-tab i{display:inline-block}a.phpdebugbar-tab.phpdebugbar-tab-history{width:auto;min-width:22px}a.phpdebugbar-tab.phpdebugbar-tab-history,a.phpdebugbar-tab.phpdebugbar-tab-settings{display:flex;justify-content:center;align-items:center}a.phpdebugbar-tab.phpdebugbar-tab-history .phpdebugbar-text,a.phpdebugbar-tab.phpdebugbar-tab-settings .phpdebugbar-text{display:none;white-space:nowrap}a.phpdebugbar-tab.phpdebugbar-tab-history i,a.phpdebugbar-tab.phpdebugbar-tab-settings i{display:inline-block}.phpdebugbar-widgets-dataset-history table{width:100%;table-layout:fixed}.phpdebugbar-widgets-dataset-history table th{font-weight:700}.phpdebugbar-widgets-dataset-history table td,.phpdebugbar-widgets-dataset-history table th{padding:6px 3px;border-bottom:1px solid var(--debugbar-border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.phpdebugbar-widgets-dataset-history table td a{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.phpdebugbar-widgets-dataset-history table tr.phpdebugbar-widgets-active{background:var(--debugbar-active);color:var(--debugbar-active-text)}.phpdebugbar-widgets-dataset-history span.phpdebugbar-badge{margin:0 5px 0 2px;font-size:11px;line-height:14px;padding:0 6px;background:var(--debugbar-badge);border-radius:4px;color:var(--debugbar-badge-text);font-weight:400;text-shadow:none;vertical-align:middle}.phpdebugbar-widgets-dataset-history .phpdebugbar-widgets-dataset-actions{text-align:center;padding:7px 0;position:sticky;top:0;background:var(--debugbar-background)}.phpdebugbar-widgets-dataset-history .phpdebugbar-widgets-dataset-actions a{margin:0 10px}.phpdebugbar-widgets-dataset-history .phpdebugbar-widgets-dataset-actions input{margin:5px}.phpdebugbar-settings .phpdebugbar-form-row{display:block;border-top:1px solid var(--debugbar-border);min-height:17px;padding:5px 10px}.phpdebugbar-settings .phpdebugbar-form-label{width:200px;font-weight:700;display:inline-block;clear:none}.phpdebugbar-settings .phpdebugbar-form-input{font-weight:700;display:inline-block;clear:none}.phpdebugbar-settings input[type=text],.phpdebugbar-settings select{margin:0 5px;min-width:200px}.phpdebugbar-settings input[type=checkbox]{margin:0 5px}pre.phpdebugbar-widgets-code-block{white-space:pre;word-wrap:normal;overflow:hidden}pre.phpdebugbar-widgets-code-block code{display:block;overflow-x:auto;overflow-y:hidden}pre.phpdebugbar-widgets-code-block code.phpdebugbar-widgets-numbered-code{padding:5px;line-height:normal}pre.phpdebugbar-widgets-code-block ul li.phpdebugbar-widgets-highlighted-line{font-weight:bolder;text-decoration:underline}pre.phpdebugbar-widgets-code-block ul li.phpdebugbar-widgets-highlighted-line span{position:absolute;background:var(--debugbar-text);min-width:calc(100% - 85px);margin-left:10px;opacity:.15}pre.phpdebugbar-widgets-code-block ul{position:static;float:left;padding:5px;border-right:1px solid var(--debugbar-header-border);text-align:right}.phpdebugbar-widgets-kvlist span.phpdebugbar-widgets-filename,li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-filename,table.phpdebugbar-widgets-tablevar span.phpdebugbar-widgets-filename{display:block;font-style:italic;float:right;margin-left:8px;color:var(--debugbar-link)}a.phpdebugbar-widgets-editor-link,a.phpdebugbar-widgets-external-link{color:var(--debugbar-link)}.phpdebugbar-widgets-kvlist span.phpdebugbar-widgets-filename:hover,li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-filename:hover,a.phpdebugbar-widgets-editor-link:hover,a.phpdebugbar-widgets-external-link:hover{color:var(--debugbar-hover)}a.phpdebugbar-widgets-editor-link:before,a.phpdebugbar-widgets-copy-clipboard-check:before,a.phpdebugbar-widgets-external-link:after{content:"";display:inline-block;width:1em;height:1em;margin-left:4px;vertical-align:middle;-webkit-mask-image:var(--debugbar-icon-external-link);mask-image:var(--debugbar-icon-external-link);-webkit-mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;mask-size:contain;mask-repeat:no-repeat;mask-position:center;background-color:currentColor}a.phpdebugbar-widgets-copy-clipboard-check:before{margin-left:0;margin-right:4px;-webkit-mask-image:var(--debugbar-icon-circle-check);mask-image:var(--debugbar-icon-circle-check)}table.phpdebugbar-widgets-params{width:70%;margin:10px;border:1px solid var(--debugbar-border);font-family:var(--debugbar-font-mono);font-size:13px;border-collapse:collapse}table.phpdebugbar-widgets-params th{font-weight:700}table.phpdebugbar-widgets-params td{border:1px solid var(--debugbar-border);border-left:none;border-right:none;padding:0 5px}table.phpdebugbar-widgets-params .phpdebugbar-widgets-name{width:20%;font-weight:700;vertical-align:top}.phpdebugbar-widgets-truncated{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}ul.phpdebugbar-widgets-list{margin:0;padding:0;list-style:none;font-family:var(--debugbar-font-mono)}ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item{padding:7px 10px;border-bottom:1px solid var(--debugbar-border);position:relative;overflow:hidden}div.phpdebugbar-widgets-messages{position:relative;height:100%;overflow:hidden;display:flex;flex-direction:column}div.phpdebugbar-widgets-messages ul.phpdebugbar-widgets-list{padding-bottom:45px;flex:1;overflow-y:auto}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value{display:flex;align-items:center}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value:before{margin-right:8px;font-family:system-ui,sans-serif;font-size:1.25em;line-height:1;display:inline-flex;align-items:center}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-success{color:#28a745}.phpdebugbar[data-theme=dark] div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-success{color:#56db3a}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-success:before{content:"\2713"}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-alert:before{content:"\2139";color:#cbcf38}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-debug:before{color:#78d79a}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-warning:before,div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-emergency:before,div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-notice:before{content:"\26a0";color:#ecb03d}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-error,div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-critical{color:red}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-error:before,div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-critical:before{content:"\2716"}.phpdebugbar-widgets-params .phpdebugbar-widgets-value pre.sf-dump,dl.phpdebugbar-widgets-kvlist dd.phpdebugbar-widgets-value pre.sf-dump,div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item pre.sf-dump{display:inline-block!important;padding-top:0;padding-left:0;padding-bottom:0}dl.phpdebugbar-widgets-kvlist dd.phpdebugbar-widgets-value pre.sf-dump{max-width:calc(100% - 5px)}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-collector,div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-label{float:right;font-size:12px;padding:2px 4px;color:#888;margin:0 2px;text-decoration:none;text-shadow:none;background:none;font-weight:400}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-context-count{float:right;font-size:12px;padding:2px 4px;color:#888;margin:0 2px;text-decoration:none;text-shadow:none;background:none;font-weight:400;display:inline-flex;align-items:center}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-context-count:before{content:"";display:inline-block;width:1em;height:1em;margin-right:4px;-webkit-mask-image:var(--debugbar-icon-table);mask-image:var(--debugbar-icon-table);-webkit-mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;mask-size:contain;mask-repeat:no-repeat;mask-position:center;background-color:currentColor}div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-collector{color:#555;font-style:italic}div.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar{position:relative;flex-shrink:0;width:100%;background:var(--debugbar-header);color:var(--debugbar-text);border-top:1px solid var(--debugbar-border);border-bottom:0px;height:20px;padding:4px 0}div.phpdebugbar-widgets-messages li .phpdebugbar-widgets-label-called-from{float:right;color:var(--debugbar-text-muted);padding-left:5px;border-bottom:1px dotted var(--debugbar-border)}div.phpdebugbar-widgets-messages li .phpdebugbar-widgets-label-called-from:before{content:"";display:inline-block;width:1em;height:1em;margin-right:4px;vertical-align:middle;-webkit-mask-image:var(--debugbar-icon-link);mask-image:var(--debugbar-icon-link);-webkit-mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;mask-size:contain;mask-repeat:no-repeat;mask-position:center;background-color:currentColor}div.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar input{border:0;margin:0 0 0 7px;width:30%;box-shadow:none;border-radius:3px;padding:2px 6px;height:15px}div.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar input:focus{outline:none}div.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter{float:right;font-size:12px;padding:2px 4px;background:#7cacd5;margin:0 2px;border-radius:4px;color:var(--debugbar-background);text-decoration:none}div.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter.phpdebugbar-widgets-excluded{background:var(--debugbar-active);color:var(--debugbar-text-muted)}dl.phpdebugbar-widgets-kvlist{margin:0;display:grid;grid-template-columns:minmax(160px,15%) minmax(0,1fr)}dl.phpdebugbar-widgets-kvlist dt{grid-column:1;min-width:0;padding:5px 10px;border-top:1px solid var(--debugbar-border);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}dl.phpdebugbar-widgets-kvlist dd{grid-column:2;margin:0;padding:5px 10px;border-top:1px solid var(--debugbar-border);cursor:pointer;min-height:17px;overflow-wrap:anywhere;overflow-x:auto}dl.phpdebugbar-widgets-varlist,dl.phpdebugbar-widgets-jsonvarlist,dl.phpdebugbar-widgets-htmlvarlist{font-family:var(--debugbar-font-mono)}dl.phpdebugbar-widgets-jsonvarlist dd,dl.phpdebugbar-widgets-htmlvarlist dd{cursor:initial}ul.phpdebugbar-widgets-timeline{margin:0;padding:0;list-style:none}ul.phpdebugbar-widgets-timeline .phpdebugbar-widgets-measure{height:20px;position:relative;border:none;display:block}ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-label,ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-collector{position:absolute;font-size:12px;font-family:var(--debugbar-font-mono);color:var(--debugbar-text);top:4px;left:5px;background:none;text-shadow:none;font-weight:400;white-space:pre}ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-collector{left:initial;right:5px}ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-value{display:block;position:absolute;height:calc(100% - 4px);background-color:var(--debugbar-accent);border-bottom:2px solid var(--debugbar-accent-border);top:2px;border-radius:3px;min-width:2px}div.phpdebugbar-widgets-exceptions li.phpdebugbar-widgets-list-item{cursor:pointer}div.phpdebugbar-widgets-exceptions li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-message{display:block;color:red}div.phpdebugbar-widgets-exceptions li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-type{display:block;position:absolute;right:4px;top:4px;font-weight:700}div.phpdebugbar-widgets-exceptions li.phpdebugbar-widgets-list-item pre.phpdebugbar-widgets-file{margin:10px;padding:5px;border:1px solid var(--debugbar-border);font-family:var(--debugbar-font-mono)}div.phpdebugbar-widgets-exceptions li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-filename{float:none}div.phpdebugbar[data-theme=dark] code.phpdebugbar-widgets-sql,div.phpdebugbar[data-theme=dark] .phpdebugbar-widgets-name,div.phpdebugbar[data-theme=dark] .phpdebugbar-widgets-key,div.phpdebugbar[data-theme=dark] .phpdebugbar-widgets-success>pre.sf-dump>.sf-dump-note{color:#fdfd96}table.phpdebugbar-widgets-tablevar{width:100%;table-layout:auto;font-size:1em}table.phpdebugbar-widgets-tablevar td:first-child{width:150px;white-space:nowrap;font-family:var(--debugbar-font-mono)}table.phpdebugbar-widgets-tablevar td.phpdebugbar-widgets-editor{width:5%;white-space:nowrap;text-align:right}table.phpdebugbar-widgets-tablevar tr.phpdebugbar-widgets-header td,table.phpdebugbar-widgets-tablevar tr.phpdebugbar-widgets-summary td{font-weight:700}table.phpdebugbar-widgets-tablevar td{padding:2px 4px;border-bottom:1px solid var(--debugbar-border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400}table.phpdebugbar-widgets-tablevar tr.phpdebugbar-widgets-header td,table.phpdebugbar-widgets-tablevar tr.phpdebugbar-widgets-summary td{position:sticky;inset-inline-start:0px;background:var(--debugbar-background);border-bottom:none;z-index:1;top:0;bottom:0}table.phpdebugbar-widgets-tablevar tr.phpdebugbar-widgets-header td:after,table.phpdebugbar-widgets-tablevar tr.phpdebugbar-widgets-summary td:after{content:"";position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:var(--debugbar-border)}table.phpdebugbar-widgets-tablevar tr.phpdebugbar-widgets-summary td:after{bottom:auto;top:0}div.phpdebugbar span.phpdebugbar-widgets-badge{margin:0 5px 0 8px;font-size:11px;line-height:14px;padding:0 6px;background:var(--debugbar-badge-active);border-radius:4px;color:var(--debugbar-badge-active-text);font-weight:400;text-shadow:none;vertical-align:middle}.phpdebugbar .phpdebugbar-widgets-datasets-switcher-widget{position:relative;float:right;display:flex;padding:0!important;margin:0!important;height:32px;align-items:center}.phpdebugbar .phpdebugbar-widgets-datasets-badge{position:relative;display:flex;align-items:center;gap:6px;padding:0 10px;height:32px;background:var(--debugbar-header);color:var(--debugbar-header-text);cursor:pointer;font-size:12px;line-height:normal;transition:background-color .15s;font-family:var(--debugbar-font-sans);border-right:1px solid var(--debugbar-header-border)}.phpdebugbar .phpdebugbar-widgets-datasets-badge:hover{background:var(--debugbar-active)}.phpdebugbar .phpdebugbar-widgets-datasets-badge-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;background:var(--debugbar-badge);color:var(--debugbar-badge-text);border-radius:9px;font-weight:600;font-size:11px}.phpdebugbar .phpdebugbar-widgets-datasets-badge-count[hidden]{display:none}.phpdebugbar .phpdebugbar-widgets-datasets-badge-url{max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--debugbar-font-mono)}.phpdebugbar-widgets-datasets-panel{position:fixed;width:600px;background:var(--debugbar-background);border:1px solid var(--debugbar-border);box-shadow:0 2px 8px #0000001a;overflow:hidden;z-index:100000001}.phpdebugbar-widgets-datasets-panel-toolbar{display:flex;align-items:center;gap:8px;padding:6px 10px;background:var(--debugbar-background-alt);border-bottom:1px solid var(--debugbar-border);font-size:12px;font-family:var(--debugbar-font-sans)}.phpdebugbar-widgets-datasets-autoshow{display:flex;align-items:center;gap:4px;cursor:pointer;color:var(--debugbar-text);white-space:nowrap;font-family:var(--debugbar-font-sans)}.phpdebugbar-widgets-datasets-autoshow input[type=checkbox]{cursor:pointer;margin:0}.phpdebugbar-widgets-datasets-clear-btn,.phpdebugbar-widgets-datasets-showall-btn{color:var(--debugbar-link);text-decoration:none;cursor:pointer;white-space:nowrap;font-family:var(--debugbar-font-sans)}.phpdebugbar-widgets-datasets-clear-btn:hover,.phpdebugbar-widgets-datasets-showall-btn:hover{color:var(--debugbar-hover);text-decoration:underline}.phpdebugbar-widgets-datasets-refresh-btn{color:var(--debugbar-text-muted);text-decoration:none;cursor:pointer;white-space:nowrap;font-size:14px;display:inline-flex;align-items:center}.phpdebugbar-widgets-datasets-refresh-btn[hidden]{display:none}.phpdebugbar-widgets-datasets-refresh-btn:hover,.phpdebugbar-widgets-datasets-refresh-btn.phpdebugbar-widgets-active{color:var(--debugbar-text)}.phpdebugbar-widgets-datasets-refresh-btn.phpdebugbar-widgets-active i{animation:phpdebugbar-spin 2s linear infinite}@keyframes phpdebugbar-spin{0%{transform:rotate(0)}to{transform:rotate(-360deg)}}.phpdebugbar-widgets-datasets-search{flex:1;padding:3px 8px;font-size:11px;min-width:120px;border:1px solid var(--debugbar-border);background:var(--debugbar-background);color:var(--debugbar-text);border-radius:2px;font-family:var(--debugbar-font-sans)}.phpdebugbar-widgets-datasets-list{max-height:300px;overflow-y:auto}.phpdebugbar-widgets-datasets-list-item{display:grid;grid-template-columns:45px 50px 1fr auto auto auto;gap:6px;padding:5px 10px;border-bottom:1px solid var(--debugbar-border);cursor:pointer;transition:background-color .1s;align-items:center;font-size:11px}.phpdebugbar-widgets-datasets-list-item[hidden]{display:none}.phpdebugbar-widgets-datasets-list-item:hover{background:var(--debugbar-background-alt)}.phpdebugbar-widgets-datasets-list-item.phpdebugbar-widgets-active{background:var(--debugbar-active);font-weight:500}.phpdebugbar-widgets-datasets-item-nb{color:var(--debugbar-text-muted);font-weight:600;font-family:var(--debugbar-font-mono)}.phpdebugbar-widgets-datasets-item-copy-id{cursor:pointer;color:var(--debugbar-text-muted);display:inline-flex;align-items:center;margin-right:-4px;position:relative}.phpdebugbar-widgets-datasets-item-copy-id i{font-size:12px}.phpdebugbar-widgets-datasets-item-copy-id:hover{color:var(--debugbar-text)}.phpdebugbar-widgets-datasets-item-copy-id.phpdebugbar-widgets-copied{color:var(--debugbar-success, #28a745)}.phpdebugbar-widgets-datasets-item-time{color:var(--debugbar-text-muted);font-family:var(--debugbar-font-mono)}.phpdebugbar-widgets-datasets-item-request{display:flex;gap:6px;align-items:center;overflow:hidden}.phpdebugbar-widgets-datasets-item-method{padding:1px 5px;background:var(--debugbar-badge);color:var(--debugbar-badge-text);border-radius:2px;font-weight:600;font-family:var(--debugbar-font-mono);flex-shrink:0}.phpdebugbar-widgets-datasets-item-url{color:var(--debugbar-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--debugbar-font-mono)}.phpdebugbar-widgets-datasets-item-suffix{color:var(--debugbar-text-muted);font-family:var(--debugbar-font-mono);flex-shrink:0}.phpdebugbar-widgets-datasets-item-badges{display:inline-flex;gap:4px;align-items:center;flex-wrap:wrap}.phpdebugbar-widgets-datasets-item-badge{display:inline-flex;align-items:center;gap:2px;padding:1px 4px;background:var(--debugbar-badge);color:var(--debugbar-badge-text);border-radius:2px;font-size:10px;font-weight:600;cursor:pointer;transition:background-color .1s}.phpdebugbar-widgets-datasets-item-badge:hover{background:var(--debugbar-badge-active);color:var(--debugbar-badge-active-text)}.phpdebugbar-widgets-datasets-item-badge i{width:12px;height:12px}div.phpdebugbar-openhandler-overlay{position:fixed;left:0;top:0;width:100%;height:100%;background:#000;opacity:.3;z-index:100000002}div.phpdebugbar-openhandler{position:fixed;margin:auto;inset:0;width:80%;height:70%;background:var(--debugbar-background);color:var(--debugbar-text);border:2px solid var(--debugbar-header-border);overflow:auto;z-index:100000003;font-family:var(--debugbar-font-sans);font-size:14px;padding:0}div.phpdebugbar-openhandler select,div.phpdebugbar-openhandler input{appearance:auto}div.phpdebugbar-openhandler input,div.phpdebugbar-openhandler select{color:var(--debugbar-header-text);background-color:var(--debugbar-header);border:1px solid var(--debugbar-header-border);border-radius:.25rem;height:20px;margin:0 5px;padding:0}div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions input[name=uri]{width:200px}div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions input[name=ip]{width:90px}div.phpdebugbar-openhandler a{color:var(--debugbar-header-text)}div.phpdebugbar-openhandler .phpdebugbar-openhandler-header{background:var(--debugbar-header) no-repeat 5px 4px;color:var(--debugbar-header-text);margin-bottom:10px;display:flex;align-items:center;padding:5px 8px}div.phpdebugbar-openhandler .phpdebugbar-openhandler-header .phpdebugbar-openhandler-closebtn,div.phpdebugbar-openhandler .phpdebugbar-openhandler-header .phpdebugbar-openhandler-brand{font-size:14px;color:var(--debugbar-header-text);text-decoration:none;padding-right:5px;line-height:1;align-items:center}div.phpdebugbar-openhandler .phpdebugbar-openhandler-header .phpdebugbar-openhandler-closebtn{margin-left:auto}div.phpdebugbar-openhandler table{width:100%;table-layout:fixed;font-size:14px}div.phpdebugbar-openhandler table td,div.phpdebugbar-openhandler table th{border:0px solid var(--debugbar-border);padding:2px 8px}div.phpdebugbar-openhandler table th,div.phpdebugbar-openhandler table tr:nth-child(2n){background-color:var(--debugbar-background-alt)}div.phpdebugbar-openhandler table th:nth-child(3),div.phpdebugbar-openhandler table td:nth-child(3),div.phpdebugbar-openhandler table th:nth-child(5),div.phpdebugbar-openhandler table td:nth-child(5),div.phpdebugbar-openhandler table th:nth-child(6),div.phpdebugbar-openhandler table td:nth-child(6){text-align:center}div.phpdebugbar-openhandler table td{padding:6px 3px;border-bottom:1px solid var(--debugbar-border)}div.phpdebugbar-openhandler table td a{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.phpdebugbar-openhandler-id-cell{display:flex;align-items:center;gap:4px}.phpdebugbar-openhandler-id-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:55px;display:inline-block;font-family:var(--debugbar-font-mono);font-size:12px}.phpdebugbar-openhandler-copy-id{cursor:pointer;color:var(--debugbar-text-muted);display:inline-flex;align-items:center;position:relative;flex-shrink:0}.phpdebugbar-openhandler-copy-id i{font-size:12px}.phpdebugbar-openhandler-copy-id:hover{color:var(--debugbar-text)}.phpdebugbar-openhandler-copy-id.phpdebugbar-openhandler-copied{color:var(--debugbar-success, #28a745)}div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions{text-align:center;padding:7px 0}div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions a{color:var(--debugbar-header-text);background-color:var(--debugbar-header);border:1px solid var(--debugbar-header-border);border-radius:.25rem;margin:5px;padding:4px 12px}div.phpdebugbar-widgets-mails span.phpdebugbar-widgets-subject{display:block}div.phpdebugbar-widgets-mails li.phpdebugbar-widgets-list-item pre.phpdebugbar-widgets-headers{margin:10px;padding:5px;border:1px solid var(--debugbar-border);font-family:var(--debugbar-font-mono)}div.phpdebugbar-widgets-sqlqueries{position:relative;height:100%;overflow:hidden;display:flex;flex-direction:column}div.phpdebugbar-widgets-sqlqueries .phpdebugbar-widgets-status{font-family:var(--debugbar-font-mono);padding:6px;border-bottom:1px solid var(--debugbar-border);font-weight:700;color:var(--debugbar-text);background-color:var(--debugbar-background-alt);flex-shrink:0;order:1}div.phpdebugbar-widgets-sqlqueries ul.phpdebugbar-widgets-list{flex:1;overflow-y:auto;order:2}div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-error{color:red}div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-database,div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-duration,div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-memory,div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-row-count,div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-copy-clipboard,div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-stmt-id{float:right;margin-left:8px;color:var(--debugbar-text-muted)}div.phpdebugbar-widgets-sqlqueries div.phpdebugbar-widgets-status span.phpdebugbar-widgets-database,div.phpdebugbar-widgets-sqlqueries div.phpdebugbar-widgets-status span.phpdebugbar-widgets-duration,div.phpdebugbar-widgets-sqlqueries div.phpdebugbar-widgets-status span.phpdebugbar-widgets-memory,div.phpdebugbar-widgets-sqlqueries div.phpdebugbar-widgets-status span.phpdebugbar-widgets-row-count,div.phpdebugbar-widgets-sqlqueries div.phpdebugbar-widgets-status span.phpdebugbar-widgets-copy-clipboard,div.phpdebugbar-widgets-sqlqueries div.phpdebugbar-widgets-status span.phpdebugbar-widgets-stmt-id{color:var(--debugbar-text)}div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-database:before,div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-duration:before,div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-memory:before,div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-row-count:before,div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-copy-clipboard:before,div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-copy-clipboard-check:before,div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-stmt-id:before{content:"";display:inline-block;width:1em;height:1em;margin-right:4px;vertical-align:middle;-webkit-mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;mask-size:contain;mask-repeat:no-repeat;mask-position:center;background-color:currentColor}div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-database:before{-webkit-mask-image:var(--debugbar-icon-database);mask-image:var(--debugbar-icon-database)}div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-duration:before{-webkit-mask-image:var(--debugbar-icon-clock);mask-image:var(--debugbar-icon-clock)}div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-memory:before{-webkit-mask-image:var(--debugbar-icon-cpu);mask-image:var(--debugbar-icon-cpu)}div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-row-count:before{-webkit-mask-image:var(--debugbar-icon-table);mask-image:var(--debugbar-icon-table)}div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-stmt-id:before{-webkit-mask-image:var(--debugbar-icon-link);mask-image:var(--debugbar-icon-link)}div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-copy-clipboard:before{-webkit-mask-image:var(--debugbar-icon-copy);mask-image:var(--debugbar-icon-copy)}div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-copy-clipboard-check:before{-webkit-mask-image:var(--debugbar-icon-circle-check);mask-image:var(--debugbar-icon-circle-check)}div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-error{display:block;font-weight:700}code.phpdebugbar-widgets-sql{white-space:pre-wrap;overflow-wrap:break-word;word-wrap:break-word}div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-slow{background-color:#ffe4e4}div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-duplicate{background-color:#fdfdcd}div.phpdebugbar[data-theme=dark] div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-slow{background-color:#623100}div.phpdebugbar[data-theme=dark] div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-duplicate{background-color:#565602}div.phpdebugbar-widgets-sqlqueries div.phpdebugbar-widgets-toolbar{position:relative;flex-shrink:0;width:100%;z-index:1;order:3}div.phpdebugbar-widgets-sqlqueries div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter{float:right;font-size:12px;padding:2px 4px;background:#7cacd5;margin:0 2px;border-radius:4px;color:#fff;text-decoration:none}div.phpdebugbar-widgets-sqlqueries div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter.phpdebugbar-widgets-excluded{background:var(--debugbar-background);color:var(--debugbar-text)}div.phpdebugbar-widgets-sqlqueries a.phpdebugbar-widgets-duplicates{font-weight:700;text-decoration:underline}div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item div.phpdebugbar-widgets-bg-measure{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden;pointer-events:none}div.phpdebugbar-widgets-sqlqueries div.phpdebugbar-widgets-bg-measure div.phpdebugbar-widgets-value{position:absolute;bottom:0;height:1px;opacity:1;background:var(--debugbar-accent-border)}div.phpdebugbar-widgets-sqlqueries td.phpdebugbar-widgets-value li.phpdebugbar-widgets-table-list-item{text-align:left;padding-left:6px}div.phpdebugbar-widgets-sqlqueries .phpdebugbar-text-muted{color:var(--debugbar-text-muted)}div.phpdebugbar-widgets-sqlqueries .phpdebugbar-widgets-transaction,div.phpdebugbar-widgets-sqlqueries .phpdebugbar-widgets-message,div.phpdebugbar-widgets-sqlqueries .phpdebugbar-widgets-info{font-weight:bolder}div.phpdebugbar-widgets-sqlqueries .phpdebugbar-widgets-transaction{color:#d73a49}[data-theme=dark] div.phpdebugbar-widgets-sqlqueries .phpdebugbar-widgets-transaction{color:#ff7b72}div.phpdebugbar-widgets-templates div.phpdebugbar-widgets-status{font-family:var(--debugbar-font-mono);padding:6px;border-bottom:1px solid var(--debugbar-border);font-weight:700;color:var(--debugbar-text);background-color:var(--debugbar-background-alt)}div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-render-time,div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-memory,div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-param-count,div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-type{float:right;margin-left:8px;color:var(--debugbar-text)}div.phpdebugbar-widgets-templates div.phpdebugbar-widgets-status span.phpdebugbar-widgets-render-time,div.phpdebugbar-widgets-templates div.phpdebugbar-widgets-status span.phpdebugbar-widgets-memory,div.phpdebugbar-widgets-templates div.phpdebugbar-widgets-status span.phpdebugbar-widgets-param-count,div.phpdebugbar-widgets-templates div.phpdebugbar-widgets-status a.phpdebugbar-widgets-editor-link,div.phpdebugbar-widgets-templates div.phpdebugbar-widgets-status span.phpdebugbar-widgets-type{color:var(--debugbar-text)}div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-render-time:before,div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-memory:before,div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-param-count:before,div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-type:before{content:"";display:inline-block;width:1em;height:1em;margin-right:4px;vertical-align:middle;-webkit-mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;mask-size:contain;mask-repeat:no-repeat;mask-position:center;background-color:currentColor}div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-render-time:before{-webkit-mask-image:var(--debugbar-icon-clock);mask-image:var(--debugbar-icon-clock)}div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-memory:before{-webkit-mask-image:var(--debugbar-icon-cpu);mask-image:var(--debugbar-icon-cpu)}div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-param-count:before{-webkit-mask-image:var(--debugbar-icon-table);mask-image:var(--debugbar-icon-table)}div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-type:before{-webkit-mask-image:var(--debugbar-icon-code);mask-image:var(--debugbar-icon-code)}div.phpdebugbar[data-theme=dark] div.phpdebugbar-widgets-templates div.phpdebugbar-widgets-callgraph>pre *{background-color:inherit!important}pre code.phpdebugbar-hljs{display:block;overflow-x:auto;padding:1em}code.phpdebugbar-hljs{padding:3px 5px}/*!
+ Theme: GitHub
+ Description: Light theme as seen on github.com
+ Author: github.com
+ Maintainer: @Hirse
+ Updated: 2021-05-15
+
+ Outdated base version: https://github.com/primer/github-syntax-light
+ Current colors taken from GitHub's CSS
+*/.phpdebugbar-hljs{color:var(--debugbar-text)}.phpdebugbar-hljs-doctag,.phpdebugbar-hljs-keyword,.phpdebugbar-hljs-meta .phpdebugbar-hljs-keyword,.phpdebugbar-hljs-template-tag,.phpdebugbar-hljs-template-variable,.phpdebugbar-hljs-type,.phpdebugbar-hljs-variable.language_{color:#d73a49}.phpdebugbar-hljs-title,.phpdebugbar-hljs-title.class_,.phpdebugbar-hljs-title.class_.inherited__,.phpdebugbar-hljs-title.function_{color:#6f42c1}.phpdebugbar-hljs-attr,.phpdebugbar-hljs-attribute,.phpdebugbar-hljs-literal,.phpdebugbar-hljs-meta,.phpdebugbar-hljs-number,.phpdebugbar-hljs-operator,.phpdebugbar-hljs-variable,.phpdebugbar-hljs-selector-attr,.phpdebugbar-hljs-selector-class,.phpdebugbar-hljs-selector-id{color:#005cc5}.phpdebugbar-hljs-regexp,.phpdebugbar-hljs-string,.phpdebugbar-hljs-meta .phpdebugbar-hljs-string{color:#032f62}.phpdebugbar-hljs-built_in,.phpdebugbar-hljs-symbol{color:#e36209}.phpdebugbar-hljs-comment,.phpdebugbar-hljs-code,.phpdebugbar-hljs-formula{color:#6a737d}.phpdebugbar-hljs-name,.phpdebugbar-hljs-quote,.phpdebugbar-hljs-selector-tag,.phpdebugbar-hljs-selector-pseudo{color:#22863a}.phpdebugbar-hljs-subst{color:#24292e}.phpdebugbar-hljs-section{color:#005cc5;font-weight:700}.phpdebugbar-hljs-bullet{color:#735c0f}.phpdebugbar-hljs-emphasis{color:#24292e;font-style:italic}.phpdebugbar-hljs-strong{color:#24292e;font-weight:700}.phpdebugbar-hljs-addition{color:#22863a;background-color:#f0fff4}.phpdebugbar-hljs-deletion{color:#b31d28;background-color:#ffeef0}/*!
+ Theme: GitHub Dark
+ Description: Dark theme as seen on github.com
+ Author: github.com
+ Maintainer: @Hirse
+ Updated: 2021-05-15
+
+ Outdated base version: https://github.com/primer/github-syntax-dark
+ Current colors taken from GitHub's CSS
+*/[data-theme=dark] .phpdebugbar-hljs-doctag,[data-theme=dark] .phpdebugbar-hljs-keyword,[data-theme=dark] .phpdebugbar-hljs-meta [data-theme=dark] .phpdebugbar-hljs-keyword,[data-theme=dark] .phpdebugbar-hljs-template-tag,[data-theme=dark] .phpdebugbar-hljs-template-variable,[data-theme=dark] .phpdebugbar-hljs-type,[data-theme=dark] .phpdebugbar-hljs-variable.language_{color:#ff7b72}[data-theme=dark] .phpdebugbar-hljs-title,[data-theme=dark] .phpdebugbar-hljs-title.class_,[data-theme=dark] .phpdebugbar-hljs-title.class_.inherited__,[data-theme=dark] .phpdebugbar-hljs-title.function_{color:#d2a8ff}[data-theme=dark] .phpdebugbar-hljs-attr,[data-theme=dark] .phpdebugbar-hljs-attribute,[data-theme=dark] .phpdebugbar-hljs-literal,[data-theme=dark] .phpdebugbar-hljs-meta,[data-theme=dark] .phpdebugbar-hljs-number,[data-theme=dark] .phpdebugbar-hljs-operator,[data-theme=dark] .phpdebugbar-hljs-variable,[data-theme=dark] .phpdebugbar-hljs-selector-attr,[data-theme=dark] .phpdebugbar-hljs-selector-class,[data-theme=dark] .phpdebugbar-hljs-selector-id{color:#79c0ff}[data-theme=dark] .phpdebugbar-hljs-regexp,[data-theme=dark] .phpdebugbar-hljs-string,[data-theme=dark] .phpdebugbar-hljs-meta [data-theme=dark] .phpdebugbar-hljs-string{color:#a5d6ff}[data-theme=dark] .phpdebugbar-hljs-built_in,[data-theme=dark] .phpdebugbar-hljs-symbol{color:#ffa657}[data-theme=dark] .phpdebugbar-hljs-comment,[data-theme=dark] .phpdebugbar-hljs-code,[data-theme=dark] .phpdebugbar-hljs-formula{color:#8b949e}[data-theme=dark] .phpdebugbar-hljs-name,[data-theme=dark] .phpdebugbar-hljs-quote,[data-theme=dark] .phpdebugbar-hljs-selector-tag,[data-theme=dark] .phpdebugbar-hljs-selector-pseudo{color:#7ee787}[data-theme=dark] .phpdebugbar-hljs-subst{color:#c9d1d9}[data-theme=dark] .phpdebugbar-hljs-section{color:#1f6feb;font-weight:700}[data-theme=dark] .phpdebugbar-hljs-bullet{color:#f2cc60}[data-theme=dark] .phpdebugbar-hljs-emphasis{color:#c9d1d9;font-style:italic}[data-theme=dark] .phpdebugbar-hljs-strong{color:#c9d1d9;font-weight:700}[data-theme=dark] .phpdebugbar-hljs-addition{color:#aff5b4;background-color:#033a16}[data-theme=dark] .phpdebugbar-hljs-deletion{color:#ffdcd7;background-color:#67060c}.phpdebugbar pre.sf-dump .sf-dump-compact{display:none}.phpdebugbar pre.sf-dump{display:block;white-space:pre;padding:5px;overflow:initial!important}.phpdebugbar pre.sf-dump a{text-decoration:none;cursor:pointer;border:0;outline:none;color:inherit}.phpdebugbar pre.sf-dump,.phpdebugbar pre.sf-dump .sf-dump-default{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.phpdebugbar pre.sf-dump .sf-dump-num{font-weight:700;color:#1299da}.phpdebugbar pre.sf-dump .sf-dump-const{font-weight:700}.phpdebugbar pre.sf-dump .sf-dump-str{font-weight:700;color:#3a9b26}.phpdebugbar pre.sf-dump .sf-dump-note{color:#1299da}.phpdebugbar pre.sf-dump .sf-dump-ref{color:#7b7b7b}.phpdebugbar pre.sf-dump .sf-dump-public,.phpdebugbar pre.sf-dump .sf-dump-protected,.phpdebugbar pre.sf-dump .sf-dump-private{color:#000}.phpdebugbar pre.sf-dump .sf-dump-meta{color:#b729d9}.phpdebugbar pre.sf-dump .sf-dump-key{color:#3a9b26}.phpdebugbar pre.sf-dump .sf-dump-index{color:#1299da}.phpdebugbar[data-theme=dark] pre.sf-dump,pre.sf-dump .sf-dump-default{background-color:#18171b;color:#ff8400;line-height:1.2em;font:12px Menlo,Monaco,Consolas,monospace;word-wrap:break-word;white-space:pre-wrap;position:relative;z-index:99999;word-break:break-all}.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-num{font-weight:700;color:#1299da}.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-const{font-weight:700}.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-str{font-weight:700;color:#56db3a}.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-note{color:#1299da}.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-ref{color:#a0a0a0}.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-public,.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-protected,.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-private{color:#fff}.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-meta{color:#b729d9}.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-key{color:#56db3a}.phpdebugbar[data-theme=dark] pre.sf-dump .sf-dump-index{color:#1299da}.phpdebugbar pre.sf-dump samp{display:block;padding-left:2ch}.phpdebugbar pre.sf-dump .sf-dump-preview{opacity:.6;cursor:pointer;display:inline-block;max-width:80%;vertical-align:top;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-left:.4em}.phpdebugbar pre.sf-dump .sf-dump-hidden{display:none!important}
diff --git a/resources/dist/debugbar.min.js b/resources/dist/debugbar.min.js
new file mode 100644
index 000000000..5078e1883
--- /dev/null
+++ b/resources/dist/debugbar.min.js
@@ -0,0 +1,22 @@
+(()=>{var Pn=Object.defineProperty,Un=Object.defineProperties;var Bn=Object.getOwnPropertyDescriptors;var Pt=Object.getOwnPropertySymbols;var Hn=Object.prototype.hasOwnProperty,Wn=Object.prototype.propertyIsEnumerable;var Bt=Math.pow,Ut=(s,W,S)=>W in s?Pn(s,W,{enumerable:!0,configurable:!0,writable:!0,value:S}):s[W]=S,et=(s,W)=>{for(var S in W||(W={}))Hn.call(W,S)&&Ut(s,S,W[S]);if(Pt)for(var S of Pt(W))Wn.call(W,S)&&Ut(s,S,W[S]);return s},Ht=(s,W)=>Un(s,Bn(W));var Wt=(s,W,S)=>new Promise((g,d)=>{var w=M=>{try{B(S.next(M))}catch(U){d(U)}},c=M=>{try{B(S.throw(M))}catch(U){d(U)}},B=M=>M.done?g(M.value):Promise.resolve(M.value).then(w,c);B((S=S.apply(s,W)).next())});(()=>{var s=Object.create,W=Object.defineProperty,S=Object.getOwnPropertyDescriptor,g=Object.getOwnPropertyNames,d=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty,c=(L,k)=>()=>(k||L((k={exports:{}}).exports,k),k.exports),B=(L,k,q,ee)=>{if(k&&typeof k=="object"||typeof k=="function")for(let ne of g(k))!w.call(L,ne)&&ne!==q&&W(L,ne,{get:()=>k[ne],enumerable:!(ee=S(k,ne))||ee.enumerable});return L},M=(L,k,q)=>(q=L!=null?s(d(L)):{},B(k||!L||!L.__esModule?W(q,"default",{value:L,enumerable:!0}):q,L)),U=c((L,k)=>{function q(n){return n instanceof Map?n.clear=n.delete=n.set=function(){throw new Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=function(){throw new Error("set is read-only")}),Object.freeze(n),Object.getOwnPropertyNames(n).forEach(x=>{let j=n[x],Z=typeof j;(Z==="object"||Z==="function")&&!Object.isFrozen(j)&&q(j)}),n}var ee=class{constructor(n){n.data===void 0&&(n.data={}),this.data=n.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function ne(n){return n.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function le(n,...x){let j=Object.create(null);for(let Z in n)j[Z]=n[Z];return x.forEach(function(Z){for(let de in Z)j[de]=Z[de]}),j}var ae="",se=n=>!!n.scope,ge=(n,{prefix:x})=>{if(n.startsWith("language:"))return n.replace("language:","language-");if(n.includes(".")){let j=n.split(".");return[`${x}${j.shift()}`,...j.map((Z,de)=>`${Z}${"_".repeat(de+1)}`)].join(" ")}return`${x}${n}`},ce=class{constructor(n,x){this.buffer="",this.classPrefix=x.classPrefix,n.walk(this)}addText(n){this.buffer+=ne(n)}openNode(n){if(!se(n))return;let x=ge(n.scope,{prefix:this.classPrefix});this.span(x)}closeNode(n){se(n)&&(this.buffer+=ae)}value(){return this.buffer}span(n){this.buffer+=``}},Ie=(n={})=>{let x={children:[]};return Object.assign(x,n),x},Me=class Ft{constructor(){this.rootNode=Ie(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(x){this.top.children.push(x)}openNode(x){let j=Ie({scope:x});this.add(j),this.stack.push(j)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(x){return this.constructor._walk(x,this.rootNode)}static _walk(x,j){return typeof j=="string"?x.addText(j):j.children&&(x.openNode(j),j.children.forEach(Z=>this._walk(x,Z)),x.closeNode(j)),x}static _collapse(x){typeof x!="string"&&x.children&&(x.children.every(j=>typeof j=="string")?x.children=[x.children.join("")]:x.children.forEach(j=>{Ft._collapse(j)}))}},Le=class extends Me{constructor(n){super(),this.options=n}addText(n){n!==""&&this.add(n)}startScope(n){this.openNode(n)}endScope(){this.closeNode()}__addSublanguage(n,x){let j=n.root;x&&(j.scope=`language:${x}`),this.add(j)}toHTML(){return new ce(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}};function me(n){return n?typeof n=="string"?n:n.source:null}function Ce(n){return Te("(?=",n,")")}function De(n){return Te("(?:",n,")*")}function Pe(n){return Te("(?:",n,")?")}function Te(...n){return n.map(x=>me(x)).join("")}function ke(n){let x=n[n.length-1];return typeof x=="object"&&x.constructor===Object?(n.splice(n.length-1,1),x):{}}function ve(...n){return"("+(ke(n).capture?"":"?:")+n.map(x=>me(x)).join("|")+")"}function xe(n){return new RegExp(n.toString()+"|").exec("").length-1}function he(n,x){let j=n&&n.exec(x);return j&&j.index===0}var we=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function ye(n,{joinWith:x}){let j=0;return n.map(Z=>{j+=1;let de=j,ue=me(Z),$="";for(;ue.length>0;){let V=we.exec(ue);if(!V){$+=ue;break}$+=ue.substring(0,V.index),ue=ue.substring(V.index+V[0].length),V[0][0]==="\\"&&V[1]?$+="\\"+String(Number(V[1])+de):($+=V[0],V[0]==="("&&j++)}return $}).map(Z=>`(${Z})`).join(x)}var Ge=/\b\B/,_e="[a-zA-Z]\\w*",je="[a-zA-Z_]\\w*",Xe="\\b\\d+(\\.\\d+)?",Ke="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",Ae="\\b(0b[01]+)",Ne="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",Ue=(n={})=>{let x=/^#![ ]*\//;return n.binary&&(n.begin=Te(x,/.*\b/,n.binary,/\b.*/)),le({scope:"meta",begin:x,end:/$/,relevance:0,"on:begin":(j,Z)=>{j.index!==0&&Z.ignoreMatch()}},n)},qe={begin:"\\\\[\\s\\S]",relevance:0},Se={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[qe]},Ve={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[qe]},Qe={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},$e=function(n,x,j={}){let Z=le({scope:"comment",begin:n,end:x,contains:[]},j);Z.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let de=ve("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return Z.contains.push({begin:Te(/[ ]+/,"(",de,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),Z},st=$e("//","$"),at=$e("/\\*","\\*/"),Gt=$e("#","$"),jt={scope:"number",begin:Xe,relevance:0},Vt={scope:"number",begin:Ke,relevance:0},$t={scope:"number",begin:Ae,relevance:0},zt={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[qe,{begin:/\[/,end:/\]/,relevance:0,contains:[qe]}]},Yt={scope:"title",begin:_e,relevance:0},Xt={scope:"title",begin:je,relevance:0},Kt={begin:"\\.\\s*"+je,relevance:0},qt=function(n){return Object.assign(n,{"on:begin":(x,j)=>{j.data._beginMatch=x[1]},"on:end":(x,j)=>{j.data._beginMatch!==x[1]&&j.ignoreMatch()}})},rt=Object.freeze({__proto__:null,APOS_STRING_MODE:Se,BACKSLASH_ESCAPE:qe,BINARY_NUMBER_MODE:$t,BINARY_NUMBER_RE:Ae,COMMENT:$e,C_BLOCK_COMMENT_MODE:at,C_LINE_COMMENT_MODE:st,C_NUMBER_MODE:Vt,C_NUMBER_RE:Ke,END_SAME_AS_BEGIN:qt,HASH_COMMENT_MODE:Gt,IDENT_RE:_e,MATCH_NOTHING_RE:Ge,METHOD_GUARD:Kt,NUMBER_MODE:jt,NUMBER_RE:Xe,PHRASAL_WORDS_MODE:Qe,QUOTE_STRING_MODE:Ve,REGEXP_MODE:zt,RE_STARTERS_RE:Ne,SHEBANG:Ue,TITLE_MODE:Yt,UNDERSCORE_IDENT_RE:je,UNDERSCORE_TITLE_MODE:Xt});function Qt(n,x){n.input[n.index-1]==="."&&x.ignoreMatch()}function Zt(n,x){n.className!==void 0&&(n.scope=n.className,delete n.className)}function Jt(n,x){x&&n.beginKeywords&&(n.begin="\\b("+n.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",n.__beforeBegin=Qt,n.keywords=n.keywords||n.beginKeywords,delete n.beginKeywords,n.relevance===void 0&&(n.relevance=0))}function en(n,x){Array.isArray(n.illegal)&&(n.illegal=ve(...n.illegal))}function tn(n,x){if(n.match){if(n.begin||n.end)throw new Error("begin & end are not supported with match");n.begin=n.match,delete n.match}}function nn(n,x){n.relevance===void 0&&(n.relevance=1)}var sn=(n,x)=>{if(!n.beforeMatch)return;if(n.starts)throw new Error("beforeMatch cannot be used with starts");let j=Object.assign({},n);Object.keys(n).forEach(Z=>{delete n[Z]}),n.keywords=j.keywords,n.begin=Te(j.beforeMatch,Ce(j.begin)),n.starts={relevance:0,contains:[Object.assign(j,{endsParent:!0})]},n.relevance=0,delete j.beforeMatch},an=["of","and","for","in","not","or","if","then","parent","list","value"],rn="keyword";function Rt(n,x,j=rn){let Z=Object.create(null);return typeof n=="string"?de(j,n.split(" ")):Array.isArray(n)?de(j,n):Object.keys(n).forEach(function(ue){Object.assign(Z,Rt(n[ue],x,ue))}),Z;function de(ue,$){x&&($=$.map(V=>V.toLowerCase())),$.forEach(function(V){let K=V.split("|");Z[K[0]]=[ue,on(K[0],K[1])]})}}function on(n,x){return x?Number(x):ln(n)?0:1}function ln(n){return an.includes(n.toLowerCase())}var Lt={},Ze=n=>{console.error(n)},Nt=(n,...x)=>{console.log(`WARN: ${n}`,...x)},tt=(n,x)=>{Lt[`${n}/${x}`]||(console.log(`Deprecated as of ${n}. ${x}`),Lt[`${n}/${x}`]=!0)},ot=new Error;function _t(n,x,{key:j}){let Z=0,de=n[j],ue={},$={};for(let V=1;V<=x.length;V++)$[V+Z]=de[V],ue[V+Z]=!0,Z+=xe(x[V-1]);n[j]=$,n[j]._emit=ue,n[j]._multi=!0}function cn(n){if(Array.isArray(n.begin)){if(n.skip||n.excludeBegin||n.returnBegin)throw Ze("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),ot;if(typeof n.beginScope!="object"||n.beginScope===null)throw Ze("beginScope must be object"),ot;_t(n,n.begin,{key:"beginScope"}),n.begin=ye(n.begin,{joinWith:""})}}function dn(n){if(Array.isArray(n.end)){if(n.skip||n.excludeEnd||n.returnEnd)throw Ze("skip, excludeEnd, returnEnd not compatible with endScope: {}"),ot;if(typeof n.endScope!="object"||n.endScope===null)throw Ze("endScope must be object"),ot;_t(n,n.end,{key:"endScope"}),n.end=ye(n.end,{joinWith:""})}}function un(n){n.scope&&typeof n.scope=="object"&&n.scope!==null&&(n.beginScope=n.scope,delete n.scope)}function pn(n){un(n),typeof n.beginScope=="string"&&(n.beginScope={_wrap:n.beginScope}),typeof n.endScope=="string"&&(n.endScope={_wrap:n.endScope}),cn(n),dn(n)}function hn(n){function x($,V){return new RegExp(me($),"m"+(n.case_insensitive?"i":"")+(n.unicodeRegex?"u":"")+(V?"g":""))}class j{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(V,K){K.position=this.position++,this.matchIndexes[this.matchAt]=K,this.regexes.push([K,V]),this.matchAt+=xe(V)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);let V=this.regexes.map(K=>K[1]);this.matcherRe=x(ye(V,{joinWith:"|"}),!0),this.lastIndex=0}exec(V){this.matcherRe.lastIndex=this.lastIndex;let K=this.matcherRe.exec(V);if(!K)return null;let fe=K.findIndex((it,Et)=>Et>0&&it!==void 0),pe=this.matchIndexes[fe];return K.splice(0,fe),Object.assign(K,pe)}}class Z{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(V){if(this.multiRegexes[V])return this.multiRegexes[V];let K=new j;return this.rules.slice(V).forEach(([fe,pe])=>K.addRule(fe,pe)),K.compile(),this.multiRegexes[V]=K,K}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(V,K){this.rules.push([V,K]),K.type==="begin"&&this.count++}exec(V){let K=this.getMatcher(this.regexIndex);K.lastIndex=this.lastIndex;let fe=K.exec(V);if(this.resumingScanAtSamePosition()&&!(fe&&fe.index===this.lastIndex)){let pe=this.getMatcher(0);pe.lastIndex=this.lastIndex+1,fe=pe.exec(V)}return fe&&(this.regexIndex+=fe.position+1,this.regexIndex===this.count&&this.considerAll()),fe}}function de($){let V=new Z;return $.contains.forEach(K=>V.addRule(K.begin,{rule:K,type:"begin"})),$.terminatorEnd&&V.addRule($.terminatorEnd,{type:"end"}),$.illegal&&V.addRule($.illegal,{type:"illegal"}),V}function ue($,V){let K=$;if($.isCompiled)return K;[Zt,tn,pn,sn].forEach(pe=>pe($,V)),n.compilerExtensions.forEach(pe=>pe($,V)),$.__beforeBegin=null,[Jt,en,nn].forEach(pe=>pe($,V)),$.isCompiled=!0;let fe=null;return typeof $.keywords=="object"&&$.keywords.$pattern&&($.keywords=Object.assign({},$.keywords),fe=$.keywords.$pattern,delete $.keywords.$pattern),fe=fe||/\w+/,$.keywords&&($.keywords=Rt($.keywords,n.case_insensitive)),K.keywordPatternRe=x(fe,!0),V&&($.begin||($.begin=/\B|\b/),K.beginRe=x(K.begin),!$.end&&!$.endsWithParent&&($.end=/\B|\b/),$.end&&(K.endRe=x(K.end)),K.terminatorEnd=me(K.end)||"",$.endsWithParent&&V.terminatorEnd&&(K.terminatorEnd+=($.end?"|":"")+V.terminatorEnd)),$.illegal&&(K.illegalRe=x($.illegal)),$.contains||($.contains=[]),$.contains=[].concat(...$.contains.map(function(pe){return En(pe==="self"?$:pe)})),$.contains.forEach(function(pe){ue(pe,K)}),$.starts&&ue($.starts,V),K.matcher=de(K),K}if(n.compilerExtensions||(n.compilerExtensions=[]),n.contains&&n.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return n.classNameAliases=le(n.classNameAliases||{}),ue(n)}function St(n){return n?n.endsWithParent||St(n.starts):!1}function En(n){return n.variants&&!n.cachedVariants&&(n.cachedVariants=n.variants.map(function(x){return le(n,{variants:null},x)})),n.cachedVariants?n.cachedVariants:St(n)?le(n,{starts:n.starts?le(n.starts):null}):Object.isFrozen(n)?le(n):n}var gn="11.11.1",mn=class extends Error{constructor(n,x){super(n),this.name="HTMLInjectionError",this.html=x}},ht=ne,yt=le,At=Symbol("nomatch"),fn=7,Ot=function(n){let x=Object.create(null),j=Object.create(null),Z=[],de=!0,ue="Could not find the language '{}', did you forget to load/include a language module?",$={disableAutodetect:!0,name:"Plain text",contains:[]},V={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:Le};function K(D){return V.noHighlightRe.test(D)}function fe(D){let Y=D.className+" ";Y+=D.parentNode?D.parentNode.className:"";let te=V.languageDetectRe.exec(Y);if(te){let re=ze(te[1]);return re||(Nt(ue.replace("{}",te[1])),Nt("Falling back to no-highlight mode for this block.",D)),re?te[1]:"no-highlight"}return Y.split(/\s+/).find(re=>K(re)||ze(re))}function pe(D,Y,te){let re="",Ee="";typeof Y=="object"?(re=D,te=Y.ignoreIllegals,Ee=Y.language):(tt("10.7.0","highlight(lang, code, ...args) has been deprecated."),tt("10.7.0",`Please use highlight(code, options) instead.
+https://github.com/highlightjs/highlight.js/issues/2277`),Ee=D,re=Y),te===void 0&&(te=!0);let Be={code:re,language:Ee};ct("before:highlight",Be);let Ye=Be.result?Be.result:it(Be.language,Be.code,te);return Ye.code=Be.code,ct("after:highlight",Ye),Ye}function it(D,Y,te,re){let Ee=Object.create(null);function Be(F,z){return F.keywords[z]}function Ye(){if(!Q.keywords){be.addText(oe);return}let F=0;Q.keywordPatternRe.lastIndex=0;let z=Q.keywordPatternRe.exec(oe),J="";for(;z;){J+=oe.substring(F,z.index);let ie=We.case_insensitive?z[0].toLowerCase():z[0],Re=Be(Q,ie);if(Re){let[Fe,kn]=Re;if(be.addText(J),J="",Ee[ie]=(Ee[ie]||0)+1,Ee[ie]<=fn&&(pt+=kn),Fe.startsWith("_"))J+=z[0];else{let Mn=We.classNameAliases[Fe]||Fe;He(z[0],Mn)}}else J+=z[0];F=Q.keywordPatternRe.lastIndex,z=Q.keywordPatternRe.exec(oe)}J+=oe.substring(F),be.addText(J)}function dt(){if(oe==="")return;let F=null;if(typeof Q.subLanguage=="string"){if(!x[Q.subLanguage]){be.addText(oe);return}F=it(Q.subLanguage,oe,!0,Mt[Q.subLanguage]),Mt[Q.subLanguage]=F._top}else F=gt(oe,Q.subLanguage.length?Q.subLanguage:null);Q.relevance>0&&(pt+=F.relevance),be.__addSublanguage(F._emitter,F.language)}function Oe(){Q.subLanguage!=null?dt():Ye(),oe=""}function He(F,z){F!==""&&(be.startScope(z),be.addText(F),be.endScope())}function xt(F,z){let J=1,ie=z.length-1;for(;J<=ie;){if(!F._emit[J]){J++;continue}let Re=We.classNameAliases[F[J]]||F[J],Fe=z[J];Re?He(Fe,Re):(oe=Fe,Ye(),oe=""),J++}}function wt(F,z){return F.scope&&typeof F.scope=="string"&&be.openNode(We.classNameAliases[F.scope]||F.scope),F.beginScope&&(F.beginScope._wrap?(He(oe,We.classNameAliases[F.beginScope._wrap]||F.beginScope._wrap),oe=""):F.beginScope._multi&&(xt(F.beginScope,z),oe="")),Q=Object.create(F,{parent:{value:Q}}),Q}function Dt(F,z,J){let ie=he(F.endRe,J);if(ie){if(F["on:end"]){let Re=new ee(F);F["on:end"](z,Re),Re.isMatchIgnored&&(ie=!1)}if(ie){for(;F.endsParent&&F.parent;)F=F.parent;return F}}if(F.endsWithParent)return Dt(F.parent,z,J)}function Cn(F){return Q.matcher.regexIndex===0?(oe+=F[0],1):(Tt=!0,0)}function vn(F){let z=F[0],J=F.rule,ie=new ee(J),Re=[J.__beforeBegin,J["on:begin"]];for(let Fe of Re)if(Fe&&(Fe(F,ie),ie.isMatchIgnored))return Cn(z);return J.skip?oe+=z:(J.excludeBegin&&(oe+=z),Oe(),!J.returnBegin&&!J.excludeBegin&&(oe=z)),wt(J,F),J.returnBegin?0:z.length}function xn(F){let z=F[0],J=Y.substring(F.index),ie=Dt(Q,F,J);if(!ie)return At;let Re=Q;Q.endScope&&Q.endScope._wrap?(Oe(),He(z,Q.endScope._wrap)):Q.endScope&&Q.endScope._multi?(Oe(),xt(Q.endScope,F)):Re.skip?oe+=z:(Re.returnEnd||Re.excludeEnd||(oe+=z),Oe(),Re.excludeEnd&&(oe=z));do Q.scope&&be.closeNode(),!Q.skip&&!Q.subLanguage&&(pt+=Q.relevance),Q=Q.parent;while(Q!==ie.parent);return ie.starts&&wt(ie.starts,F),Re.returnEnd?0:z.length}function wn(){let F=[];for(let z=Q;z!==We;z=z.parent)z.scope&&F.unshift(z.scope);F.forEach(z=>be.openNode(z))}let ut={};function kt(F,z){let J=z&&z[0];if(oe+=F,J==null)return Oe(),0;if(ut.type==="begin"&&z.type==="end"&&ut.index===z.index&&J===""){if(oe+=Y.slice(z.index,z.index+1),!de){let ie=new Error(`0 width match regex (${D})`);throw ie.languageName=D,ie.badRule=ut.rule,ie}return 1}if(ut=z,z.type==="begin")return vn(z);if(z.type==="illegal"&&!te){let ie=new Error('Illegal lexeme "'+J+'" for mode "'+(Q.scope||"")+'"');throw ie.mode=Q,ie}else if(z.type==="end"){let ie=xn(z);if(ie!==At)return ie}if(z.type==="illegal"&&J==="")return oe+=`
+`,1;if(bt>1e5&&bt>z.index*3)throw new Error("potential infinite loop, way more iterations than matches");return oe+=J,J.length}let We=ze(D);if(!We)throw Ze(ue.replace("{}",D)),new Error('Unknown language: "'+D+'"');let Dn=hn(We),ft="",Q=re||Dn,Mt={},be=new V.__emitter(V);wn();let oe="",pt=0,Je=0,bt=0,Tt=!1;try{if(We.__emitTokens)We.__emitTokens(Y,be);else{for(Q.matcher.considerAll();;){bt++,Tt?Tt=!1:Q.matcher.considerAll(),Q.matcher.lastIndex=Je;let F=Q.matcher.exec(Y);if(!F)break;let z=Y.substring(Je,F.index),J=kt(z,F);Je=F.index+J}kt(Y.substring(Je))}return be.finalize(),ft=be.toHTML(),{language:D,value:ft,relevance:pt,illegal:!1,_emitter:be,_top:Q}}catch(F){if(F.message&&F.message.includes("Illegal"))return{language:D,value:ht(Y),illegal:!0,relevance:0,_illegalBy:{message:F.message,index:Je,context:Y.slice(Je-100,Je+100),mode:F.mode,resultSoFar:ft},_emitter:be};if(de)return{language:D,value:ht(Y),illegal:!1,relevance:0,errorRaised:F,_emitter:be,_top:Q};throw F}}function Et(D){let Y={value:ht(D),illegal:!1,relevance:0,_top:$,_emitter:new V.__emitter(V)};return Y._emitter.addText(D),Y}function gt(D,Y){Y=Y||V.languages||Object.keys(x);let te=Et(D),re=Y.filter(ze).filter(vt).map(Oe=>it(Oe,D,!1));re.unshift(te);let Ee=re.sort((Oe,He)=>{if(Oe.relevance!==He.relevance)return He.relevance-Oe.relevance;if(Oe.language&&He.language){if(ze(Oe.language).supersetOf===He.language)return 1;if(ze(He.language).supersetOf===Oe.language)return-1}return 0}),[Be,Ye]=Ee,dt=Be;return dt.secondBest=Ye,dt}function bn(D,Y,te){let re=Y&&j[Y]||te;D.classList.add("hljs"),D.classList.add(`language-${re}`)}function mt(D){let Y=null,te=fe(D);if(K(te))return;if(ct("before:highlightElement",{el:D,language:te}),D.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",D);return}if(D.children.length>0&&(V.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(D)),V.throwUnescapedHTML))throw new mn("One of your code blocks includes unescaped HTML.",D.innerHTML);Y=D;let re=Y.textContent,Ee=te?pe(re,{language:te,ignoreIllegals:!0}):gt(re);D.innerHTML=Ee.value,D.dataset.highlighted="yes",bn(D,te,Ee.language),D.result={language:Ee.language,re:Ee.relevance,relevance:Ee.relevance},Ee.secondBest&&(D.secondBest={language:Ee.secondBest.language,relevance:Ee.secondBest.relevance}),ct("after:highlightElement",{el:D,result:Ee,text:re})}function Tn(D){V=yt(V,D)}let Rn=()=>{lt(),tt("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function Ln(){lt(),tt("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let It=!1;function lt(){function D(){lt()}if(document.readyState==="loading"){It||window.addEventListener("DOMContentLoaded",D,!1),It=!0;return}document.querySelectorAll(V.cssSelector).forEach(mt)}function Nn(D,Y){let te=null;try{te=Y(n)}catch(re){if(Ze("Language definition for '{}' could not be registered.".replace("{}",D)),de)Ze(re);else throw re;te=$}te.name||(te.name=D),x[D]=te,te.rawDefinition=Y.bind(null,n),te.aliases&&Ct(te.aliases,{languageName:D})}function _n(D){delete x[D];for(let Y of Object.keys(j))j[Y]===D&&delete j[Y]}function Sn(){return Object.keys(x)}function ze(D){return D=(D||"").toLowerCase(),x[D]||x[j[D]]}function Ct(D,{languageName:Y}){typeof D=="string"&&(D=[D]),D.forEach(te=>{j[te.toLowerCase()]=Y})}function vt(D){let Y=ze(D);return Y&&!Y.disableAutodetect}function yn(D){D["before:highlightBlock"]&&!D["before:highlightElement"]&&(D["before:highlightElement"]=Y=>{D["before:highlightBlock"](Object.assign({block:Y.el},Y))}),D["after:highlightBlock"]&&!D["after:highlightElement"]&&(D["after:highlightElement"]=Y=>{D["after:highlightBlock"](Object.assign({block:Y.el},Y))})}function An(D){yn(D),Z.push(D)}function On(D){let Y=Z.indexOf(D);Y!==-1&&Z.splice(Y,1)}function ct(D,Y){let te=D;Z.forEach(function(re){re[te]&&re[te](Y)})}function In(D){return tt("10.7.0","highlightBlock will be removed entirely in v12.0"),tt("10.7.0","Please use highlightElement now."),mt(D)}Object.assign(n,{highlight:pe,highlightAuto:gt,highlightAll:lt,highlightElement:mt,highlightBlock:In,configure:Tn,initHighlighting:Rn,initHighlightingOnLoad:Ln,registerLanguage:Nn,unregisterLanguage:_n,listLanguages:Sn,getLanguage:ze,registerAliases:Ct,autoDetection:vt,inherit:yt,addPlugin:An,removePlugin:On}),n.debugMode=function(){de=!1},n.safeMode=function(){de=!0},n.versionString=gn,n.regex={concat:Te,lookahead:Ce,either:ve,optional:Pe,anyNumberOfTimes:De};for(let D in rt)typeof rt[D]=="object"&&q(rt[D]);return Object.assign(n,rt),n},nt=Ot({});nt.newInstance=()=>Ot({}),k.exports=nt,nt.HighlightJS=nt,nt.default=nt}),p=M(U(),1),e=p.default;function t(L){let k=L.regex,q=/(?![A-Za-z0-9])(?![$])/,ee=k.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,q),ne=k.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,q),le=k.concat(/[A-Z]+/,q),ae={scope:"variable",match:"\\$+"+ee},se={scope:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{begin:/\?>/}]},ge={scope:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},ce=L.inherit(L.APOS_STRING_MODE,{illegal:null}),Ie=L.inherit(L.QUOTE_STRING_MODE,{illegal:null,contains:L.QUOTE_STRING_MODE.contains.concat(ge)}),Me={begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/,contains:L.QUOTE_STRING_MODE.contains.concat(ge),"on:begin":(Ae,Ne)=>{Ne.data._beginMatch=Ae[1]||Ae[2]},"on:end":(Ae,Ne)=>{Ne.data._beginMatch!==Ae[1]&&Ne.ignoreMatch()}},Le=L.END_SAME_AS_BEGIN({begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/}),me=`[
+]`,Ce={scope:"string",variants:[Ie,ce,Me,Le]},De={scope:"number",variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?"}],relevance:0},Pe=["false","null","true"],Te=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],ke=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],ve={keyword:Te,literal:(Ae=>{let Ne=[];return Ae.forEach(Ue=>{Ne.push(Ue),Ue.toLowerCase()===Ue?Ne.push(Ue.toUpperCase()):Ne.push(Ue.toLowerCase())}),Ne})(Pe),built_in:ke},xe=Ae=>Ae.map(Ne=>Ne.replace(/\|\d+$/,"")),he={variants:[{match:[/new/,k.concat(me,"+"),k.concat("(?!",xe(ke).join("\\b|"),"\\b)"),ne],scope:{1:"keyword",4:"title.class"}}]},we=k.concat(ee,"\\b(?!\\()"),ye={variants:[{match:[k.concat(/::/,k.lookahead(/(?!class\b)/)),we],scope:{2:"variable.constant"}},{match:[/::/,/class/],scope:{2:"variable.language"}},{match:[ne,k.concat(/::/,k.lookahead(/(?!class\b)/)),we],scope:{1:"title.class",3:"variable.constant"}},{match:[ne,k.concat("::",k.lookahead(/(?!class\b)/))],scope:{1:"title.class"}},{match:[ne,/::/,/class/],scope:{1:"title.class",3:"variable.language"}}]},Ge={scope:"attr",match:k.concat(ee,k.lookahead(":"),k.lookahead(/(?!::)/))},_e={relevance:0,begin:/\(/,end:/\)/,keywords:ve,contains:[Ge,ae,ye,L.C_BLOCK_COMMENT_MODE,Ce,De,he]},je={relevance:0,match:[/\b/,k.concat("(?!fn\\b|function\\b|",xe(Te).join("\\b|"),"|",xe(ke).join("\\b|"),"\\b)"),ee,k.concat(me,"*"),k.lookahead(/(?=\()/)],scope:{3:"title.function.invoke"},contains:[_e]};_e.contains.push(je);let Xe=[Ge,ye,L.C_BLOCK_COMMENT_MODE,Ce,De,he],Ke={begin:k.concat(/#\[\s*\\?/,k.either(ne,le)),beginScope:"meta",end:/]/,endScope:"meta",keywords:{literal:Pe,keyword:["new","array"]},contains:[{begin:/\[/,end:/]/,keywords:{literal:Pe,keyword:["new","array"]},contains:["self",...Xe]},...Xe,{scope:"meta",variants:[{match:ne},{match:le}]}]};return{case_insensitive:!1,keywords:ve,contains:[Ke,L.HASH_COMMENT_MODE,L.COMMENT("//","$"),L.COMMENT("/\\*","\\*/",{contains:[{scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/,keywords:"__halt_compiler",starts:{scope:"comment",end:L.MATCH_NOTHING_RE,contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},se,{scope:"variable.language",match:/\$this\b/},ae,je,ye,{match:[/const/,/\s/,ee],scope:{1:"keyword",3:"variable.constant"}},he,{scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use"},L.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:ve,contains:["self",Ke,ae,ye,L.C_BLOCK_COMMENT_MODE,Ce,De]}]},{scope:"class",variants:[{beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{beginKeywords:"extends implements"},L.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[L.inherit(L.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{beginKeywords:"use",relevance:0,end:";",contains:[{match:/\b(as|const|function)\b/,scope:"keyword"},L.UNDERSCORE_TITLE_MODE]},Ce,De]}}function r(L){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},L.inherit(L.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),L.inherit(L.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}var y="[A-Za-z$_][0-9A-Za-z$_]*",_=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],O=["true","false","null","undefined","NaN","Infinity"],v=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],G=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],P=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],A=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],f=[].concat(P,v,G);function R(L){let k=L.regex,q=(Se,{after:Ve})=>{let Qe=""+Se[0].slice(1);return Se.input.indexOf(Qe,Ve)!==-1},ee=y,ne={begin:"<>",end:">"},le=/<[A-Za-z0-9\\._:-]+\s*\/>/,ae={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(Se,Ve)=>{let Qe=Se[0].length+Se.index,$e=Se.input[Qe];if($e==="<"||$e===","){Ve.ignoreMatch();return}$e===">"&&(q(Se,{after:Qe})||Ve.ignoreMatch());let st,at=Se.input.substring(Qe);if(st=at.match(/^\s*=/)){Ve.ignoreMatch();return}if((st=at.match(/^\s+extends\s+/))&&st.index===0){Ve.ignoreMatch();return}}},se={$pattern:y,keyword:_,literal:O,built_in:f,"variable.language":A},ge="[0-9](_?[0-9])*",ce=`\\.(${ge})`,Ie="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",Me={className:"number",variants:[{begin:`(\\b(${Ie})((${ce})|\\.)?|(${ce}))[eE][+-]?(${ge})\\b`},{begin:`\\b(${Ie})\\b((${ce})\\b|\\.)?|(${ce})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},Le={className:"subst",begin:"\\$\\{",end:"\\}",keywords:se,contains:[]},me={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[L.BACKSLASH_ESCAPE,Le],subLanguage:"xml"}},Ce={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[L.BACKSLASH_ESCAPE,Le],subLanguage:"css"}},De={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[L.BACKSLASH_ESCAPE,Le],subLanguage:"graphql"}},Pe={className:"string",begin:"`",end:"`",contains:[L.BACKSLASH_ESCAPE,Le]},Te={className:"comment",variants:[L.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:ee+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),L.C_BLOCK_COMMENT_MODE,L.C_LINE_COMMENT_MODE]},ke=[L.APOS_STRING_MODE,L.QUOTE_STRING_MODE,me,Ce,De,Pe,{match:/\$\d+/},Me];Le.contains=ke.concat({begin:/\{/,end:/\}/,keywords:se,contains:["self"].concat(ke)});let ve=[].concat(Te,Le.contains),xe=ve.concat([{begin:/(\s*)\(/,end:/\)/,keywords:se,contains:["self"].concat(ve)}]),he={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:se,contains:xe},we={variants:[{match:[/class/,/\s+/,ee,/\s+/,/extends/,/\s+/,k.concat(ee,"(",k.concat(/\./,ee),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,ee],scope:{1:"keyword",3:"title.class"}}]},ye={relevance:0,match:k.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...v,...G]}},Ge={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},_e={variants:[{match:[/function/,/\s+/,ee,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[he],illegal:/%/},je={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function Xe(Se){return k.concat("(?!",Se.join("|"),")")}let Ke={match:k.concat(/\b/,Xe([...P,"super","import"].map(Se=>`${Se}\\s*\\(`)),ee,k.lookahead(/\s*\(/)),className:"title.function",relevance:0},Ae={begin:k.concat(/\./,k.lookahead(k.concat(ee,/(?![0-9A-Za-z$_(])/))),end:ee,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},Ne={match:[/get|set/,/\s+/,ee,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},he]},Ue="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+L.UNDERSCORE_IDENT_RE+")\\s*=>",qe={match:[/const|var|let/,/\s+/,ee,/\s*/,/=\s*/,/(async\s*)?/,k.lookahead(Ue)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[he]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:se,exports:{PARAMS_CONTAINS:xe,CLASS_REFERENCE:ye},illegal:/#(?![$_A-z])/,contains:[L.SHEBANG({label:"shebang",binary:"node",relevance:5}),Ge,L.APOS_STRING_MODE,L.QUOTE_STRING_MODE,me,Ce,De,Pe,Te,{match:/\$\d+/},Me,ye,{scope:"attr",match:ee+k.lookahead(":"),relevance:0},qe,{begin:"("+L.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[Te,L.REGEXP_MODE,{className:"function",begin:Ue,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:L.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:se,contains:xe}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:ne.begin,end:ne.end},{match:le},{begin:ae.begin,"on:begin":ae.isTrulyOpeningTag,end:ae.end}],subLanguage:"xml",contains:[{begin:ae.begin,end:ae.end,skip:!0,contains:["self"]}]}]},_e,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+L.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[he,L.inherit(L.TITLE_MODE,{begin:ee,className:"title.function"})]},{match:/\.\.\./,relevance:0},Ae,{match:"\\$"+ee,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[he]},Ke,je,we,Ne,{match:/\$[(.]/}]}}function E(L){let k=L.regex,q=L.COMMENT("--","$"),ee={scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},ne={begin:/"/,end:/"/,contains:[{match:/""/}]},le=["true","false","unknown"],ae=["double precision","large object","with timezone","without timezone"],se=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],ge=["add","asc","collation","desc","final","first","last","view"],ce=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],Ie=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],Me=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],Le=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],me=Ie,Ce=[...ce,...ge].filter(he=>!Ie.includes(he)),De={scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},Pe={scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},Te={match:k.concat(/\b/,k.either(...me),/\s*\(/),relevance:0,keywords:{built_in:me}};function ke(he){return k.concat(/\b/,k.either(...he.map(we=>we.replace(/\s+/,"\\s+"))),/\b/)}let ve={scope:"keyword",match:ke(Le),relevance:0};function xe(he,{exceptions:we,when:ye}={}){let Ge=ye;return we=we||[],he.map(_e=>_e.match(/\|\d+$/)||we.includes(_e)?_e:Ge(_e)?`${_e}|0`:_e)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:xe(Ce,{when:he=>he.length<3}),literal:le,type:se,built_in:Me},contains:[{scope:"type",match:ke(ae)},ve,Te,De,ee,ne,L.C_NUMBER_MODE,L.C_BLOCK_COMMENT_MODE,q,Pe]}}function i(L){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta.prompt",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}var h=L=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:L.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[L.APOS_STRING_MODE,L.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:L.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),l=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],N=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],T=[...l,...N],b=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),a=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),I=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),H=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function m(L){let k=L.regex,q=h(L),ee={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},ne="and or not only",le=/@-?\w[\w]*(-\w+)*/,ae="[a-zA-Z-][a-zA-Z0-9_-]*",se=[L.APOS_STRING_MODE,L.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[q.BLOCK_COMMENT,ee,q.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+ae,relevance:0},q.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+a.join("|")+")"},{begin:":(:)?("+I.join("|")+")"}]},q.CSS_VARIABLE,{className:"attribute",begin:"\\b("+H.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[q.BLOCK_COMMENT,q.HEXCOLOR,q.IMPORTANT,q.CSS_NUMBER_MODE,...se,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...se,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},q.FUNCTION_DISPATCH]},{begin:k.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:le},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:ne,attribute:b.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...se,q.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+T.join("|")+")\\b"}]}}function o(L){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}function u(L){let k=L.regex,q=k.concat(/[\p{L}_]/u,k.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),ee=/[\p{L}0-9._:-]+/u,ne={className:"symbol",begin:/&[a-z]+;|[0-9]+;|[a-f0-9]+;/},le={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},ae=L.inherit(le,{begin:/\(/,end:/\)/}),se=L.inherit(L.APOS_STRING_MODE,{className:"string"}),ge=L.inherit(L.QUOTE_STRING_MODE,{className:"string"}),ce={endsWithParent:!0,illegal:/,relevance:0,contains:[{className:"attr",begin:ee,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[ne]},{begin:/'/,end:/'/,contains:[ne]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[le,ge,se,ae,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[le,ae,ge,se]}]}]},L.COMMENT(//,{relevance:10}),{begin://,relevance:10},ne,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[ge]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/', $line . '', $header);
+ }
+
+ return $header;
+ }
+}
diff --git a/src/DataFormatter/VarDumper/DebugBarJsonCaster.php b/src/DataFormatter/VarDumper/DebugBarJsonCaster.php
new file mode 100644
index 000000000..c893903ec
--- /dev/null
+++ b/src/DataFormatter/VarDumper/DebugBarJsonCaster.php
@@ -0,0 +1,250 @@
+addCasters(DebugBarJsonCaster::getCasters());
+ * $data = $cloner->cloneVar(new DebugBarJsonVar($jsonNode));
+ * (new HtmlDumper())->dump($data);
+ */
+class DebugBarJsonCaster
+{
+ /**
+ * Returns the caster map to register with VarCloner::addCasters().
+ */
+ public static function getCasters(): array
+ {
+ return [
+ DebugBarJsonVar::class => [self::class, 'cast'],
+ ];
+ }
+
+ public static function cast(DebugBarJsonVar $var, array $a, Stub $stub, bool $isNested): array
+ {
+ $node = $var->node;
+
+ // Native scalar/string β unwrap to PHP value
+ if (!is_array($node)) {
+ $stub->type = Stub::TYPE_REF;
+ $stub->class = '';
+ $stub->handle = 0;
+ $stub->value = $node;
+ return [];
+ }
+
+ // New _vd format
+ if (isset($node['_vd'])) {
+ return self::castVdHash($node, $stub);
+ }
+
+ // Legacy format
+ return match ($node['t'] ?? null) {
+ 's' => self::castScalar($node, $stub),
+ 'r' => self::castString($node, $stub),
+ 'h' => self::castHash($node, $stub),
+ default => [],
+ };
+ }
+
+ private static function castScalar(array $node, Stub $stub): array
+ {
+ // Use TYPE_REF so Data::dumpItem unwraps to the native PHP value,
+ // matching how VarCloner stores scalars natively.
+ $stub->type = Stub::TYPE_REF;
+ $stub->class = '';
+ $stub->handle = 0;
+ $stub->value = match ($node['s']) {
+ 'b' => (bool) $node['v'],
+ 'i' => (int) $node['v'],
+ 'd' => (float) $node['v'],
+ 'n' => null,
+ default => $node['v'] ?? null,
+ };
+
+ return [];
+ }
+
+ private static function castString(array $node, Stub $stub): array
+ {
+ $stub->type = Stub::TYPE_STRING;
+ $stub->class = ($node['bin'] ?? false) ? Stub::STRING_BINARY : Stub::STRING_UTF8;
+ $stub->value = $node['v'];
+ $stub->cut = $node['cut'] ?? 0;
+
+ return [];
+ }
+
+ private static function castHash(array $node, Stub $stub): array
+ {
+ $ht = $node['ht'];
+ $children = $node['c'] ?? [];
+ $cut = $node['cut'] ?? 0;
+
+ if ($ht === Cursor::HASH_OBJECT) {
+ $stub->type = Stub::TYPE_OBJECT;
+ $stub->class = $node['cls'] ?? 'stdClass';
+ if (isset($node['ref'])) {
+ $ref = $node['ref'];
+ $stub->handle = is_array($ref) ? $ref['s'] : $ref;
+ $stub->refCount = is_array($ref) ? $ref['c'] : 0;
+ } else {
+ $stub->handle = 0;
+ }
+ } elseif ($ht === Cursor::HASH_RESOURCE) {
+ $stub->type = Stub::TYPE_RESOURCE;
+ $stub->class = $node['cls'] ?? 'Unknown';
+ $stub->handle = 0;
+ } else {
+ // For TYPE_ARRAY, Data::dumpItem copies classβtype and valueβclass,
+ // so class must be ARRAY_INDEXED/ARRAY_ASSOC and value is the count.
+ $stub->type = Stub::TYPE_ARRAY;
+ $stub->class = ($ht === Cursor::HASH_INDEXED) ? Stub::ARRAY_INDEXED : Stub::ARRAY_ASSOC;
+ $stub->value = count($children) + $cut;
+ $stub->handle = 0;
+ }
+
+ $stub->cut = $cut;
+
+ $a = [];
+ foreach ($children as $i => $entry) {
+ $key = self::buildKey($entry, $ht, $i);
+ $a[$key] = self::nodeToValue($entry['n']);
+ }
+
+ return $a;
+ }
+
+ /**
+ * Cast a node in the new _vd format (natural tree with metadata sidecar).
+ */
+ private static function castVdHash(array $node, Stub $stub): array
+ {
+ $vd = $node['_vd'];
+ $ht = $vd[0];
+ $ref = $vd[1] ?? 0;
+ $cls = $vd[2] ?? null;
+ $prefixes = $vd[3] ?? null;
+ $cut = $node['_cut'] ?? 0;
+
+ // Filter out meta keys to get property keys
+ $keys = array_keys(array_diff_key($node, array_flip(['_vd', '_cut', '_sd'])));
+
+ if ($ht === Cursor::HASH_OBJECT) {
+ $stub->type = Stub::TYPE_OBJECT;
+ $stub->class = $cls ?? 'stdClass';
+ $stub->handle = $ref;
+ } elseif ($ht === Cursor::HASH_RESOURCE) {
+ $stub->type = Stub::TYPE_RESOURCE;
+ $stub->class = $cls ?? 'Unknown';
+ $stub->handle = 0;
+ }
+
+ $stub->cut = $cut;
+
+ $a = [];
+ foreach ($keys as $i => $key) {
+ $value = $node[$key];
+ $prefix = $prefixes[$i] ?? null;
+
+ // Build the \0-encoded key for Symfony
+ $encodedKey = match ($prefix) {
+ null => $key, // public
+ '+' => Caster::PREFIX_DYNAMIC . $key, // dynamic
+ '~' => Caster::PREFIX_VIRTUAL . $key, // meta/virtual
+ '*' => Caster::PREFIX_PROTECTED . $key, // protected
+ default => sprintf(Caster::PATTERN_PRIVATE, $prefix, $key), // private
+ };
+
+ // Recursively wrap nested _vd objects
+ if (is_array($value) && isset($value['_vd'])) {
+ $a[$encodedKey] = new DebugBarJsonVar($value);
+ } else {
+ $a[$encodedKey] = $value;
+ }
+ }
+
+ return $a;
+ }
+
+ private static function buildKey(array $entry, int $ht, int $index): string|int
+ {
+ $k = $entry['k'] ?? $index;
+
+ // Compact format: single prefix field for object/resource visibility
+ if (isset($entry['p'])) {
+ return match ($entry['p']) {
+ '+' => Caster::PREFIX_DYNAMIC . $k,
+ '~' => Caster::PREFIX_VIRTUAL . $k,
+ '*' => Caster::PREFIX_PROTECTED . $k,
+ '' => sprintf(Caster::PATTERN_PRIVATE, '', $k),
+ default => sprintf(Caster::PATTERN_PRIVATE, $entry['p'], $k),
+ };
+ }
+
+ // Legacy format (deprecated): kt/kc/dyn fields
+ $kt = $entry['kt'] ?? null;
+ $isDynamic = ($entry['dyn'] ?? false) === true;
+
+ // Infer key type from parent hash type when not explicit
+ if ($kt === null) {
+ if ($ht === Cursor::HASH_INDEXED) {
+ return (int) $k;
+ }
+ if ($ht === Cursor::HASH_OBJECT) {
+ return $isDynamic ? Caster::PREFIX_DYNAMIC . $k : $k;
+ }
+ if ($ht === Cursor::HASH_RESOURCE) {
+ return Caster::PREFIX_VIRTUAL . $k;
+ }
+ return $k;
+ }
+
+ return match ($kt) {
+ 'i' => (int) $k,
+ 'pub' => $isDynamic ? Caster::PREFIX_DYNAMIC . $k : $k,
+ 'pro' => Caster::PREFIX_PROTECTED . $k,
+ 'pri' => sprintf(Caster::PATTERN_PRIVATE, $entry['kc'] ?? '', $k),
+ 'meta' => Caster::PREFIX_VIRTUAL . $k,
+ default => $k, // 'k' and others
+ };
+ }
+
+ private static function nodeToValue(array $node): mixed
+ {
+ $type = $node['t'] ?? null;
+
+ // Scalars and strings become native PHP values β VarCloner handles them directly
+ if ($type === 's') {
+ return match ($node['s']) {
+ 'b' => (bool) $node['v'],
+ 'i' => (int) $node['v'],
+ 'd' => (float) $node['v'],
+ 'n' => null,
+ 'l' => $node['v'] ?? '',
+ default => $node['v'] ?? null,
+ };
+ }
+
+ if ($type === 'r') {
+ return $node['v'];
+ }
+
+ // Hash nodes wrap in DebugBarJsonVar so the caster fires recursively
+ if ($type === 'h') {
+ return new DebugBarJsonVar($node);
+ }
+
+ return null;
+ }
+}
diff --git a/src/DataFormatter/VarDumper/DebugBarJsonDumper.php b/src/DataFormatter/VarDumper/DebugBarJsonDumper.php
new file mode 100644
index 000000000..325000f2b
--- /dev/null
+++ b/src/DataFormatter/VarDumper/DebugBarJsonDumper.php
@@ -0,0 +1,252 @@
+ Keys in insertion order for current hash */
+ private array $currentKeys = [];
+
+ /** @var Cursor|null Cursor state for the current item */
+ private ?Cursor $pendingCursor = null;
+
+ /** @var int Current hash type */
+ private int $currentHt = 0;
+
+ /**
+ * Dump a Data object and return the JSON string.
+ */
+ public function dump(Data $data): ?string
+ {
+ $array = $this->dumpAsArray($data);
+ return json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
+ }
+
+ /**
+ * Dump a Data object and return the raw PHP value (avoids double-encoding).
+ */
+ public function dumpAsArray(Data $data): mixed
+ {
+ $this->stack = [];
+ $this->root = null;
+ $this->currentResult = null;
+ $this->currentKeys = [];
+ $this->pendingCursor = null;
+ $this->currentHt = 0;
+
+ $data->dump($this);
+
+ return $this->root;
+ }
+
+ public function dumpScalar(Cursor $cursor, string $type, $value): void
+ {
+ // Scalars map directly to native JSON types
+ $native = match ($type) {
+ 'boolean' => (bool) $value,
+ 'integer' => (int) $value,
+ 'double' => (float) $value,
+ 'NULL' => null,
+ 'label' => (string) ($value ?? ''),
+ default => $value,
+ };
+
+ $this->emitValue($cursor, $native);
+ }
+
+ public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut): void
+ {
+ if ($cut > 0) {
+ $str .= '[..' . $cut . ']';
+ }
+
+ $this->emitValue($cursor, $str);
+ }
+
+ public function enterHash(Cursor $cursor, int $type, $class, bool $hasChild): void
+ {
+ // Push current context onto stack
+ if ($this->currentResult !== null) {
+ $this->stack[] = [$this->currentResult, $this->currentKeys, $this->pendingCursor, $this->currentHt];
+ }
+
+ $this->currentResult = [];
+ $this->currentKeys = [];
+ $this->currentHt = $type;
+ $this->pendingCursor = clone $cursor;
+ }
+
+ public function leaveHash(Cursor $cursor, int $type, $class, bool $hasChild, int $cut): void
+ {
+ $result = $this->currentResult;
+ $keys = $this->currentKeys;
+ $isObject = ($type === Cursor::HASH_OBJECT);
+ $isResource = ($type === Cursor::HASH_RESOURCE);
+
+ // Build _vd metadata for objects/resources
+ if ($isObject || $isResource) {
+ $vd = [$type];
+
+ // ref (object handle)
+ $handle = $cursor->softRefHandle ?: $cursor->softRefTo;
+ $ref = ($handle > 0) ? $handle : 0;
+
+ // class
+ $cls = ($class !== null && $class !== 'stdClass') ? $class : null;
+
+ // prefixes array β only include if any non-public properties exist
+ $prefixes = $this->buildPrefixes($keys, $result);
+
+ // Build _vd with trailing omission: [ht] or [ht,ref] or [ht,ref,cls] or [ht,ref,cls,prefixes]
+ if ($prefixes !== null) {
+ $vd = [$type, $ref, $cls, $prefixes];
+ } elseif ($cls !== null) {
+ $vd = [$type, $ref, $cls];
+ } elseif ($ref > 0) {
+ $vd = [$type, $ref];
+ }
+
+ $result['_vd'] = $vd;
+ }
+
+ // Cut indicator
+ if ($cut > 0) {
+ $result['_cut'] = $cut;
+ }
+
+ // Pop from stack
+ if ($this->stack !== []) {
+ [$this->currentResult, $this->currentKeys, $this->pendingCursor, $this->currentHt] = array_pop($this->stack);
+ $this->emitValue($cursor, $result);
+ } else {
+ $this->currentResult = null;
+ $this->currentKeys = [];
+ $this->pendingCursor = null;
+ $this->root = $result;
+ }
+ }
+
+ /**
+ * Build prefixes array from the temporary prefix markers stored in result.
+ * Returns null if all properties are public (no prefixes needed).
+ */
+ private function buildPrefixes(array $keys, array &$result): ?array
+ {
+ $prefixes = [];
+ $hasNonPublic = false;
+
+ foreach ($keys as $key) {
+ $prefixKey = "\0_vd_p\0" . $key;
+ if (isset($result[$prefixKey])) {
+ $prefixes[] = $result[$prefixKey];
+ unset($result[$prefixKey]);
+ $hasNonPublic = true;
+ } else {
+ $prefixes[] = null; // public
+ }
+ }
+
+ return $hasNonPublic ? $prefixes : null;
+ }
+
+ /**
+ * Emit a value: either add it to the current hash, or set it as root.
+ */
+ private function emitValue(Cursor $cursor, mixed $value): void
+ {
+ if ($this->currentResult !== null) {
+ $this->addToCurrentHash($cursor, $value);
+ } else {
+ $this->root = $value;
+ }
+ }
+
+ /**
+ * Add a value to the current hash with key info from the cursor.
+ */
+ private function addToCurrentHash(Cursor $cursor, mixed $value): void
+ {
+ $key = $cursor->hashKey;
+
+ if ($key === null) {
+ // Indexed array β use numeric key
+ $this->currentResult[] = $value;
+ return;
+ }
+
+ if ($cursor->hashKeyIsBinary) {
+ $key = mb_convert_encoding($key, 'UTF-8', 'ISO-8859-1');
+ }
+
+ switch ($cursor->hashType) {
+ case Cursor::HASH_INDEXED:
+ $this->currentResult[] = $value;
+ break;
+
+ case Cursor::HASH_ASSOC:
+ $this->currentResult[$key] = $value;
+ $this->currentKeys[] = $key;
+ break;
+
+ case Cursor::HASH_RESOURCE:
+ $key = "\0~\0" . $key;
+ // fall through
+ // no break
+ case Cursor::HASH_OBJECT:
+ if (!isset($key[0]) || $key[0] !== "\0") {
+ // Public property
+ $this->currentResult[$key] = $value;
+ $this->currentKeys[] = $key;
+ } elseif (($pos = strpos($key, "\0", 1)) !== false && $pos > 0) {
+ $prefix = substr($key, 1, $pos - 1);
+ $propName = substr($key, $pos + 1);
+ $this->currentResult[$propName] = $value;
+ $this->currentKeys[] = $propName;
+ // Store prefix marker (cleaned up in buildPrefixes)
+ $this->currentResult["\0_vd_p\0" . $propName] = $prefix;
+ } else {
+ $this->currentResult[$key] = $value;
+ $this->currentKeys[] = $key;
+ $this->currentResult["\0_vd_p\0" . $key] = '';
+ }
+ break;
+
+ default:
+ $this->currentResult[$key] = $value;
+ $this->currentKeys[] = $key;
+ break;
+ }
+ }
+}
diff --git a/src/DataFormatter/VarDumper/DebugBarJsonVar.php b/src/DataFormatter/VarDumper/DebugBarJsonVar.php
new file mode 100644
index 000000000..ea639b976
--- /dev/null
+++ b/src/DataFormatter/VarDumper/DebugBarJsonVar.php
@@ -0,0 +1,22 @@
+addCasters(DebugBarJsonCaster::getCasters());
+ * $data = $cloner->cloneVar(new DebugBarJsonVar($jsonNode));
+ */
+class DebugBarJsonVar
+{
+ public function __construct(
+ public readonly mixed $node,
+ ) {}
+}
diff --git a/src/DataFormatter/VarDumper/ReverseJsonDumper.php b/src/DataFormatter/VarDumper/ReverseJsonDumper.php
new file mode 100644
index 000000000..0923017d1
--- /dev/null
+++ b/src/DataFormatter/VarDumper/ReverseJsonDumper.php
@@ -0,0 +1,341 @@
+wrapJsonDumps($data);
+
+ $cloner = new VarCloner();
+ $cloner->addCasters(DebugBarJsonCaster::getCasters());
+
+ return $cloner->cloneVar($result);
+ }
+
+ private function wrapJsonDumps(mixed $data): mixed
+ {
+ if (!is_array($data)) {
+ return $data;
+ }
+
+ // New format: _vd metadata β wrap as DebugBarJsonVar
+ if (array_key_exists('_vd', $data)) {
+ return new DebugBarJsonVar($data);
+ }
+
+ // Legacy format: _sd marker β wrap as DebugBarJsonVar
+ if (array_key_exists('_sd', $data)) {
+ return new DebugBarJsonVar($data);
+ }
+
+ foreach ($data as $key => $value) {
+ $data[$key] = $this->wrapJsonDumps($value);
+ }
+
+ return $data;
+ }
+
+ public function reverseFormatVar(mixed $node): string
+ {
+ return $this->valueToText($node, 0);
+ }
+
+ // ---------------------------------------------------------------
+ // Value β Text reconstruction (mirrors CliDumper output format)
+ // ---------------------------------------------------------------
+ private function valueToText(mixed $value, int $depth): string
+ {
+ if ($value === null) {
+ return 'null';
+ }
+ if (is_bool($value)) {
+ return $value ? 'true' : 'false';
+ }
+ if (is_int($value)) {
+ return (string) $value;
+ }
+ if (is_float($value)) {
+ $s = (string) $value;
+ return !str_contains($s, '.') ? $s . '.0' : $s;
+ }
+ if (is_string($value)) {
+ if (str_contains($value, "\n")) {
+ $display = str_replace("\n", '\n' . "\n", $value);
+ return '"""' . "\n" . $display . "\n" . '"""';
+ }
+ return '"' . $value . '"';
+ }
+ if (is_array($value)) {
+ // New _vd format: object/resource
+ if (isset($value['_vd'])) {
+ return $this->vdHashToText($value, $depth);
+ }
+ // Legacy format
+ if (isset($value['t'])) {
+ return $this->jsonToText($value, $depth);
+ }
+ // Plain array
+ return $this->plainArrayToText($value, $depth);
+ }
+ return '';
+ }
+
+ private function plainArrayToText(array $data, int $depth): string
+ {
+ $cut = $data['_cut'] ?? 0;
+ $keys = array_keys(array_diff_key($data, array_flip(['_cut'])));
+ $count = count($keys) + $cut;
+ $isIndexed = array_is_list($data) || ($keys === [] && $cut > 0);
+
+ if ($count === 0) {
+ return '[]';
+ }
+
+ $header = $count > 0 ? 'array:' . $count . ' [' : '[';
+ if ($keys === [] && $cut > 0) {
+ return $header . ' β¦' . $cut . ']';
+ }
+
+ $indent = str_repeat(' ', $depth + 1);
+ $lines = [];
+ foreach ($keys as $i => $key) {
+ $line = $indent;
+ if ($isIndexed) {
+ $line .= $key . ' => ';
+ } else {
+ $line .= '"' . $key . '" => ';
+ }
+ $line .= $this->valueToText($data[$key], $depth + 1);
+ $lines[] = $line;
+ }
+ if ($cut > 0) {
+ $lines[] = $indent . 'β¦' . $cut;
+ }
+ $closingIndent = str_repeat(' ', $depth);
+ return $header . "\n" . implode("\n", $lines) . "\n" . $closingIndent . ']';
+ }
+
+ private function vdHashToText(array $node, int $depth): string
+ {
+ $vd = $node['_vd'];
+ $ht = $vd[0];
+ $ref = $vd[1] ?? 0;
+ $cls = $vd[2] ?? null;
+ $prefixes = $vd[3] ?? null;
+ $cut = $node['_cut'] ?? 0;
+ $keys = array_keys(array_diff_key($node, array_flip(['_vd', '_cut', '_sd'])));
+
+ $isObject = ($ht === Cursor::HASH_OBJECT);
+ $isResource = ($ht === Cursor::HASH_RESOURCE);
+
+ // Header
+ if ($isObject) {
+ $header = ($cls ? $cls . ' ' : '') . '{';
+ if ($ref) {
+ $header .= '#' . $ref;
+ }
+ } elseif ($isResource) {
+ $header = ($cls ? $cls . ' ' : '') . '{';
+ } else {
+ $header = '[';
+ }
+ $closingChar = ($isObject || $isResource) ? '}' : ']';
+
+ if ($keys === [] && $cut === 0) {
+ return $header . $closingChar;
+ }
+ if ($keys === [] && $cut > 0) {
+ return $header . ' β¦' . $cut . $closingChar;
+ }
+
+ $indent = str_repeat(' ', $depth + 1);
+ $lines = [];
+ foreach ($keys as $i => $key) {
+ $line = $indent;
+ $prefix = $prefixes[$i] ?? null;
+ $line .= match ($prefix) {
+ null => '+' . $key . ': ',
+ '+' => '+"' . $key . '": ',
+ '~' => $key . ': ',
+ '*' => '#' . $key . ': ',
+ default => '-' . $key . ': ',
+ };
+ $line .= $this->valueToText($node[$key], $depth + 1);
+ $lines[] = $line;
+ }
+ if ($cut > 0) {
+ $lines[] = $indent . 'β¦' . $cut;
+ }
+ $closingIndent = str_repeat(' ', $depth);
+ return $header . "\n" . implode("\n", $lines) . "\n" . $closingIndent . $closingChar;
+ }
+
+ // Legacy format support
+ private function jsonToText(array $node, int $depth): string
+ {
+ return match ($node['t'] ?? null) {
+ 's' => $this->scalarToText($node),
+ 'r' => $this->stringToText($node),
+ 'h' => $this->hashToText($node, $depth),
+ default => '',
+ };
+ }
+
+ private function scalarToText(array $node): string
+ {
+ return match ($node['s']) {
+ 'i' => (string) $node['v'],
+ 'd' => !str_contains($s = (string) $node['v'], '.') ? $s . '.0' : $s,
+ 'b' => $node['v'] ? 'true' : 'false',
+ 'n' => 'null',
+ 'l' => $node['v'] ?? '',
+ default => (string) ($node['v'] ?? ''),
+ };
+ }
+
+ private function stringToText(array $node): string
+ {
+ $v = $node['v'];
+
+ // Binary strings get a 'b' prefix
+ $prefix = ($node['bin'] ?? false) ? 'b' : '';
+
+ if (isset($node['cut']) && $node['cut'] > 0) {
+ return $prefix . '"' . $v . '"β¦' . $node['cut'];
+ }
+
+ // Multiline strings use triple-quote format in CliDumper
+ // Real newlines in the string are shown as literal \n followed by a real newline
+ if (str_contains($v, "\n")) {
+ $display = str_replace("\n", '\n' . "\n", $v);
+ return $prefix . '"""' . "\n" . $display . "\n" . '"""';
+ }
+
+ return $prefix . '"' . $v . '"';
+ }
+
+ private function hashToText(array $node, int $depth): string
+ {
+ $ht = $node['ht'];
+ $isObject = ($ht === Cursor::HASH_OBJECT);
+ $isResource = ($ht === Cursor::HASH_RESOURCE);
+ $isArray = ($ht === Cursor::HASH_ASSOC || $ht === Cursor::HASH_INDEXED);
+ $children = $node['c'] ?? [];
+ $cls = $node['cls'] ?? null;
+ $cut = $node['cut'] ?? 0;
+ $ref = $node['ref'] ?? null;
+
+ $lines = [];
+
+ // Header
+ if ($isObject) {
+ $header = ($cls && $cls !== 'stdClass') ? ($cls . ' ') : '';
+ $header .= '{';
+ if ($ref) {
+ $header .= '#' . (is_array($ref) ? $ref['s'] : $ref);
+ }
+ } elseif ($isResource) {
+ $header = ($cls ? $cls . ' ' : '') . '{';
+ } else {
+ // Array
+ if ($cls) {
+ $header = 'array:' . $cls . ' [';
+ } else {
+ $header = '[';
+ }
+ }
+
+ $closingChar = $isArray ? ']' : '}';
+
+ // Empty hash
+ if ($children === [] && $cut === 0) {
+ return $header . $closingChar;
+ }
+
+ // Compact cut-only (no children to expand)
+ if ($children === [] && $cut > 0) {
+ return $header . ' β¦' . $cut . $closingChar;
+ }
+
+ $indent = str_repeat(' ', $depth + 1);
+
+ // Children
+ foreach ($children as $i => $entry) {
+ $line = $indent;
+ $line .= $this->entryKeyToText($entry, $ht, $i);
+
+ // Hard reference
+ if (isset($entry['ref'])) {
+ $line .= '&' . $entry['ref'] . ' ';
+ }
+
+ // Value
+ $line .= $this->jsonToText($entry['n'], $depth + 1);
+ $lines[] = $line;
+ }
+
+ // Cut indicator
+ if ($cut > 0) {
+ $lines[] = $indent . 'β¦' . $cut;
+ }
+
+ $closingIndent = str_repeat(' ', $depth);
+
+ return $header . "\n" . implode("\n", $lines) . "\n" . $closingIndent . $closingChar;
+ }
+
+ private function entryKeyToText(array $entry, int $ht, int $index): string
+ {
+ $k = $entry['k'] ?? $index;
+
+ // New compact format: single prefix for object/resource visibility
+ if (isset($entry['p'])) {
+ return match ($entry['p']) {
+ '+' => '+"' . $k . '": ',
+ '~' => $k . ': ',
+ '*' => '#' . $k . ': ',
+ '' => '-' . $k . ': ',
+ default => '-' . $k . ': ', // private with declaring class
+ };
+ }
+
+ // Legacy/inferred kt format
+ $kt = $entry['kt'] ?? null;
+ if ($kt === null) {
+ if (isset($entry['k']) || $ht === Cursor::HASH_INDEXED) {
+ if ($ht === Cursor::HASH_INDEXED) {
+ $kt = 'i';
+ } elseif ($ht === Cursor::HASH_RESOURCE) {
+ $kt = 'meta';
+ } elseif ($ht === Cursor::HASH_OBJECT) {
+ $kt = 'pub';
+ } else {
+ $kt = is_int($entry['k']) ? 'i' : 'k';
+ }
+ } else {
+ return '';
+ }
+ }
+
+ $isDynamic = ($entry['dyn'] ?? false) === true;
+
+ return match ($kt) {
+ 'i' => $k . ' => ',
+ 'k' => is_int($k) ? ($k . ' => ') : ('"' . $k . '" => '),
+ 'pub' => $isDynamic ? '+"' . $k . '": ' : '+' . $k . ': ',
+ 'pro' => '#' . $k . ': ',
+ 'pri' => '-' . $k . ': ',
+ 'meta' => $k . ': ',
+ default => $k . ': ',
+ };
+ }
+
+}
diff --git a/src/DebugBar.php b/src/DebugBar.php
new file mode 100644
index 000000000..1303399ee
--- /dev/null
+++ b/src/DebugBar.php
@@ -0,0 +1,628 @@
+
+ * $debugbar = new DebugBar();
+ * $debugbar->addCollector(new DataCollector\MessagesCollector());
+ * $debugbar['messages']->addMessage("foobar");
+ *
+ *
+ * @implements ArrayAccess
+ */
+class DebugBar implements ArrayAccess
+{
+ public static bool $useOpenHandlerWhenSendingDataHeaders = false;
+
+ /** @var DataCollectorInterface[] */
+ protected array $collectors = [];
+
+ protected ?array $data = null;
+
+ protected ?JavascriptRenderer $jsRenderer = null;
+
+ protected ?RequestIdGeneratorInterface $requestIdGenerator = null;
+
+ protected ?string $requestId = null;
+
+ protected ?StorageInterface $storage = null;
+
+ protected ?HttpDriverInterface $httpDriver = null;
+
+ protected string $stackSessionNamespace = 'PHPDEBUGBAR_STACK_DATA';
+
+ protected bool $useHtmlVarDumper = true;
+
+ protected bool $stackAlwaysUseSessionStorage = false;
+
+ protected ?string $editorTemplate = null;
+
+ protected ?string $editorLinkTemplate = null;
+
+ protected ?array $remotePathReplacements = null;
+
+ /**
+ * Adds a data collector
+ *
+ *
+ * @throws DebugBarException
+ *
+ * @return $this
+ */
+ public function addCollector(DataCollectorInterface $collector): static
+ {
+ if ($collector->getName() === '__meta') {
+ throw new DebugBarException("'__meta' is a reserved name and cannot be used as a collector name");
+ }
+ if (isset($this->collectors[$collector->getName()])) {
+ throw new DebugBarException("'{$collector->getName()}' is already a registered collector");
+ }
+ if ($this->useHtmlVarDumper && method_exists($collector, 'useHtmlVarDumper')) {
+ $collector->useHtmlVarDumper($this->useHtmlVarDumper);
+ }
+ if ($this->editorTemplate && method_exists($collector, 'setEditorLinkTemplate')) {
+ $collector->setEditorLinkTemplate($this->editorTemplate);
+ }
+ if ($this->editorLinkTemplate && method_exists($collector, 'setXdebugLinkTemplate')) {
+ $collector->setXdebugLinkTemplate($this->editorLinkTemplate);
+ }
+ if ($this->remotePathReplacements && method_exists($collector, 'setXdebugReplacements')) {
+ $collector->setXdebugReplacements($this->remotePathReplacements);
+ }
+ $this->collectors[$collector->getName()] = $collector;
+ return $this;
+ }
+
+ /**
+ * Checks if a data collector has been added
+ *
+ *
+ * @return boolean
+ */
+ public function hasCollector(string $name): bool
+ {
+ return isset($this->collectors[$name]);
+ }
+
+ public function getCollector(string $name): DataCollectorInterface
+ {
+ if (!isset($this->collectors[$name])) {
+ throw new DebugBarException("'$name' is not a registered collector");
+ }
+ return $this->collectors[$name];
+ }
+
+ public function removeCollector(string $name): void
+ {
+ if (!isset($this->collectors[$name])) {
+ throw new DebugBarException("'$name' is not a registered collector");
+ }
+
+ unset($this->collectors[$name]);
+ }
+ /**
+ * Returns an array of all data collectors
+ *
+ * @return array|DataCollectorInterface[]
+ */
+ public function getCollectors(): array
+ {
+ return $this->collectors;
+ }
+
+ /**
+ * Sets the request id generator
+ *
+ * @return $this
+ */
+ public function setRequestIdGenerator(RequestIdGeneratorInterface $generator): static
+ {
+ $this->requestIdGenerator = $generator;
+ return $this;
+ }
+
+ public function getRequestIdGenerator(): RequestIdGeneratorInterface
+ {
+ if ($this->requestIdGenerator === null) {
+ $this->requestIdGenerator = new RequestIdGenerator();
+ }
+ return $this->requestIdGenerator;
+ }
+
+ /**
+ * Returns the id of the current request
+ *
+ */
+ public function getCurrentRequestId(): string
+ {
+ if ($this->requestId === null) {
+ $this->requestId = $this->getRequestIdGenerator()->generate();
+ }
+ return $this->requestId;
+ }
+
+ /**
+ * Sets the storage backend to use to store the collected data
+ *
+ * @return $this
+ */
+ public function setStorage(?StorageInterface $storage = null): static
+ {
+ $this->storage = $storage;
+ return $this;
+ }
+
+ public function getStorage(): ?StorageInterface
+ {
+ return $this->storage;
+ }
+
+ /**
+ * Checks if the data will be persisted
+ *
+ * @return boolean
+ */
+ public function isDataPersisted(): bool
+ {
+ return $this->storage !== null;
+ }
+
+ /**
+ * Sets the HTTP driver
+ *
+ * @return $this
+ */
+ public function setHttpDriver(HttpDriverInterface $driver): static
+ {
+ $this->httpDriver = $driver;
+ return $this;
+ }
+
+ /**
+ * Returns the HTTP driver
+ *
+ * If no http driver where defined, a PhpHttpDriver is automatically created
+ *
+ */
+ public function getHttpDriver(): HttpDriverInterface
+ {
+ if ($this->httpDriver === null) {
+ $this->httpDriver = new PhpHttpDriver();
+ }
+ return $this->httpDriver;
+ }
+
+ /**
+ * Collects meta data about the current request
+ */
+ public function collectMetaData(): array
+ {
+ if (php_sapi_name() === 'cli') {
+ $ip = gethostname();
+ if ($ip) {
+ $ip = gethostbyname($ip);
+ } else {
+ $ip = '127.0.0.1';
+ }
+ $request_variables = [
+ 'method' => 'CLI',
+ 'uri' => isset($_SERVER['SCRIPT_FILENAME']) ? realpath($_SERVER['SCRIPT_FILENAME']) : null,
+ 'ip' => $ip,
+ ];
+ } else {
+ $request_variables = [
+ 'method' => $_SERVER['REQUEST_METHOD'] ?? null,
+ 'uri' => $_SERVER['REQUEST_URI'] ?? null,
+ 'ip' => $_SERVER['REMOTE_ADDR'] ?? null,
+ ];
+ }
+
+ $rid = $_SERVER['HTTP_PHPDEBUGBAR_REQUEST_ID'] ?? null;
+ if (is_string($rid)) {
+ $rid = substr(preg_replace('/[^A-Za-z0-9\-_.]/', '', $rid), 0, 64);
+ }
+
+ return array_merge(
+ [
+ 'id' => $this->getCurrentRequestId(),
+ 'datetime' => date('Y-m-d H:i:s'),
+ 'utime' => microtime(true),
+ ],
+ is_string($rid) && $rid !== '' ? ['rid' => $rid] : [],
+ $request_variables,
+ );
+ }
+
+ /**
+ * Collects the data from the collectors
+ *
+ */
+ public function collect(): array
+ {
+ $this->data = [
+ '__meta' => $this->collectMetaData(),
+ ];
+
+ $lateCollectors = [];
+ foreach ($this->collectors as $name => $collector) {
+ if ($collector instanceof TimeDataCollector) {
+ $lateCollectors[$name] = $collector;
+ } else {
+ $this->data[$name] = $collector->collect();
+ }
+ }
+
+ // Run TimeData collectors last to catch items added during collection
+ foreach ($lateCollectors as $name => $collector) {
+ $this->data[$name] = $collector->collect();
+ }
+
+ // Remove all invalid (non UTF-8) characters
+ array_walk_recursive($this->data, function (&$item): void {
+ if (is_float($item) && !is_finite($item)) {
+ $item = '[NON-FINITE FLOAT]';
+ } elseif (is_string($item) && !mb_check_encoding($item, 'UTF-8')) {
+ $item = mb_convert_encoding($item, 'UTF-8', 'UTF-8');
+ }
+ });
+
+ if ($this->storage !== null) {
+ $this->storage->save($this->getCurrentRequestId(), $this->data);
+ }
+
+ return $this->data;
+ }
+
+ /**
+ * Returns collected data
+ *
+ * Will collect the data if none have been collected yet
+ *
+ */
+ public function getData(): array
+ {
+ if ($this->data === null) {
+ $this->collect();
+ }
+ return $this->data;
+ }
+
+ public function reset(): void
+ {
+ $this->requestId = null;
+ $this->data = null;
+
+ foreach ($this->collectors as $collector) {
+ if ($collector instanceof Resettable) {
+ $collector->reset();
+ }
+ }
+ }
+
+ /**
+ * Returns an array of HTTP headers containing the data
+ *
+ * @param integer $maxHeaderLength
+ *
+ * @return array
+ *
+ */
+ public function getDataAsHeaders(string $headerName = 'phpdebugbar', int $maxHeaderLength = 4096, int $maxTotalHeaderLength = 250000): array
+ {
+ $data = rawurlencode(json_encode([
+ 'id' => $this->getCurrentRequestId(),
+ 'data' => $this->getData(),
+ ]));
+
+ if (strlen($data) > $maxTotalHeaderLength) {
+ $data = rawurlencode(json_encode([
+ 'error' => 'Maximum header size exceeded',
+ ]));
+ }
+
+ $chunks = [];
+
+ while (strlen($data) > $maxHeaderLength) {
+ $chunks[] = substr($data, 0, $maxHeaderLength);
+ $data = substr($data, $maxHeaderLength);
+ }
+ $chunks[] = $data;
+
+ $headers = [];
+ for ($i = 0, $c = count($chunks); $i < $c; $i++) {
+ $name = $headerName . ($i > 0 ? "-$i" : '');
+ $headers[$name] = $chunks[$i];
+ }
+
+ return $headers;
+ }
+
+ /**
+ * Sends the data through the HTTP headers
+ *
+ * @param integer $maxHeaderLength
+ *
+ * @return $this
+ */
+ public function sendDataInHeaders(?bool $useOpenHandler = null, string $headerName = 'phpdebugbar', int $maxHeaderLength = 4096): static
+ {
+ if ($useOpenHandler === null) {
+ $useOpenHandler = self::$useOpenHandlerWhenSendingDataHeaders;
+ }
+ if ($useOpenHandler && $this->isDataPersisted()) {
+ $this->getData();
+ $headers = ["{$headerName}-id" => $this->getCurrentRequestId()];
+
+ // Only send stacked data in ajax if storage is used
+ if (!$this->stackAlwaysUseSessionStorage && $this->hasStackedData()) {
+ $stackIds = $this->getStackedIds();
+ if (count($stackIds) > 0) {
+ $headers["{$headerName}-stack"] = json_encode($stackIds);
+ }
+ }
+ } else {
+ $headers = $this->getDataAsHeaders($headerName, $maxHeaderLength);
+ }
+ $this->getHttpDriver()->setHeaders($headers);
+ return $this;
+ }
+
+ /**
+ * Stacks the data in the session for later rendering
+ */
+ public function stackData(): static
+ {
+ $http = $this->initStackSession();
+
+ $data = null;
+ if (!$this->isDataPersisted() || $this->stackAlwaysUseSessionStorage) {
+ $data = $this->getData();
+ } elseif ($this->data === null) {
+ $this->collect();
+ }
+
+ $stack = $http->getSessionValue($this->stackSessionNamespace);
+ $stack[$this->getCurrentRequestId()] = $data;
+ $http->setSessionValue($this->stackSessionNamespace, $stack);
+ return $this;
+ }
+
+ /**
+ * Checks if there is stacked data in the session
+ *
+ * @return boolean
+ */
+ public function hasStackedData(): bool
+ {
+ try {
+ $stackedData = $this->getStackedValue(false);
+ } catch (DebugBarException $e) {
+ return false;
+ }
+
+ return count($stackedData) > 0;
+ }
+
+ /**
+ * @throws DebugBarException
+ */
+ protected function getStackedValue(bool $delete = true): array
+ {
+ $http = $this->initStackSession();
+ $stackedData = $http->getSessionValue($this->stackSessionNamespace);
+ if ($delete) {
+ $http->deleteSessionValue($this->stackSessionNamespace);
+ }
+
+ if (!is_array($stackedData)) {
+ return [];
+ }
+
+ return $stackedData;
+ }
+
+ /**
+ * Returns the data stacked in the session
+ *
+ * @param boolean $delete Whether to delete the data in the session
+ *
+ * @return array[]
+ *
+ */
+ public function getStackedData(bool $delete = true): array
+ {
+ $stackedData = $this->getStackedValue($delete);
+
+ $datasets = [];
+ if ($this->isDataPersisted() && !$this->stackAlwaysUseSessionStorage) {
+ foreach ($stackedData as $id => $data) {
+ $datasets[$id] = $this->getStorage()->get($id);
+ }
+ } else {
+ $datasets = $stackedData;
+ }
+
+ return array_filter($datasets);
+ }
+
+ public function getStackedIds(bool $delete = true): array
+ {
+ $stackedData = $this->getStackedValue($delete);
+
+ return array_keys($stackedData);
+ }
+
+ /**
+ * Sets the key to use in the $_SESSION array
+ *
+ *
+ * @return $this
+ */
+ public function setStackDataSessionNamespace(string $ns): static
+ {
+ $this->stackSessionNamespace = $ns;
+ return $this;
+ }
+
+ /**
+ * Returns the key used in the $_SESSION array
+ *
+ */
+ public function getStackDataSessionNamespace(): string
+ {
+ return $this->stackSessionNamespace;
+ }
+
+ /**
+ * Sets whether to only use the session to store stacked data even
+ * if a storage is enabled
+ *
+ * @param boolean $enabled
+ *
+ * @return $this
+ */
+ public function setStackAlwaysUseSessionStorage(bool $enabled = true): static
+ {
+ $this->stackAlwaysUseSessionStorage = $enabled;
+ return $this;
+ }
+
+ /**
+ * Checks if the session is always used to store stacked data
+ * even if a storage is enabled
+ *
+ * @return boolean
+ */
+ public function isStackAlwaysUseSessionStorage(): bool
+ {
+ return $this->stackAlwaysUseSessionStorage;
+ }
+
+ /**
+ * Initializes the session for stacked data
+ *
+ *
+ * @throws DebugBarException
+ */
+ protected function initStackSession(): HttpDriverInterface
+ {
+ $http = $this->getHttpDriver();
+ if (!$http->isSessionStarted()) {
+ throw new DebugBarException("Session must be started before using stack data in the debug bar");
+ }
+
+ if (!$http->hasSessionValue($this->stackSessionNamespace)) {
+ $http->setSessionValue($this->stackSessionNamespace, []);
+ }
+
+ return $http;
+ }
+
+ /**
+ * Returns a JavascriptRenderer for this instance
+ *
+ */
+ public function getJavascriptRenderer(?string $baseUrl = null, ?string $basePath = null): JavascriptRenderer
+ {
+ if ($this->jsRenderer === null) {
+ $this->jsRenderer = new JavascriptRenderer($this, $baseUrl, $basePath);
+ }
+ return $this->jsRenderer;
+ }
+
+ /**
+ * Set the editor globally, e.g., `vscode`
+ */
+ public function setEditor(string $editor): void
+ {
+ $this->editorTemplate = $editor;
+ $this->editorLinkTemplate = null;
+
+ foreach ($this->collectors as $collector) {
+ if (method_exists($collector, 'setEditorLinkTemplate')) {
+ $collector->setEditorLinkTemplate($this->editorTemplate);
+ }
+ }
+ }
+
+ /**
+ * Set the editor link template globally,
+ * `%f` = file, `%l` = line, e.g., `vscode://file/%f:%l`
+ */
+ public function setEditorTemplate(string $editorLinkTemplate, bool $shouldUseAjax = false): void
+ {
+ $this->editorTemplate = null;
+ $this->editorLinkTemplate = !$shouldUseAjax ? $editorLinkTemplate
+ : "javascript:(()=>{let r=new XMLHttpRequest;r.open('get','{$editorLinkTemplate}');r.send();})()";
+
+ foreach ($this->collectors as $collector) {
+ if (method_exists($collector, 'setXdebugLinkTemplate')) {
+ $collector->setXdebugLinkTemplate($this->editorLinkTemplate);
+ }
+ }
+ }
+
+ /**
+ * Set server path replacements, server paths will be mapped to local paths
+ * e.g., `['/var/www/remote/' => '/home/local/']`,
+ * '/var/www/remote/app/path' will become to '/home/local/app/path'
+ */
+ public function setRemoteReplacements(array $remotePathReplacements): void
+ {
+ $this->remotePathReplacements = $remotePathReplacements;
+
+ foreach ($this->collectors as $collector) {
+ if (method_exists($collector, 'setXdebugReplacements')) {
+ $collector->setXdebugReplacements($this->remotePathReplacements);
+ }
+ }
+ }
+
+ // --------------------------------------------
+ // ArrayAccess implementation
+
+ public function offsetSet(mixed $offset, mixed $value): void
+ {
+ throw new DebugBarException("DebugBar[] is read-only");
+ }
+
+ public function offsetGet(mixed $offset): mixed
+ {
+ return $this->getCollector($offset);
+ }
+
+ public function offsetExists(mixed $offset): bool
+ {
+ return $this->hasCollector($offset);
+ }
+
+ public function offsetUnset(mixed $offset): void
+ {
+ if ($this->hasCollector($offset)) {
+ $this->removeCollector($offset);
+ }
+ }
+}
diff --git a/src/DebugBar/Bridge/CacheCacheCollector.php b/src/DebugBar/Bridge/CacheCacheCollector.php
deleted file mode 100644
index 7e7f46f9d..000000000
--- a/src/DebugBar/Bridge/CacheCacheCollector.php
+++ /dev/null
@@ -1,75 +0,0 @@
-
- * $debugbar->addCollector(new CacheCacheCollector(CacheManager::get('default')));
- * // or
- * $debugbar->addCollector(new CacheCacheCollector());
- * $debugbar['cache']->addCache(CacheManager::get('default'));
- *
- */
-class CacheCacheCollector extends MonologCollector
-{
- protected $logger;
-
- /**
- * CacheCacheCollector constructor.
- * @param Cache|null $cache
- * @param Logger|null $logger
- * @param bool $level
- * @param bool $bubble
- */
- public function __construct(Cache $cache = null, Logger $logger = null, $level = Logger::DEBUG, $bubble = true)
- {
- parent::__construct(null, $level, $bubble);
-
- if ($logger === null) {
- $logger = new Logger('Cache');
- }
- $this->logger = $logger;
-
- if ($cache !== null) {
- $this->addCache($cache);
- }
- }
-
- /**
- * @param Cache $cache
- */
- public function addCache(Cache $cache)
- {
- $backend = $cache->getBackend();
- if (!($backend instanceof LoggingBackend)) {
- $backend = new LoggingBackend($backend, $this->logger);
- }
- $cache->setBackend($backend);
- $this->addLogger($backend->getLogger());
- }
-
- /**
- * @return string
- */
- public function getName()
- {
- return 'cache';
- }
-}
diff --git a/src/DebugBar/Bridge/DoctrineCollector.php b/src/DebugBar/Bridge/DoctrineCollector.php
deleted file mode 100644
index 7c91da9bf..000000000
--- a/src/DebugBar/Bridge/DoctrineCollector.php
+++ /dev/null
@@ -1,115 +0,0 @@
-
- * $debugStack = new Doctrine\DBAL\Logging\DebugStack();
- * $entityManager->getConnection()->getConfiguration()->setSQLLogger($debugStack);
- * $debugbar->addCollector(new DoctrineCollector($debugStack));
- *
- */
-class DoctrineCollector extends DataCollector implements Renderable, AssetProvider
-{
- protected $debugStack;
-
- /**
- * DoctrineCollector constructor.
- * @param $debugStackOrEntityManager
- * @throws DebugBarException
- */
- public function __construct($debugStackOrEntityManager)
- {
- if ($debugStackOrEntityManager instanceof EntityManager) {
- $debugStackOrEntityManager = $debugStackOrEntityManager->getConnection()->getConfiguration()->getSQLLogger();
- }
- if (!($debugStackOrEntityManager instanceof DebugStack)) {
- throw new DebugBarException("'DoctrineCollector' requires an 'EntityManager' or 'DebugStack' object");
- }
- $this->debugStack = $debugStackOrEntityManager;
- }
-
- /**
- * @return array
- */
- public function collect()
- {
- $queries = array();
- $totalExecTime = 0;
- foreach ($this->debugStack->queries as $q) {
- $queries[] = array(
- 'sql' => $q['sql'],
- 'params' => (object) $q['params'],
- 'duration' => $q['executionMS'],
- 'duration_str' => $this->formatDuration($q['executionMS'])
- );
- $totalExecTime += $q['executionMS'];
- }
-
- return array(
- 'nb_statements' => count($queries),
- 'accumulated_duration' => $totalExecTime,
- 'accumulated_duration_str' => $this->formatDuration($totalExecTime),
- 'statements' => $queries
- );
- }
-
- /**
- * @return string
- */
- public function getName()
- {
- return 'doctrine';
- }
-
- /**
- * @return array
- */
- public function getWidgets()
- {
- return array(
- "database" => array(
- "icon" => "arrow-right",
- "widget" => "PhpDebugBar.Widgets.SQLQueriesWidget",
- "map" => "doctrine",
- "default" => "[]"
- ),
- "database:badge" => array(
- "map" => "doctrine.nb_statements",
- "default" => 0
- )
- );
- }
-
- /**
- * @return array
- */
- public function getAssets()
- {
- return array(
- 'css' => 'widgets/sqlqueries/widget.css',
- 'js' => 'widgets/sqlqueries/widget.js'
- );
- }
-}
diff --git a/src/DebugBar/Bridge/MonologCollector.php b/src/DebugBar/Bridge/MonologCollector.php
deleted file mode 100644
index f24b296d5..000000000
--- a/src/DebugBar/Bridge/MonologCollector.php
+++ /dev/null
@@ -1,118 +0,0 @@
-
- * $debugbar->addCollector(new MonologCollector($logger));
- *
- */
-class MonologCollector extends AbstractProcessingHandler implements DataCollectorInterface, Renderable, MessagesAggregateInterface
-{
- protected $name;
-
- protected $records = array();
-
- /**
- * @param Logger $logger
- * @param int $level
- * @param boolean $bubble
- * @param string $name
- */
- public function __construct(Logger $logger = null, $level = Logger::DEBUG, $bubble = true, $name = 'monolog')
- {
- parent::__construct($level, $bubble);
- $this->name = $name;
- if ($logger !== null) {
- $this->addLogger($logger);
- }
- }
-
- /**
- * Adds logger which messages you want to log
- *
- * @param Logger $logger
- */
- public function addLogger(Logger $logger)
- {
- $logger->pushHandler($this);
- }
-
- /**
- * @param array $record
- */
- protected function write(array $record)
- {
- $this->records[] = array(
- 'message' => $record['formatted'],
- 'is_string' => true,
- 'label' => strtolower($record['level_name']),
- 'time' => $record['datetime']->format('U')
- );
- }
-
- /**
- * @return array
- */
- public function getMessages()
- {
- return $this->records;
- }
-
- /**
- * @return array
- */
- public function collect()
- {
- return array(
- 'count' => count($this->records),
- 'records' => $this->records
- );
- }
-
- /**
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
-
- /**
- * @return array
- */
- public function getWidgets()
- {
- $name = $this->getName();
- return array(
- $name => array(
- "icon" => "suitcase",
- "widget" => "PhpDebugBar.Widgets.MessagesWidget",
- "map" => "$name.records",
- "default" => "[]"
- ),
- "$name:badge" => array(
- "map" => "$name.count",
- "default" => "null"
- )
- );
- }
-}
diff --git a/src/DebugBar/Bridge/Propel2Collector.php b/src/DebugBar/Bridge/Propel2Collector.php
deleted file mode 100644
index 3df4dcc6d..000000000
--- a/src/DebugBar/Bridge/Propel2Collector.php
+++ /dev/null
@@ -1,307 +0,0 @@
-
- * $debugbar->addCollector(new \DebugBar\Bridge\Propel2Collector(\Propel\Runtime\Propel::getServiceContainer()->getReadConnection()));
- *
- */
-class Propel2Collector extends DataCollector implements Renderable, AssetProvider
-{
- /**
- * @var null|TestHandler
- */
- protected $handler = null;
-
- /**
- * @var null|Logger
- */
- protected $logger = null;
-
- /**
- * @var array
- */
- protected $config = array();
-
- /**
- * @var array
- */
- protected $errors = array();
-
- /**
- * @var int
- */
- protected $queryCount = 0;
-
- /**
- * @param ConnectionInterface $connection Propel connection
- */
- public function __construct(
- ConnectionInterface $connection,
- array $logMethods = array(
- 'beginTransaction',
- 'commit',
- 'rollBack',
- 'forceRollBack',
- 'exec',
- 'query',
- 'execute'
- )
- ) {
- if ($connection instanceof ProfilerConnectionWrapper) {
- $connection->setLogMethods($logMethods);
-
- $this->config = $connection->getProfiler()->getConfiguration();
-
- $this->handler = new TestHandler();
-
- if ($connection->getLogger() instanceof Logger) {
- $this->logger = $connection->getLogger();
- $this->logger->pushHandler($this->handler);
- } else {
- $this->errors[] = 'Supported only monolog logger';
- }
- } else {
- $this->errors[] = 'You need set ProfilerConnectionWrapper';
- }
- }
-
- /**
- * @return TestHandler|null
- */
- public function getHandler()
- {
- return $this->handler;
- }
-
- /**
- * @return array
- */
- public function getConfig()
- {
- return $this->config;
- }
-
- /**
- * @return Logger|null
- */
- public function getLogger()
- {
- return $this->logger;
- }
-
- /**
- * @return LoggerInterface
- */
- protected function getDefaultLogger()
- {
- return Propel::getServiceContainer()->getLogger();
- }
-
- /**
- * @return int
- */
- protected function getQueryCount()
- {
- return $this->queryCount;
- }
-
- /**
- * @param array $records
- * @param array $config
- * @return array
- */
- protected function getStatements($records, $config)
- {
- $statements = array();
- foreach ($records as $record) {
- $duration = null;
- $memory = null;
-
- $isSuccess = ( LogLevel::INFO === strtolower($record['level_name']) );
-
- $detailsCount = count($config['details']);
- $parameters = explode($config['outerGlue'], $record['message'], $detailsCount + 1);
- if (count($parameters) === ($detailsCount + 1)) {
- $parameters = array_map('trim', $parameters);
- $_details = array();
- foreach (array_splice($parameters, 0, $detailsCount) as $string) {
- list($key, $value) = array_map('trim', explode($config['innerGlue'], $string, 2));
- $_details[$key] = $value;
- }
-
- $details = array();
- foreach ($config['details'] as $key => $detail) {
- if (isset($_details[$detail['name']])) {
- $value = $_details[$detail['name']];
- if ('time' === $key) {
- if (substr_count($value, 'ms')) {
- $value = (float)$value / 1000;
- } else {
- $value = (float)$value;
- }
- } else {
- $suffixes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
- $suffix = substr($value, -2);
- $i = array_search($suffix, $suffixes, true);
- $i = (false === $i) ? 0 : $i;
-
- $value = ((float)$value) * pow(1024, $i);
- }
- $details[$key] = $value;
- }
- }
-
- if (isset($details['time'])) {
- $duration = $details['time'];
- }
- if (isset($details['memDelta'])) {
- $memory = $details['memDelta'];
- }
-
- $message = end($parameters);
-
- if ($isSuccess) {
- $this->queryCount++;
- }
-
- } else {
- $message = $record['message'];
- }
-
- $statement = array(
- 'sql' => $message,
- 'is_success' => $isSuccess,
- 'duration' => $duration,
- 'duration_str' => $this->getDataFormatter()->formatDuration($duration),
- 'memory' => $memory,
- 'memory_str' => $this->getDataFormatter()->formatBytes($memory),
- );
-
- if (false === $isSuccess) {
- $statement['sql'] = '';
- $statement['error_code'] = $record['level'];
- $statement['error_message'] = $message;
- }
-
- $statements[] = $statement;
- }
- return $statements;
- }
-
- /**
- * @return array
- */
- public function collect()
- {
- if (count($this->errors)) {
- return array(
- 'statements' => array_map(function ($message) {
- return array('sql' => '', 'is_success' => false, 'error_code' => 500, 'error_message' => $message);
- }, $this->errors),
- 'nb_statements' => 0,
- 'nb_failed_statements' => count($this->errors),
- );
- }
-
- if ($this->getHandler() === null) {
- return array();
- }
-
- $statements = $this->getStatements($this->getHandler()->getRecords(), $this->getConfig());
-
- $failedStatement = count(array_filter($statements, function ($statement) {
- return false === $statement['is_success'];
- }));
- $accumulatedDuration = array_reduce($statements, function ($accumulatedDuration, $statement) {
-
- $time = isset($statement['duration']) ? $statement['duration'] : 0;
- return $accumulatedDuration += $time;
- });
- $memoryUsage = array_reduce($statements, function ($memoryUsage, $statement) {
-
- $time = isset($statement['memory']) ? $statement['memory'] : 0;
- return $memoryUsage += $time;
- });
-
- return array(
- 'nb_statements' => $this->getQueryCount(),
- 'nb_failed_statements' => $failedStatement,
- 'accumulated_duration' => $accumulatedDuration,
- 'accumulated_duration_str' => $this->getDataFormatter()->formatDuration($accumulatedDuration),
- 'memory_usage' => $memoryUsage,
- 'memory_usage_str' => $this->getDataFormatter()->formatBytes($memoryUsage),
- 'statements' => $statements
- );
- }
-
- /**
- * @return string
- */
- public function getName()
- {
- $additionalName = '';
- if ($this->getLogger() !== $this->getDefaultLogger()) {
- $additionalName = ' ('.$this->getLogger()->getName().')';
- }
-
- return 'propel2'.$additionalName;
- }
-
- /**
- * @return array
- */
- public function getWidgets()
- {
- return array(
- $this->getName() => array(
- 'icon' => 'bolt',
- 'widget' => 'PhpDebugBar.Widgets.SQLQueriesWidget',
- 'map' => $this->getName(),
- 'default' => '[]'
- ),
- $this->getName().':badge' => array(
- 'map' => $this->getName().'.nb_statements',
- 'default' => 0
- ),
- );
- }
-
- /**
- * @return array
- */
- public function getAssets()
- {
- return array(
- 'css' => 'widgets/sqlqueries/widget.css',
- 'js' => 'widgets/sqlqueries/widget.js'
- );
- }
-}
diff --git a/src/DebugBar/Bridge/PropelCollector.php b/src/DebugBar/Bridge/PropelCollector.php
deleted file mode 100644
index 93ad4ff82..000000000
--- a/src/DebugBar/Bridge/PropelCollector.php
+++ /dev/null
@@ -1,253 +0,0 @@
-
- * $debugbar->addCollector(new PropelCollector($debugbar['messages']));
- * PropelCollector::enablePropelProfiling();
- *
- */
-class PropelCollector extends DataCollector implements BasicLogger, Renderable, AssetProvider
-{
- protected $logger;
-
- protected $statements = array();
-
- protected $accumulatedTime = 0;
-
- protected $peakMemory = 0;
-
- /**
- * Sets the needed configuration option in propel to enable query logging
- *
- * @param PropelConfiguration $config Apply profiling on a specific config
- */
- public static function enablePropelProfiling(PropelConfiguration $config = null)
- {
- if ($config === null) {
- $config = Propel::getConfiguration(PropelConfiguration::TYPE_OBJECT);
- }
- $config->setParameter('debugpdo.logging.details.method.enabled', true);
- $config->setParameter('debugpdo.logging.details.time.enabled', true);
- $config->setParameter('debugpdo.logging.details.mem.enabled', true);
- $allMethods = array(
- 'PropelPDO::__construct', // logs connection opening
- 'PropelPDO::__destruct', // logs connection close
- 'PropelPDO::exec', // logs a query
- 'PropelPDO::query', // logs a query
- 'PropelPDO::beginTransaction', // logs a transaction begin
- 'PropelPDO::commit', // logs a transaction commit
- 'PropelPDO::rollBack', // logs a transaction rollBack (watch out for the capital 'B')
- 'DebugPDOStatement::execute', // logs a query from a prepared statement
- );
- $config->setParameter('debugpdo.logging.methods', $allMethods, false);
- }
-
- /**
- * @param LoggerInterface $logger A logger to forward non-query log lines to
- * @param PropelPDO $conn Bound this collector to a connection only
- */
- public function __construct(LoggerInterface $logger = null, PropelPDO $conn = null)
- {
- if ($conn) {
- $conn->setLogger($this);
- } else {
- Propel::setLogger($this);
- }
- $this->logger = $logger;
- $this->logQueriesToLogger = false;
- }
-
- public function setLogQueriesToLogger($enable = true)
- {
- $this->logQueriesToLogger = $enable;
- return $this;
- }
-
- public function isLogQueriesToLogger()
- {
- return $this->logQueriesToLogger;
- }
-
- public function emergency($m)
- {
- $this->log($m, Propel::LOG_EMERG);
- }
-
- public function alert($m)
- {
- $this->log($m, Propel::LOG_ALERT);
- }
-
- public function crit($m)
- {
- $this->log($m, Propel::LOG_CRIT);
- }
-
- public function err($m)
- {
- $this->log($m, Propel::LOG_ERR);
- }
-
- public function warning($m)
- {
- $this->log($m, Propel::LOG_WARNING);
- }
-
- public function notice($m)
- {
- $this->log($m, Propel::LOG_NOTICE);
- }
-
- public function info($m)
- {
- $this->log($m, Propel::LOG_INFO);
- }
-
- public function debug($m)
- {
- $this->log($m, Propel::LOG_DEBUG);
- }
-
- public function log($message, $severity = null)
- {
- if (strpos($message, 'DebugPDOStatement::execute') !== false) {
- list($sql, $duration_str) = $this->parseAndLogSqlQuery($message);
- if (!$this->logQueriesToLogger) {
- return;
- }
- $message = "$sql ($duration_str)";
- }
-
- if ($this->logger !== null) {
- $this->logger->log($this->convertLogLevel($severity), $message);
- }
- }
-
- /**
- * Converts Propel log levels to PSR log levels
- *
- * @param int $level
- * @return string
- */
- protected function convertLogLevel($level)
- {
- $map = array(
- Propel::LOG_EMERG => LogLevel::EMERGENCY,
- Propel::LOG_ALERT => LogLevel::ALERT,
- Propel::LOG_CRIT => LogLevel::CRITICAL,
- Propel::LOG_ERR => LogLevel::ERROR,
- Propel::LOG_WARNING => LogLevel::WARNING,
- Propel::LOG_NOTICE => LogLevel::NOTICE,
- Propel::LOG_DEBUG => LogLevel::DEBUG
- );
- return $map[$level];
- }
-
- /**
- * Parse a log line to extract query information
- *
- * @param string $message
- */
- protected function parseAndLogSqlQuery($message)
- {
- $parts = explode('|', $message, 4);
- $sql = trim($parts[3]);
-
- $duration = 0;
- if (preg_match('/([0-9]+\.[0-9]+)/', $parts[1], $matches)) {
- $duration = (float) $matches[1];
- }
-
- $memory = 0;
- if (preg_match('/([0-9]+\.[0-9]+) ([A-Z]{1,2})/', $parts[2], $matches)) {
- $memory = (float) $matches[1];
- if ($matches[2] == 'KB') {
- $memory *= 1024;
- } elseif ($matches[2] == 'MB') {
- $memory *= 1024 * 1024;
- }
- }
-
- $this->statements[] = array(
- 'sql' => $sql,
- 'is_success' => true,
- 'duration' => $duration,
- 'duration_str' => $this->formatDuration($duration),
- 'memory' => $memory,
- 'memory_str' => $this->formatBytes($memory)
- );
- $this->accumulatedTime += $duration;
- $this->peakMemory = max($this->peakMemory, $memory);
- return array($sql, $this->formatDuration($duration));
- }
-
- public function collect()
- {
- return array(
- 'nb_statements' => count($this->statements),
- 'nb_failed_statements' => 0,
- 'accumulated_duration' => $this->accumulatedTime,
- 'accumulated_duration_str' => $this->formatDuration($this->accumulatedTime),
- 'peak_memory_usage' => $this->peakMemory,
- 'peak_memory_usage_str' => $this->formatBytes($this->peakMemory),
- 'statements' => $this->statements
- );
- }
-
- public function getName()
- {
- return 'propel';
- }
-
- public function getWidgets()
- {
- return array(
- "propel" => array(
- "icon" => "bolt",
- "widget" => "PhpDebugBar.Widgets.SQLQueriesWidget",
- "map" => "propel",
- "default" => "[]"
- ),
- "propel:badge" => array(
- "map" => "propel.nb_statements",
- "default" => 0
- )
- );
- }
-
- public function getAssets()
- {
- return array(
- 'css' => 'widgets/sqlqueries/widget.css',
- 'js' => 'widgets/sqlqueries/widget.js'
- );
- }
-}
diff --git a/src/DebugBar/Bridge/SlimCollector.php b/src/DebugBar/Bridge/SlimCollector.php
deleted file mode 100644
index 030a3baf6..000000000
--- a/src/DebugBar/Bridge/SlimCollector.php
+++ /dev/null
@@ -1,66 +0,0 @@
-slim = $slim;
- if ($log = $slim->getLog()) {
- $this->originalLogWriter = $log->getWriter();
- $log->setWriter($this);
- $log->setEnabled(true);
- }
- }
-
- public function write($message, $level)
- {
- if ($this->originalLogWriter) {
- $this->originalLogWriter->write($message, $level);
- }
- $this->addMessage($message, $this->getLevelName($level));
- }
-
- protected function getLevelName($level)
- {
- $map = array(
- Log::EMERGENCY => LogLevel::EMERGENCY,
- Log::ALERT => LogLevel::ALERT,
- Log::CRITICAL => LogLevel::CRITICAL,
- Log::ERROR => LogLevel::ERROR,
- Log::WARN => LogLevel::WARNING,
- Log::NOTICE => LogLevel::NOTICE,
- Log::INFO => LogLevel::INFO,
- Log::DEBUG => LogLevel::DEBUG
- );
- return $map[$level];
- }
-
- public function getName()
- {
- return 'slim';
- }
-}
diff --git a/src/DebugBar/Bridge/SwiftMailer/SwiftLogCollector.php b/src/DebugBar/Bridge/SwiftMailer/SwiftLogCollector.php
deleted file mode 100644
index fdef79a0b..000000000
--- a/src/DebugBar/Bridge/SwiftMailer/SwiftLogCollector.php
+++ /dev/null
@@ -1,44 +0,0 @@
-registerPlugin(new Swift_Plugins_LoggerPlugin($this));
- }
-
- public function add($entry)
- {
- $this->addMessage($entry);
- }
-
- public function dump()
- {
- return implode(PHP_EOL, $this->_log);
- }
-
- public function getName()
- {
- return 'swiftmailer_logs';
- }
-}
diff --git a/src/DebugBar/Bridge/SwiftMailer/SwiftMailCollector.php b/src/DebugBar/Bridge/SwiftMailer/SwiftMailCollector.php
deleted file mode 100644
index 01a5e906c..000000000
--- a/src/DebugBar/Bridge/SwiftMailer/SwiftMailCollector.php
+++ /dev/null
@@ -1,92 +0,0 @@
-messagesLogger = new Swift_Plugins_MessageLogger();
- $mailer->registerPlugin($this->messagesLogger);
- }
-
- public function collect()
- {
- $mails = array();
- foreach ($this->messagesLogger->getMessages() as $msg) {
- $mails[] = array(
- 'to' => $this->formatTo($msg->getTo()),
- 'subject' => $msg->getSubject(),
- 'headers' => $msg->getHeaders()->toString()
- );
- }
- return array(
- 'count' => count($mails),
- 'mails' => $mails
- );
- }
-
- protected function formatTo($to)
- {
- if (!$to) {
- return '';
- }
-
- $f = array();
- foreach ($to as $k => $v) {
- $f[] = (empty($v) ? '' : "$v ") . "<$k>";
- }
- return implode(', ', $f);
- }
-
- public function getName()
- {
- return 'swiftmailer_mails';
- }
-
- public function getWidgets()
- {
- return array(
- 'emails' => array(
- 'icon' => 'inbox',
- 'widget' => 'PhpDebugBar.Widgets.MailsWidget',
- 'map' => 'swiftmailer_mails.mails',
- 'default' => '[]',
- 'title' => 'Mails'
- ),
- 'emails:badge' => array(
- 'map' => 'swiftmailer_mails.count',
- 'default' => 'null'
- )
- );
- }
-
- public function getAssets()
- {
- return array(
- 'css' => 'widgets/mails/widget.css',
- 'js' => 'widgets/mails/widget.js'
- );
- }
-}
diff --git a/src/DebugBar/Bridge/Twig/TimeableTwigExtensionProfiler.php b/src/DebugBar/Bridge/Twig/TimeableTwigExtensionProfiler.php
deleted file mode 100644
index 3611d2d8e..000000000
--- a/src/DebugBar/Bridge/Twig/TimeableTwigExtensionProfiler.php
+++ /dev/null
@@ -1,60 +0,0 @@
-timeDataCollector = $timeDataCollector;
- }
-
- public function __construct(\Twig_Profiler_Profile $profile, TimeDataCollector $timeDataCollector = null)
- {
- parent::__construct($profile);
-
- $this->timeDataCollector = $timeDataCollector;
- }
-
- public function enter(Twig_Profiler_Profile $profile)
- {
- if ($this->timeDataCollector && $profile->isTemplate()) {
- $this->timeDataCollector->startMeasure($profile->getName(), 'template ' . $profile->getName());
- }
- parent::enter($profile);
- }
-
- public function leave(Twig_Profiler_Profile $profile)
- {
- parent::leave($profile);
- if ($this->timeDataCollector && $profile->isTemplate()) {
- $this->timeDataCollector->stopMeasure($profile->getName());
- }
- }
-}
\ No newline at end of file
diff --git a/src/DebugBar/Bridge/Twig/TraceableTwigEnvironment.php b/src/DebugBar/Bridge/Twig/TraceableTwigEnvironment.php
deleted file mode 100644
index cdaae7a45..000000000
--- a/src/DebugBar/Bridge/Twig/TraceableTwigEnvironment.php
+++ /dev/null
@@ -1,417 +0,0 @@
-twig = $twig;
- $this->timeDataCollector = $timeDataCollector;
- }
-
- public function __call($name, $arguments)
- {
- return call_user_func_array(array($this->twig, $name), $arguments);
- }
-
- public function getRenderedTemplates()
- {
- return $this->renderedTemplates;
- }
-
- public function addRenderedTemplate(array $info)
- {
- $this->renderedTemplates[] = $info;
- }
-
- public function getTimeDataCollector()
- {
- return $this->timeDataCollector;
- }
-
- public function getBaseTemplateClass()
- {
- return $this->twig->getBaseTemplateClass();
- }
-
- public function setBaseTemplateClass($class)
- {
- $this->twig->setBaseTemplateClass($class);
- }
-
- public function enableDebug()
- {
- $this->twig->enableDebug();
- }
-
- public function disableDebug()
- {
- $this->twig->disableDebug();
- }
-
- public function isDebug()
- {
- return $this->twig->isDebug();
- }
-
- public function enableAutoReload()
- {
- $this->twig->enableAutoReload();
- }
-
- public function disableAutoReload()
- {
- $this->twig->disableAutoReload();
- }
-
- public function isAutoReload()
- {
- return $this->twig->isAutoReload();
- }
-
- public function enableStrictVariables()
- {
- $this->twig->enableStrictVariables();
- }
-
- public function disableStrictVariables()
- {
- $this->twig->disableStrictVariables();
- }
-
- public function isStrictVariables()
- {
- return $this->twig->isStrictVariables();
- }
-
- public function getCache($original = true)
- {
- return $this->twig->getCache($original);
- }
-
- public function setCache($cache)
- {
- $this->twig->setCache($cache);
- }
-
- public function getCacheFilename($name)
- {
- return $this->twig->getCacheFilename($name);
- }
-
- public function getTemplateClass($name, $index = null)
- {
- return $this->twig->getTemplateClass($name, $index);
- }
-
- public function getTemplateClassPrefix()
- {
- return $this->twig->getTemplateClassPrefix();
- }
-
- public function render($name, array $context = array())
- {
- return $this->loadTemplate($name)->render($context);
- }
-
- public function display($name, array $context = array())
- {
- $this->loadTemplate($name)->display($context);
- }
-
- public function loadTemplate($name, $index = null)
- {
- $cls = $this->twig->getTemplateClass($name, $index);
-
- if (isset($this->twig->loadedTemplates[$cls])) {
- return $this->twig->loadedTemplates[$cls];
- }
-
- if (!class_exists($cls, false)) {
- if (false === $cache = $this->getCacheFilename($name)) {
- eval('?>'.$this->compileSource($this->getLoader()->getSource($name), $name));
- } else {
- if (!is_file($cache) || ($this->isAutoReload() && !$this->isTemplateFresh($name, filemtime($cache)))) {
- $this->writeCacheFile($cache, $this->compileSource($this->getLoader()->getSource($name), $name));
- }
-
- require_once $cache;
- }
- }
-
- if (!$this->twig->runtimeInitialized) {
- $this->initRuntime();
- }
-
- return $this->twig->loadedTemplates[$cls] = new TraceableTwigTemplate($this, new $cls($this));
- }
-
- public function isTemplateFresh($name, $time)
- {
- return $this->twig->isTemplateFresh($name, $time);
- }
-
- public function resolveTemplate($names)
- {
- return $this->twig->resolveTemplate($names);
- }
-
- public function clearTemplateCache()
- {
- $this->twig->clearTemplateCache();
- }
-
- public function clearCacheFiles()
- {
- $this->twig->clearCacheFiles();
- }
-
- public function getLexer()
- {
- return $this->twig->getLexer();
- }
-
- public function setLexer(Twig_LexerInterface $lexer)
- {
- $this->twig->setLexer($lexer);
- }
-
- public function tokenize($source, $name = null)
- {
- return $this->twig->tokenize($source, $name);
- }
-
- public function getParser()
- {
- return $this->twig->getParser();
- }
-
- public function setParser(Twig_ParserInterface $parser)
- {
- $this->twig->setParser($parser);
- }
-
- public function parse(Twig_TokenStream $tokens)
- {
- return $this->twig->parse($tokens);
- }
-
- public function getCompiler()
- {
- return $this->twig->getCompiler();
- }
-
- public function setCompiler(Twig_CompilerInterface $compiler)
- {
- $this->twig->setCompiler($compiler);
- }
-
- public function compile(Twig_NodeInterface $node)
- {
- return $this->twig->compile($node);
- }
-
- public function compileSource($source, $name = null)
- {
- return $this->twig->compileSource($source, $name);
- }
-
- public function setLoader(Twig_LoaderInterface $loader)
- {
- $this->twig->setLoader($loader);
- }
-
- public function getLoader()
- {
- return $this->twig->getLoader();
- }
-
- public function setCharset($charset)
- {
- $this->twig->setCharset($charset);
- }
-
- public function getCharset()
- {
- return $this->twig->getCharset();
- }
-
- public function initRuntime()
- {
- $this->twig->initRuntime();
- }
-
- public function hasExtension($name)
- {
- return $this->twig->hasExtension($name);
- }
-
- public function getExtension($name)
- {
- return $this->twig->getExtension($name);
- }
-
- public function addExtension(Twig_ExtensionInterface $extension)
- {
- $this->twig->addExtension($extension);
- }
-
- public function removeExtension($name)
- {
- $this->twig->removeExtension($name);
- }
-
- public function setExtensions(array $extensions)
- {
- $this->twig->setExtensions($extensions);
- }
-
- public function getExtensions()
- {
- return $this->twig->getExtensions();
- }
-
- public function addTokenParser(Twig_TokenParserInterface $parser)
- {
- $this->twig->addTokenParser($parser);
- }
-
- public function getTokenParsers()
- {
- return $this->twig->getTokenParsers();
- }
-
- public function getTags()
- {
- return $this->twig->getTags();
- }
-
- public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
- {
- $this->twig->addNodeVisitor($visitor);
- }
-
- public function getNodeVisitors()
- {
- return $this->twig->getNodeVisitors();
- }
-
- public function addFilter($name, $filter = null)
- {
- $this->twig->addFilter($name, $filter);
- }
-
- public function getFilter($name)
- {
- return $this->twig->getFilter($name);
- }
-
- public function registerUndefinedFilterCallback($callable)
- {
- $this->twig->registerUndefinedFilterCallback($callable);
- }
-
- public function getFilters()
- {
- return $this->twig->getFilters();
- }
-
- public function addTest($name, $test = null)
- {
- $this->twig->addTest($name, $test);
- }
-
- public function getTests()
- {
- return $this->twig->getTests();
- }
-
- public function getTest($name)
- {
- return $this->twig->getTest($name);
- }
-
- public function addFunction($name, $function = null)
- {
- $this->twig->addFunction($name, $function);
- }
-
- public function getFunction($name)
- {
- return $this->twig->getFunction($name);
- }
-
- public function registerUndefinedFunctionCallback($callable)
- {
- $this->twig->registerUndefinedFunctionCallback($callable);
- }
-
- public function getFunctions()
- {
- return $this->twig->getFunctions();
- }
-
- public function addGlobal($name, $value)
- {
- $this->twig->addGlobal($name, $value);
- }
-
- public function getGlobals()
- {
- return $this->twig->getGlobals();
- }
-
- public function mergeGlobals(array $context)
- {
- return $this->twig->mergeGlobals($context);
- }
-
- public function getUnaryOperators()
- {
- return $this->twig->getUnaryOperators();
- }
-
- public function getBinaryOperators()
- {
- return $this->twig->getBinaryOperators();
- }
-
- public function computeAlternatives($name, $items)
- {
- return $this->twig->computeAlternatives($name, $items);
- }
-}
diff --git a/src/DebugBar/Bridge/Twig/TraceableTwigTemplate.php b/src/DebugBar/Bridge/Twig/TraceableTwigTemplate.php
deleted file mode 100644
index 648f7baf4..000000000
--- a/src/DebugBar/Bridge/Twig/TraceableTwigTemplate.php
+++ /dev/null
@@ -1,136 +0,0 @@
-env = $env;
- $this->template = $template;
- }
-
- public function __call($name, $arguments)
- {
- return call_user_func_array(array($this->template, $name), $arguments);
- }
-
- public function doDisplay(array $context, array $blocks = array())
- {
- return $this->template->doDisplay($context, $blocks);
- }
-
- public function getTemplateName()
- {
- return $this->template->getTemplateName();
- }
-
- public function getEnvironment()
- {
- return $this->template->getEnvironment();
- }
-
- public function getParent(array $context)
- {
- return $this->template->getParent($context);
- }
-
- public function isTraitable()
- {
- return $this->template->isTraitable();
- }
-
- public function displayParentBlock($name, array $context, array $blocks = array())
- {
- $this->template->displayParentBlock($name, $context, $blocks);
- }
-
- public function displayBlock($name, array $context, array $blocks = array(), $useBlocks = true)
- {
- $this->template->displayBlock($name, $context, $blocks, $useBlocks);
- }
-
- public function renderParentBlock($name, array $context, array $blocks = array())
- {
- return $this->template->renderParentBlock($name, $context, $blocks);
- }
-
- public function renderBlock($name, array $context, array $blocks = array(), $useBlocks = true)
- {
- return $this->template->renderBlock($name, $context, $blocks, $useBlocks);
- }
-
- public function hasBlock($name)
- {
- return $this->template->hasBlock($name);
- }
-
- public function getBlockNames()
- {
- return $this->template->getBlockNames();
- }
-
- public function getBlocks()
- {
- return $this->template->getBlocks();
- }
-
- public function display(array $context, array $blocks = array())
- {
- $start = microtime(true);
- $this->template->display($context, $blocks);
- $end = microtime(true);
-
- if ($timeDataCollector = $this->env->getTimeDataCollector()) {
- $name = sprintf("twig.render(%s)", $this->template->getTemplateName());
- $timeDataCollector->addMeasure($name, $start, $end);
- }
-
- $this->env->addRenderedTemplate(array(
- 'name' => $this->template->getTemplateName(),
- 'render_time' => $end - $start
- ));
- }
-
- public function render(array $context)
- {
- $level = ob_get_level();
- ob_start();
- try {
- $this->display($context);
- } catch (Exception $e) {
- while (ob_get_level() > $level) {
- ob_end_clean();
- }
-
- throw $e;
- }
-
- return ob_get_clean();
- }
-
- public static function clearCache()
- {
- Twig_Template::clearCache();
- }
-}
diff --git a/src/DebugBar/Bridge/Twig/TwigCollector.php b/src/DebugBar/Bridge/Twig/TwigCollector.php
deleted file mode 100644
index c571d835b..000000000
--- a/src/DebugBar/Bridge/Twig/TwigCollector.php
+++ /dev/null
@@ -1,87 +0,0 @@
-
- * $env = new TraceableTwigEnvironment(new Twig_Environment($loader));
- * $debugbar->addCollector(new TwigCollector($env));
- *
- */
-class TwigCollector extends DataCollector implements Renderable, AssetProvider
-{
- public function __construct(TraceableTwigEnvironment $twig)
- {
- $this->twig = $twig;
- }
-
- public function collect()
- {
- $templates = array();
- $accuRenderTime = 0;
-
- foreach ($this->twig->getRenderedTemplates() as $tpl) {
- $accuRenderTime += $tpl['render_time'];
- $templates[] = array(
- 'name' => $tpl['name'],
- 'render_time' => $tpl['render_time'],
- 'render_time_str' => $this->formatDuration($tpl['render_time'])
- );
- }
-
- return array(
- 'nb_templates' => count($templates),
- 'templates' => $templates,
- 'accumulated_render_time' => $accuRenderTime,
- 'accumulated_render_time_str' => $this->formatDuration($accuRenderTime)
- );
- }
-
- public function getName()
- {
- return 'twig';
- }
-
- public function getWidgets()
- {
- return array(
- 'twig' => array(
- 'icon' => 'leaf',
- 'widget' => 'PhpDebugBar.Widgets.TemplatesWidget',
- 'map' => 'twig',
- 'default' => json_encode(array('templates' => array())),
- ),
- 'twig:badge' => array(
- 'map' => 'twig.nb_templates',
- 'default' => 0
- )
- );
- }
-
- public function getAssets()
- {
- return array(
- 'css' => 'widgets/templates/widget.css',
- 'js' => 'widgets/templates/widget.js'
- );
- }
-}
diff --git a/src/DebugBar/Bridge/TwigProfileCollector.php b/src/DebugBar/Bridge/TwigProfileCollector.php
deleted file mode 100644
index efd3a7d52..000000000
--- a/src/DebugBar/Bridge/TwigProfileCollector.php
+++ /dev/null
@@ -1,197 +0,0 @@
-
- * $env = new Twig_Environment($loader); // Or from a PSR11-container
- * $profile = new Twig_Profiler_Profile();
- * $env->addExtension(new Twig_Extension_Profile($profile));
- * $debugbar->addCollector(new TwigProfileCollector($profile, $env));
- * // or: $debugbar->addCollector(new TwigProfileCollector($profile, $loader));
- *
- */
-class TwigProfileCollector extends DataCollector implements Renderable, AssetProvider
-{
- /**
- * @var \Twig_Profiler_Profile
- */
- private $profile;
- /**
- * @var \Twig_LoaderInterface
- */
- private $loader;
- /** @var int */
- private $templateCount;
- /** @var int */
- private $blockCount;
- /** @var int */
- private $macroCount;
- /**
- * @var array[] {
- * @var string $name
- * @var int $render_time
- * @var string $render_time_str
- * @var string $memory_str
- * @var string $xdebug_link
- * }
- */
- private $templates;
-
- /**
- * TwigProfileCollector constructor.
- *
- * @param \Twig_Profiler_Profile $profile
- * @param \Twig_LoaderInterface|\Twig_Environment $loaderOrEnv
- */
- public function __construct(\Twig_Profiler_Profile $profile, $loaderOrEnv = null)
- {
- $this->profile = $profile;
- if ($loaderOrEnv instanceof \Twig_Environment) {
- $loaderOrEnv = $loaderOrEnv->getLoader();
- }
- $this->loader = $loaderOrEnv;
- }
-
- /**
- * Returns a hash where keys are control names and their values
- * an array of options as defined in {@see DebugBar\JavascriptRenderer::addControl()}
- *
- * @return array
- */
- public function getWidgets()
- {
- return array(
- 'twig' => array(
- 'icon' => 'leaf',
- 'widget' => 'PhpDebugBar.Widgets.TemplatesWidget',
- 'map' => 'twig',
- 'default' => json_encode(array('templates' => array())),
- ),
- 'twig:badge' => array(
- 'map' => 'twig.badge',
- 'default' => 0,
- ),
- );
- }
-
- /**
- * @return array
- */
- public function getAssets()
- {
- return array(
- 'css' => 'widgets/templates/widget.css',
- 'js' => 'widgets/templates/widget.js',
- );
- }
-
- /**
- * Called by the DebugBar when data needs to be collected
- *
- * @return array Collected data
- */
- public function collect()
- {
- $this->templateCount = $this->blockCount = $this->macroCount = 0;
- $this->templates = array();
- $this->computeData($this->profile);
-
- return array(
- 'nb_templates' => $this->templateCount,
- 'nb_blocks' => $this->blockCount,
- 'nb_macros' => $this->macroCount,
- 'templates' => $this->templates,
- 'accumulated_render_time' => $this->profile->getDuration(),
- 'accumulated_render_time_str' => $this->getDataFormatter()->formatDuration($this->profile->getDuration()),
- 'memory_usage_str' => $this->getDataFormatter()->formatBytes($this->profile->getMemoryUsage()),
- 'callgraph' => $this->getHtmlCallGraph(),
- 'badge' => implode(
- '/',
- array(
- $this->templateCount,
- $this->blockCount,
- $this->macroCount,
- )
- ),
- );
- }
-
- /**
- * Returns the unique name of the collector
- *
- * @return string
- */
- public function getName()
- {
- return 'twig';
- }
-
- public function getHtmlCallGraph()
- {
- $dumper = new \Twig_Profiler_Dumper_Html();
-
- return $dumper->dump($this->profile);
- }
-
- /**
- * Get an Xdebug Link to a file
- *
- * @return array {
- * @var string url
- * @var bool ajax
- * }
- */
- public function getXdebugLink($template, $line = 1)
- {
- if (is_null($this->loader)) {
- return null;
- }
- $file = $this->loader->getSourceContext($template)->getPath();
-
- return parent::getXdebugLink($file, $line);
- }
-
- private function computeData(\Twig_Profiler_Profile $profile)
- {
- $this->templateCount += ($profile->isTemplate() ? 1 : 0);
- $this->blockCount += ($profile->isBlock() ? 1 : 0);
- $this->macroCount += ($profile->isMacro() ? 1 : 0);
- if ($profile->isTemplate()) {
- $this->templates[] = array(
- 'name' => $profile->getName(),
- 'render_time' => $profile->getDuration(),
- 'render_time_str' => $this->getDataFormatter()->formatDuration($profile->getDuration()),
- 'memory_str' => $this->getDataFormatter()->formatBytes($profile->getMemoryUsage()),
- 'xdebug_link' => $this->getXdebugLink($profile->getTemplate()),
- );
- }
- foreach ($profile as $p) {
- $this->computeData($p);
- }
- }
-}
diff --git a/src/DebugBar/DataCollector/ConfigCollector.php b/src/DebugBar/DataCollector/ConfigCollector.php
deleted file mode 100644
index 75817ba20..000000000
--- a/src/DebugBar/DataCollector/ConfigCollector.php
+++ /dev/null
@@ -1,120 +0,0 @@
-useHtmlVarDumper = $value;
- return $this;
- }
-
- /**
- * Indicates whether the Symfony HtmlDumper will be used to dump variables for rich variable
- * rendering.
- *
- * @return mixed
- */
- public function isHtmlVarDumperUsed()
- {
- return $this->useHtmlVarDumper;
- }
-
- /**
- * @param array $data
- * @param string $name
- */
- public function __construct(array $data = array(), $name = 'config')
- {
- $this->name = $name;
- $this->data = $data;
- }
-
- /**
- * Sets the data
- *
- * @param array $data
- */
- public function setData(array $data)
- {
- $this->data = $data;
- }
-
- /**
- * @return array
- */
- public function collect()
- {
- $data = array();
- foreach ($this->data as $k => $v) {
- if ($this->isHtmlVarDumperUsed()) {
- $v = $this->getVarDumper()->renderVar($v);
- } else if (!is_string($v)) {
- $v = $this->getDataFormatter()->formatVar($v);
- }
- $data[$k] = $v;
- }
- return $data;
- }
-
- /**
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
-
- /**
- * @return array
- */
- public function getAssets() {
- return $this->isHtmlVarDumperUsed() ? $this->getVarDumper()->getAssets() : array();
- }
-
- /**
- * @return array
- */
- public function getWidgets()
- {
- $name = $this->getName();
- $widget = $this->isHtmlVarDumperUsed()
- ? "PhpDebugBar.Widgets.HtmlVariableListWidget"
- : "PhpDebugBar.Widgets.VariableListWidget";
- return array(
- "$name" => array(
- "icon" => "gear",
- "widget" => $widget,
- "map" => "$name",
- "default" => "{}"
- )
- );
- }
-}
diff --git a/src/DebugBar/DataCollector/DataCollector.php b/src/DebugBar/DataCollector/DataCollector.php
deleted file mode 100644
index 5e3d52f23..000000000
--- a/src/DebugBar/DataCollector/DataCollector.php
+++ /dev/null
@@ -1,234 +0,0 @@
-dataFormater = $formater;
- return $this;
- }
-
- /**
- * @return DataFormatterInterface
- */
- public function getDataFormatter()
- {
- if ($this->dataFormater === null) {
- $this->dataFormater = self::getDefaultDataFormatter();
- }
- return $this->dataFormater;
- }
-
- /**
- * Get an Xdebug Link to a file
- *
- * @param string $file
- * @param int $line
- *
- * @return array {
- * @var string $url
- * @var bool $ajax should be used to open the url instead of a normal links
- * }
- */
- public function getXdebugLink($file, $line = 1)
- {
- if (count($this->xdebugReplacements)) {
- $file = strtr($file, $this->xdebugReplacements);
- }
-
- $url = strtr($this->getXdebugLinkTemplate(), ['%f' => $file, '%l' => $line]);
- if ($url) {
- return ['url' => $url, 'ajax' => $this->getXdebugShouldUseAjax()];
- }
- }
-
- /**
- * Sets the default variable dumper used by all collectors subclassing this class
- *
- * @param DebugBarVarDumper $varDumper
- */
- public static function setDefaultVarDumper(DebugBarVarDumper $varDumper)
- {
- self::$defaultVarDumper = $varDumper;
- }
-
- /**
- * Returns the default variable dumper
- *
- * @return DebugBarVarDumper
- */
- public static function getDefaultVarDumper()
- {
- if (self::$defaultVarDumper === null) {
- self::$defaultVarDumper = new DebugBarVarDumper();
- }
- return self::$defaultVarDumper;
- }
-
- /**
- * Sets the variable dumper instance used by this collector
- *
- * @param DebugBarVarDumper $varDumper
- * @return $this
- */
- public function setVarDumper(DebugBarVarDumper $varDumper)
- {
- $this->varDumper = $varDumper;
- return $this;
- }
-
- /**
- * Gets the variable dumper instance used by this collector; note that collectors using this
- * instance need to be sure to return the static assets provided by the variable dumper.
- *
- * @return DebugBarVarDumper
- */
- public function getVarDumper()
- {
- if ($this->varDumper === null) {
- $this->varDumper = self::getDefaultVarDumper();
- }
- return $this->varDumper;
- }
-
- /**
- * @deprecated
- */
- public function formatVar($var)
- {
- return $this->getDataFormatter()->formatVar($var);
- }
-
- /**
- * @deprecated
- */
- public function formatDuration($seconds)
- {
- return $this->getDataFormatter()->formatDuration($seconds);
- }
-
- /**
- * @deprecated
- */
- public function formatBytes($size, $precision = 2)
- {
- return $this->getDataFormatter()->formatBytes($size, $precision);
- }
-
- /**
- * @return string
- */
- public function getXdebugLinkTemplate()
- {
- if (empty($this->xdebugLinkTemplate) && !empty(ini_get('xdebug.file_link_format'))) {
- $this->xdebugLinkTemplate = ini_get('xdebug.file_link_format');
- }
-
- return $this->xdebugLinkTemplate;
- }
-
- /**
- * @param string $xdebugLinkTemplate
- * @param bool $shouldUseAjax
- */
- public function setXdebugLinkTemplate($xdebugLinkTemplate, $shouldUseAjax = false)
- {
- if ($xdebugLinkTemplate === 'idea') {
- $this->xdebugLinkTemplate = 'http://localhost:63342/api/file/?file=%f&line=%l';
- $this->xdebugShouldUseAjax = true;
- } else {
- $this->xdebugLinkTemplate = $xdebugLinkTemplate;
- $this->xdebugShouldUseAjax = $shouldUseAjax;
- }
- }
-
- /**
- * @return bool
- */
- public function getXdebugShouldUseAjax()
- {
- return $this->xdebugShouldUseAjax;
- }
-
- /**
- * returns an array of filename-replacements
- *
- * this is useful f.e. when using vagrant or remote servers,
- * where the path of the file is different between server and
- * development environment
- *
- * @return array key-value-pairs of replacements, key = path on server, value = replacement
- */
- public function getXdebugReplacements()
- {
- return $this->xdebugReplacements;
- }
-
- /**
- * @param array $xdebugReplacements
- */
- public function setXdebugReplacements($xdebugReplacements)
- {
- $this->xdebugReplacements = $xdebugReplacements;
- }
-
- public function setXdebugReplacement($serverPath, $replacement)
- {
- $this->xdebugReplacements[$serverPath] = $replacement;
- }
-}
diff --git a/src/DebugBar/DataCollector/ExceptionsCollector.php b/src/DebugBar/DataCollector/ExceptionsCollector.php
deleted file mode 100644
index 22904a713..000000000
--- a/src/DebugBar/DataCollector/ExceptionsCollector.php
+++ /dev/null
@@ -1,142 +0,0 @@
-addThrowable($e);
- }
-
- /**
- * Adds a Throwable to be profiled in the debug bar
- *
- * @param \Throwable $e
- */
- public function addThrowable($e)
- {
- $this->exceptions[] = $e;
- if ($this->chainExceptions && $previous = $e->getPrevious()) {
- $this->addThrowable($previous);
- }
- }
-
- /**
- * Configure whether or not all chained exceptions should be shown.
- *
- * @param bool $chainExceptions
- */
- public function setChainExceptions($chainExceptions = true)
- {
- $this->chainExceptions = $chainExceptions;
- }
-
- /**
- * Returns the list of exceptions being profiled
- *
- * @return array[\Throwable]
- */
- public function getExceptions()
- {
- return $this->exceptions;
- }
-
- public function collect()
- {
- return array(
- 'count' => count($this->exceptions),
- 'exceptions' => array_map(array($this, 'formatThrowableData'), $this->exceptions)
- );
- }
-
- /**
- * Returns exception data as an array
- *
- * @param Exception $e
- * @return array
- * @deprecated in favor on formatThrowableData
- */
- public function formatExceptionData(Exception $e)
- {
- return $this->formatThrowableData($e);
- }
-
- /**
- * Returns Throwable data as an array
- *
- * @param \Throwable $e
- * @return array
- */
- public function formatThrowableData($e)
- {
- $filePath = $e->getFile();
- if ($filePath && file_exists($filePath)) {
- $lines = file($filePath);
- $start = $e->getLine() - 4;
- $lines = array_slice($lines, $start < 0 ? 0 : $start, 7);
- } else {
- $lines = array("Cannot open the file ($filePath) in which the exception occurred ");
- }
-
- return array(
- 'type' => get_class($e),
- 'message' => $e->getMessage(),
- 'code' => $e->getCode(),
- 'file' => $filePath,
- 'line' => $e->getLine(),
- 'surrounding_lines' => $lines,
- 'xdebug_link' => $this->getXdebugLink($filePath, $e->getLine())
- );
- }
-
- /**
- * @return string
- */
- public function getName()
- {
- return 'exceptions';
- }
-
- /**
- * @return array
- */
- public function getWidgets()
- {
- return array(
- 'exceptions' => array(
- 'icon' => 'bug',
- 'widget' => 'PhpDebugBar.Widgets.ExceptionsWidget',
- 'map' => 'exceptions.exceptions',
- 'default' => '[]'
- ),
- 'exceptions:badge' => array(
- 'map' => 'exceptions.count',
- 'default' => 'null'
- )
- );
- }
-}
diff --git a/src/DebugBar/DataCollector/MessagesCollector.php b/src/DebugBar/DataCollector/MessagesCollector.php
deleted file mode 100644
index f26d3716c..000000000
--- a/src/DebugBar/DataCollector/MessagesCollector.php
+++ /dev/null
@@ -1,245 +0,0 @@
-name = $name;
- }
-
- /**
- * Sets the data formater instance used by this collector
- *
- * @param DataFormatterInterface $formater
- * @return $this
- */
- public function setDataFormatter(DataFormatterInterface $formater)
- {
- $this->dataFormater = $formater;
- return $this;
- }
-
- /**
- * @return DataFormatterInterface
- */
- public function getDataFormatter()
- {
- if ($this->dataFormater === null) {
- $this->dataFormater = DataCollector::getDefaultDataFormatter();
- }
- return $this->dataFormater;
- }
-
- /**
- * Sets the variable dumper instance used by this collector
- *
- * @param DebugBarVarDumper $varDumper
- * @return $this
- */
- public function setVarDumper(DebugBarVarDumper $varDumper)
- {
- $this->varDumper = $varDumper;
- return $this;
- }
-
- /**
- * Gets the variable dumper instance used by this collector
- *
- * @return DebugBarVarDumper
- */
- public function getVarDumper()
- {
- if ($this->varDumper === null) {
- $this->varDumper = DataCollector::getDefaultVarDumper();
- }
- return $this->varDumper;
- }
-
- /**
- * Sets a flag indicating whether the Symfony HtmlDumper will be used to dump variables for
- * rich variable rendering. Be sure to set this flag before logging any messages for the
- * first time.
- *
- * @param bool $value
- * @return $this
- */
- public function useHtmlVarDumper($value = true)
- {
- $this->useHtmlVarDumper = $value;
- return $this;
- }
-
- /**
- * Indicates whether the Symfony HtmlDumper will be used to dump variables for rich variable
- * rendering.
- *
- * @return mixed
- */
- public function isHtmlVarDumperUsed()
- {
- return $this->useHtmlVarDumper;
- }
-
- /**
- * Adds a message
- *
- * A message can be anything from an object to a string
- *
- * @param mixed $message
- * @param string $label
- */
- public function addMessage($message, $label = 'info', $isString = true)
- {
- $messageText = $message;
- $messageHtml = null;
- if (!is_string($message)) {
- // Send both text and HTML representations; the text version is used for searches
- $messageText = $this->getDataFormatter()->formatVar($message);
- if ($this->isHtmlVarDumperUsed()) {
- $messageHtml = $this->getVarDumper()->renderVar($message);
- }
- $isString = false;
- }
- $this->messages[] = array(
- 'message' => $messageText,
- 'message_html' => $messageHtml,
- 'is_string' => $isString,
- 'label' => $label,
- 'time' => microtime(true)
- );
- }
-
- /**
- * Aggregates messages from other collectors
- *
- * @param MessagesAggregateInterface $messages
- */
- public function aggregate(MessagesAggregateInterface $messages)
- {
- $this->aggregates[] = $messages;
- }
-
- /**
- * @return array
- */
- public function getMessages()
- {
- $messages = $this->messages;
- foreach ($this->aggregates as $collector) {
- $msgs = array_map(function ($m) use ($collector) {
- $m['collector'] = $collector->getName();
- return $m;
- }, $collector->getMessages());
- $messages = array_merge($messages, $msgs);
- }
-
- // sort messages by their timestamp
- usort($messages, function ($a, $b) {
- if ($a['time'] === $b['time']) {
- return 0;
- }
- return $a['time'] < $b['time'] ? -1 : 1;
- });
-
- return $messages;
- }
-
- /**
- * @param $level
- * @param $message
- * @param array $context
- */
- public function log($level, $message, array $context = array())
- {
- $this->addMessage($message, $level);
- }
-
- /**
- * Deletes all messages
- */
- public function clear()
- {
- $this->messages = array();
- }
-
- /**
- * @return array
- */
- public function collect()
- {
- $messages = $this->getMessages();
- return array(
- 'count' => count($messages),
- 'messages' => $messages
- );
- }
-
- /**
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
-
- /**
- * @return array
- */
- public function getAssets() {
- return $this->isHtmlVarDumperUsed() ? $this->getVarDumper()->getAssets() : array();
- }
-
- /**
- * @return array
- */
- public function getWidgets()
- {
- $name = $this->getName();
- return array(
- "$name" => array(
- 'icon' => 'list-alt',
- "widget" => "PhpDebugBar.Widgets.MessagesWidget",
- "map" => "$name.messages",
- "default" => "[]"
- ),
- "$name:badge" => array(
- "map" => "$name.count",
- "default" => "null"
- )
- );
- }
-}
diff --git a/src/DebugBar/DataCollector/PDO/PDOCollector.php b/src/DebugBar/DataCollector/PDO/PDOCollector.php
deleted file mode 100644
index e1eb35ad0..000000000
--- a/src/DebugBar/DataCollector/PDO/PDOCollector.php
+++ /dev/null
@@ -1,206 +0,0 @@
-';
-
- /**
- * @param TraceablePDO $pdo
- * @param TimeDataCollector $timeCollector
- */
- public function __construct(TraceablePDO $pdo = null, TimeDataCollector $timeCollector = null)
- {
- $this->timeCollector = $timeCollector;
- if ($pdo !== null) {
- $this->addConnection($pdo, 'default');
- }
- }
-
- /**
- * Renders the SQL of traced statements with params embeded
- *
- * @param boolean $enabled
- */
- public function setRenderSqlWithParams($enabled = true, $quotationChar = '<>')
- {
- $this->renderSqlWithParams = $enabled;
- $this->sqlQuotationChar = $quotationChar;
- }
-
- /**
- * @return bool
- */
- public function isSqlRenderedWithParams()
- {
- return $this->renderSqlWithParams;
- }
-
- /**
- * @return string
- */
- public function getSqlQuotationChar()
- {
- return $this->sqlQuotationChar;
- }
-
- /**
- * Adds a new PDO instance to be collector
- *
- * @param TraceablePDO $pdo
- * @param string $name Optional connection name
- */
- public function addConnection(TraceablePDO $pdo, $name = null)
- {
- if ($name === null) {
- $name = spl_object_hash($pdo);
- }
- $this->connections[$name] = $pdo;
- }
-
- /**
- * Returns PDO instances to be collected
- *
- * @return array
- */
- public function getConnections()
- {
- return $this->connections;
- }
-
- /**
- * @return array
- */
- public function collect()
- {
- $data = array(
- 'nb_statements' => 0,
- 'nb_failed_statements' => 0,
- 'accumulated_duration' => 0,
- 'memory_usage' => 0,
- 'peak_memory_usage' => 0,
- 'statements' => array()
- );
-
- foreach ($this->connections as $name => $pdo) {
- $pdodata = $this->collectPDO($pdo, $this->timeCollector, $name);
- $data['nb_statements'] += $pdodata['nb_statements'];
- $data['nb_failed_statements'] += $pdodata['nb_failed_statements'];
- $data['accumulated_duration'] += $pdodata['accumulated_duration'];
- $data['memory_usage'] += $pdodata['memory_usage'];
- $data['peak_memory_usage'] = max($data['peak_memory_usage'], $pdodata['peak_memory_usage']);
- $data['statements'] = array_merge($data['statements'],
- array_map(function ($s) use ($name) { $s['connection'] = $name; return $s; }, $pdodata['statements']));
- }
-
- $data['accumulated_duration_str'] = $this->getDataFormatter()->formatDuration($data['accumulated_duration']);
- $data['memory_usage_str'] = $this->getDataFormatter()->formatBytes($data['memory_usage']);
- $data['peak_memory_usage_str'] = $this->getDataFormatter()->formatBytes($data['peak_memory_usage']);
-
- return $data;
- }
-
- /**
- * Collects data from a single TraceablePDO instance
- *
- * @param TraceablePDO $pdo
- * @param TimeDataCollector $timeCollector
- * @param string|null $connectionName the pdo connection (eg default | read | write)
- * @return array
- */
- protected function collectPDO(TraceablePDO $pdo, TimeDataCollector $timeCollector = null, $connectionName = null)
- {
- if (empty($connectionName) || $connectionName == 'default') {
- $connectionName = 'pdo';
- } else {
- $connectionName = 'pdo ' . $connectionName;
- }
- $stmts = array();
- foreach ($pdo->getExecutedStatements() as $stmt) {
- $stmts[] = array(
- 'sql' => $this->renderSqlWithParams ? $stmt->getSqlWithParams($this->sqlQuotationChar) : $stmt->getSql(),
- 'row_count' => $stmt->getRowCount(),
- 'stmt_id' => $stmt->getPreparedId(),
- 'prepared_stmt' => $stmt->getSql(),
- 'params' => (object) $stmt->getParameters(),
- 'duration' => $stmt->getDuration(),
- 'duration_str' => $this->getDataFormatter()->formatDuration($stmt->getDuration()),
- 'memory' => $stmt->getMemoryUsage(),
- 'memory_str' => $this->getDataFormatter()->formatBytes($stmt->getMemoryUsage()),
- 'end_memory' => $stmt->getEndMemory(),
- 'end_memory_str' => $this->getDataFormatter()->formatBytes($stmt->getEndMemory()),
- 'is_success' => $stmt->isSuccess(),
- 'error_code' => $stmt->getErrorCode(),
- 'error_message' => $stmt->getErrorMessage()
- );
- if ($timeCollector !== null) {
- $timeCollector->addMeasure($stmt->getSql(), $stmt->getStartTime(), $stmt->getEndTime(), array(), $connectionName);
- }
- }
-
- return array(
- 'nb_statements' => count($stmts),
- 'nb_failed_statements' => count($pdo->getFailedExecutedStatements()),
- 'accumulated_duration' => $pdo->getAccumulatedStatementsDuration(),
- 'accumulated_duration_str' => $this->getDataFormatter()->formatDuration($pdo->getAccumulatedStatementsDuration()),
- 'memory_usage' => $pdo->getMemoryUsage(),
- 'memory_usage_str' => $this->getDataFormatter()->formatBytes($pdo->getPeakMemoryUsage()),
- 'peak_memory_usage' => $pdo->getPeakMemoryUsage(),
- 'peak_memory_usage_str' => $this->getDataFormatter()->formatBytes($pdo->getPeakMemoryUsage()),
- 'statements' => $stmts
- );
- }
-
- /**
- * @return string
- */
- public function getName()
- {
- return 'pdo';
- }
-
- /**
- * @return array
- */
- public function getWidgets()
- {
- return array(
- "database" => array(
- "icon" => "database",
- "widget" => "PhpDebugBar.Widgets.SQLQueriesWidget",
- "map" => "pdo",
- "default" => "[]"
- ),
- "database:badge" => array(
- "map" => "pdo.nb_statements",
- "default" => 0
- )
- );
- }
-
- /**
- * @return array
- */
- public function getAssets()
- {
- return array(
- 'css' => 'widgets/sqlqueries/widget.css',
- 'js' => 'widgets/sqlqueries/widget.js'
- );
- }
-}
diff --git a/src/DebugBar/DataCollector/PDO/TraceablePDO.php b/src/DebugBar/DataCollector/PDO/TraceablePDO.php
deleted file mode 100644
index 8d1e2aa19..000000000
--- a/src/DebugBar/DataCollector/PDO/TraceablePDO.php
+++ /dev/null
@@ -1,311 +0,0 @@
-pdo = $pdo;
- $this->pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DebugBar\DataCollector\PDO\TraceablePDOStatement', array($this)));
- }
-
- /**
- * Initiates a transaction
- *
- * @link http://php.net/manual/en/pdo.begintransaction.php
- * @return bool TRUE on success or FALSE on failure.
- */
- public function beginTransaction()
- {
- return $this->pdo->beginTransaction();
- }
-
- /**
- * Commits a transaction
- *
- * @link http://php.net/manual/en/pdo.commit.php
- * @return bool TRUE on success or FALSE on failure.
- */
- public function commit()
- {
- return $this->pdo->commit();
- }
-
- /**
- * Fetch extended error information associated with the last operation on the database handle
- *
- * @link http://php.net/manual/en/pdo.errorinfo.php
- * @return array PDO::errorInfo returns an array of error information
- */
- public function errorCode()
- {
- return $this->pdo->errorCode();
- }
-
- /**
- * Fetch extended error information associated with the last operation on the database handle
- *
- * @link http://php.net/manual/en/pdo.errorinfo.php
- * @return array PDO::errorInfo returns an array of error information
- */
- public function errorInfo()
- {
- return $this->pdo->errorInfo();
- }
-
- /**
- * Execute an SQL statement and return the number of affected rows
- *
- * @link http://php.net/manual/en/pdo.exec.php
- * @param string $statement
- * @return int|bool PDO::exec returns the number of rows that were modified or deleted by the
- * SQL statement you issued. If no rows were affected, PDO::exec returns 0. This function may
- * return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE.
- * Please read the section on Booleans for more information
- */
- public function exec($statement)
- {
- return $this->profileCall('exec', $statement, func_get_args());
- }
-
- /**
- * Retrieve a database connection attribute
- *
- * @link http://php.net/manual/en/pdo.getattribute.php
- * @param int $attribute One of the PDO::ATTR_* constants
- * @return mixed A successful call returns the value of the requested PDO attribute.
- * An unsuccessful call returns null.
- */
- public function getAttribute($attribute)
- {
- return $this->pdo->getAttribute($attribute);
- }
-
- /**
- * Checks if inside a transaction
- *
- * @link http://php.net/manual/en/pdo.intransaction.php
- * @return bool TRUE if a transaction is currently active, and FALSE if not.
- */
- public function inTransaction()
- {
- return $this->pdo->inTransaction();
- }
-
- /**
- * Returns the ID of the last inserted row or sequence value
- *
- * @link http://php.net/manual/en/pdo.lastinsertid.php
- * @param string $name [optional]
- * @return string If a sequence name was not specified for the name parameter, PDO::lastInsertId
- * returns a string representing the row ID of the last row that was inserted into the database.
- */
- public function lastInsertId($name = null)
- {
- return $this->pdo->lastInsertId($name);
- }
-
- /**
- * Prepares a statement for execution and returns a statement object
- *
- * @link http://php.net/manual/en/pdo.prepare.php
- * @param string $statement This must be a valid SQL statement template for the target DB server.
- * @param array $driver_options [optional] This array holds one or more key=>value pairs to
- * set attribute values for the PDOStatement object that this method returns.
- * @return TraceablePDOStatement|bool If the database server successfully prepares the statement,
- * PDO::prepare returns a PDOStatement object. If the database server cannot successfully prepare
- * the statement, PDO::prepare returns FALSE or emits PDOException (depending on error handling).
- */
- public function prepare($statement, $driver_options = array())
- {
- return $this->pdo->prepare($statement, $driver_options);
- }
-
- /**
- * Executes an SQL statement, returning a result set as a PDOStatement object
- *
- * @link http://php.net/manual/en/pdo.query.php
- * @param string $statement
- * @return TraceablePDOStatement|bool PDO::query returns a PDOStatement object, or FALSE on
- * failure.
- */
- public function query($statement)
- {
- return $this->profileCall('query', $statement, func_get_args());
- }
-
- /**
- * Quotes a string for use in a query.
- *
- * @link http://php.net/manual/en/pdo.quote.php
- * @param string $string The string to be quoted.
- * @param int $parameter_type [optional] Provides a data type hint for drivers that have
- * alternate quoting styles.
- * @return string|bool A quoted string that is theoretically safe to pass into an SQL statement.
- * Returns FALSE if the driver does not support quoting in this way.
- */
- public function quote($string, $parameter_type = PDO::PARAM_STR)
- {
- return $this->pdo->quote($string, $parameter_type);
- }
-
- /**
- * Rolls back a transaction
- *
- * @link http://php.net/manual/en/pdo.rollback.php
- * @return bool TRUE on success or FALSE on failure.
- */
- public function rollBack()
- {
- return $this->pdo->rollBack();
- }
-
- /**
- * Set an attribute
- *
- * @link http://php.net/manual/en/pdo.setattribute.php
- * @param int $attribute
- * @param mixed $value
- * @return bool TRUE on success or FALSE on failure.
- */
- public function setAttribute($attribute, $value)
- {
- return $this->pdo->setAttribute($attribute, $value);
- }
-
- /**
- * Profiles a call to a PDO method
- *
- * @param string $method
- * @param string $sql
- * @param array $args
- * @return mixed The result of the call
- */
- protected function profileCall($method, $sql, array $args)
- {
- $trace = new TracedStatement($sql);
- $trace->start();
-
- $ex = null;
- try {
- $result = call_user_func_array(array($this->pdo, $method), $args);
- } catch (PDOException $e) {
- $ex = $e;
- }
-
- if ($this->pdo->getAttribute(PDO::ATTR_ERRMODE) !== PDO::ERRMODE_EXCEPTION && $result === false) {
- $error = $this->pdo->errorInfo();
- $ex = new PDOException($error[2], $error[0]);
- }
-
- $trace->end($ex);
- $this->addExecutedStatement($trace);
-
- if ($this->pdo->getAttribute(PDO::ATTR_ERRMODE) === PDO::ERRMODE_EXCEPTION && $ex !== null) {
- throw $ex;
- }
- return $result;
- }
-
- /**
- * Adds an executed TracedStatement
- *
- * @param TracedStatement $stmt
- */
- public function addExecutedStatement(TracedStatement $stmt)
- {
- $this->executedStatements[] = $stmt;
- }
-
- /**
- * Returns the accumulated execution time of statements
- *
- * @return int
- */
- public function getAccumulatedStatementsDuration()
- {
- return array_reduce($this->executedStatements, function ($v, $s) { return $v + $s->getDuration(); });
- }
-
- /**
- * Returns the peak memory usage while performing statements
- *
- * @return int
- */
- public function getMemoryUsage()
- {
- return array_reduce($this->executedStatements, function ($v, $s) { return $v + $s->getMemoryUsage(); });
- }
-
- /**
- * Returns the peak memory usage while performing statements
- *
- * @return int
- */
- public function getPeakMemoryUsage()
- {
- return array_reduce($this->executedStatements, function ($v, $s) { $m = $s->getEndMemory(); return $m > $v ? $m : $v; });
- }
-
- /**
- * Returns the list of executed statements as TracedStatement objects
- *
- * @return array
- */
- public function getExecutedStatements()
- {
- return $this->executedStatements;
- }
-
- /**
- * Returns the list of failed statements
- *
- * @return array
- */
- public function getFailedExecutedStatements()
- {
- return array_filter($this->executedStatements, function ($s) { return !$s->isSuccess(); });
- }
-
- /**
- * @param $name
- * @return mixed
- */
- public function __get($name)
- {
- return $this->pdo->$name;
- }
-
- /**
- * @param $name
- * @param $value
- */
- public function __set($name, $value)
- {
- $this->pdo->$name = $value;
- }
-
- /**
- * @param $name
- * @param $args
- * @return mixed
- */
- public function __call($name, $args)
- {
- return call_user_func_array(array($this->pdo, $name), $args);
- }
-}
diff --git a/src/DebugBar/DataCollector/PDO/TraceablePDOStatement.php b/src/DebugBar/DataCollector/PDO/TraceablePDOStatement.php
deleted file mode 100644
index 58a83d891..000000000
--- a/src/DebugBar/DataCollector/PDO/TraceablePDOStatement.php
+++ /dev/null
@@ -1,129 +0,0 @@
-pdo = $pdo;
- }
-
- /**
- * Bind a column to a PHP variable
- *
- * @link http://php.net/manual/en/pdostatement.bindcolumn.php
- * @param mixed $column Number of the column (1-indexed) or name of the column in the result set
- * @param mixed $param Name of the PHP variable to which the column will be bound.
- * @param int $type [optional] Data type of the parameter, specified by the PDO::PARAM_*
- * constants.
- * @param int $maxlen [optional] A hint for pre-allocation.
- * @param mixed $driverdata [optional] Optional parameter(s) for the driver.
- * @return bool TRUE on success or FALSE on failure.
- */
- public function bindColumn($column, &$param, $type = null, $maxlen = null, $driverdata = null)
- {
- $this->boundParameters[$column] = $param;
- $args = array_merge(array($column, &$param), array_slice(func_get_args(), 2));
- return call_user_func_array(array("parent", 'bindColumn'), $args);
- }
-
- /**
- * Binds a parameter to the specified variable name
- *
- * @link http://php.net/manual/en/pdostatement.bindparam.php
- * @param mixed $parameter Parameter identifier. For a prepared statement using named
- * placeholders, this will be a parameter name of the form :name. For a prepared statement using
- * question mark placeholders, this will be the 1-indexed position of the parameter.
- * @param mixed $variable Name of the PHP variable to bind to the SQL statement parameter.
- * @param int $data_type [optional] Explicit data type for the parameter using the PDO::PARAM_*
- * constants.
- * @param int $length [optional] Length of the data type. To indicate that a parameter is an OUT
- * parameter from a stored procedure, you must explicitly set the length.
- * @param mixed $driver_options [optional]
- * @return bool TRUE on success or FALSE on failure.
- */
- public function bindParam($parameter, &$variable, $data_type = PDO::PARAM_STR, $length = null, $driver_options = null)
- {
- $this->boundParameters[$parameter] = $variable;
- $args = array_merge(array($parameter, &$variable), array_slice(func_get_args(), 2));
- return call_user_func_array(array("parent", 'bindParam'), $args);
- }
-
- /**
- * Binds a value to a parameter
- *
- * @link http://php.net/manual/en/pdostatement.bindvalue.php
- * @param mixed $parameter Parameter identifier. For a prepared statement using named
- * placeholders, this will be a parameter name of the form :name. For a prepared statement using
- * question mark placeholders, this will be the 1-indexed position of the parameter.
- * @param mixed $value The value to bind to the parameter.
- * @param int $data_type [optional] Explicit data type for the parameter using the PDO::PARAM_*
- * constants.
- * @return bool TRUE on success or FALSE on failure.
- */
- public function bindValue($parameter, $value, $data_type = PDO::PARAM_STR)
- {
- $this->boundParameters[$parameter] = $value;
- return call_user_func_array(array("parent", 'bindValue'), func_get_args());
- }
-
- /**
- * Executes a prepared statement
- *
- * @link http://php.net/manual/en/pdostatement.execute.php
- * @param array $input_parameters [optional] An array of values with as many elements as there
- * are bound parameters in the SQL statement being executed. All values are treated as
- * PDO::PARAM_STR.
- * @return bool TRUE on success or FALSE on failure.
- */
- public function execute($input_parameters = null)
- {
- $preparedId = spl_object_hash($this);
- $boundParameters = $this->boundParameters;
- if (is_array($input_parameters)) {
- $boundParameters = array_merge($boundParameters, $input_parameters);
- }
-
- $trace = new TracedStatement($this->queryString, $boundParameters, $preparedId);
- $trace->start();
-
- $ex = null;
- try {
- $result = parent::execute($input_parameters);
- } catch (PDOException $e) {
- $ex = $e;
- }
-
- if ($this->pdo->getAttribute(PDO::ATTR_ERRMODE) !== PDO::ERRMODE_EXCEPTION && $result === false) {
- $error = $this->errorInfo();
- $ex = new PDOException($error[2], (int) $error[0]);
- }
-
- $trace->end($ex, $this->rowCount());
- $this->pdo->addExecutedStatement($trace);
-
- if ($this->pdo->getAttribute(PDO::ATTR_ERRMODE) === PDO::ERRMODE_EXCEPTION && $ex !== null) {
- throw $ex;
- }
- return $result;
- }
-}
diff --git a/src/DebugBar/DataCollector/PDO/TracedStatement.php b/src/DebugBar/DataCollector/PDO/TracedStatement.php
deleted file mode 100644
index 96070ccd0..000000000
--- a/src/DebugBar/DataCollector/PDO/TracedStatement.php
+++ /dev/null
@@ -1,271 +0,0 @@
-sql = $sql;
- $this->parameters = $this->checkParameters($params);
- $this->preparedId = $preparedId;
- }
-
- /**
- * @param null $startTime
- * @param null $startMemory
- */
- public function start($startTime = null, $startMemory = null)
- {
- $this->startTime = $startTime ?: microtime(true);
- $this->startMemory = $startMemory ?: memory_get_usage(false);
- }
-
- /**
- * @param \Exception|null $exception
- * @param int $rowCount
- * @param null $endTime
- * @param null $endMemory
- */
- public function end(\Exception $exception = null, $rowCount = 0, $endTime = null, $endMemory = null)
- {
- $this->endTime = $endTime ?: microtime(true);
- $this->duration = $this->endTime - $this->startTime;
- $this->endMemory = $endMemory ?: memory_get_usage(false);
- $this->memoryDelta = $this->endMemory - $this->startMemory;
- $this->exception = $exception;
- $this->rowCount = $rowCount;
- }
-
- /**
- * Check parameters for illegal (non UTF-8) strings, like Binary data.
- *
- * @param $params
- * @return mixed
- */
- public function checkParameters($params)
- {
- foreach ($params as &$param) {
- if (!mb_check_encoding($param, 'UTF-8')) {
- $param = '[BINARY DATA]';
- }
- }
- return $params;
- }
-
- /**
- * Returns the SQL string used for the query
- *
- * @return string
- */
- public function getSql()
- {
- return $this->sql;
- }
-
- /**
- * Returns the SQL string with any parameters used embedded
- *
- * @param string $quotationChar
- * @return string
- */
- public function getSqlWithParams($quotationChar = '<>')
- {
- if (($l = strlen($quotationChar)) > 1) {
- $quoteLeft = substr($quotationChar, 0, $l / 2);
- $quoteRight = substr($quotationChar, $l / 2);
- } else {
- $quoteLeft = $quoteRight = $quotationChar;
- }
-
- $sql = $this->sql;
-
- $cleanBackRefCharMap = array('%'=>'%%', '$'=>'$%', '\\'=>'\\%');
-
- foreach ($this->parameters as $k => $v) {
-
- $backRefSafeV = strtr($v, $cleanBackRefCharMap);
-
- $v = "$quoteLeft$backRefSafeV$quoteRight";
-
- if (is_numeric($k)) {
- $marker = "\?";
- } else {
- $marker = (preg_match("/^:/", $k)) ? $k : ":" . $k;
- }
-
- $matchRule = "/({$marker}(?!\w))(?=(?:[^$quotationChar]|[$quotationChar][^$quotationChar]*[$quotationChar])*$)/";
- for ($i = 0; $i <= mb_substr_count($sql, $k); $i++) {
- $sql = preg_replace($matchRule, $v, $sql, 1);
- }
- }
-
- $sql = strtr($sql, array_flip($cleanBackRefCharMap));
-
- return $sql;
- }
-
- /**
- * Returns the number of rows affected/returned
- *
- * @return int
- */
- public function getRowCount()
- {
- return $this->rowCount;
- }
-
- /**
- * Returns an array of parameters used with the query
- *
- * @return array
- */
- public function getParameters()
- {
- $params = array();
- foreach ($this->parameters as $name => $param) {
- $params[$name] = htmlentities($param, ENT_QUOTES, 'UTF-8', false);
- }
- return $params;
- }
-
- /**
- * Returns the prepared statement id
- *
- * @return string
- */
- public function getPreparedId()
- {
- return $this->preparedId;
- }
-
- /**
- * Checks if this is a prepared statement
- *
- * @return boolean
- */
- public function isPrepared()
- {
- return $this->preparedId !== null;
- }
-
- /**
- * @return mixed
- */
- public function getStartTime()
- {
- return $this->startTime;
- }
-
- /**
- * @return mixed
- */
- public function getEndTime()
- {
- return $this->endTime;
- }
-
- /**
- * Returns the duration in seconds of the execution
- *
- * @return int
- */
- public function getDuration()
- {
- return $this->duration;
- }
-
- /**
- * @return mixed
- */
- public function getStartMemory()
- {
- return $this->startMemory;
- }
-
- /**
- * @return mixed
- */
- public function getEndMemory()
- {
- return $this->endMemory;
- }
-
- /**
- * Returns the memory usage during the execution
- *
- * @return int
- */
- public function getMemoryUsage()
- {
- return $this->memoryDelta;
- }
-
- /**
- * Checks if the statement was successful
- *
- * @return boolean
- */
- public function isSuccess()
- {
- return $this->exception === null;
- }
-
- /**
- * Returns the exception triggered
- *
- * @return \Exception
- */
- public function getException()
- {
- return $this->exception;
- }
-
- /**
- * Returns the exception's code
- *
- * @return string
- */
- public function getErrorCode()
- {
- return $this->exception !== null ? $this->exception->getCode() : 0;
- }
-
- /**
- * Returns the exception's message
- *
- * @return string
- */
- public function getErrorMessage()
- {
- return $this->exception !== null ? $this->exception->getMessage() : '';
- }
-}
diff --git a/src/DebugBar/DataCollector/RequestDataCollector.php b/src/DebugBar/DataCollector/RequestDataCollector.php
deleted file mode 100644
index 6bd781eee..000000000
--- a/src/DebugBar/DataCollector/RequestDataCollector.php
+++ /dev/null
@@ -1,100 +0,0 @@
-useHtmlVarDumper = $value;
- return $this;
- }
-
- /**
- * Indicates whether the Symfony HtmlDumper will be used to dump variables for rich variable
- * rendering.
- *
- * @return mixed
- */
- public function isHtmlVarDumperUsed()
- {
- return $this->useHtmlVarDumper;
- }
-
- /**
- * @return array
- */
- public function collect()
- {
- $vars = array('_GET', '_POST', '_SESSION', '_COOKIE', '_SERVER');
- $data = array();
-
- foreach ($vars as $var) {
- if (isset($GLOBALS[$var])) {
- $key = "$" . $var;
- if ($this->isHtmlVarDumperUsed()) {
- $data[$key] = $this->getVarDumper()->renderVar($GLOBALS[$var]);
- } else {
- $data[$key] = $this->getDataFormatter()->formatVar($GLOBALS[$var]);
- }
- }
- }
-
- return $data;
- }
-
- /**
- * @return string
- */
- public function getName()
- {
- return 'request';
- }
-
- /**
- * @return array
- */
- public function getAssets() {
- return $this->isHtmlVarDumperUsed() ? $this->getVarDumper()->getAssets() : array();
- }
-
- /**
- * @return array
- */
- public function getWidgets()
- {
- $widget = $this->isHtmlVarDumperUsed()
- ? "PhpDebugBar.Widgets.HtmlVariableListWidget"
- : "PhpDebugBar.Widgets.VariableListWidget";
- return array(
- "request" => array(
- "icon" => "tags",
- "widget" => $widget,
- "map" => "request",
- "default" => "{}"
- )
- );
- }
-}
diff --git a/src/DebugBar/DataCollector/TimeDataCollector.php b/src/DebugBar/DataCollector/TimeDataCollector.php
deleted file mode 100644
index 27a2e1a2d..000000000
--- a/src/DebugBar/DataCollector/TimeDataCollector.php
+++ /dev/null
@@ -1,245 +0,0 @@
-requestStartTime = (float)$requestStartTime;
- }
-
- /**
- * Starts a measure
- *
- * @param string $name Internal name, used to stop the measure
- * @param string|null $label Public name
- * @param string|null $collector The source of the collector
- */
- public function startMeasure($name, $label = null, $collector = null)
- {
- $start = microtime(true);
- $this->startedMeasures[$name] = array(
- 'label' => $label ?: $name,
- 'start' => $start,
- 'collector' => $collector
- );
- }
-
- /**
- * Check a measure exists
- *
- * @param string $name
- * @return bool
- */
- public function hasStartedMeasure($name)
- {
- return isset($this->startedMeasures[$name]);
- }
-
- /**
- * Stops a measure
- *
- * @param string $name
- * @param array $params
- * @throws DebugBarException
- */
- public function stopMeasure($name, $params = array())
- {
- $end = microtime(true);
- if (!$this->hasStartedMeasure($name)) {
- throw new DebugBarException("Failed stopping measure '$name' because it hasn't been started");
- }
- $this->addMeasure(
- $this->startedMeasures[$name]['label'],
- $this->startedMeasures[$name]['start'],
- $end,
- $params,
- $this->startedMeasures[$name]['collector']
- );
- unset($this->startedMeasures[$name]);
- }
-
- /**
- * Adds a measure
- *
- * @param string $label
- * @param float $start
- * @param float $end
- * @param array $params
- * @param string|null $collector
- */
- public function addMeasure($label, $start, $end, $params = array(), $collector = null)
- {
- $this->measures[] = array(
- 'label' => $label,
- 'start' => $start,
- 'relative_start' => $start - $this->requestStartTime,
- 'end' => $end,
- 'relative_end' => $end - $this->requestEndTime,
- 'duration' => $end - $start,
- 'duration_str' => $this->getDataFormatter()->formatDuration($end - $start),
- 'params' => $params,
- 'collector' => $collector
- );
- }
-
- /**
- * Utility function to measure the execution of a Closure
- *
- * @param string $label
- * @param \Closure $closure
- * @param string|null $collector
- */
- public function measure($label, \Closure $closure, $collector = null)
- {
- $name = spl_object_hash($closure);
- $this->startMeasure($name, $label, $collector);
- $result = $closure();
- $params = is_array($result) ? $result : array();
- $this->stopMeasure($name, $params);
- }
-
- /**
- * Returns an array of all measures
- *
- * @return array
- */
- public function getMeasures()
- {
- return $this->measures;
- }
-
- /**
- * Returns the request start time
- *
- * @return float
- */
- public function getRequestStartTime()
- {
- return $this->requestStartTime;
- }
-
- /**
- * Returns the request end time
- *
- * @return float
- */
- public function getRequestEndTime()
- {
- return $this->requestEndTime;
- }
-
- /**
- * Returns the duration of a request
- *
- * @return float
- */
- public function getRequestDuration()
- {
- if ($this->requestEndTime !== null) {
- return $this->requestEndTime - $this->requestStartTime;
- }
- return microtime(true) - $this->requestStartTime;
- }
-
- /**
- * @return array
- * @throws DebugBarException
- */
- public function collect()
- {
- $this->requestEndTime = microtime(true);
- foreach (array_keys($this->startedMeasures) as $name) {
- $this->stopMeasure($name);
- }
-
- usort($this->measures, function($a, $b) {
- if ($a['start'] == $b['start']) {
- return 0;
- }
- return $a['start'] < $b['start'] ? -1 : 1;
- });
-
- return array(
- 'start' => $this->requestStartTime,
- 'end' => $this->requestEndTime,
- 'duration' => $this->getRequestDuration(),
- 'duration_str' => $this->getDataFormatter()->formatDuration($this->getRequestDuration()),
- 'measures' => array_values($this->measures)
- );
- }
-
- /**
- * @return string
- */
- public function getName()
- {
- return 'time';
- }
-
- /**
- * @return array
- */
- public function getWidgets()
- {
- return array(
- "time" => array(
- "icon" => "clock-o",
- "tooltip" => "Request Duration",
- "map" => "time.duration_str",
- "default" => "'0ms'"
- ),
- "timeline" => array(
- "icon" => "tasks",
- "widget" => "PhpDebugBar.Widgets.TimelineWidget",
- "map" => "time",
- "default" => "{}"
- )
- );
- }
-}
diff --git a/src/DebugBar/DataFormatter/DataFormatter.php b/src/DebugBar/DataFormatter/DataFormatter.php
deleted file mode 100644
index 7ffb19892..000000000
--- a/src/DebugBar/DataFormatter/DataFormatter.php
+++ /dev/null
@@ -1,81 +0,0 @@
-cloner = new VarCloner();
- $this->dumper = new CliDumper();
- }
-
- /**
- * @param $data
- * @return string
- */
- public function formatVar($data)
- {
- $output = '';
-
- $this->dumper->dump(
- $this->cloner->cloneVar($data),
- function ($line, $depth) use (&$output) {
- // A negative depth means "end of dump"
- if ($depth >= 0) {
- // Adds a two spaces indentation to the line
- $output .= str_repeat(' ', $depth).$line."\n";
- }
- }
- );
-
- return trim($output);
- }
-
- /**
- * @param float $seconds
- * @return string
- */
- public function formatDuration($seconds)
- {
- if ($seconds < 0.001) {
- return round($seconds * 1000000) . 'ΞΌs';
- } elseif ($seconds < 1) {
- return round($seconds * 1000, 2) . 'ms';
- }
- return round($seconds, 2) . 's';
- }
-
- /**
- * @param string $size
- * @param int $precision
- * @return string
- */
- public function formatBytes($size, $precision = 2)
- {
- if ($size === 0 || $size === null) {
- return "0B";
- }
-
- $sign = $size < 0 ? '-' : '';
- $size = abs($size);
-
- $base = log($size) / log(1024);
- $suffixes = array('B', 'KB', 'MB', 'GB', 'TB');
- return $sign . round(pow(1024, $base - floor($base)), $precision) . $suffixes[floor($base)];
- }
-}
diff --git a/src/DebugBar/DataFormatter/DebugBarVarDumper.php b/src/DebugBar/DataFormatter/DebugBarVarDumper.php
deleted file mode 100644
index 7b92ddf0a..000000000
--- a/src/DebugBar/DataFormatter/DebugBarVarDumper.php
+++ /dev/null
@@ -1,315 +0,0 @@
- 0,
- 'styles' => array(
- // NOTE: 'default' CSS is also specified in debugbar.css
- 'default' => 'word-wrap: break-word; white-space: pre-wrap; word-break: normal',
- 'num' => 'font-weight:bold; color:#1299DA',
- 'const' => 'font-weight:bold',
- 'str' => 'font-weight:bold; color:#3A9B26',
- 'note' => 'color:#1299DA',
- 'ref' => 'color:#7B7B7B',
- 'public' => 'color:#000000',
- 'protected' => 'color:#000000',
- 'private' => 'color:#000000',
- 'meta' => 'color:#B729D9',
- 'key' => 'color:#3A9B26',
- 'index' => 'color:#1299DA',
- 'ellipsis' => 'color:#A0A000',
- ),
- );
-
- protected $clonerOptions;
-
- protected $dumperOptions;
-
- /** @var VarCloner */
- protected $cloner;
-
- /** @var DebugBarHtmlDumper */
- protected $dumper;
-
- /**
- * Gets the VarCloner instance with configuration options set.
- *
- * @return VarCloner
- */
- protected function getCloner()
- {
- if (!$this->cloner) {
- $clonerOptions = $this->getClonerOptions();
- if (isset($clonerOptions['casters'])) {
- $this->cloner = new VarCloner($clonerOptions['casters']);
- } else {
- $this->cloner = new VarCloner();
- }
- if (isset($clonerOptions['additional_casters'])) {
- $this->cloner->addCasters($clonerOptions['additional_casters']);
- }
- if (isset($clonerOptions['max_items'])) {
- $this->cloner->setMaxItems($clonerOptions['max_items']);
- }
- if (isset($clonerOptions['max_string'])) {
- $this->cloner->setMaxString($clonerOptions['max_string']);
- }
- // setMinDepth was added to Symfony 3.4:
- if (isset($clonerOptions['min_depth']) && method_exists($this->cloner, 'setMinDepth')) {
- $this->cloner->setMinDepth($clonerOptions['min_depth']);
- }
- }
- return $this->cloner;
- }
-
- /**
- * Gets the DebugBarHtmlDumper instance with configuration options set.
- *
- * @return DebugBarHtmlDumper
- */
- protected function getDumper()
- {
- if (!$this->dumper) {
- $this->dumper = new DebugBarHtmlDumper();
- $dumperOptions = $this->getDumperOptions();
- if (isset($dumperOptions['styles'])) {
- $this->dumper->setStyles($dumperOptions['styles']);
- }
- }
- return $this->dumper;
- }
-
- /**
- * Gets the array of non-default VarCloner configuration options.
- *
- * @return array
- */
- public function getClonerOptions()
- {
- if ($this->clonerOptions === null) {
- $this->clonerOptions = self::$defaultClonerOptions;
- }
- return $this->clonerOptions;
- }
-
- /**
- * Merges an array of non-default VarCloner configuration options with the existing non-default
- * options.
- *
- * Configuration options are:
- * - casters: a map of VarDumper Caster objects to use instead of the default casters.
- * - additional_casters: a map of VarDumper Caster objects to use in addition to the default
- * casters.
- * - max_items: maximum number of items to clone beyond the minimum depth.
- * - max_string: maximum string size
- * - min_depth: minimum tree depth to clone before counting items against the max_items limit.
- * (Requires Symfony 3.4; ignored on older versions.)
- *
- * @param array $options
- */
- public function mergeClonerOptions($options)
- {
- $this->clonerOptions = $options + $this->getClonerOptions();
- $this->cloner = null;
- }
-
- /**
- * Resets the array of non-default VarCloner configuration options without retaining any of the
- * existing non-default options.
- *
- * Configuration options are:
- * - casters: a map of VarDumper Caster objects to use instead of the default casters.
- * - additional_casters: a map of VarDumper Caster objects to use in addition to the default
- * casters.
- * - max_items: maximum number of items to clone beyond the minimum depth.
- * - max_string: maximum string size
- * - min_depth: minimum tree depth to clone before counting items against the max_items limit.
- * (Requires Symfony 3.4; ignored on older versions.)
- *
- * @param array $options
- */
- public function resetClonerOptions($options = null)
- {
- $this->clonerOptions = ($options ?: array()) + self::$defaultClonerOptions;
- $this->cloner = null;
- }
-
- /**
- * Gets the array of non-default HtmlDumper configuration options.
- *
- * @return array
- */
- public function getDumperOptions()
- {
- if ($this->dumperOptions === null) {
- $this->dumperOptions = self::$defaultDumperOptions;
- }
- return $this->dumperOptions;
- }
-
- /**
- * Merges an array of non-default HtmlDumper configuration options with the existing non-default
- * options.
- *
- * Configuration options are:
- * - styles: a map of CSS styles to include in the assets, as documented in
- * HtmlDumper::setStyles.
- * - expanded_depth: the tree depth to initially expand.
- * (Requires Symfony 3.2; ignored on older versions.)
- * - max_string: maximum string size.
- * (Requires Symfony 3.2; ignored on older versions.)
- * - file_link_format: link format for files; %f expanded to file and %l expanded to line
- * (Requires Symfony 3.2; ignored on older versions.)
- *
- * @param array $options
- */
- public function mergeDumperOptions($options)
- {
- $this->dumperOptions = $options + $this->getDumperOptions();
- $this->dumper = null;
- }
-
- /**
- * Resets the array of non-default HtmlDumper configuration options without retaining any of the
- * existing non-default options.
- *
- * Configuration options are:
- * - styles: a map of CSS styles to include in the assets, as documented in
- * HtmlDumper::setStyles.
- * - expanded_depth: the tree depth to initially expand.
- * (Requires Symfony 3.2; ignored on older versions.)
- * - max_string: maximum string size.
- * (Requires Symfony 3.2; ignored on older versions.)
- * - file_link_format: link format for files; %f expanded to file and %l expanded to line
- * (Requires Symfony 3.2; ignored on older versions.)
- *
- * @param array $options
- */
- public function resetDumperOptions($options = null)
- {
- $this->dumperOptions = ($options ?: array()) + self::$defaultDumperOptions;
- $this->dumper = null;
- }
-
- /**
- * Captures the data from a variable and serializes it for later rendering.
- *
- * @param mixed $data The variable to capture.
- * @return string Serialized variable data.
- */
- public function captureVar($data)
- {
- return serialize($this->getCloner()->cloneVar($data));
- }
-
- /**
- * Gets the display options for the HTML dumper.
- *
- * @return array
- */
- protected function getDisplayOptions()
- {
- $displayOptions = array();
- $dumperOptions = $this->getDumperOptions();
- // Only used by Symfony 3.2 and newer:
- if (isset($dumperOptions['expanded_depth'])) {
- $displayOptions['maxDepth'] = $dumperOptions['expanded_depth'];
- }
- // Only used by Symfony 3.2 and newer:
- if (isset($dumperOptions['max_string'])) {
- $displayOptions['maxStringLength'] = $dumperOptions['max_string'];
- }
- // Only used by Symfony 3.2 and newer:
- if (isset($dumperOptions['file_link_format'])) {
- $displayOptions['fileLinkFormat'] = $dumperOptions['file_link_format'];
- }
- return $displayOptions;
- }
-
- /**
- * Renders previously-captured data from captureVar to HTML and returns it as a string.
- *
- * @param string $capturedData Captured data from captureVar.
- * @param array $seekPath Pass an array of keys to traverse if you only want to render a subset
- * of the data.
- * @return string HTML rendering of the variable.
- */
- public function renderCapturedVar($capturedData, $seekPath = array())
- {
- $data = unserialize($capturedData);
- // The seek method was added in Symfony 3.2; emulate the behavior via SeekingData for older
- // Symfony versions.
- if (!method_exists($data, 'seek')) {
- $data = new SeekingData($data->getRawData());
- }
-
- foreach ($seekPath as $key) {
- $data = $data->seek($key);
- }
-
- return $this->dump($data);
- }
-
- /**
- * Captures and renders the data from a variable to HTML and returns it as a string.
- *
- * @param mixed $data The variable to capture and render.
- * @return string HTML rendering of the variable.
- */
- public function renderVar($data)
- {
- return $this->dump($this->getCloner()->cloneVar($data));
- }
-
- /**
- * Returns assets required for rendering variables.
- *
- * @return array
- */
- public function getAssets() {
- $dumper = $this->getDumper();
- $dumper->setDumpHeader(null); // this will cause the default dump header to regenerate
- return array(
- 'inline_head' => array(
- 'html_var_dumper' => $dumper->getDumpHeaderByDebugBar(),
- ),
- );
- }
-
- /**
- * Helper function to dump a Data object to HTML.
- *
- * @param Data $data
- * @return string
- */
- protected function dump(Data $data)
- {
- $dumper = $this->getDumper();
- $output = fopen('php://memory', 'r+b');
- $dumper->setOutput($output);
- $dumper->setDumpHeader(''); // we don't actually want a dump header
- // NOTE: Symfony 3.2 added the third $extraDisplayOptions parameter. Older versions will
- // safely ignore it.
- $dumper->dump($data, null, $this->getDisplayOptions());
- $result = stream_get_contents($output, -1, 0);
- fclose($output);
- return $result;
- }
-}
diff --git a/src/DebugBar/DataFormatter/VarDumper/DebugBarHtmlDumper.php b/src/DebugBar/DataFormatter/VarDumper/DebugBarHtmlDumper.php
deleted file mode 100644
index 0ff4919c1..000000000
--- a/src/DebugBar/DataFormatter/VarDumper/DebugBarHtmlDumper.php
+++ /dev/null
@@ -1,17 +0,0 @@
-getDumpHeader());
- }
-}
diff --git a/src/DebugBar/DataFormatter/VarDumper/SeekingData.php b/src/DebugBar/DataFormatter/VarDumper/SeekingData.php
deleted file mode 100644
index be71ebfc9..000000000
--- a/src/DebugBar/DataFormatter/VarDumper/SeekingData.php
+++ /dev/null
@@ -1,103 +0,0 @@
-getRawData();
- $item = $thisData[$this->position][$this->key];
-
- if (!$item instanceof Stub || !$item->position) {
- return;
- }
- $keys = array($key);
-
- switch ($item->type) {
- case Stub::TYPE_OBJECT:
- $keys[] = "\0+\0".$key;
- $keys[] = "\0*\0".$key;
- $keys[] = "\0~\0".$key;
- $keys[] = "\0$item->class\0$key";
- case Stub::TYPE_ARRAY:
- case Stub::TYPE_RESOURCE:
- break;
- default:
- return;
- }
-
- $data = null;
- $children = $thisData[$item->position];
-
- foreach ($keys as $key) {
- if (isset($children[$key]) || array_key_exists($key, $children)) {
- $data = clone $this;
- $data->key = $key;
- $data->position = $item->position;
- break;
- }
- }
-
- return $data;
- }
-
- /**
- * {@inheritdoc}
- */
- public function dump(DumperInterface $dumper)
- {
- // Override the base class dump to use the position and key
- $refs = array(0);
- $class = new \ReflectionClass($this);
- $dumpItem = $class->getMethod('dumpItem');
- $dumpItem->setAccessible(true);
- $data = $this->getRawData();
- $args = array($dumper, new Cursor(), &$refs, $data[$this->position][$this->key]);
- $dumpItem->invokeArgs($this, $args);
- }
-}
diff --git a/src/DebugBar/DebugBar.php b/src/DebugBar/DebugBar.php
deleted file mode 100644
index af900a801..000000000
--- a/src/DebugBar/DebugBar.php
+++ /dev/null
@@ -1,493 +0,0 @@
-
- * $debugbar = new DebugBar();
- * $debugbar->addCollector(new DataCollector\MessagesCollector());
- * $debugbar['messages']->addMessage("foobar");
- *
- */
-class DebugBar implements ArrayAccess
-{
- public static $useOpenHandlerWhenSendingDataHeaders = false;
-
- protected $collectors = array();
-
- protected $data;
-
- protected $jsRenderer;
-
- protected $requestIdGenerator;
-
- protected $requestId;
-
- protected $storage;
-
- protected $httpDriver;
-
- protected $stackSessionNamespace = 'PHPDEBUGBAR_STACK_DATA';
-
- protected $stackAlwaysUseSessionStorage = false;
-
- /**
- * Adds a data collector
- *
- * @param DataCollectorInterface $collector
- *
- * @throws DebugBarException
- * @return $this
- */
- public function addCollector(DataCollectorInterface $collector)
- {
- if ($collector->getName() === '__meta') {
- throw new DebugBarException("'__meta' is a reserved name and cannot be used as a collector name");
- }
- if (isset($this->collectors[$collector->getName()])) {
- throw new DebugBarException("'{$collector->getName()}' is already a registered collector");
- }
- $this->collectors[$collector->getName()] = $collector;
- return $this;
- }
-
- /**
- * Checks if a data collector has been added
- *
- * @param string $name
- * @return boolean
- */
- public function hasCollector($name)
- {
- return isset($this->collectors[$name]);
- }
-
- /**
- * Returns a data collector
- *
- * @param string $name
- * @return DataCollectorInterface
- * @throws DebugBarException
- */
- public function getCollector($name)
- {
- if (!isset($this->collectors[$name])) {
- throw new DebugBarException("'$name' is not a registered collector");
- }
- return $this->collectors[$name];
- }
-
- /**
- * Returns an array of all data collectors
- *
- * @return array[DataCollectorInterface]
- */
- public function getCollectors()
- {
- return $this->collectors;
- }
-
- /**
- * Sets the request id generator
- *
- * @param RequestIdGeneratorInterface $generator
- * @return $this
- */
- public function setRequestIdGenerator(RequestIdGeneratorInterface $generator)
- {
- $this->requestIdGenerator = $generator;
- return $this;
- }
-
- /**
- * @return RequestIdGeneratorInterface
- */
- public function getRequestIdGenerator()
- {
- if ($this->requestIdGenerator === null) {
- $this->requestIdGenerator = new RequestIdGenerator();
- }
- return $this->requestIdGenerator;
- }
-
- /**
- * Returns the id of the current request
- *
- * @return string
- */
- public function getCurrentRequestId()
- {
- if ($this->requestId === null) {
- $this->requestId = $this->getRequestIdGenerator()->generate();
- }
- return $this->requestId;
- }
-
- /**
- * Sets the storage backend to use to store the collected data
- *
- * @param StorageInterface $storage
- * @return $this
- */
- public function setStorage(StorageInterface $storage = null)
- {
- $this->storage = $storage;
- return $this;
- }
-
- /**
- * @return StorageInterface
- */
- public function getStorage()
- {
- return $this->storage;
- }
-
- /**
- * Checks if the data will be persisted
- *
- * @return boolean
- */
- public function isDataPersisted()
- {
- return $this->storage !== null;
- }
-
- /**
- * Sets the HTTP driver
- *
- * @param HttpDriverInterface $driver
- * @return $this
- */
- public function setHttpDriver(HttpDriverInterface $driver)
- {
- $this->httpDriver = $driver;
- return $this;
- }
-
- /**
- * Returns the HTTP driver
- *
- * If no http driver where defined, a PhpHttpDriver is automatically created
- *
- * @return HttpDriverInterface
- */
- public function getHttpDriver()
- {
- if ($this->httpDriver === null) {
- $this->httpDriver = new PhpHttpDriver();
- }
- return $this->httpDriver;
- }
-
- /**
- * Collects the data from the collectors
- *
- * @return array
- */
- public function collect()
- {
- if (php_sapi_name() === 'cli') {
- $ip = gethostname();
- if ($ip) {
- $ip = gethostbyname($ip);
- } else {
- $ip = '127.0.0.1';
- }
- $request_variables = array(
- 'method' => 'CLI',
- 'uri' => isset($_SERVER['SCRIPT_FILENAME']) ? realpath($_SERVER['SCRIPT_FILENAME']) : null,
- 'ip' => $ip
- );
- } else {
- $request_variables = array(
- 'method' => isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : null,
- 'uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : null,
- 'ip' => isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null
- );
- }
- $this->data = array(
- '__meta' => array_merge(
- array(
- 'id' => $this->getCurrentRequestId(),
- 'datetime' => date('Y-m-d H:i:s'),
- 'utime' => microtime(true)
- ),
- $request_variables
- )
- );
-
- foreach ($this->collectors as $name => $collector) {
- $this->data[$name] = $collector->collect();
- }
-
- // Remove all invalid (non UTF-8) characters
- array_walk_recursive($this->data, function (&$item) {
- if (is_string($item) && !mb_check_encoding($item, 'UTF-8')) {
- $item = mb_convert_encoding($item, 'UTF-8', 'UTF-8');
- }
- });
-
- if ($this->storage !== null) {
- $this->storage->save($this->getCurrentRequestId(), $this->data);
- }
-
- return $this->data;
- }
-
- /**
- * Returns collected data
- *
- * Will collect the data if none have been collected yet
- *
- * @return array
- */
- public function getData()
- {
- if ($this->data === null) {
- $this->collect();
- }
- return $this->data;
- }
-
- /**
- * Returns an array of HTTP headers containing the data
- *
- * @param string $headerName
- * @param integer $maxHeaderLength
- * @return array
- */
- public function getDataAsHeaders($headerName = 'phpdebugbar', $maxHeaderLength = 4096, $maxTotalHeaderLength = 250000)
- {
- $data = rawurlencode(json_encode(array(
- 'id' => $this->getCurrentRequestId(),
- 'data' => $this->getData()
- )));
-
- if (strlen($data) > $maxTotalHeaderLength) {
- $data = rawurlencode(json_encode(array(
- 'error' => 'Maximum header size exceeded'
- )));
- }
-
- $chunks = array();
-
- while (strlen($data) > $maxHeaderLength) {
- $chunks[] = substr($data, 0, $maxHeaderLength);
- $data = substr($data, $maxHeaderLength);
- }
- $chunks[] = $data;
-
- $headers = array();
- for ($i = 0, $c = count($chunks); $i < $c; $i++) {
- $name = $headerName . ($i > 0 ? "-$i" : '');
- $headers[$name] = $chunks[$i];
- }
-
- return $headers;
- }
-
- /**
- * Sends the data through the HTTP headers
- *
- * @param bool $useOpenHandler
- * @param string $headerName
- * @param integer $maxHeaderLength
- * @return $this
- */
- public function sendDataInHeaders($useOpenHandler = null, $headerName = 'phpdebugbar', $maxHeaderLength = 4096)
- {
- if ($useOpenHandler === null) {
- $useOpenHandler = self::$useOpenHandlerWhenSendingDataHeaders;
- }
- if ($useOpenHandler && $this->storage !== null) {
- $this->getData();
- $headerName .= '-id';
- $headers = array($headerName => $this->getCurrentRequestId());
- } else {
- $headers = $this->getDataAsHeaders($headerName, $maxHeaderLength);
- }
- $this->getHttpDriver()->setHeaders($headers);
- return $this;
- }
-
- /**
- * Stacks the data in the session for later rendering
- */
- public function stackData()
- {
- $http = $this->initStackSession();
-
- $data = null;
- if (!$this->isDataPersisted() || $this->stackAlwaysUseSessionStorage) {
- $data = $this->getData();
- } elseif ($this->data === null) {
- $this->collect();
- }
-
- $stack = $http->getSessionValue($this->stackSessionNamespace);
- $stack[$this->getCurrentRequestId()] = $data;
- $http->setSessionValue($this->stackSessionNamespace, $stack);
- return $this;
- }
-
- /**
- * Checks if there is stacked data in the session
- *
- * @return boolean
- */
- public function hasStackedData()
- {
- try {
- $http = $this->initStackSession();
- } catch (DebugBarException $e) {
- return false;
- }
- return count($http->getSessionValue($this->stackSessionNamespace)) > 0;
- }
-
- /**
- * Returns the data stacked in the session
- *
- * @param boolean $delete Whether to delete the data in the session
- * @return array
- */
- public function getStackedData($delete = true)
- {
- $http = $this->initStackSession();
- $stackedData = $http->getSessionValue($this->stackSessionNamespace);
- if ($delete) {
- $http->deleteSessionValue($this->stackSessionNamespace);
- }
-
- $datasets = array();
- if ($this->isDataPersisted() && !$this->stackAlwaysUseSessionStorage) {
- foreach ($stackedData as $id => $data) {
- $datasets[$id] = $this->getStorage()->get($id);
- }
- } else {
- $datasets = $stackedData;
- }
-
- return $datasets;
- }
-
- /**
- * Sets the key to use in the $_SESSION array
- *
- * @param string $ns
- * @return $this
- */
- public function setStackDataSessionNamespace($ns)
- {
- $this->stackSessionNamespace = $ns;
- return $this;
- }
-
- /**
- * Returns the key used in the $_SESSION array
- *
- * @return string
- */
- public function getStackDataSessionNamespace()
- {
- return $this->stackSessionNamespace;
- }
-
- /**
- * Sets whether to only use the session to store stacked data even
- * if a storage is enabled
- *
- * @param boolean $enabled
- * @return $this
- */
- public function setStackAlwaysUseSessionStorage($enabled = true)
- {
- $this->stackAlwaysUseSessionStorage = $enabled;
- return $this;
- }
-
- /**
- * Checks if the session is always used to store stacked data
- * even if a storage is enabled
- *
- * @return boolean
- */
- public function isStackAlwaysUseSessionStorage()
- {
- return $this->stackAlwaysUseSessionStorage;
- }
-
- /**
- * Initializes the session for stacked data
- * @return HttpDriverInterface
- * @throws DebugBarException
- */
- protected function initStackSession()
- {
- $http = $this->getHttpDriver();
- if (!$http->isSessionStarted()) {
- throw new DebugBarException("Session must be started before using stack data in the debug bar");
- }
-
- if (!$http->hasSessionValue($this->stackSessionNamespace)) {
- $http->setSessionValue($this->stackSessionNamespace, array());
- }
-
- return $http;
- }
-
- /**
- * Returns a JavascriptRenderer for this instance
- * @param string $baseUrl
- * @param string $basePath
- * @return JavascriptRenderer
- */
- public function getJavascriptRenderer($baseUrl = null, $basePath = null)
- {
- if ($this->jsRenderer === null) {
- $this->jsRenderer = new JavascriptRenderer($this, $baseUrl, $basePath);
- }
- return $this->jsRenderer;
- }
-
- // --------------------------------------------
- // ArrayAccess implementation
-
- public function offsetSet($key, $value)
- {
- throw new DebugBarException("DebugBar[] is read-only");
- }
-
- public function offsetGet($key)
- {
- return $this->getCollector($key);
- }
-
- public function offsetExists($key)
- {
- return $this->hasCollector($key);
- }
-
- public function offsetUnset($key)
- {
- throw new DebugBarException("DebugBar[] is read-only");
- }
-}
diff --git a/src/DebugBar/JavascriptRenderer.php b/src/DebugBar/JavascriptRenderer.php
deleted file mode 100644
index b8cba0aa7..000000000
--- a/src/DebugBar/JavascriptRenderer.php
+++ /dev/null
@@ -1,1126 +0,0 @@
- 'vendor/font-awesome/css/font-awesome.min.css',
- 'highlightjs' => 'vendor/highlightjs/styles/github.css'
- );
-
- protected $jsVendors = array(
- 'jquery' => 'vendor/jquery/dist/jquery.min.js',
- 'highlightjs' => 'vendor/highlightjs/highlight.pack.js'
- );
-
- protected $includeVendors = true;
-
- protected $cssFiles = array('debugbar.css', 'widgets.css', 'openhandler.css');
-
- protected $jsFiles = array('debugbar.js', 'widgets.js', 'openhandler.js');
-
- protected $additionalAssets = array();
-
- protected $javascriptClass = 'PhpDebugBar.DebugBar';
-
- protected $variableName = 'phpdebugbar';
-
- protected $enableJqueryNoConflict = true;
-
- protected $useRequireJs = false;
-
- protected $initialization;
-
- protected $controls = array();
-
- protected $ignoredCollectors = array();
-
- protected $ajaxHandlerClass = 'PhpDebugBar.AjaxHandler';
-
- protected $ajaxHandlerBindToJquery = true;
-
- protected $ajaxHandlerBindToXHR = false;
-
- protected $ajaxHandlerAutoShow = true;
-
- protected $openHandlerClass = 'PhpDebugBar.OpenHandler';
-
- protected $openHandlerUrl;
-
- /**
- * @param \DebugBar\DebugBar $debugBar
- * @param string $baseUrl
- * @param string $basePath
- */
- public function __construct(DebugBar $debugBar, $baseUrl = null, $basePath = null)
- {
- $this->debugBar = $debugBar;
-
- if ($baseUrl === null) {
- $baseUrl = '/vendor/maximebf/debugbar/src/DebugBar/Resources';
- }
- $this->baseUrl = $baseUrl;
-
- if ($basePath === null) {
- $basePath = __DIR__ . DIRECTORY_SEPARATOR . 'Resources';
- }
- $this->basePath = $basePath;
-
- // bitwise operations cannot be done in class definition :(
- $this->initialization = self::INITIALIZE_CONSTRUCTOR | self::INITIALIZE_CONTROLS;
- }
-
- /**
- * Sets options from an array
- *
- * Options:
- * - base_path
- * - base_url
- * - include_vendors
- * - javascript_class
- * - variable_name
- * - initialization
- * - enable_jquery_noconflict
- * - controls
- * - disable_controls
- * - ignore_collectors
- * - ajax_handler_classname
- * - ajax_handler_bind_to_jquery
- * - ajax_handler_auto_show
- * - open_handler_classname
- * - open_handler_url
- *
- * @param array $options [description]
- */
- public function setOptions(array $options)
- {
- if (array_key_exists('base_path', $options)) {
- $this->setBasePath($options['base_path']);
- }
- if (array_key_exists('base_url', $options)) {
- $this->setBaseUrl($options['base_url']);
- }
- if (array_key_exists('include_vendors', $options)) {
- $this->setIncludeVendors($options['include_vendors']);
- }
- if (array_key_exists('javascript_class', $options)) {
- $this->setJavascriptClass($options['javascript_class']);
- }
- if (array_key_exists('variable_name', $options)) {
- $this->setVariableName($options['variable_name']);
- }
- if (array_key_exists('initialization', $options)) {
- $this->setInitialization($options['initialization']);
- }
- if (array_key_exists('enable_jquery_noconflict', $options)) {
- $this->setEnableJqueryNoConflict($options['enable_jquery_noconflict']);
- }
- if (array_key_exists('use_requirejs', $options)) {
- $this->setUseRequireJs($options['use_requirejs']);
- }
- if (array_key_exists('controls', $options)) {
- foreach ($options['controls'] as $name => $control) {
- $this->addControl($name, $control);
- }
- }
- if (array_key_exists('disable_controls', $options)) {
- foreach ((array) $options['disable_controls'] as $name) {
- $this->disableControl($name);
- }
- }
- if (array_key_exists('ignore_collectors', $options)) {
- foreach ((array) $options['ignore_collectors'] as $name) {
- $this->ignoreCollector($name);
- }
- }
- if (array_key_exists('ajax_handler_classname', $options)) {
- $this->setAjaxHandlerClass($options['ajax_handler_classname']);
- }
- if (array_key_exists('ajax_handler_bind_to_jquery', $options)) {
- $this->setBindAjaxHandlerToJquery($options['ajax_handler_bind_to_jquery']);
- }
- if (array_key_exists('ajax_handler_auto_show', $options)) {
- $this->setAjaxHandlerAutoShow($options['ajax_handler_auto_show']);
- }
- if (array_key_exists('open_handler_classname', $options)) {
- $this->setOpenHandlerClass($options['open_handler_classname']);
- }
- if (array_key_exists('open_handler_url', $options)) {
- $this->setOpenHandlerUrl($options['open_handler_url']);
- }
- }
-
- /**
- * Sets the path which assets are relative to
- *
- * @param string $path
- */
- public function setBasePath($path)
- {
- $this->basePath = $path;
- return $this;
- }
-
- /**
- * Returns the path which assets are relative to
- *
- * @return string
- */
- public function getBasePath()
- {
- return $this->basePath;
- }
-
- /**
- * Sets the base URL from which assets will be served
- *
- * @param string $url
- */
- public function setBaseUrl($url)
- {
- $this->baseUrl = $url;
- return $this;
- }
-
- /**
- * Returns the base URL from which assets will be served
- *
- * @return string
- */
- public function getBaseUrl()
- {
- return $this->baseUrl;
- }
-
- /**
- * Whether to include vendor assets
- *
- * You can only include js or css vendors using
- * setIncludeVendors('css') or setIncludeVendors('js')
- *
- * @param boolean $enabled
- */
- public function setIncludeVendors($enabled = true)
- {
- if (is_string($enabled)) {
- $enabled = array($enabled);
- }
- $this->includeVendors = $enabled;
-
- if (!$enabled || (is_array($enabled) && !in_array('js', $enabled))) {
- // no need to call jQuery.noConflict() if we do not include our own version
- $this->enableJqueryNoConflict = false;
- }
-
- return $this;
- }
-
- /**
- * Checks if vendors assets are included
- *
- * @return boolean
- */
- public function areVendorsIncluded()
- {
- return $this->includeVendors !== false;
- }
-
- /**
- * Disable a specific vendor's assets.
- *
- * @param string $name "jquery", "fontawesome", "highlightjs"
- *
- * @return void
- */
- public function disableVendor($name)
- {
- if (array_key_exists($name, $this->cssVendors)) {
- unset($this->cssVendors[$name]);
- }
- if (array_key_exists($name, $this->jsVendors)) {
- unset($this->jsVendors[$name]);
- }
- }
-
- /**
- * Sets the javascript class name
- *
- * @param string $className
- */
- public function setJavascriptClass($className)
- {
- $this->javascriptClass = $className;
- return $this;
- }
-
- /**
- * Returns the javascript class name
- *
- * @return string
- */
- public function getJavascriptClass()
- {
- return $this->javascriptClass;
- }
-
- /**
- * Sets the variable name of the class instance
- *
- * @param string $name
- */
- public function setVariableName($name)
- {
- $this->variableName = $name;
- return $this;
- }
-
- /**
- * Returns the variable name of the class instance
- *
- * @return string
- */
- public function getVariableName()
- {
- return $this->variableName;
- }
-
- /**
- * Sets what should be initialized
- *
- * - INITIALIZE_CONSTRUCTOR: only initializes the instance
- * - INITIALIZE_CONTROLS: initializes the controls and data mapping
- * - INITIALIZE_CONSTRUCTOR | INITIALIZE_CONTROLS: initialize everything (default)
- *
- * @param integer $init
- */
- public function setInitialization($init)
- {
- $this->initialization = $init;
- return $this;
- }
-
- /**
- * Returns what should be initialized
- *
- * @return integer
- */
- public function getInitialization()
- {
- return $this->initialization;
- }
-
- /**
- * Sets whether to call jQuery.noConflict()
- *
- * @param boolean $enabled
- */
- public function setEnableJqueryNoConflict($enabled = true)
- {
- $this->enableJqueryNoConflict = $enabled;
- return $this;
- }
-
- /**
- * Checks if jQuery.noConflict() will be called
- *
- * @return boolean
- */
- public function isJqueryNoConflictEnabled()
- {
- return $this->enableJqueryNoConflict;
- }
-
- /**
- * Sets whether to use RequireJS or not
- *
- * @param boolean $enabled
- * @return $this
- */
- public function setUseRequireJs($enabled = true)
- {
- $this->useRequireJs = $enabled;
- return $this;
- }
-
- /**
- * Checks if RequireJS is used
- *
- * @return boolean
- */
- public function isRequireJsUsed()
- {
- return $this->useRequireJs;
- }
-
- /**
- * Adds a control to initialize
- *
- * Possible options:
- * - icon: icon name
- * - tooltip: string
- * - widget: widget class name
- * - title: tab title
- * - map: a property name from the data to map the control to
- * - default: a js string, default value of the data map
- *
- * "icon" or "widget" are at least needed
- *
- * @param string $name
- * @param array $options
- */
- public function addControl($name, array $options)
- {
- if (count(array_intersect(array_keys($options), array('icon', 'widget', 'tab', 'indicator'))) === 0) {
- throw new DebugBarException("Not enough options for control '$name'");
- }
- $this->controls[$name] = $options;
- return $this;
- }
-
- /**
- * Disables a control
- *
- * @param string $name
- */
- public function disableControl($name)
- {
- $this->controls[$name] = null;
- return $this;
- }
-
- /**
- * Returns the list of controls
- *
- * This does not include controls provided by collectors
- *
- * @return array
- */
- public function getControls()
- {
- return $this->controls;
- }
-
- /**
- * Ignores widgets provided by a collector
- *
- * @param string $name
- */
- public function ignoreCollector($name)
- {
- $this->ignoredCollectors[] = $name;
- return $this;
- }
-
- /**
- * Returns the list of ignored collectors
- *
- * @return array
- */
- public function getIgnoredCollectors()
- {
- return $this->ignoredCollectors;
- }
-
- /**
- * Sets the class name of the ajax handler
- *
- * Set to false to disable
- *
- * @param string $className
- */
- public function setAjaxHandlerClass($className)
- {
- $this->ajaxHandlerClass = $className;
- return $this;
- }
-
- /**
- * Returns the class name of the ajax handler
- *
- * @return string
- */
- public function getAjaxHandlerClass()
- {
- return $this->ajaxHandlerClass;
- }
-
- /**
- * Sets whether to call bindToJquery() on the ajax handler
- *
- * @param boolean $bind
- */
- public function setBindAjaxHandlerToJquery($bind = true)
- {
- $this->ajaxHandlerBindToJquery = $bind;
- return $this;
- }
-
- /**
- * Checks whether bindToJquery() will be called on the ajax handler
- *
- * @return boolean
- */
- public function isAjaxHandlerBoundToJquery()
- {
- return $this->ajaxHandlerBindToJquery;
- }
-
- /**
- * Sets whether to call bindToXHR() on the ajax handler
- *
- * @param boolean $bind
- */
- public function setBindAjaxHandlerToXHR($bind = true)
- {
- $this->ajaxHandlerBindToXHR = $bind;
- return $this;
- }
-
- /**
- * Checks whether bindToXHR() will be called on the ajax handler
- *
- * @return boolean
- */
- public function isAjaxHandlerBoundToXHR()
- {
- return $this->ajaxHandlerBindToXHR;
- }
-
- /**
- * Sets whether new ajax debug data will be immediately shown. Setting to false could be useful
- * if there are a lot of tracking events cluttering things.
- *
- * @param boolean $autoShow
- */
- public function setAjaxHandlerAutoShow($autoShow = true)
- {
- $this->ajaxHandlerAutoShow = $autoShow;
- return $this;
- }
-
- /**
- * Checks whether the ajax handler will immediately show new ajax requests.
- *
- * @return boolean
- */
- public function isAjaxHandlerAutoShow()
- {
- return $this->ajaxHandlerAutoShow;
- }
-
- /**
- * Sets the class name of the js open handler
- *
- * @param string $className
- */
- public function setOpenHandlerClass($className)
- {
- $this->openHandlerClass = $className;
- return $this;
- }
-
- /**
- * Returns the class name of the js open handler
- *
- * @return string
- */
- public function getOpenHandlerClass()
- {
- return $this->openHandlerClass;
- }
-
- /**
- * Sets the url of the open handler
- *
- * @param string $url
- */
- public function setOpenHandlerUrl($url)
- {
- $this->openHandlerUrl = $url;
- return $this;
- }
-
- /**
- * Returns the url for the open handler
- *
- * @return string
- */
- public function getOpenHandlerUrl()
- {
- return $this->openHandlerUrl;
- }
-
- /**
- * Add assets stored in files to render in the head
- *
- * @param array $cssFiles An array of filenames
- * @param array $jsFiles An array of filenames
- * @param string $basePath Base path of those files
- * @param string $baseUrl Base url of those files
- * @return $this
- */
- public function addAssets($cssFiles, $jsFiles, $basePath = null, $baseUrl = null)
- {
- $this->additionalAssets[] = array(
- 'base_path' => $basePath,
- 'base_url' => $baseUrl,
- 'css' => (array) $cssFiles,
- 'js' => (array) $jsFiles
- );
- return $this;
- }
-
- /**
- * Add inline assets to render inline in the head. Ideally, you should store static assets in
- * files that you add with the addAssets function. However, adding inline assets is useful when
- * integrating with 3rd-party libraries that require static assets that are only available in an
- * inline format.
- *
- * The inline content arrays require special string array keys: they are used to deduplicate
- * content. This is particularly useful if multiple instances of the same asset end up being
- * added. Inline assets from all collectors are merged together into the same array, so these
- * content IDs effectively deduplicate the inline assets.
- *
- * @param array $inlineCss An array map of content ID to inline CSS content (not including ' . "\n", $content);
- }
-
- foreach ($jsFiles as $file) {
- $html .= sprintf('' . "\n", $file);
- }
-
- foreach ($inlineJs as $content) {
- $html .= sprintf('' . "\n", $content);
- }
-
- foreach ($inlineHead as $content) {
- $html .= $content . "\n";
- }
-
- if ($this->enableJqueryNoConflict && !$this->useRequireJs) {
- $html .= '' . "\n";
- }
-
- return $html;
- }
-
- /**
- * Register shutdown to display the debug bar
- *
- * @param boolean $here Set position of HTML. True if is to current position or false for end file
- * @param boolean $initialize Whether to render the de bug bar initialization code
- * @param bool $renderStackedData
- * @param bool $head
- * @return string Return "{--DEBUGBAR_OB_START_REPLACE_ME--}" or return an empty string if $here == false
- */
- public function renderOnShutdown($here = true, $initialize = true, $renderStackedData = true, $head = false)
- {
- register_shutdown_function(array($this, "replaceTagInBuffer"), $here, $initialize, $renderStackedData, $head);
-
- if (ob_get_level() === 0) {
- ob_start();
- }
-
- return ($here) ? self::REPLACEABLE_TAG : "";
- }
-
- /**
- * Same as renderOnShutdown() with $head = true
- *
- * @param boolean $here
- * @param boolean $initialize
- * @param boolean $renderStackedData
- * @return string
- */
- public function renderOnShutdownWithHead($here = true, $initialize = true, $renderStackedData = true)
- {
- return $this->renderOnShutdown($here, $initialize, $renderStackedData, true);
- }
-
- /**
- * Is callback function for register_shutdown_function(...)
- *
- * @param boolean $here Set position of HTML. True if is to current position or false for end file
- * @param boolean $initialize Whether to render the de bug bar initialization code
- * @param bool $renderStackedData
- * @param bool $head
- */
- public function replaceTagInBuffer($here = true, $initialize = true, $renderStackedData = true, $head = false)
- {
- $render = ($head ? $this->renderHead() : "")
- . $this->render($initialize, $renderStackedData);
-
- $current = ($here && ob_get_level() > 0) ? ob_get_clean() : self::REPLACEABLE_TAG;
-
- echo str_replace(self::REPLACEABLE_TAG, $render, $current, $count);
-
- if ($count === 0) {
- echo $render;
- }
- }
-
- /**
- * Returns the code needed to display the debug bar
- *
- * AJAX request should not render the initialization code.
- *
- * @param boolean $initialize Whether or not to render the debug bar initialization code
- * @param boolean $renderStackedData Whether or not to render the stacked data
- * @return string
- */
- public function render($initialize = true, $renderStackedData = true)
- {
- $js = '';
-
- if ($initialize) {
- $js = $this->getJsInitializationCode();
- }
-
- if ($renderStackedData && $this->debugBar->hasStackedData()) {
- foreach ($this->debugBar->getStackedData() as $id => $data) {
- $js .= $this->getAddDatasetCode($id, $data, '(stacked)');
- }
- }
-
- $suffix = !$initialize ? '(ajax)' : null;
- $js .= $this->getAddDatasetCode($this->debugBar->getCurrentRequestId(), $this->debugBar->getData(), $suffix);
-
- if ($this->useRequireJs){
- return "\n";
- } else {
- return "\n";
- }
-
- }
-
- /**
- * Returns the js code needed to initialize the debug bar
- *
- * @return string
- */
- protected function getJsInitializationCode()
- {
- $js = '';
-
- if (($this->initialization & self::INITIALIZE_CONSTRUCTOR) === self::INITIALIZE_CONSTRUCTOR) {
- $js .= sprintf("var %s = new %s();\n", $this->variableName, $this->javascriptClass);
- }
-
- if (($this->initialization & self::INITIALIZE_CONTROLS) === self::INITIALIZE_CONTROLS) {
- $js .= $this->getJsControlsDefinitionCode($this->variableName);
- }
-
- if ($this->ajaxHandlerClass) {
- $js .= sprintf("%s.ajaxHandler = new %s(%s, undefined, %s);\n",
- $this->variableName,
- $this->ajaxHandlerClass,
- $this->variableName,
- $this->ajaxHandlerAutoShow ? 'true' : 'false'
- );
- if ($this->ajaxHandlerBindToXHR) {
- $js .= sprintf("%s.ajaxHandler.bindToXHR();\n", $this->variableName);
- } elseif ($this->ajaxHandlerBindToJquery) {
- $js .= sprintf("if (jQuery) %s.ajaxHandler.bindToJquery(jQuery);\n", $this->variableName);
- }
- }
-
- if ($this->openHandlerUrl !== null) {
- $js .= sprintf("%s.setOpenHandler(new %s(%s));\n", $this->variableName,
- $this->openHandlerClass,
- json_encode(array("url" => $this->openHandlerUrl)));
- }
-
- return $js;
- }
-
- /**
- * Returns the js code needed to initialized the controls and data mapping of the debug bar
- *
- * Controls can be defined by collectors themselves or using {@see addControl()}
- *
- * @param string $varname Debug bar's variable name
- * @return string
- */
- protected function getJsControlsDefinitionCode($varname)
- {
- $js = '';
- $dataMap = array();
- $excludedOptions = array('indicator', 'tab', 'map', 'default', 'widget', 'position');
-
- // finds controls provided by collectors
- $widgets = array();
- foreach ($this->debugBar->getCollectors() as $collector) {
- if (($collector instanceof Renderable) && !in_array($collector->getName(), $this->ignoredCollectors)) {
- if ($w = $collector->getWidgets()) {
- $widgets = array_merge($widgets, $w);
- }
- }
- }
- $controls = array_merge($widgets, $this->controls);
-
- foreach (array_filter($controls) as $name => $options) {
- $opts = array_diff_key($options, array_flip($excludedOptions));
-
- if (isset($options['tab']) || isset($options['widget'])) {
- if (!isset($opts['title'])) {
- $opts['title'] = ucfirst(str_replace('_', ' ', $name));
- }
- $js .= sprintf("%s.addTab(\"%s\", new %s({%s%s}));\n",
- $varname,
- $name,
- isset($options['tab']) ? $options['tab'] : 'PhpDebugBar.DebugBar.Tab',
- substr(json_encode($opts, JSON_FORCE_OBJECT), 1, -1),
- isset($options['widget']) ? sprintf('%s"widget": new %s()', count($opts) ? ', ' : '', $options['widget']) : ''
- );
- } elseif (isset($options['indicator']) || isset($options['icon'])) {
- $js .= sprintf("%s.addIndicator(\"%s\", new %s(%s), \"%s\");\n",
- $varname,
- $name,
- isset($options['indicator']) ? $options['indicator'] : 'PhpDebugBar.DebugBar.Indicator',
- json_encode($opts, JSON_FORCE_OBJECT),
- isset($options['position']) ? $options['position'] : 'right'
- );
- }
-
- if (isset($options['map']) && isset($options['default'])) {
- $dataMap[$name] = array($options['map'], $options['default']);
- }
- }
-
- // creates the data mapping object
- $mapJson = array();
- foreach ($dataMap as $name => $values) {
- $mapJson[] = sprintf('"%s": ["%s", %s]', $name, $values[0], $values[1]);
- }
- $js .= sprintf("%s.setDataMap({\n%s\n});\n", $varname, implode(",\n", $mapJson));
-
- // activate state restoration
- $js .= sprintf("%s.restoreState();\n", $varname);
-
- return $js;
- }
-
- /**
- * Returns the js code needed to add a dataset
- *
- * @param string $requestId
- * @param array $data
- * @param mixed $suffix
- * @return string
- */
- protected function getAddDatasetCode($requestId, $data, $suffix = null)
- {
- $js = sprintf("%s.addDataSet(%s, \"%s\"%s);\n",
- $this->variableName,
- json_encode($data),
- $requestId,
- $suffix ? ", " . json_encode($suffix) : ''
- );
- return $js;
- }
-}
diff --git a/src/DebugBar/OpenHandler.php b/src/DebugBar/OpenHandler.php
deleted file mode 100644
index ee4df4137..000000000
--- a/src/DebugBar/OpenHandler.php
+++ /dev/null
@@ -1,117 +0,0 @@
-isDataPersisted()) {
- throw new DebugBarException("DebugBar must have a storage backend to use OpenHandler");
- }
- $this->debugBar = $debugBar;
- }
-
- /**
- * Handles the current request
- *
- * @param array $request Request data
- * @param bool $echo
- * @param bool $sendHeader
- * @return string
- * @throws DebugBarException
- */
- public function handle($request = null, $echo = true, $sendHeader = true)
- {
- if ($request === null) {
- $request = $_REQUEST;
- }
-
- $op = 'find';
- if (isset($request['op'])) {
- $op = $request['op'];
- if (!in_array($op, array('find', 'get', 'clear'))) {
- throw new DebugBarException("Invalid operation '{$request['op']}'");
- }
- }
-
- if ($sendHeader) {
- $this->debugBar->getHttpDriver()->setHeaders(array(
- 'Content-Type' => 'application/json'
- ));
- }
-
- $response = json_encode(call_user_func(array($this, $op), $request));
- if ($echo) {
- echo $response;
- }
- return $response;
- }
-
- /**
- * Find operation
- * @param $request
- * @return array
- */
- protected function find($request)
- {
- $max = 20;
- if (isset($request['max'])) {
- $max = $request['max'];
- }
-
- $offset = 0;
- if (isset($request['offset'])) {
- $offset = $request['offset'];
- }
-
- $filters = array();
- foreach (array('utime', 'datetime', 'ip', 'uri', 'method') as $key) {
- if (isset($request[$key])) {
- $filters[$key] = $request[$key];
- }
- }
-
- return $this->debugBar->getStorage()->find($filters, $max, $offset);
- }
-
- /**
- * Get operation
- * @param $request
- * @return array
- * @throws DebugBarException
- */
- protected function get($request)
- {
- if (!isset($request['id'])) {
- throw new DebugBarException("Missing 'id' parameter in 'get' operation");
- }
- return $this->debugBar->getStorage()->get($request['id']);
- }
-
- /**
- * Clear operation
- */
- protected function clear($request)
- {
- $this->debugBar->getStorage()->clear();
- return array('success' => true);
- }
-}
diff --git a/src/DebugBar/RequestIdGenerator.php b/src/DebugBar/RequestIdGenerator.php
deleted file mode 100644
index 90c1728b0..000000000
--- a/src/DebugBar/RequestIdGenerator.php
+++ /dev/null
@@ -1,43 +0,0 @@
-= 5.3.0, but OpenSSL may not always be available
- return 'X' . bin2hex(openssl_random_pseudo_bytes(16));
- } else {
- // Fall back to a rudimentary ID generator:
- // * $_SERVER array will make the ID unique to this request.
- // * spl_object_hash($this) will make the ID unique to this object instance.
- // (note that object hashes can be reused, but the other data here should prevent issues here).
- // * uniqid('', true) will use the current microtime(), plus additional random data.
- // * $this->index guarantees the uniqueness of IDs from the current object.
- $this->index++;
- $entropy = serialize($_SERVER) . uniqid('', true) . spl_object_hash($this) . $this->index;
- return 'X' . md5($entropy);
- }
- }
-}
diff --git a/src/DebugBar/Resources/debugbar.css b/src/DebugBar/Resources/debugbar.css
deleted file mode 100644
index abfbca399..000000000
--- a/src/DebugBar/Resources/debugbar.css
+++ /dev/null
@@ -1,314 +0,0 @@
-/* Hide debugbar when printing a page */
-@media print {
- div.phpdebugbar {
- display: none;
- }
-}
-
-div.phpdebugbar {
- position: fixed;
- bottom: 0;
- left: 0;
- width: 100%;
- border-top: 0;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
- background: #fff;
- z-index: 10000;
- font-size: 14px;
- color: #000;
- text-align: left;
- line-height: 1;
- letter-spacing: normal;
- direction: ltr;
-}
-
-div.phpdebugbar a,
-div.phpdebugbar-openhandler {
- cursor: pointer;
-}
-
-div.phpdebugbar-drag-capture {
- position: fixed;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- z-index: 10001;
- background: none;
- display: none;
- cursor: n-resize;
-}
-
-div.phpdebugbar-closed {
- width: auto;
-}
-
-div.phpdebugbar * {
- margin: 0;
- padding: 0;
- border: 0;
- font-weight: normal;
- text-decoration: none;
- clear: initial;
- width: auto;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-
-div.phpdebugbar ol, div.phpdebugbar ul {
- list-style: none;
-}
-
-div.phpdebugbar table {
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-div.phpdebugbar input[type='text'], div.phpdebugbar input[type='password'] {
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
- background: #fff;
- font-size: 14px;
- color: #000;
- border: 0;
- padding: 0;
- margin: 0;
-}
-
-div.phpdebugbar code, div.phpdebugbar pre, div.phpdebugbar samp {
- background: none;
- font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
- font-size: 1em;
- border: 0;
- padding: 0;
- margin: 0;
-}
-
-div.phpdebugbar code, div.phpdebugbar pre {
- color: #000;
-}
-
-div.phpdebugbar pre.sf-dump {
- color: #a0a000;
- outline: 0;
-}
-
-a.phpdebugbar-restore-btn {
- float: left;
- padding: 5px 8px;
- font-size: 14px;
- color: #555;
- text-decoration: none;
- border-right: 1px solid #ddd;
-}
-
-div.phpdebugbar-resize-handle {
- display: none;
- height: 4px;
- margin-top: -4px;
- width: 100%;
- background: none;
- border-bottom: 1px solid #ccc;
- cursor: n-resize;
-}
-
-div.phpdebugbar-closed, div.phpdebugbar-minimized{
- border-top: 1px solid #ccc;
-}
-/* -------------------------------------- */
-
-div.phpdebugbar-header, a.phpdebugbar-restore-btn {
- background: #efefef url(data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2020%2020%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Ccircle%20fill%3D%22%23000%22%20cx%3D%2210%22%20cy%3D%2210%22%20r%3D%229%22%2F%3E%3Cpath%20d%3D%22M6.039%208.342c.463%200%20.772.084.927.251.154.168.191.455.11.862-.084.424-.247.727-.487.908-.241.182-.608.272-1.1.272h-.743l.456-2.293h.837zm-2.975%204.615h1.22l.29-1.457H5.62c.461%200%20.84-.047%201.139-.142.298-.095.569-.254.812-.477.205-.184.37-.387.497-.608.127-.222.217-.466.27-.734.13-.65.032-1.155-.292-1.518-.324-.362-.84-.543-1.545-.543H4.153l-1.089%205.479zM9.235%206.02h1.21l-.289%201.458h1.079c.679%200%201.147.115%201.405.347.258.231.335.607.232%201.125l-.507%202.55h-1.23l.481-2.424c.055-.276.035-.464-.06-.565-.095-.1-.298-.15-.608-.15H9.98L9.356%2011.5h-1.21l1.089-5.48M15.566%208.342c.464%200%20.773.084.928.251.154.168.19.455.11.862-.084.424-.247.727-.488.908-.24.182-.607.272-1.1.272h-.742l.456-2.293h.836zm-2.974%204.615h1.22l.29-1.457h1.046c.461%200%20.84-.047%201.139-.142.298-.095.569-.254.812-.477.205-.184.37-.387.497-.608.127-.222.217-.466.27-.734.129-.65.032-1.155-.292-1.518-.324-.362-.84-.543-1.545-.543H13.68l-1.089%205.479z%22%20fill%3D%22%23FFF%22%2F%3E%3C%2Fsvg%3E) no-repeat 5px 4px / 20px 20px;
-}
-div.phpdebugbar-header {
- padding-left: 29px;
- min-height: 26px;
- line-height: 16px;
-}
-div.phpdebugbar-header:before, div.phpdebugbar-header:after {
- display: table;
- line-height: 0;
- content: "";
-}
-div.phpdebugbar-header:after {
- clear: both;
-}
-div.phpdebugbar-header-left {
- float: left;
-}
-div.phpdebugbar-header-right {
- float: right;
-}
-div.phpdebugbar-header > div > * {
- padding: 5px 5px;
- font-size: 14px;
- color: #555;
- text-decoration: none;
-}
-div.phpdebugbar-header-left > * {
- float: left;
-}
-div.phpdebugbar-header-right > * {
- float: right;
-}
-div.phpdebugbar-header-right > select {
- padding: 0;
-}
-
-/* -------------------------------------- */
-
-span.phpdebugbar-indicator,
-a.phpdebugbar-indicator,
-a.phpdebugbar-close-btn {
- border-right: 1px solid #ddd;
-}
-
-a.phpdebugbar-tab.phpdebugbar-active {
- background: #ccc;
- color: #444;
- background-image: linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
- background-image: -o-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
- background-image: -moz-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
- background-image: -webkit-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
- background-image: -ms-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.41, rgb(173,173,173)), color-stop(0.71, rgb(209,209,209)));
-}
- a.phpdebugbar-tab span.phpdebugbar-badge {
- display: none;
- margin-left: 5px;
- font-size: 11px;
- line-height: 14px;
- padding: 0 6px;
- background: #ccc;
- border-radius: 4px;
- color: #555;
- font-weight: normal;
- text-shadow: none;
- vertical-align: middle;
- }
- a.phpdebugbar-tab i {
- display: none;
- vertical-align: middle;
- }
- a.phpdebugbar-tab span.phpdebugbar-badge.phpdebugbar-visible {
- display: inline;
- }
- a.phpdebugbar-tab span.phpdebugbar-badge.phpdebugbar-important {
- background: #ed6868;
- color: white;
- }
-
-a.phpdebugbar-close-btn, a.phpdebugbar-open-btn, a.phpdebugbar-restore-btn, a.phpdebugbar-minimize-btn , a.phpdebugbar-maximize-btn {
- width: 16px;
- height: 16px;
-}
-
-a.phpdebugbar-minimize-btn , a.phpdebugbar-maximize-btn {
- padding-right: 0 !important;
-}
-
-a.phpdebugbar-maximize-btn { display: none}
-
-a.phpdebugbar-minimize-btn { display: block}
-
-div.phpdebugbar-minimized a.phpdebugbar-maximize-btn { display: block}
-
-div.phpdebugbar-minimized a.phpdebugbar-minimize-btn { display: none}
-
-a.phpdebugbar-minimize-btn {
- background:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201792%201792%22%20id%3D%22chevron-down%22%3E%3Cpath%20d%3D%22M1683%20808l-742%20741q-19%2019-45%2019t-45-19l-742-741q-19-19-19-45.5t19-45.5l166-165q19-19%2045-19t45%2019l531%20531%20531-531q19-19%2045-19t45%2019l166%20165q19%2019%2019%2045.5t-19%2045.5z%22%2F%3E%3C%2Fsvg%3E) no-repeat 6px 6px / 14px 14px;
-}
-
-a.phpdebugbar-maximize-btn {
- background:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201792%201792%22%20id%3D%22chevron-up%22%3E%3Cpath%20d%3D%22M1683%201331l-166%20165q-19%2019-45%2019t-45-19l-531-531-531%20531q-19%2019-45%2019t-45-19l-166-165q-19-19-19-45.5t19-45.5l742-741q19-19%2045-19t45%2019l742%20741q19%2019%2019%2045.5t-19%2045.5z%22%2F%3E%3C%2Fsvg%3E) no-repeat 6px 6px / 14px 14px;
-}
-
-a.phpdebugbar-close-btn {
- background: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201792%201792%22%20id%3D%22close%22%3E%3Cpath%20d%3D%22M1490%201322q0%2040-28%2068l-136%20136q-28%2028-68%2028t-68-28l-294-294-294%20294q-28%2028-68%2028t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28%2068-28t68%2028l294%20294%20294-294q28-28%2068-28t68%2028l136%20136q28%2028%2028%2068t-28%2068l-294%20294%20294%20294q28%2028%2028%2068z%22%2F%3E%3C%2Fsvg%3E) no-repeat 9px 6px / 14px 14px;
-}
-
-a.phpdebugbar-open-btn {
- background: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201792%201792%22%20id%3D%22folder-open%22%3E%3Cpath%20d%3D%22M1815%20952q0%2031-31%2066l-336%20396q-43%2051-120.5%2086.5t-143.5%2035.5h-1088q-34%200-60.5-13t-26.5-43q0-31%2031-66l336-396q43-51%20120.5-86.5t143.5-35.5h1088q34%200%2060.5%2013t26.5%2043zm-343-344v160h-832q-94%200-197%2047.5t-164%20119.5l-337%20396-5%206q0-4-.5-12.5t-.5-12.5v-960q0-92%2066-158t158-66h320q92%200%20158%2066t66%20158v32h544q92%200%20158%2066t66%20158z%22%2F%3E%3C%2Fsvg%3E) no-repeat 8px 6px / 14px 14px;
-}
-
-.phpdebugbar-indicator {
- position: relative;
- cursor: pointer;
-}
- .phpdebugbar-indicator span.phpdebugbar-text {
- margin-left: 5px;
- }
- .phpdebugbar-indicator span.phpdebugbar-tooltip {
- display: none;
- position: absolute;
- top: -30px;
- background: #efefef;
- opacity: .7;
- border: 1px solid #ccc;
- color: #555;
- font-size: 11px;
- padding: 2px 3px;
- z-index: 1000;
- text-align: center;
- width: 200%;
- right: 0;
- }
- .phpdebugbar-indicator:hover span.phpdebugbar-tooltip:not(.phpdebugbar-disabled) {
- display: block;
- }
-
-select.phpdebugbar-datasets-switcher {
- float: right;
- display: none;
- margin: 2px 0 0 7px;
- max-width: 200px;
- max-height: 23px;
- padding: 0;
-}
-
-/* -------------------------------------- */
-
-div.phpdebugbar-body {
- border-top: 1px solid #ccc;
- display: none;
- position: relative;
- height: 300px;
-}
-
-/* -------------------------------------- */
-
-div.phpdebugbar-panel {
- display: none;
- height: 100%;
- overflow: auto;
- width: 100%;
-}
-div.phpdebugbar-panel.phpdebugbar-active {
- display: block;
-}
-
-/* -------------------------------------- */
-
-div.phpdebugbar-mini-design a.phpdebugbar-tab {
- position: relative;
- border-right: 1px solid #ddd;
-}
- div.phpdebugbar-mini-design a.phpdebugbar-tab span.phpdebugbar-text {
- display: none;
- }
- div.phpdebugbar-mini-design a.phpdebugbar-tab:hover span.phpdebugbar-text {
- display: block;
- position: absolute;
- top: -30px;
- background: #efefef;
- opacity: .7;
- border: 1px solid #ccc;
- color: #555;
- font-size: 11px;
- padding: 2px 3px;
- z-index: 1000;
- text-align: center;
- right: 0;
- }
- div.phpdebugbar-mini-design a.phpdebugbar-tab i {
- display:inline-block;
- }
diff --git a/src/DebugBar/Resources/debugbar.js b/src/DebugBar/Resources/debugbar.js
deleted file mode 100644
index 1b95c714b..000000000
--- a/src/DebugBar/Resources/debugbar.js
+++ /dev/null
@@ -1,1166 +0,0 @@
-if (typeof(PhpDebugBar) == 'undefined') {
- // namespace
- var PhpDebugBar = {};
- PhpDebugBar.$ = jQuery;
-}
-
-(function($) {
-
- if (typeof(localStorage) == 'undefined') {
- // provide mock localStorage object for dumb browsers
- localStorage = {
- setItem: function(key, value) {},
- getItem: function(key) { return null; }
- };
- }
-
- if (typeof(PhpDebugBar.utils) == 'undefined') {
- PhpDebugBar.utils = {};
- }
-
- /**
- * Returns the value from an object property.
- * Using dots in the key, it is possible to retrieve nested property values
- *
- * @param {Object} dict
- * @param {String} key
- * @param {Object} default_value
- * @return {Object}
- */
- var getDictValue = PhpDebugBar.utils.getDictValue = function(dict, key, default_value) {
- var d = dict, parts = key.split('.');
- for (var i = 0; i < parts.length; i++) {
- if (!d[parts[i]]) {
- return default_value;
- }
- d = d[parts[i]];
- }
- return d;
- }
-
- /**
- * Counts the number of properties in an object
- *
- * @param {Object} obj
- * @return {Integer}
- */
- var getObjectSize = PhpDebugBar.utils.getObjectSize = function(obj) {
- if (Object.keys) {
- return Object.keys(obj).length;
- }
- var count = 0;
- for (var k in obj) {
- if (obj.hasOwnProperty(k)) {
- count++;
- }
- }
- return count;
- }
-
- /**
- * Returns a prefixed css class name
- *
- * @param {String} cls
- * @return {String}
- */
- PhpDebugBar.utils.csscls = function(cls, prefix) {
- if (cls.indexOf(' ') > -1) {
- var clss = cls.split(' '), out = [];
- for (var i = 0, c = clss.length; i < c; i++) {
- out.push(PhpDebugBar.utils.csscls(clss[i], prefix));
- }
- return out.join(' ');
- }
- if (cls.indexOf('.') === 0) {
- return '.' + prefix + cls.substr(1);
- }
- return prefix + cls;
- };
-
- /**
- * Creates a partial function of csscls where the second
- * argument is already defined
- *
- * @param {string} prefix
- * @return {Function}
- */
- PhpDebugBar.utils.makecsscls = function(prefix) {
- var f = function(cls) {
- return PhpDebugBar.utils.csscls(cls, prefix);
- };
- return f;
- }
-
- var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-');
-
-
- // ------------------------------------------------------------------
-
- /**
- * Base class for all elements with a visual component
- *
- * @param {Object} options
- * @constructor
- */
- var Widget = PhpDebugBar.Widget = function(options) {
- this._attributes = $.extend({}, this.defaults);
- this._boundAttributes = {};
- this.$el = $('<' + this.tagName + ' />');
- if (this.className) {
- this.$el.addClass(this.className);
- }
- this.initialize.apply(this, [options || {}]);
- this.render.apply(this);
- };
-
- $.extend(Widget.prototype, {
-
- tagName: 'div',
-
- className: null,
-
- defaults: {},
-
- /**
- * Called after the constructor
- *
- * @param {Object} options
- */
- initialize: function(options) {
- this.set(options);
- },
-
- /**
- * Called after the constructor to render the element
- */
- render: function() {},
-
- /**
- * Sets the value of an attribute
- *
- * @param {String} attr Can also be an object to set multiple attributes at once
- * @param {Object} value
- */
- set: function(attr, value) {
- if (typeof(attr) != 'string') {
- for (var k in attr) {
- this.set(k, attr[k]);
- }
- return;
- }
-
- this._attributes[attr] = value;
- if (typeof(this._boundAttributes[attr]) !== 'undefined') {
- for (var i = 0, c = this._boundAttributes[attr].length; i < c; i++) {
- this._boundAttributes[attr][i].apply(this, [value]);
- }
- }
- },
-
- /**
- * Checks if an attribute exists and is not null
- *
- * @param {String} attr
- * @return {[type]} [description]
- */
- has: function(attr) {
- return typeof(this._attributes[attr]) !== 'undefined' && this._attributes[attr] !== null;
- },
-
- /**
- * Returns the value of an attribute
- *
- * @param {String} attr
- * @return {Object}
- */
- get: function(attr) {
- return this._attributes[attr];
- },
-
- /**
- * Registers a callback function that will be called whenever the value of the attribute changes
- *
- * If cb is a jQuery element, text() will be used to fill the element
- *
- * @param {String} attr
- * @param {Function} cb
- */
- bindAttr: function(attr, cb) {
- if ($.isArray(attr)) {
- for (var i = 0, c = attr.length; i < c; i++) {
- this.bindAttr(attr[i], cb);
- }
- return;
- }
-
- if (typeof(this._boundAttributes[attr]) == 'undefined') {
- this._boundAttributes[attr] = [];
- }
- if (typeof(cb) == 'object') {
- var el = cb;
- cb = function(value) { el.text(value || ''); };
- }
- this._boundAttributes[attr].push(cb);
- if (this.has(attr)) {
- cb.apply(this, [this._attributes[attr]]);
- }
- }
-
- });
-
-
- /**
- * Creates a subclass
- *
- * Code from Backbone.js
- *
- * @param {Array} props Prototype properties
- * @return {Function}
- */
- Widget.extend = function(props) {
- var parent = this;
-
- var child = function() { return parent.apply(this, arguments); };
- $.extend(child, parent);
-
- var Surrogate = function(){ this.constructor = child; };
- Surrogate.prototype = parent.prototype;
- child.prototype = new Surrogate;
- $.extend(child.prototype, props);
-
- child.__super__ = parent.prototype;
-
- return child;
- };
-
- // ------------------------------------------------------------------
-
- /**
- * Tab
- *
- * A tab is composed of a tab label which is always visible and
- * a tab panel which is visible only when the tab is active.
- *
- * The panel must contain a widget. A widget is an object which has
- * an element property containing something appendable to a jQuery object.
- *
- * Options:
- * - title
- * - badge
- * - widget
- * - data: forward data to widget data
- */
- var Tab = Widget.extend({
-
- className: csscls('panel'),
-
- render: function() {
- this.$tab = $('').addClass(csscls('tab'));
-
- this.$icon = $('').appendTo(this.$tab);
- this.bindAttr('icon', function(icon) {
- if (icon) {
- this.$icon.attr('class', 'phpdebugbar-fa phpdebugbar-fa-' + icon);
- } else {
- this.$icon.attr('class', '');
- }
- });
-
- this.bindAttr('title', $('').addClass(csscls('text')).appendTo(this.$tab));
-
- this.$badge = $('').addClass(csscls('badge')).appendTo(this.$tab);
- this.bindAttr('badge', function(value) {
- if (value !== null) {
- this.$badge.text(value);
- this.$badge.addClass(csscls('visible'));
- } else {
- this.$badge.removeClass(csscls('visible'));
- }
- });
-
- this.bindAttr('widget', function(widget) {
- this.$el.empty().append(widget.$el);
- });
-
- this.bindAttr('data', function(data) {
- if (this.has('widget')) {
- this.get('widget').set('data', data);
- }
- })
- }
-
- });
-
- // ------------------------------------------------------------------
-
- /**
- * Indicator
- *
- * An indicator is a text and an icon to display single value information
- * right inside the always visible part of the debug bar
- *
- * Options:
- * - icon
- * - title
- * - tooltip
- * - data: alias of title
- */
- var Indicator = Widget.extend({
-
- tagName: 'span',
-
- className: csscls('indicator'),
-
- render: function() {
- this.$icon = $('').appendTo(this.$el);
- this.bindAttr('icon', function(icon) {
- if (icon) {
- this.$icon.attr('class', 'phpdebugbar-fa phpdebugbar-fa-' + icon);
- } else {
- this.$icon.attr('class', '');
- }
- });
-
- this.bindAttr(['title', 'data'], $('').addClass(csscls('text')).appendTo(this.$el));
-
- this.$tooltip = $('').addClass(csscls('tooltip disabled')).appendTo(this.$el);
- this.bindAttr('tooltip', function(tooltip) {
- if (tooltip) {
- this.$tooltip.text(tooltip).removeClass(csscls('disabled'));
- } else {
- this.$tooltip.addClass(csscls('disabled'));
- }
- });
- }
-
- });
-
- // ------------------------------------------------------------------
-
- /**
- * Dataset title formater
- *
- * Formats the title of a dataset for the select box
- */
- var DatasetTitleFormater = PhpDebugBar.DatasetTitleFormater = function(debugbar) {
- this.debugbar = debugbar;
- };
-
- $.extend(DatasetTitleFormater.prototype, {
-
- /**
- * Formats the title of a dataset
- *
- * @this {DatasetTitleFormater}
- * @param {String} id
- * @param {Object} data
- * @param {String} suffix
- * @return {String}
- */
- format: function(id, data, suffix) {
- if (suffix) {
- suffix = ' ' + suffix;
- } else {
- suffix = '';
- }
-
- var nb = getObjectSize(this.debugbar.datasets) + 1;
-
- if (typeof(data['__meta']) === 'undefined') {
- return "#" + nb + suffix;
- }
-
- var uri = data['__meta']['uri'], filename;
- if (uri.length && uri.charAt(uri.length - 1) === '/') {
- // URI ends in a trailing /: get the portion before then to avoid returning an empty string
- filename = uri.substr(0, uri.length - 1); // strip trailing '/'
- filename = filename.substr(filename.lastIndexOf('/') + 1); // get last path segment
- filename += '/'; // add the trailing '/' back
- } else {
- filename = uri.substr(uri.lastIndexOf('/') + 1);
- }
- var label = "#" + nb + " " + filename + suffix + ' (' + data['__meta']['datetime'].split(' ')[1] + ')';
- return label;
- }
-
- });
-
- // ------------------------------------------------------------------
-
-
- /**
- * DebugBar
- *
- * Creates a bar that appends itself to the body of your page
- * and sticks to the bottom.
- *
- * The bar can be customized by adding tabs and indicators.
- * A data map is used to fill those controls with data provided
- * from datasets.
- */
- var DebugBar = PhpDebugBar.DebugBar = Widget.extend({
-
- className: "phpdebugbar " + csscls('minimized'),
-
- options: {
- bodyMarginBottom: true,
- bodyMarginBottomHeight: 0
- },
-
- initialize: function() {
- this.controls = {};
- this.dataMap = {};
- this.datasets = {};
- this.firstTabName = null;
- this.activePanelName = null;
- this.datesetTitleFormater = new DatasetTitleFormater(this);
- this.options.bodyMarginBottomHeight = parseInt($('body').css('margin-bottom'));
- this.registerResizeHandler();
- },
-
- /**
- * Register resize event, for resize debugbar with reponsive css.
- *
- * @this {DebugBar}
- */
- registerResizeHandler: function() {
- if (typeof this.resize.bind == 'undefined') return;
-
- var f = this.resize.bind(this);
- this.respCSSSize = 0;
- $(window).resize(f);
- setTimeout(f, 20);
- },
-
- /**
- * Resizes the debugbar to fit the current browser window
- */
- resize: function() {
- var contentSize = this.respCSSSize;
- if (this.respCSSSize == 0) {
- this.$header.find("> div > *:visible").each(function () {
- contentSize += $(this).outerWidth();
- });
- }
-
- var currentSize = this.$header.width();
- var cssClass = "phpdebugbar-mini-design";
- var bool = this.$header.hasClass(cssClass);
-
- if (currentSize <= contentSize && !bool) {
- this.respCSSSize = contentSize;
- this.$header.addClass(cssClass);
- } else if (contentSize < currentSize && bool) {
- this.respCSSSize = 0;
- this.$header.removeClass(cssClass);
- }
-
- // Reset height to ensure bar is still visible
- this.setHeight(this.$body.height());
- },
-
- /**
- * Initialiazes the UI
- *
- * @this {DebugBar}
- */
- render: function() {
- var self = this;
- this.$el.appendTo('body');
- this.$dragCapture = $('').addClass(csscls('drag-capture')).appendTo(this.$el);
- this.$resizehdle = $('').addClass(csscls('resize-handle')).appendTo(this.$el);
- this.$header = $('').addClass(csscls('header')).appendTo(this.$el);
- this.$headerLeft = $('').addClass(csscls('header-left')).appendTo(this.$header);
- this.$headerRight = $('').addClass(csscls('header-right')).appendTo(this.$header);
- var $body = this.$body = $('').addClass(csscls('body')).appendTo(this.$el);
- this.recomputeBottomOffset();
-
- // dragging of resize handle
- var pos_y, orig_h;
- this.$resizehdle.on('mousedown', function(e) {
- orig_h = $body.height(), pos_y = e.pageY;
- $body.parents().on('mousemove', mousemove).on('mouseup', mouseup);
- self.$dragCapture.show();
- e.preventDefault();
- });
- var mousemove = function(e) {
- var h = orig_h + (pos_y - e.pageY);
- self.setHeight(h);
- };
- var mouseup = function() {
- $body.parents().off('mousemove', mousemove).off('mouseup', mouseup);
- self.$dragCapture.hide();
- };
-
- // close button
- this.$closebtn = $('').addClass(csscls('close-btn')).appendTo(this.$headerRight);
- this.$closebtn.click(function() {
- self.close();
- });
-
- // minimize button
- this.$minimizebtn = $('').addClass(csscls('minimize-btn') ).appendTo(this.$headerRight);
- this.$minimizebtn.click(function() {
- self.minimize();
- });
-
- // maximize button
- this.$maximizebtn = $('').addClass(csscls('maximize-btn') ).appendTo(this.$headerRight);
- this.$maximizebtn.click(function() {
- self.restore();
- });
-
- // restore button
- this.$restorebtn = $('').addClass(csscls('restore-btn')).hide().appendTo(this.$el);
- this.$restorebtn.click(function() {
- self.restore();
- });
-
- // open button
- this.$openbtn = $('').addClass(csscls('open-btn')).appendTo(this.$headerRight).hide();
- this.$openbtn.click(function() {
- self.openHandler.show(function(id, dataset) {
- self.addDataSet(dataset, id, "(opened)");
- self.showTab();
- });
- });
-
- // select box for data sets
- this.$datasets = $('').addClass(csscls('datasets-switcher')).appendTo(this.$headerRight);
- this.$datasets.change(function() {
- self.dataChangeHandler(self.datasets[this.value]);
- self.showTab();
- });
- },
-
- /**
- * Sets the height of the debugbar body section
- * Forces the height to lie within a reasonable range
- * Stores the height in local storage so it can be restored
- * Resets the document body bottom offset
- *
- * @this {DebugBar}
- */
- setHeight: function(height) {
- var min_h = 40;
- var max_h = $(window).innerHeight() - this.$header.height() - 10;
- height = Math.min(height, max_h);
- height = Math.max(height, min_h);
- this.$body.css('height', height);
- localStorage.setItem('phpdebugbar-height', height);
- this.recomputeBottomOffset();
- },
-
- /**
- * Restores the state of the DebugBar using localStorage
- * This is not called by default in the constructor and
- * needs to be called by subclasses in their init() method
- *
- * @this {DebugBar}
- */
- restoreState: function() {
- // bar height
- var height = localStorage.getItem('phpdebugbar-height');
- this.setHeight(height || this.$body.height());
-
- // bar visibility
- var open = localStorage.getItem('phpdebugbar-open');
- if (open && open == '0') {
- this.close();
- } else {
- var visible = localStorage.getItem('phpdebugbar-visible');
- if (visible && visible == '1') {
- var tab = localStorage.getItem('phpdebugbar-tab');
- if (this.isTab(tab)) {
- this.showTab(tab);
- }
- }
- }
- },
-
- /**
- * Creates and adds a new tab
- *
- * @this {DebugBar}
- * @param {String} name Internal name
- * @param {Object} widget A widget object with an element property
- * @param {String} title The text in the tab, if not specified, name will be used
- * @return {Tab}
- */
- createTab: function(name, widget, title) {
- var tab = new Tab({
- title: title || (name.replace(/[_\-]/g, ' ').charAt(0).toUpperCase() + name.slice(1)),
- widget: widget
- });
- return this.addTab(name, tab);
- },
-
- /**
- * Adds a new tab
- *
- * @this {DebugBar}
- * @param {String} name Internal name
- * @param {Tab} tab Tab object
- * @return {Tab}
- */
- addTab: function(name, tab) {
- if (this.isControl(name)) {
- throw new Error(name + ' already exists');
- }
-
- var self = this;
- tab.$tab.appendTo(this.$headerLeft).click(function() {
- if (!self.isMinimized() && self.activePanelName == name) {
- self.minimize();
- } else {
- self.showTab(name);
- }
- });
- tab.$el.appendTo(this.$body);
-
- this.controls[name] = tab;
- if (this.firstTabName == null) {
- this.firstTabName = name;
- }
- return tab;
- },
-
- /**
- * Creates and adds an indicator
- *
- * @this {DebugBar}
- * @param {String} name Internal name
- * @param {String} icon
- * @param {String} tooltip
- * @param {String} position "right" or "left", default is "right"
- * @return {Indicator}
- */
- createIndicator: function(name, icon, tooltip, position) {
- var indicator = new Indicator({
- icon: icon,
- tooltip: tooltip
- });
- return this.addIndicator(name, indicator, position);
- },
-
- /**
- * Adds an indicator
- *
- * @this {DebugBar}
- * @param {String} name Internal name
- * @param {Indicator} indicator Indicator object
- * @return {Indicator}
- */
- addIndicator: function(name, indicator, position) {
- if (this.isControl(name)) {
- throw new Error(name + ' already exists');
- }
-
- if (position == 'left') {
- indicator.$el.insertBefore(this.$headerLeft.children().first());
- } else {
- indicator.$el.appendTo(this.$headerRight);
- }
-
- this.controls[name] = indicator;
- return indicator;
- },
-
- /**
- * Returns a control
- *
- * @param {String} name
- * @return {Object}
- */
- getControl: function(name) {
- if (this.isControl(name)) {
- return this.controls[name];
- }
- },
-
- /**
- * Checks if there's a control under the specified name
- *
- * @this {DebugBar}
- * @param {String} name
- * @return {Boolean}
- */
- isControl: function(name) {
- return typeof(this.controls[name]) != 'undefined';
- },
-
- /**
- * Checks if a tab with the specified name exists
- *
- * @this {DebugBar}
- * @param {String} name
- * @return {Boolean}
- */
- isTab: function(name) {
- return this.isControl(name) && this.controls[name] instanceof Tab;
- },
-
- /**
- * Checks if an indicator with the specified name exists
- *
- * @this {DebugBar}
- * @param {String} name
- * @return {Boolean}
- */
- isIndicator: function(name) {
- return this.isControl(name) && this.controls[name] instanceof Indicator;
- },
-
- /**
- * Removes all tabs and indicators from the debug bar and hides it
- *
- * @this {DebugBar}
- */
- reset: function() {
- this.minimize();
- var self = this;
- $.each(this.controls, function(name, control) {
- if (self.isTab(name)) {
- control.$tab.remove();
- }
- control.$el.remove();
- });
- this.controls = {};
- },
-
- /**
- * Open the debug bar and display the specified tab
- *
- * @this {DebugBar}
- * @param {String} name If not specified, display the first tab
- */
- showTab: function(name) {
- if (!name) {
- if (this.activePanelName) {
- name = this.activePanelName;
- } else {
- name = this.firstTabName;
- }
- }
-
- if (!this.isTab(name)) {
- throw new Error("Unknown tab '" + name + "'");
- }
-
- this.$resizehdle.show();
- this.$body.show();
- this.recomputeBottomOffset();
-
- $(this.$header).find('> div > .' + csscls('active')).removeClass(csscls('active'));
- $(this.$body).find('> .' + csscls('active')).removeClass(csscls('active'));
-
- this.controls[name].$tab.addClass(csscls('active'));
- this.controls[name].$el.addClass(csscls('active'));
- this.activePanelName = name;
-
- this.$el.removeClass(csscls('minimized'));
- localStorage.setItem('phpdebugbar-visible', '1');
- localStorage.setItem('phpdebugbar-tab', name);
- this.resize();
- },
-
- /**
- * Hide panels and minimize the debug bar
- *
- * @this {DebugBar}
- */
- minimize: function() {
- this.$header.find('> div > .' + csscls('active')).removeClass(csscls('active'));
- this.$body.hide();
- this.$resizehdle.hide();
- this.recomputeBottomOffset();
- localStorage.setItem('phpdebugbar-visible', '0');
- this.$el.addClass(csscls('minimized'));
- this.resize();
- },
-
- /**
- * Checks if the panel is minimized
- *
- * @return {Boolean}
- */
- isMinimized: function() {
- return this.$el.hasClass(csscls('minimized'));
- },
-
- /**
- * Close the debug bar
- *
- * @this {DebugBar}
- */
- close: function() {
- this.$resizehdle.hide();
- this.$header.hide();
- this.$body.hide();
- this.$restorebtn.show();
- localStorage.setItem('phpdebugbar-open', '0');
- this.$el.addClass(csscls('closed'));
- this.recomputeBottomOffset();
- },
-
- /**
- * Checks if the panel is closed
- *
- * @return {Boolean}
- */
- isClosed: function() {
- return this.$el.hasClass(csscls('closed'));
- },
-
- /**
- * Restore the debug bar
- *
- * @this {DebugBar}
- */
- restore: function() {
- this.$resizehdle.show();
- this.$header.show();
- this.$restorebtn.hide();
- localStorage.setItem('phpdebugbar-open', '1');
- var tab = localStorage.getItem('phpdebugbar-tab');
- if (this.isTab(tab)) {
- this.showTab(tab);
- } else {
- this.showTab();
- }
- this.$el.removeClass(csscls('closed'));
- this.resize();
- },
-
- /**
- * Recomputes the margin-bottom css property of the body so
- * that the debug bar never hides any content
- */
- recomputeBottomOffset: function() {
- if (this.options.bodyMarginBottom) {
- if (this.isClosed()) {
- return $('body').css('margin-bottom', this.options.bodyMarginBottomHeight || '');
- }
-
- var offset = parseInt(this.$el.height()) + (this.options.bodyMarginBottomHeight || 0);
- $('body').css('margin-bottom', offset);
- }
- },
-
- /**
- * Sets the data map used by dataChangeHandler to populate
- * indicators and widgets
- *
- * A data map is an object where properties are control names.
- * The value of each property should be an array where the first
- * item is the name of a property from the data object (nested properties
- * can be specified) and the second item the default value.
- *
- * Example:
- * {"memory": ["memory.peak_usage_str", "0B"]}
- *
- * @this {DebugBar}
- * @param {Object} map
- */
- setDataMap: function(map) {
- this.dataMap = map;
- },
-
- /**
- * Same as setDataMap() but appends to the existing map
- * rather than replacing it
- *
- * @this {DebugBar}
- * @param {Object} map
- */
- addDataMap: function(map) {
- $.extend(this.dataMap, map);
- },
-
- /**
- * Resets datasets and add one set of data
- *
- * For this method to be usefull, you need to specify
- * a dataMap using setDataMap()
- *
- * @this {DebugBar}
- * @param {Object} data
- * @return {String} Dataset's id
- */
- setData: function(data) {
- this.datasets = {};
- return this.addDataSet(data);
- },
-
- /**
- * Adds a dataset
- *
- * If more than one dataset are added, the dataset selector
- * will be displayed.
- *
- * For this method to be usefull, you need to specify
- * a dataMap using setDataMap()
- *
- * @this {DebugBar}
- * @param {Object} data
- * @param {String} id The name of this set, optional
- * @param {String} suffix
- * @param {Bool} show Whether to show the new dataset, optional (default: true)
- * @return {String} Dataset's id
- */
- addDataSet: function(data, id, suffix, show) {
- var label = this.datesetTitleFormater.format(id, data, suffix);
- id = id || (getObjectSize(this.datasets) + 1);
- this.datasets[id] = data;
-
- this.$datasets.append($(''));
- if (this.$datasets.children().length > 1) {
- this.$datasets.show();
- }
-
- if (typeof(show) == 'undefined' || show) {
- this.showDataSet(id);
- }
- return id;
- },
-
- /**
- * Loads a dataset using the open handler
- *
- * @param {String} id
- * @param {Bool} show Whether to show the new dataset, optional (default: true)
- */
- loadDataSet: function(id, suffix, callback, show) {
- if (!this.openHandler) {
- throw new Error('loadDataSet() needs an open handler');
- }
- var self = this;
- this.openHandler.load(id, function(data) {
- self.addDataSet(data, id, suffix, show);
- callback && callback(data);
- });
- },
-
- /**
- * Returns the data from a dataset
- *
- * @this {DebugBar}
- * @param {String} id
- * @return {Object}
- */
- getDataSet: function(id) {
- return this.datasets[id];
- },
-
- /**
- * Switch the currently displayed dataset
- *
- * @this {DebugBar}
- * @param {String} id
- */
- showDataSet: function(id) {
- this.dataChangeHandler(this.datasets[id]);
- this.$datasets.val(id);
- },
-
- /**
- * Called when the current dataset is modified.
- *
- * @this {DebugBar}
- * @param {Object} data
- */
- dataChangeHandler: function(data) {
- var self = this;
- $.each(this.dataMap, function(key, def) {
- var d = getDictValue(data, def[0], def[1]);
- if (key.indexOf(':') != -1) {
- key = key.split(':');
- self.getControl(key[0]).set(key[1], d);
- } else {
- self.getControl(key).set('data', d);
- }
- });
- },
-
- /**
- * Sets the handler to open past dataset
- *
- * @this {DebugBar}
- * @param {object} handler
- */
- setOpenHandler: function(handler) {
- this.openHandler = handler;
- if (handler !== null) {
- this.$openbtn.show();
- } else {
- this.$openbtn.hide();
- }
- },
-
- /**
- * Returns the handler to open past dataset
- *
- * @this {DebugBar}
- * @return {object}
- */
- getOpenHandler: function() {
- return this.openHandler;
- }
-
- });
-
- DebugBar.Tab = Tab;
- DebugBar.Indicator = Indicator;
-
- // ------------------------------------------------------------------
-
- /**
- * AjaxHandler
- *
- * Extract data from headers of an XMLHttpRequest and adds a new dataset
- *
- * @param {Bool} autoShow Whether to immediately show new datasets, optional (default: true)
- */
- var AjaxHandler = PhpDebugBar.AjaxHandler = function(debugbar, headerName, autoShow) {
- this.debugbar = debugbar;
- this.headerName = headerName || 'phpdebugbar';
- this.autoShow = typeof(autoShow) == 'undefined' ? true : autoShow;
- };
-
- $.extend(AjaxHandler.prototype, {
-
- /**
- * Handles an XMLHttpRequest
- *
- * @this {AjaxHandler}
- * @param {XMLHttpRequest} xhr
- * @return {Bool}
- */
- handle: function(xhr) {
- // Check if the debugbar header is available
- if (xhr.getAllResponseHeaders().indexOf(this.headerName) === -1){
- return true;
- }
- if (!this.loadFromId(xhr)) {
- return this.loadFromData(xhr);
- }
- return true;
- },
-
- /**
- * Checks if the HEADER-id exists and loads the dataset using the open handler
- *
- * @param {XMLHttpRequest} xhr
- * @return {Bool}
- */
- loadFromId: function(xhr) {
- var id = this.extractIdFromHeaders(xhr);
- if (id && this.debugbar.openHandler) {
- this.debugbar.loadDataSet(id, "(ajax)", undefined, this.autoShow);
- return true;
- }
- return false;
- },
-
- /**
- * Extracts the id from the HEADER-id
- *
- * @param {XMLHttpRequest} xhr
- * @return {String}
- */
- extractIdFromHeaders: function(xhr) {
- return xhr.getResponseHeader(this.headerName + '-id');
- },
-
- /**
- * Checks if the HEADER exists and loads the dataset
- *
- * @param {XMLHttpRequest} xhr
- * @return {Bool}
- */
- loadFromData: function(xhr) {
- var raw = this.extractDataFromHeaders(xhr);
- if (!raw) {
- return false;
- }
-
- var data = this.parseHeaders(raw);
- if (data.error) {
- throw new Error('Error loading debugbar data: ' + data.error);
- } else if(data.data) {
- this.debugbar.addDataSet(data.data, data.id, "(ajax)", this.autoShow);
- }
- return true;
- },
-
- /**
- * Extract the data as a string from headers of an XMLHttpRequest
- *
- * @this {AjaxHandler}
- * @param {XMLHttpRequest} xhr
- * @return {string}
- */
- extractDataFromHeaders: function(xhr) {
- var data = xhr.getResponseHeader(this.headerName);
- if (!data) {
- return;
- }
- for (var i = 1;; i++) {
- var header = xhr.getResponseHeader(this.headerName + '-' + i);
- if (!header) {
- break;
- }
- data += header;
- }
- return decodeURIComponent(data);
- },
-
- /**
- * Parses the string data into an object
- *
- * @this {AjaxHandler}
- * @param {string} data
- * @return {string}
- */
- parseHeaders: function(data) {
- return JSON.parse(data);
- },
-
- /**
- * Attaches an event listener to jQuery.ajaxComplete()
- *
- * @this {AjaxHandler}
- * @param {jQuery} jq Optional
- */
- bindToJquery: function(jq) {
- var self = this;
- jq(document).ajaxComplete(function(e, xhr, settings) {
- if (!settings.ignoreDebugBarAjaxHandler) {
- self.handle(xhr);
- }
- });
- },
-
- /**
- * Attaches an event listener to XMLHttpRequest
- *
- * @this {AjaxHandler}
- */
- bindToXHR: function() {
- var self = this;
- var proxied = XMLHttpRequest.prototype.open;
- XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
- var xhr = this;
- this.addEventListener("readystatechange", function() {
- var skipUrl = self.debugbar.openHandler ? self.debugbar.openHandler.get('url') : null;
- if (xhr.readyState == 4 && url.indexOf(skipUrl) !== 0) {
- self.handle(xhr);
- }
- }, false);
- proxied.apply(this, Array.prototype.slice.call(arguments));
- };
- }
-
- });
-
-})(PhpDebugBar.$);
diff --git a/src/DebugBar/Resources/openhandler.css b/src/DebugBar/Resources/openhandler.css
deleted file mode 100644
index 503dddf6f..000000000
--- a/src/DebugBar/Resources/openhandler.css
+++ /dev/null
@@ -1,69 +0,0 @@
-div.phpdebugbar-openhandler-overlay {
- position: fixed;
- left: 0;
- top: 0;
- width: 100%;
- height: 100%;
- background: #000;
- opacity: .3;
- z-index: 20000;
-}
-
-div.phpdebugbar-openhandler {
- position: fixed;
- margin: auto;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- width: 70%;
- height: 70%;
- background: #fff;
- border: 2px solid #888;
- overflow: auto;
- z-index: 20001;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
- padding-bottom: 10px;
-}
- div.phpdebugbar-openhandler a {
- color: #555;
- }
- div.phpdebugbar-openhandler .phpdebugbar-openhandler-header {
- background: #efefef url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAUCAYAAABvVQZ0AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfdBgcKHQH1H7EUAAADV0lEQVQ4y7WUy28bVRSHvzvjJPbYY48dj80rTe28gCbCivPsAhBthJCoBIEQQGr/BMRjh1gA20plEYSQumFFQbBBEWVV0bLoQ1BC1YfcBDt1UicFZZzYje06M57LokVNaZJ2w7e7597zOzpX53fgfhSgzYzGDmk+7YQe0DMD/UNSD+gZzaedMKOxQ0DbnXf3IP5z1hLtyc8k8q1IuFX/N+i6LopyN7dYtNYR4ti1fO5doLqVmD+oBy90JLs6pJQ8CCEE2dxctnyz/AxQ2SwWjYRbzycTHbscx+Fh8Xg85OazC8VVKw2sqIDS3dlzJBo1X3Bdd8skKSVCiPvirusSChmhoB40rKJ1XFFVT/uGvXFwu+pBQ6erp5OdWq9v1A8KIdo9Ab9/MhJu9TUaDdbWVlEUFYlEureTP/n0IwpLNzh75gwetRlN06jdqoF7+5Mcx8br9fk0nzaJ1+s7nU4NysTupLRtW5ZKJVmpVOWpkz/LjkRCFgoFaduOrFarcnb2quzb0ytnZmZktVaT5fJNWSqV5P59+2RTU9Npxa/5e10p0XU/lmUxOryX7q5OIpEw4xPjxOMxnn/uWdqeaCNmxhgeHSSVSvHi2BidyS6OHv2S9z94D1e6exQzauqObZMeSGOtWNiOQ9iI4iIZGhplfb1CNpulNWyiqAr2xi0A5nN5QiEDze+n0QAkmic7/+diZ6K7bXLyTTxNKr19T/Hq+Css5Be4vpinWCwS8BsEQi3UajVMM45t24zsHaKv72leG59gcuINFKEsC6/X+13cfOT1S1cu8u03x8jl8ti2zfT0NCMjo9RqFS5fyhAMBejp6WZsbD9mLM6pk7+gqio/Hf+Ret1hLpv5Xhgh4+WwEZmey84ykO5HuuqWMwXgOA6ffzHF1NQR5jJ5FPWuxZaWCwcEEHzs0cfPeVtangwGjQdOfbVSpcXrRd0ktFZazVzLzw8rQHlpuXA4FAo/lIU0v3aPkBCCxesLh4Gyeic2c+Ov5d0xM57arsWtcF2XCxdnvpJSfgygbrr7wbJWioYRfqm5uXlH+6iqSr1eJ3P1yjuudD/cbp8BJIUQX/enBoYbjcaWQr//8ds5KeXbQG6n5biZXcABIDaYHkn+ev5sDvgbmAYW+L/5B5NrVZNHcIujAAAAAElFTkSuQmCC) no-repeat 5px 4px;
- padding-left: 29px;
- min-height: 26px;
- line-height: 25px;
- color: #555;
- margin-bottom: 10px;
- }
- div.phpdebugbar-openhandler .phpdebugbar-openhandler-header a {
- font-size: 14px;
- color: #555;
- text-decoration: none;
- float: right;
- padding: 5px 8px;
- }
- div.phpdebugbar-openhandler table {
- width: 100%;
- table-layout: fixed;
- font-size: 14px;
- }
- div.phpdebugbar-openhandler table td {
- padding: 6px 3px;
- border-bottom: 1px solid #ddd;
- }
- div.phpdebugbar-openhandler table td a{
- display: block;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions {
- text-align: center;
- padding: 7px 0;
- }
- div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions a {
- margin: 0 10px;
- color: #555;
- }
diff --git a/src/DebugBar/Resources/openhandler.js b/src/DebugBar/Resources/openhandler.js
deleted file mode 100644
index 5633043ff..000000000
--- a/src/DebugBar/Resources/openhandler.js
+++ /dev/null
@@ -1,202 +0,0 @@
-if (typeof(PhpDebugBar) == 'undefined') {
- // namespace
- var PhpDebugBar = {};
- PhpDebugBar.$ = jQuery;
-}
-
-(function($) {
-
- var csscls = function(cls) {
- return PhpDebugBar.utils.csscls(cls, 'phpdebugbar-openhandler-');
- };
-
- PhpDebugBar.OpenHandler = PhpDebugBar.Widget.extend({
-
- className: 'phpdebugbar-openhandler',
-
- defaults: {
- items_per_page: 20
- },
-
- render: function() {
- var self = this;
-
- this.$el.appendTo('body').hide();
- this.$closebtn = $('');
- this.$table = $('');
- $('PHP DebugBar | Open
').addClass(csscls('header')).append(this.$closebtn).appendTo(this.$el);
- $('| Date | Method | URL | IP | Filter data |
|---|
').append(this.$table).appendTo(this.$el);
- this.$actions = $('').addClass(csscls('actions')).appendTo(this.$el);
-
- this.$closebtn.on('click', function() {
- self.hide();
- });
-
- this.$loadmorebtn = $('Load more')
- .appendTo(this.$actions)
- .on('click', function() {
- self.find(self.last_find_request, self.last_find_request.offset + self.get('items_per_page'), self.handleFind.bind(self));
- });
-
- this.$showonlycurrentbtn = $('Show only current URL')
- .appendTo(this.$actions)
- .on('click', function() {
- self.$table.empty();
- self.find({uri: window.location.pathname}, 0, self.handleFind.bind(self));
- });
-
- this.$showallbtn = $('Show all')
- .appendTo(this.$actions)
- .on('click', function() {
- self.refresh();
- });
-
- this.$clearbtn = $('Delete all')
- .appendTo(this.$actions)
- .on('click', function() {
- self.clear(function() {
- self.hide();
- });
- });
-
- this.addSearch();
-
- this.$overlay = $('').addClass(csscls('overlay')).hide().appendTo('body');
- this.$overlay.on('click', function() {
- self.hide();
- });
- },
-
- refresh: function() {
- this.$table.empty();
- this.$loadmorebtn.show();
- this.find({}, 0, this.handleFind.bind(this));
- },
-
- addSearch: function(){
- var self = this;
- var searchBtn = $('')
- .text('Search')
- .attr('type', 'submit')
- .on('click', function(e) {
- self.$table.empty();
- var search = {};
- var a = $(this).parent().serializeArray();
- $.each(a, function() {
- if(this.value){
- search[this.name] = this.value;
- }
- });
-
- self.find(search, 0, self.handleFind.bind(self));
- e.preventDefault();
- });
-
- $('')
- .append('
Filter results
')
- .append('Method:
')
- .append('Uri:
')
- .append('IP:
')
- .append(searchBtn)
- .appendTo(this.$actions);
- },
-
- handleFind: function(data) {
- var self = this;
- $.each(data, function(i, meta) {
- var a = $('')
- .text('Load dataset')
- .on('click', function(e) {
- self.hide();
- self.load(meta['id'], function(data) {
- self.callback(meta['id'], data);
- });
- e.preventDefault();
- });
-
- var method = $('')
- .text(meta['method'])
- .on('click', function(e) {
- self.$table.empty();
- self.find({method: meta['method']}, 0, self.handleFind.bind(self));
- e.preventDefault();
- });
-
- var uri = $('')
- .text(meta['uri'])
- .on('click', function(e) {
- self.hide();
- self.load(meta['id'], function(data) {
- self.callback(meta['id'], data);
- });
- e.preventDefault();
- });
-
- var ip = $('')
- .text(meta['ip'])
- .on('click', function(e) {
- self.$table.empty();
- self.find({ip: meta['ip']}, 0, self.handleFind.bind(self));
- e.preventDefault();
- });
-
- var search = $('')
- .text('Show URL')
- .on('click', function(e) {
- self.$table.empty();
- self.find({uri: meta['uri']}, 0, self.handleFind.bind(self));
- e.preventDefault();
- });
-
- $('
')
- .append('' + meta['datetime'] + ' | ')
- .append('' + meta['method'] + ' | ')
- .append($(' | ').append(uri))
- .append($(' | ').append(ip))
- .append($(' | ').append(search))
- .appendTo(self.$table);
- });
- if (data.length < this.get('items_per_page')) {
- this.$loadmorebtn.hide();
- }
- },
-
- show: function(callback) {
- this.callback = callback;
- this.$el.show();
- this.$overlay.show();
- this.refresh();
- },
-
- hide: function() {
- this.$el.hide();
- this.$overlay.hide();
- },
-
- find: function(filters, offset, callback) {
- var data = $.extend({}, filters, {max: this.get('items_per_page'), offset: offset || 0});
- this.last_find_request = data;
- this.ajax(data, callback);
- },
-
- load: function(id, callback) {
- this.ajax({op: "get", id: id}, callback);
- },
-
- clear: function(callback) {
- this.ajax({op: "clear"}, callback);
- },
-
- ajax: function(data, callback) {
- $.ajax({
- dataType: 'json',
- url: this.get('url'),
- data: data,
- success: callback,
- ignoreDebugBarAjaxHandler: true
- });
- }
-
- });
-
-})(PhpDebugBar.$);
diff --git a/src/DebugBar/Resources/vendor/font-awesome/css/font-awesome.min.css b/src/DebugBar/Resources/vendor/font-awesome/css/font-awesome.min.css
deleted file mode 100644
index 3559d52d8..000000000
--- a/src/DebugBar/Resources/vendor/font-awesome/css/font-awesome.min.css
+++ /dev/null
@@ -1,4 +0,0 @@
-/*!
- * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */@font-face{font-family:'PhpDebugbarFontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.phpdebugbar-fa{display:inline-block;font:normal normal normal 14px/1 PhpDebugbarFontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.phpdebugbar-fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.phpdebugbar-fa-2x{font-size:2em}.phpdebugbar-fa-3x{font-size:3em}.phpdebugbar-fa-4x{font-size:4em}.phpdebugbar-fa-5x{font-size:5em}.phpdebugbar-fa-fw{width:1.28571429em;text-align:center}.phpdebugbar-fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.phpdebugbar-fa-ul>li{position:relative}.phpdebugbar-fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.phpdebugbar-fa-li.phpdebugbar-fa-lg{left:-1.85714286em}.phpdebugbar-fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.phpdebugbar-fa-pull-left{float:left}.phpdebugbar-fa-pull-right{float:right}.phpdebugbar-fa.phpdebugbar-fa-pull-left{margin-right:.3em}.phpdebugbar-fa.phpdebugbar-fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.phpdebugbar-fa.pull-left{margin-right:.3em}.phpdebugbar-fa.pull-right{margin-left:.3em}.phpdebugbar-fa-spin{-webkit-animation:phpdebugbar-fa-spin 2s infinite linear;animation:phpdebugbar-fa-spin 2s infinite linear}.phpdebugbar-fa-pulse{-webkit-animation:phpdebugbar-fa-spin 1s infinite steps(8);animation:phpdebugbar-fa-spin 1s infinite steps(8)}@-webkit-keyframes phpdebugbar-fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes phpdebugbar-fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.phpdebugbar-fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.phpdebugbar-fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.phpdebugbar-fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.phpdebugbar-fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.phpdebugbar-fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .phpdebugbar-fa-rotate-90,:root .phpdebugbar-fa-rotate-180,:root .phpdebugbar-fa-rotate-270,:root .phpdebugbar-fa-flip-horizontal,:root .phpdebugbar-fa-flip-vertical{filter:none}.phpdebugbar-fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.phpdebugbar-fa-stack-1x,.phpdebugbar-fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.phpdebugbar-fa-stack-1x{line-height:inherit}.phpdebugbar-fa-stack-2x{font-size:2em}.phpdebugbar-fa-inverse{color:#fff}.phpdebugbar-fa-glass:before{content:"\f000"}.phpdebugbar-fa-music:before{content:"\f001"}.phpdebugbar-fa-search:before{content:"\f002"}.phpdebugbar-fa-envelope-o:before{content:"\f003"}.phpdebugbar-fa-heart:before{content:"\f004"}.phpdebugbar-fa-star:before{content:"\f005"}.phpdebugbar-fa-star-o:before{content:"\f006"}.phpdebugbar-fa-user:before{content:"\f007"}.phpdebugbar-fa-film:before{content:"\f008"}.phpdebugbar-fa-th-large:before{content:"\f009"}.phpdebugbar-fa-th:before{content:"\f00a"}.phpdebugbar-fa-th-list:before{content:"\f00b"}.phpdebugbar-fa-check:before{content:"\f00c"}.phpdebugbar-fa-remove:before,.phpdebugbar-fa-close:before,.phpdebugbar-fa-times:before{content:"\f00d"}.phpdebugbar-fa-search-plus:before{content:"\f00e"}.phpdebugbar-fa-search-minus:before{content:"\f010"}.phpdebugbar-fa-power-off:before{content:"\f011"}.phpdebugbar-fa-signal:before{content:"\f012"}.phpdebugbar-fa-gear:before,.phpdebugbar-fa-cog:before{content:"\f013"}.phpdebugbar-fa-trash-o:before{content:"\f014"}.phpdebugbar-fa-home:before{content:"\f015"}.phpdebugbar-fa-file-o:before{content:"\f016"}.phpdebugbar-fa-clock-o:before{content:"\f017"}.phpdebugbar-fa-road:before{content:"\f018"}.phpdebugbar-fa-download:before{content:"\f019"}.phpdebugbar-fa-arrow-circle-o-down:before{content:"\f01a"}.phpdebugbar-fa-arrow-circle-o-up:before{content:"\f01b"}.phpdebugbar-fa-inbox:before{content:"\f01c"}.phpdebugbar-fa-play-circle-o:before{content:"\f01d"}.phpdebugbar-fa-rotate-right:before,.phpdebugbar-fa-repeat:before{content:"\f01e"}.phpdebugbar-fa-refresh:before{content:"\f021"}.phpdebugbar-fa-list-alt:before{content:"\f022"}.phpdebugbar-fa-lock:before{content:"\f023"}.phpdebugbar-fa-flag:before{content:"\f024"}.phpdebugbar-fa-headphones:before{content:"\f025"}.phpdebugbar-fa-volume-off:before{content:"\f026"}.phpdebugbar-fa-volume-down:before{content:"\f027"}.phpdebugbar-fa-volume-up:before{content:"\f028"}.phpdebugbar-fa-qrcode:before{content:"\f029"}.phpdebugbar-fa-barcode:before{content:"\f02a"}.phpdebugbar-fa-tag:before{content:"\f02b"}.phpdebugbar-fa-tags:before{content:"\f02c"}.phpdebugbar-fa-book:before{content:"\f02d"}.phpdebugbar-fa-bookmark:before{content:"\f02e"}.phpdebugbar-fa-print:before{content:"\f02f"}.phpdebugbar-fa-camera:before{content:"\f030"}.phpdebugbar-fa-font:before{content:"\f031"}.phpdebugbar-fa-bold:before{content:"\f032"}.phpdebugbar-fa-italic:before{content:"\f033"}.phpdebugbar-fa-text-height:before{content:"\f034"}.phpdebugbar-fa-text-width:before{content:"\f035"}.phpdebugbar-fa-align-left:before{content:"\f036"}.phpdebugbar-fa-align-center:before{content:"\f037"}.phpdebugbar-fa-align-right:before{content:"\f038"}.phpdebugbar-fa-align-justify:before{content:"\f039"}.phpdebugbar-fa-list:before{content:"\f03a"}.phpdebugbar-fa-dedent:before,.phpdebugbar-fa-outdent:before{content:"\f03b"}.phpdebugbar-fa-indent:before{content:"\f03c"}.phpdebugbar-fa-video-camera:before{content:"\f03d"}.phpdebugbar-fa-photo:before,.phpdebugbar-fa-image:before,.phpdebugbar-fa-picture-o:before{content:"\f03e"}.phpdebugbar-fa-pencil:before{content:"\f040"}.phpdebugbar-fa-map-marker:before{content:"\f041"}.phpdebugbar-fa-adjust:before{content:"\f042"}.phpdebugbar-fa-tint:before{content:"\f043"}.phpdebugbar-fa-edit:before,.phpdebugbar-fa-pencil-square-o:before{content:"\f044"}.phpdebugbar-fa-share-square-o:before{content:"\f045"}.phpdebugbar-fa-check-square-o:before{content:"\f046"}.phpdebugbar-fa-arrows:before{content:"\f047"}.phpdebugbar-fa-step-backward:before{content:"\f048"}.phpdebugbar-fa-fast-backward:before{content:"\f049"}.phpdebugbar-fa-backward:before{content:"\f04a"}.phpdebugbar-fa-play:before{content:"\f04b"}.phpdebugbar-fa-pause:before{content:"\f04c"}.phpdebugbar-fa-stop:before{content:"\f04d"}.phpdebugbar-fa-forward:before{content:"\f04e"}.phpdebugbar-fa-fast-forward:before{content:"\f050"}.phpdebugbar-fa-step-forward:before{content:"\f051"}.phpdebugbar-fa-eject:before{content:"\f052"}.phpdebugbar-fa-chevron-left:before{content:"\f053"}.phpdebugbar-fa-chevron-right:before{content:"\f054"}.phpdebugbar-fa-plus-circle:before{content:"\f055"}.phpdebugbar-fa-minus-circle:before{content:"\f056"}.phpdebugbar-fa-times-circle:before{content:"\f057"}.phpdebugbar-fa-check-circle:before{content:"\f058"}.phpdebugbar-fa-question-circle:before{content:"\f059"}.phpdebugbar-fa-info-circle:before{content:"\f05a"}.phpdebugbar-fa-crosshairs:before{content:"\f05b"}.phpdebugbar-fa-times-circle-o:before{content:"\f05c"}.phpdebugbar-fa-check-circle-o:before{content:"\f05d"}.phpdebugbar-fa-ban:before{content:"\f05e"}.phpdebugbar-fa-arrow-left:before{content:"\f060"}.phpdebugbar-fa-arrow-right:before{content:"\f061"}.phpdebugbar-fa-arrow-up:before{content:"\f062"}.phpdebugbar-fa-arrow-down:before{content:"\f063"}.phpdebugbar-fa-mail-forward:before,.phpdebugbar-fa-share:before{content:"\f064"}.phpdebugbar-fa-expand:before{content:"\f065"}.phpdebugbar-fa-compress:before{content:"\f066"}.phpdebugbar-fa-plus:before{content:"\f067"}.phpdebugbar-fa-minus:before{content:"\f068"}.phpdebugbar-fa-asterisk:before{content:"\f069"}.phpdebugbar-fa-exclamation-circle:before{content:"\f06a"}.phpdebugbar-fa-gift:before{content:"\f06b"}.phpdebugbar-fa-leaf:before{content:"\f06c"}.phpdebugbar-fa-fire:before{content:"\f06d"}.phpdebugbar-fa-eye:before{content:"\f06e"}.phpdebugbar-fa-eye-slash:before{content:"\f070"}.phpdebugbar-fa-warning:before,.phpdebugbar-fa-exclamation-triangle:before{content:"\f071"}.phpdebugbar-fa-plane:before{content:"\f072"}.phpdebugbar-fa-calendar:before{content:"\f073"}.phpdebugbar-fa-random:before{content:"\f074"}.phpdebugbar-fa-comment:before{content:"\f075"}.phpdebugbar-fa-magnet:before{content:"\f076"}.phpdebugbar-fa-chevron-up:before{content:"\f077"}.phpdebugbar-fa-chevron-down:before{content:"\f078"}.phpdebugbar-fa-retweet:before{content:"\f079"}.phpdebugbar-fa-shopping-cart:before{content:"\f07a"}.phpdebugbar-fa-folder:before{content:"\f07b"}.phpdebugbar-fa-folder-open:before{content:"\f07c"}.phpdebugbar-fa-arrows-v:before{content:"\f07d"}.phpdebugbar-fa-arrows-h:before{content:"\f07e"}.phpdebugbar-fa-bar-chart-o:before,.phpdebugbar-fa-bar-chart:before{content:"\f080"}.phpdebugbar-fa-twitter-square:before{content:"\f081"}.phpdebugbar-fa-facebook-square:before{content:"\f082"}.phpdebugbar-fa-camera-retro:before{content:"\f083"}.phpdebugbar-fa-key:before{content:"\f084"}.phpdebugbar-fa-gears:before,.phpdebugbar-fa-cogs:before{content:"\f085"}.phpdebugbar-fa-comments:before{content:"\f086"}.phpdebugbar-fa-thumbs-o-up:before{content:"\f087"}.phpdebugbar-fa-thumbs-o-down:before{content:"\f088"}.phpdebugbar-fa-star-half:before{content:"\f089"}.phpdebugbar-fa-heart-o:before{content:"\f08a"}.phpdebugbar-fa-sign-out:before{content:"\f08b"}.phpdebugbar-fa-linkedin-square:before{content:"\f08c"}.phpdebugbar-fa-thumb-tack:before{content:"\f08d"}.phpdebugbar-fa-external-link:before{content:"\f08e"}.phpdebugbar-fa-sign-in:before{content:"\f090"}.phpdebugbar-fa-trophy:before{content:"\f091"}.phpdebugbar-fa-github-square:before{content:"\f092"}.phpdebugbar-fa-upload:before{content:"\f093"}.phpdebugbar-fa-lemon-o:before{content:"\f094"}.phpdebugbar-fa-phone:before{content:"\f095"}.phpdebugbar-fa-square-o:before{content:"\f096"}.phpdebugbar-fa-bookmark-o:before{content:"\f097"}.phpdebugbar-fa-phone-square:before{content:"\f098"}.phpdebugbar-fa-twitter:before{content:"\f099"}.phpdebugbar-fa-facebook-f:before,.phpdebugbar-fa-facebook:before{content:"\f09a"}.phpdebugbar-fa-github:before{content:"\f09b"}.phpdebugbar-fa-unlock:before{content:"\f09c"}.phpdebugbar-fa-credit-card:before{content:"\f09d"}.phpdebugbar-fa-feed:before,.phpdebugbar-fa-rss:before{content:"\f09e"}.phpdebugbar-fa-hdd-o:before{content:"\f0a0"}.phpdebugbar-fa-bullhorn:before{content:"\f0a1"}.phpdebugbar-fa-bell:before{content:"\f0f3"}.phpdebugbar-fa-certificate:before{content:"\f0a3"}.phpdebugbar-fa-hand-o-right:before{content:"\f0a4"}.phpdebugbar-fa-hand-o-left:before{content:"\f0a5"}.phpdebugbar-fa-hand-o-up:before{content:"\f0a6"}.phpdebugbar-fa-hand-o-down:before{content:"\f0a7"}.phpdebugbar-fa-arrow-circle-left:before{content:"\f0a8"}.phpdebugbar-fa-arrow-circle-right:before{content:"\f0a9"}.phpdebugbar-fa-arrow-circle-up:before{content:"\f0aa"}.phpdebugbar-fa-arrow-circle-down:before{content:"\f0ab"}.phpdebugbar-fa-globe:before{content:"\f0ac"}.phpdebugbar-fa-wrench:before{content:"\f0ad"}.phpdebugbar-fa-tasks:before{content:"\f0ae"}.phpdebugbar-fa-filter:before{content:"\f0b0"}.phpdebugbar-fa-briefcase:before{content:"\f0b1"}.phpdebugbar-fa-arrows-alt:before{content:"\f0b2"}.phpdebugbar-fa-group:before,.phpdebugbar-fa-users:before{content:"\f0c0"}.phpdebugbar-fa-chain:before,.phpdebugbar-fa-link:before{content:"\f0c1"}.phpdebugbar-fa-cloud:before{content:"\f0c2"}.phpdebugbar-fa-flask:before{content:"\f0c3"}.phpdebugbar-fa-cut:before,.phpdebugbar-fa-scissors:before{content:"\f0c4"}.phpdebugbar-fa-copy:before,.phpdebugbar-fa-files-o:before{content:"\f0c5"}.phpdebugbar-fa-paperclip:before{content:"\f0c6"}.phpdebugbar-fa-save:before,.phpdebugbar-fa-floppy-o:before{content:"\f0c7"}.phpdebugbar-fa-square:before{content:"\f0c8"}.phpdebugbar-fa-navicon:before,.phpdebugbar-fa-reorder:before,.phpdebugbar-fa-bars:before{content:"\f0c9"}.phpdebugbar-fa-list-ul:before{content:"\f0ca"}.phpdebugbar-fa-list-ol:before{content:"\f0cb"}.phpdebugbar-fa-strikethrough:before{content:"\f0cc"}.phpdebugbar-fa-underline:before{content:"\f0cd"}.phpdebugbar-fa-table:before{content:"\f0ce"}.phpdebugbar-fa-magic:before{content:"\f0d0"}.phpdebugbar-fa-truck:before{content:"\f0d1"}.phpdebugbar-fa-pinterest:before{content:"\f0d2"}.phpdebugbar-fa-pinterest-square:before{content:"\f0d3"}.phpdebugbar-fa-google-plus-square:before{content:"\f0d4"}.phpdebugbar-fa-google-plus:before{content:"\f0d5"}.phpdebugbar-fa-money:before{content:"\f0d6"}.phpdebugbar-fa-caret-down:before{content:"\f0d7"}.phpdebugbar-fa-caret-up:before{content:"\f0d8"}.phpdebugbar-fa-caret-left:before{content:"\f0d9"}.phpdebugbar-fa-caret-right:before{content:"\f0da"}.phpdebugbar-fa-columns:before{content:"\f0db"}.phpdebugbar-fa-unsorted:before,.phpdebugbar-fa-sort:before{content:"\f0dc"}.phpdebugbar-fa-sort-down:before,.phpdebugbar-fa-sort-desc:before{content:"\f0dd"}.phpdebugbar-fa-sort-up:before,.phpdebugbar-fa-sort-asc:before{content:"\f0de"}.phpdebugbar-fa-envelope:before{content:"\f0e0"}.phpdebugbar-fa-linkedin:before{content:"\f0e1"}.phpdebugbar-fa-rotate-left:before,.phpdebugbar-fa-undo:before{content:"\f0e2"}.phpdebugbar-fa-legal:before,.phpdebugbar-fa-gavel:before{content:"\f0e3"}.phpdebugbar-fa-dashboard:before,.phpdebugbar-fa-tachometer:before{content:"\f0e4"}.phpdebugbar-fa-comment-o:before{content:"\f0e5"}.phpdebugbar-fa-comments-o:before{content:"\f0e6"}.phpdebugbar-fa-flash:before,.phpdebugbar-fa-bolt:before{content:"\f0e7"}.phpdebugbar-fa-sitemap:before{content:"\f0e8"}.phpdebugbar-fa-umbrella:before{content:"\f0e9"}.phpdebugbar-fa-paste:before,.phpdebugbar-fa-clipboard:before{content:"\f0ea"}.phpdebugbar-fa-lightbulb-o:before{content:"\f0eb"}.phpdebugbar-fa-exchange:before{content:"\f0ec"}.phpdebugbar-fa-cloud-download:before{content:"\f0ed"}.phpdebugbar-fa-cloud-upload:before{content:"\f0ee"}.phpdebugbar-fa-user-md:before{content:"\f0f0"}.phpdebugbar-fa-stethoscope:before{content:"\f0f1"}.phpdebugbar-fa-suitcase:before{content:"\f0f2"}.phpdebugbar-fa-bell-o:before{content:"\f0a2"}.phpdebugbar-fa-coffee:before{content:"\f0f4"}.phpdebugbar-fa-cutlery:before{content:"\f0f5"}.phpdebugbar-fa-file-text-o:before{content:"\f0f6"}.phpdebugbar-fa-building-o:before{content:"\f0f7"}.phpdebugbar-fa-hospital-o:before{content:"\f0f8"}.phpdebugbar-fa-ambulance:before{content:"\f0f9"}.phpdebugbar-fa-medkit:before{content:"\f0fa"}.phpdebugbar-fa-fighter-jet:before{content:"\f0fb"}.phpdebugbar-fa-beer:before{content:"\f0fc"}.phpdebugbar-fa-h-square:before{content:"\f0fd"}.phpdebugbar-fa-plus-square:before{content:"\f0fe"}.phpdebugbar-fa-angle-double-left:before{content:"\f100"}.phpdebugbar-fa-angle-double-right:before{content:"\f101"}.phpdebugbar-fa-angle-double-up:before{content:"\f102"}.phpdebugbar-fa-angle-double-down:before{content:"\f103"}.phpdebugbar-fa-angle-left:before{content:"\f104"}.phpdebugbar-fa-angle-right:before{content:"\f105"}.phpdebugbar-fa-angle-up:before{content:"\f106"}.phpdebugbar-fa-angle-down:before{content:"\f107"}.phpdebugbar-fa-desktop:before{content:"\f108"}.phpdebugbar-fa-laptop:before{content:"\f109"}.phpdebugbar-fa-tablet:before{content:"\f10a"}.phpdebugbar-fa-mobile-phone:before,.phpdebugbar-fa-mobile:before{content:"\f10b"}.phpdebugbar-fa-circle-o:before{content:"\f10c"}.phpdebugbar-fa-quote-left:before{content:"\f10d"}.phpdebugbar-fa-quote-right:before{content:"\f10e"}.phpdebugbar-fa-spinner:before{content:"\f110"}.phpdebugbar-fa-circle:before{content:"\f111"}.phpdebugbar-fa-mail-reply:before,.phpdebugbar-fa-reply:before{content:"\f112"}.phpdebugbar-fa-github-alt:before{content:"\f113"}.phpdebugbar-fa-folder-o:before{content:"\f114"}.phpdebugbar-fa-folder-open-o:before{content:"\f115"}.phpdebugbar-fa-smile-o:before{content:"\f118"}.phpdebugbar-fa-frown-o:before{content:"\f119"}.phpdebugbar-fa-meh-o:before{content:"\f11a"}.phpdebugbar-fa-gamepad:before{content:"\f11b"}.phpdebugbar-fa-keyboard-o:before{content:"\f11c"}.phpdebugbar-fa-flag-o:before{content:"\f11d"}.phpdebugbar-fa-flag-checkered:before{content:"\f11e"}.phpdebugbar-fa-terminal:before{content:"\f120"}.phpdebugbar-fa-code:before{content:"\f121"}.phpdebugbar-fa-mail-reply-all:before,.phpdebugbar-fa-reply-all:before{content:"\f122"}.phpdebugbar-fa-star-half-empty:before,.phpdebugbar-fa-star-half-full:before,.phpdebugbar-fa-star-half-o:before{content:"\f123"}.phpdebugbar-fa-location-arrow:before{content:"\f124"}.phpdebugbar-fa-crop:before{content:"\f125"}.phpdebugbar-fa-code-fork:before{content:"\f126"}.phpdebugbar-fa-unlink:before,.phpdebugbar-fa-chain-broken:before{content:"\f127"}.phpdebugbar-fa-question:before{content:"\f128"}.phpdebugbar-fa-info:before{content:"\f129"}.phpdebugbar-fa-exclamation:before{content:"\f12a"}.phpdebugbar-fa-superscript:before{content:"\f12b"}.phpdebugbar-fa-subscript:before{content:"\f12c"}.phpdebugbar-fa-eraser:before{content:"\f12d"}.phpdebugbar-fa-puzzle-piece:before{content:"\f12e"}.phpdebugbar-fa-microphone:before{content:"\f130"}.phpdebugbar-fa-microphone-slash:before{content:"\f131"}.phpdebugbar-fa-shield:before{content:"\f132"}.phpdebugbar-fa-calendar-o:before{content:"\f133"}.phpdebugbar-fa-fire-extinguisher:before{content:"\f134"}.phpdebugbar-fa-rocket:before{content:"\f135"}.phpdebugbar-fa-maxcdn:before{content:"\f136"}.phpdebugbar-fa-chevron-circle-left:before{content:"\f137"}.phpdebugbar-fa-chevron-circle-right:before{content:"\f138"}.phpdebugbar-fa-chevron-circle-up:before{content:"\f139"}.phpdebugbar-fa-chevron-circle-down:before{content:"\f13a"}.phpdebugbar-fa-html5:before{content:"\f13b"}.phpdebugbar-fa-css3:before{content:"\f13c"}.phpdebugbar-fa-anchor:before{content:"\f13d"}.phpdebugbar-fa-unlock-alt:before{content:"\f13e"}.phpdebugbar-fa-bullseye:before{content:"\f140"}.phpdebugbar-fa-ellipsis-h:before{content:"\f141"}.phpdebugbar-fa-ellipsis-v:before{content:"\f142"}.phpdebugbar-fa-rss-square:before{content:"\f143"}.phpdebugbar-fa-play-circle:before{content:"\f144"}.phpdebugbar-fa-ticket:before{content:"\f145"}.phpdebugbar-fa-minus-square:before{content:"\f146"}.phpdebugbar-fa-minus-square-o:before{content:"\f147"}.phpdebugbar-fa-level-up:before{content:"\f148"}.phpdebugbar-fa-level-down:before{content:"\f149"}.phpdebugbar-fa-check-square:before{content:"\f14a"}.phpdebugbar-fa-pencil-square:before{content:"\f14b"}.phpdebugbar-fa-external-link-square:before{content:"\f14c"}.phpdebugbar-fa-share-square:before{content:"\f14d"}.phpdebugbar-fa-compass:before{content:"\f14e"}.phpdebugbar-fa-toggle-down:before,.phpdebugbar-fa-caret-square-o-down:before{content:"\f150"}.phpdebugbar-fa-toggle-up:before,.phpdebugbar-fa-caret-square-o-up:before{content:"\f151"}.phpdebugbar-fa-toggle-right:before,.phpdebugbar-fa-caret-square-o-right:before{content:"\f152"}.phpdebugbar-fa-euro:before,.phpdebugbar-fa-eur:before{content:"\f153"}.phpdebugbar-fa-gbp:before{content:"\f154"}.phpdebugbar-fa-dollar:before,.phpdebugbar-fa-usd:before{content:"\f155"}.phpdebugbar-fa-rupee:before,.phpdebugbar-fa-inr:before{content:"\f156"}.phpdebugbar-fa-cny:before,.phpdebugbar-fa-rmb:before,.phpdebugbar-fa-yen:before,.phpdebugbar-fa-jpy:before{content:"\f157"}.phpdebugbar-fa-ruble:before,.phpdebugbar-fa-rouble:before,.phpdebugbar-fa-rub:before{content:"\f158"}.phpdebugbar-fa-won:before,.phpdebugbar-fa-krw:before{content:"\f159"}.phpdebugbar-fa-bitcoin:before,.phpdebugbar-fa-btc:before{content:"\f15a"}.phpdebugbar-fa-file:before{content:"\f15b"}.phpdebugbar-fa-file-text:before{content:"\f15c"}.phpdebugbar-fa-sort-alpha-asc:before{content:"\f15d"}.phpdebugbar-fa-sort-alpha-desc:before{content:"\f15e"}.phpdebugbar-fa-sort-amount-asc:before{content:"\f160"}.phpdebugbar-fa-sort-amount-desc:before{content:"\f161"}.phpdebugbar-fa-sort-numeric-asc:before{content:"\f162"}.phpdebugbar-fa-sort-numeric-desc:before{content:"\f163"}.phpdebugbar-fa-thumbs-up:before{content:"\f164"}.phpdebugbar-fa-thumbs-down:before{content:"\f165"}.phpdebugbar-fa-youtube-square:before{content:"\f166"}.phpdebugbar-fa-youtube:before{content:"\f167"}.phpdebugbar-fa-xing:before{content:"\f168"}.phpdebugbar-fa-xing-square:before{content:"\f169"}.phpdebugbar-fa-youtube-play:before{content:"\f16a"}.phpdebugbar-fa-dropbox:before{content:"\f16b"}.phpdebugbar-fa-stack-overflow:before{content:"\f16c"}.phpdebugbar-fa-instagram:before{content:"\f16d"}.phpdebugbar-fa-flickr:before{content:"\f16e"}.phpdebugbar-fa-adn:before{content:"\f170"}.phpdebugbar-fa-bitbucket:before{content:"\f171"}.phpdebugbar-fa-bitbucket-square:before{content:"\f172"}.phpdebugbar-fa-tumblr:before{content:"\f173"}.phpdebugbar-fa-tumblr-square:before{content:"\f174"}.phpdebugbar-fa-long-arrow-down:before{content:"\f175"}.phpdebugbar-fa-long-arrow-up:before{content:"\f176"}.phpdebugbar-fa-long-arrow-left:before{content:"\f177"}.phpdebugbar-fa-long-arrow-right:before{content:"\f178"}.phpdebugbar-fa-apple:before{content:"\f179"}.phpdebugbar-fa-windows:before{content:"\f17a"}.phpdebugbar-fa-android:before{content:"\f17b"}.phpdebugbar-fa-linux:before{content:"\f17c"}.phpdebugbar-fa-dribbble:before{content:"\f17d"}.phpdebugbar-fa-skype:before{content:"\f17e"}.phpdebugbar-fa-foursquare:before{content:"\f180"}.phpdebugbar-fa-trello:before{content:"\f181"}.phpdebugbar-fa-female:before{content:"\f182"}.phpdebugbar-fa-male:before{content:"\f183"}.phpdebugbar-fa-gittip:before,.phpdebugbar-fa-gratipay:before{content:"\f184"}.phpdebugbar-fa-sun-o:before{content:"\f185"}.phpdebugbar-fa-moon-o:before{content:"\f186"}.phpdebugbar-fa-archive:before{content:"\f187"}.phpdebugbar-fa-bug:before{content:"\f188"}.phpdebugbar-fa-vk:before{content:"\f189"}.phpdebugbar-fa-weibo:before{content:"\f18a"}.phpdebugbar-fa-renren:before{content:"\f18b"}.phpdebugbar-fa-pagelines:before{content:"\f18c"}.phpdebugbar-fa-stack-exchange:before{content:"\f18d"}.phpdebugbar-fa-arrow-circle-o-right:before{content:"\f18e"}.phpdebugbar-fa-arrow-circle-o-left:before{content:"\f190"}.phpdebugbar-fa-toggle-left:before,.phpdebugbar-fa-caret-square-o-left:before{content:"\f191"}.phpdebugbar-fa-dot-circle-o:before{content:"\f192"}.phpdebugbar-fa-wheelchair:before{content:"\f193"}.phpdebugbar-fa-vimeo-square:before{content:"\f194"}.phpdebugbar-fa-turkish-lira:before,.phpdebugbar-fa-try:before{content:"\f195"}.phpdebugbar-fa-plus-square-o:before{content:"\f196"}.phpdebugbar-fa-space-shuttle:before{content:"\f197"}.phpdebugbar-fa-slack:before{content:"\f198"}.phpdebugbar-fa-envelope-square:before{content:"\f199"}.phpdebugbar-fa-wordpress:before{content:"\f19a"}.phpdebugbar-fa-openid:before{content:"\f19b"}.phpdebugbar-fa-institution:before,.phpdebugbar-fa-bank:before,.phpdebugbar-fa-university:before{content:"\f19c"}.phpdebugbar-fa-mortar-board:before,.phpdebugbar-fa-graduation-cap:before{content:"\f19d"}.phpdebugbar-fa-yahoo:before{content:"\f19e"}.phpdebugbar-fa-google:before{content:"\f1a0"}.phpdebugbar-fa-reddit:before{content:"\f1a1"}.phpdebugbar-fa-reddit-square:before{content:"\f1a2"}.phpdebugbar-fa-stumbleupon-circle:before{content:"\f1a3"}.phpdebugbar-fa-stumbleupon:before{content:"\f1a4"}.phpdebugbar-fa-delicious:before{content:"\f1a5"}.phpdebugbar-fa-digg:before{content:"\f1a6"}.phpdebugbar-fa-pied-piper-pp:before{content:"\f1a7"}.phpdebugbar-fa-pied-piper-alt:before{content:"\f1a8"}.phpdebugbar-fa-drupal:before{content:"\f1a9"}.phpdebugbar-fa-joomla:before{content:"\f1aa"}.phpdebugbar-fa-language:before{content:"\f1ab"}.phpdebugbar-fa-fax:before{content:"\f1ac"}.phpdebugbar-fa-building:before{content:"\f1ad"}.phpdebugbar-fa-child:before{content:"\f1ae"}.phpdebugbar-fa-paw:before{content:"\f1b0"}.phpdebugbar-fa-spoon:before{content:"\f1b1"}.phpdebugbar-fa-cube:before{content:"\f1b2"}.phpdebugbar-fa-cubes:before{content:"\f1b3"}.phpdebugbar-fa-behance:before{content:"\f1b4"}.phpdebugbar-fa-behance-square:before{content:"\f1b5"}.phpdebugbar-fa-steam:before{content:"\f1b6"}.phpdebugbar-fa-steam-square:before{content:"\f1b7"}.phpdebugbar-fa-recycle:before{content:"\f1b8"}.phpdebugbar-fa-automobile:before,.phpdebugbar-fa-car:before{content:"\f1b9"}.phpdebugbar-fa-cab:before,.phpdebugbar-fa-taxi:before{content:"\f1ba"}.phpdebugbar-fa-tree:before{content:"\f1bb"}.phpdebugbar-fa-spotify:before{content:"\f1bc"}.phpdebugbar-fa-deviantart:before{content:"\f1bd"}.phpdebugbar-fa-soundcloud:before{content:"\f1be"}.phpdebugbar-fa-database:before{content:"\f1c0"}.phpdebugbar-fa-file-pdf-o:before{content:"\f1c1"}.phpdebugbar-fa-file-word-o:before{content:"\f1c2"}.phpdebugbar-fa-file-excel-o:before{content:"\f1c3"}.phpdebugbar-fa-file-powerpoint-o:before{content:"\f1c4"}.phpdebugbar-fa-file-photo-o:before,.phpdebugbar-fa-file-picture-o:before,.phpdebugbar-fa-file-image-o:before{content:"\f1c5"}.phpdebugbar-fa-file-zip-o:before,.phpdebugbar-fa-file-archive-o:before{content:"\f1c6"}.phpdebugbar-fa-file-sound-o:before,.phpdebugbar-fa-file-audio-o:before{content:"\f1c7"}.phpdebugbar-fa-file-movie-o:before,.phpdebugbar-fa-file-video-o:before{content:"\f1c8"}.phpdebugbar-fa-file-code-o:before{content:"\f1c9"}.phpdebugbar-fa-vine:before{content:"\f1ca"}.phpdebugbar-fa-codepen:before{content:"\f1cb"}.phpdebugbar-fa-jsfiddle:before{content:"\f1cc"}.phpdebugbar-fa-life-bouy:before,.phpdebugbar-fa-life-buoy:before,.phpdebugbar-fa-life-saver:before,.phpdebugbar-fa-support:before,.phpdebugbar-fa-life-ring:before{content:"\f1cd"}.phpdebugbar-fa-circle-o-notch:before{content:"\f1ce"}.phpdebugbar-fa-ra:before,.phpdebugbar-fa-resistance:before,.phpdebugbar-fa-rebel:before{content:"\f1d0"}.phpdebugbar-fa-ge:before,.phpdebugbar-fa-empire:before{content:"\f1d1"}.phpdebugbar-fa-git-square:before{content:"\f1d2"}.phpdebugbar-fa-git:before{content:"\f1d3"}.phpdebugbar-fa-y-combinator-square:before,.phpdebugbar-fa-yc-square:before,.phpdebugbar-fa-hacker-news:before{content:"\f1d4"}.phpdebugbar-fa-tencent-weibo:before{content:"\f1d5"}.phpdebugbar-fa-qq:before{content:"\f1d6"}.phpdebugbar-fa-wechat:before,.phpdebugbar-fa-weixin:before{content:"\f1d7"}.phpdebugbar-fa-send:before,.phpdebugbar-fa-paper-plane:before{content:"\f1d8"}.phpdebugbar-fa-send-o:before,.phpdebugbar-fa-paper-plane-o:before{content:"\f1d9"}.phpdebugbar-fa-history:before{content:"\f1da"}.phpdebugbar-fa-circle-thin:before{content:"\f1db"}.phpdebugbar-fa-header:before{content:"\f1dc"}.phpdebugbar-fa-paragraph:before{content:"\f1dd"}.phpdebugbar-fa-sliders:before{content:"\f1de"}.phpdebugbar-fa-share-alt:before{content:"\f1e0"}.phpdebugbar-fa-share-alt-square:before{content:"\f1e1"}.phpdebugbar-fa-bomb:before{content:"\f1e2"}.phpdebugbar-fa-soccer-ball-o:before,.phpdebugbar-fa-futbol-o:before{content:"\f1e3"}.phpdebugbar-fa-tty:before{content:"\f1e4"}.phpdebugbar-fa-binoculars:before{content:"\f1e5"}.phpdebugbar-fa-plug:before{content:"\f1e6"}.phpdebugbar-fa-slideshare:before{content:"\f1e7"}.phpdebugbar-fa-twitch:before{content:"\f1e8"}.phpdebugbar-fa-yelp:before{content:"\f1e9"}.phpdebugbar-fa-newspaper-o:before{content:"\f1ea"}.phpdebugbar-fa-wifi:before{content:"\f1eb"}.phpdebugbar-fa-calculator:before{content:"\f1ec"}.phpdebugbar-fa-paypal:before{content:"\f1ed"}.phpdebugbar-fa-google-wallet:before{content:"\f1ee"}.phpdebugbar-fa-cc-visa:before{content:"\f1f0"}.phpdebugbar-fa-cc-mastercard:before{content:"\f1f1"}.phpdebugbar-fa-cc-discover:before{content:"\f1f2"}.phpdebugbar-fa-cc-amex:before{content:"\f1f3"}.phpdebugbar-fa-cc-paypal:before{content:"\f1f4"}.phpdebugbar-fa-cc-stripe:before{content:"\f1f5"}.phpdebugbar-fa-bell-slash:before{content:"\f1f6"}.phpdebugbar-fa-bell-slash-o:before{content:"\f1f7"}.phpdebugbar-fa-trash:before{content:"\f1f8"}.phpdebugbar-fa-copyright:before{content:"\f1f9"}.phpdebugbar-fa-at:before{content:"\f1fa"}.phpdebugbar-fa-eyedropper:before{content:"\f1fb"}.phpdebugbar-fa-paint-brush:before{content:"\f1fc"}.phpdebugbar-fa-birthday-cake:before{content:"\f1fd"}.phpdebugbar-fa-area-chart:before{content:"\f1fe"}.phpdebugbar-fa-pie-chart:before{content:"\f200"}.phpdebugbar-fa-line-chart:before{content:"\f201"}.phpdebugbar-fa-lastfm:before{content:"\f202"}.phpdebugbar-fa-lastfm-square:before{content:"\f203"}.phpdebugbar-fa-toggle-off:before{content:"\f204"}.phpdebugbar-fa-toggle-on:before{content:"\f205"}.phpdebugbar-fa-bicycle:before{content:"\f206"}.phpdebugbar-fa-bus:before{content:"\f207"}.phpdebugbar-fa-ioxhost:before{content:"\f208"}.phpdebugbar-fa-angellist:before{content:"\f209"}.phpdebugbar-fa-cc:before{content:"\f20a"}.phpdebugbar-fa-shekel:before,.phpdebugbar-fa-sheqel:before,.phpdebugbar-fa-ils:before{content:"\f20b"}.phpdebugbar-fa-meanpath:before{content:"\f20c"}.phpdebugbar-fa-buysellads:before{content:"\f20d"}.phpdebugbar-fa-connectdevelop:before{content:"\f20e"}.phpdebugbar-fa-dashcube:before{content:"\f210"}.phpdebugbar-fa-forumbee:before{content:"\f211"}.phpdebugbar-fa-leanpub:before{content:"\f212"}.phpdebugbar-fa-sellsy:before{content:"\f213"}.phpdebugbar-fa-shirtsinbulk:before{content:"\f214"}.phpdebugbar-fa-simplybuilt:before{content:"\f215"}.phpdebugbar-fa-skyatlas:before{content:"\f216"}.phpdebugbar-fa-cart-plus:before{content:"\f217"}.phpdebugbar-fa-cart-arrow-down:before{content:"\f218"}.phpdebugbar-fa-diamond:before{content:"\f219"}.phpdebugbar-fa-ship:before{content:"\f21a"}.phpdebugbar-fa-user-secret:before{content:"\f21b"}.phpdebugbar-fa-motorcycle:before{content:"\f21c"}.phpdebugbar-fa-street-view:before{content:"\f21d"}.phpdebugbar-fa-heartbeat:before{content:"\f21e"}.phpdebugbar-fa-venus:before{content:"\f221"}.phpdebugbar-fa-mars:before{content:"\f222"}.phpdebugbar-fa-mercury:before{content:"\f223"}.phpdebugbar-fa-intersex:before,.phpdebugbar-fa-transgender:before{content:"\f224"}.phpdebugbar-fa-transgender-alt:before{content:"\f225"}.phpdebugbar-fa-venus-double:before{content:"\f226"}.phpdebugbar-fa-mars-double:before{content:"\f227"}.phpdebugbar-fa-venus-mars:before{content:"\f228"}.phpdebugbar-fa-mars-stroke:before{content:"\f229"}.phpdebugbar-fa-mars-stroke-v:before{content:"\f22a"}.phpdebugbar-fa-mars-stroke-h:before{content:"\f22b"}.phpdebugbar-fa-neuter:before{content:"\f22c"}.phpdebugbar-fa-genderless:before{content:"\f22d"}.phpdebugbar-fa-facebook-official:before{content:"\f230"}.phpdebugbar-fa-pinterest-p:before{content:"\f231"}.phpdebugbar-fa-whatsapp:before{content:"\f232"}.phpdebugbar-fa-server:before{content:"\f233"}.phpdebugbar-fa-user-plus:before{content:"\f234"}.phpdebugbar-fa-user-times:before{content:"\f235"}.phpdebugbar-fa-hotel:before,.phpdebugbar-fa-bed:before{content:"\f236"}.phpdebugbar-fa-viacoin:before{content:"\f237"}.phpdebugbar-fa-train:before{content:"\f238"}.phpdebugbar-fa-subway:before{content:"\f239"}.phpdebugbar-fa-medium:before{content:"\f23a"}.phpdebugbar-fa-yc:before,.phpdebugbar-fa-y-combinator:before{content:"\f23b"}.phpdebugbar-fa-optin-monster:before{content:"\f23c"}.phpdebugbar-fa-opencart:before{content:"\f23d"}.phpdebugbar-fa-expeditedssl:before{content:"\f23e"}.phpdebugbar-fa-battery-4:before,.phpdebugbar-fa-battery:before,.phpdebugbar-fa-battery-full:before{content:"\f240"}.phpdebugbar-fa-battery-3:before,.phpdebugbar-fa-battery-three-quarters:before{content:"\f241"}.phpdebugbar-fa-battery-2:before,.phpdebugbar-fa-battery-half:before{content:"\f242"}.phpdebugbar-fa-battery-1:before,.phpdebugbar-fa-battery-quarter:before{content:"\f243"}.phpdebugbar-fa-battery-0:before,.phpdebugbar-fa-battery-empty:before{content:"\f244"}.phpdebugbar-fa-mouse-pointer:before{content:"\f245"}.phpdebugbar-fa-i-cursor:before{content:"\f246"}.phpdebugbar-fa-object-group:before{content:"\f247"}.phpdebugbar-fa-object-ungroup:before{content:"\f248"}.phpdebugbar-fa-sticky-note:before{content:"\f249"}.phpdebugbar-fa-sticky-note-o:before{content:"\f24a"}.phpdebugbar-fa-cc-jcb:before{content:"\f24b"}.phpdebugbar-fa-cc-diners-club:before{content:"\f24c"}.phpdebugbar-fa-clone:before{content:"\f24d"}.phpdebugbar-fa-balance-scale:before{content:"\f24e"}.phpdebugbar-fa-hourglass-o:before{content:"\f250"}.phpdebugbar-fa-hourglass-1:before,.phpdebugbar-fa-hourglass-start:before{content:"\f251"}.phpdebugbar-fa-hourglass-2:before,.phpdebugbar-fa-hourglass-half:before{content:"\f252"}.phpdebugbar-fa-hourglass-3:before,.phpdebugbar-fa-hourglass-end:before{content:"\f253"}.phpdebugbar-fa-hourglass:before{content:"\f254"}.phpdebugbar-fa-hand-grab-o:before,.phpdebugbar-fa-hand-rock-o:before{content:"\f255"}.phpdebugbar-fa-hand-stop-o:before,.phpdebugbar-fa-hand-paper-o:before{content:"\f256"}.phpdebugbar-fa-hand-scissors-o:before{content:"\f257"}.phpdebugbar-fa-hand-lizard-o:before{content:"\f258"}.phpdebugbar-fa-hand-spock-o:before{content:"\f259"}.phpdebugbar-fa-hand-pointer-o:before{content:"\f25a"}.phpdebugbar-fa-hand-peace-o:before{content:"\f25b"}.phpdebugbar-fa-trademark:before{content:"\f25c"}.phpdebugbar-fa-registered:before{content:"\f25d"}.phpdebugbar-fa-creative-commons:before{content:"\f25e"}.phpdebugbar-fa-gg:before{content:"\f260"}.phpdebugbar-fa-gg-circle:before{content:"\f261"}.phpdebugbar-fa-tripadvisor:before{content:"\f262"}.phpdebugbar-fa-odnoklassniki:before{content:"\f263"}.phpdebugbar-fa-odnoklassniki-square:before{content:"\f264"}.phpdebugbar-fa-get-pocket:before{content:"\f265"}.phpdebugbar-fa-wikipedia-w:before{content:"\f266"}.phpdebugbar-fa-safari:before{content:"\f267"}.phpdebugbar-fa-chrome:before{content:"\f268"}.phpdebugbar-fa-firefox:before{content:"\f269"}.phpdebugbar-fa-opera:before{content:"\f26a"}.phpdebugbar-fa-internet-explorer:before{content:"\f26b"}.phpdebugbar-fa-tv:before,.phpdebugbar-fa-television:before{content:"\f26c"}.phpdebugbar-fa-contao:before{content:"\f26d"}.phpdebugbar-fa-500px:before{content:"\f26e"}.phpdebugbar-fa-amazon:before{content:"\f270"}.phpdebugbar-fa-calendar-plus-o:before{content:"\f271"}.phpdebugbar-fa-calendar-minus-o:before{content:"\f272"}.phpdebugbar-fa-calendar-times-o:before{content:"\f273"}.phpdebugbar-fa-calendar-check-o:before{content:"\f274"}.phpdebugbar-fa-industry:before{content:"\f275"}.phpdebugbar-fa-map-pin:before{content:"\f276"}.phpdebugbar-fa-map-signs:before{content:"\f277"}.phpdebugbar-fa-map-o:before{content:"\f278"}.phpdebugbar-fa-map:before{content:"\f279"}.phpdebugbar-fa-commenting:before{content:"\f27a"}.phpdebugbar-fa-commenting-o:before{content:"\f27b"}.phpdebugbar-fa-houzz:before{content:"\f27c"}.phpdebugbar-fa-vimeo:before{content:"\f27d"}.phpdebugbar-fa-black-tie:before{content:"\f27e"}.phpdebugbar-fa-fonticons:before{content:"\f280"}.phpdebugbar-fa-reddit-alien:before{content:"\f281"}.phpdebugbar-fa-edge:before{content:"\f282"}.phpdebugbar-fa-credit-card-alt:before{content:"\f283"}.phpdebugbar-fa-codiepie:before{content:"\f284"}.phpdebugbar-fa-modx:before{content:"\f285"}.phpdebugbar-fa-fort-awesome:before{content:"\f286"}.phpdebugbar-fa-usb:before{content:"\f287"}.phpdebugbar-fa-product-hunt:before{content:"\f288"}.phpdebugbar-fa-mixcloud:before{content:"\f289"}.phpdebugbar-fa-scribd:before{content:"\f28a"}.phpdebugbar-fa-pause-circle:before{content:"\f28b"}.phpdebugbar-fa-pause-circle-o:before{content:"\f28c"}.phpdebugbar-fa-stop-circle:before{content:"\f28d"}.phpdebugbar-fa-stop-circle-o:before{content:"\f28e"}.phpdebugbar-fa-shopping-bag:before{content:"\f290"}.phpdebugbar-fa-shopping-basket:before{content:"\f291"}.phpdebugbar-fa-hashtag:before{content:"\f292"}.phpdebugbar-fa-bluetooth:before{content:"\f293"}.phpdebugbar-fa-bluetooth-b:before{content:"\f294"}.phpdebugbar-fa-percent:before{content:"\f295"}.phpdebugbar-fa-gitlab:before{content:"\f296"}.phpdebugbar-fa-wpbeginner:before{content:"\f297"}.phpdebugbar-fa-wpforms:before{content:"\f298"}.phpdebugbar-fa-envira:before{content:"\f299"}.phpdebugbar-fa-universal-access:before{content:"\f29a"}.phpdebugbar-fa-wheelchair-alt:before{content:"\f29b"}.phpdebugbar-fa-question-circle-o:before{content:"\f29c"}.phpdebugbar-fa-blind:before{content:"\f29d"}.phpdebugbar-fa-audio-description:before{content:"\f29e"}.phpdebugbar-fa-volume-control-phone:before{content:"\f2a0"}.phpdebugbar-fa-braille:before{content:"\f2a1"}.phpdebugbar-fa-assistive-listening-systems:before{content:"\f2a2"}.phpdebugbar-fa-asl-interpreting:before,.phpdebugbar-fa-american-sign-language-interpreting:before{content:"\f2a3"}.phpdebugbar-fa-deafness:before,.phpdebugbar-fa-hard-of-hearing:before,.phpdebugbar-fa-deaf:before{content:"\f2a4"}.phpdebugbar-fa-glide:before{content:"\f2a5"}.phpdebugbar-fa-glide-g:before{content:"\f2a6"}.phpdebugbar-fa-signing:before,.phpdebugbar-fa-sign-language:before{content:"\f2a7"}.phpdebugbar-fa-low-vision:before{content:"\f2a8"}.phpdebugbar-fa-viadeo:before{content:"\f2a9"}.phpdebugbar-fa-viadeo-square:before{content:"\f2aa"}.phpdebugbar-fa-snapchat:before{content:"\f2ab"}.phpdebugbar-fa-snapchat-ghost:before{content:"\f2ac"}.phpdebugbar-fa-snapchat-square:before{content:"\f2ad"}.phpdebugbar-fa-pied-piper:before{content:"\f2ae"}.phpdebugbar-fa-first-order:before{content:"\f2b0"}.phpdebugbar-fa-yoast:before{content:"\f2b1"}.phpdebugbar-fa-themeisle:before{content:"\f2b2"}.phpdebugbar-fa-google-plus-circle:before,.phpdebugbar-fa-google-plus-official:before{content:"\f2b3"}.phpdebugbar-fa-fa:before,.phpdebugbar-fa-font-awesome:before{content:"\f2b4"}.phpdebugbar-fa-handshake-o:before{content:"\f2b5"}.phpdebugbar-fa-envelope-open:before{content:"\f2b6"}.phpdebugbar-fa-envelope-open-o:before{content:"\f2b7"}.phpdebugbar-fa-linode:before{content:"\f2b8"}.phpdebugbar-fa-address-book:before{content:"\f2b9"}.phpdebugbar-fa-address-book-o:before{content:"\f2ba"}.phpdebugbar-fa-vcard:before,.phpdebugbar-fa-address-card:before{content:"\f2bb"}.phpdebugbar-fa-vcard-o:before,.phpdebugbar-fa-address-card-o:before{content:"\f2bc"}.phpdebugbar-fa-user-circle:before{content:"\f2bd"}.phpdebugbar-fa-user-circle-o:before{content:"\f2be"}.phpdebugbar-fa-user-o:before{content:"\f2c0"}.phpdebugbar-fa-id-badge:before{content:"\f2c1"}.phpdebugbar-fa-drivers-license:before,.phpdebugbar-fa-id-card:before{content:"\f2c2"}.phpdebugbar-fa-drivers-license-o:before,.phpdebugbar-fa-id-card-o:before{content:"\f2c3"}.phpdebugbar-fa-quora:before{content:"\f2c4"}.phpdebugbar-fa-free-code-camp:before{content:"\f2c5"}.phpdebugbar-fa-telegram:before{content:"\f2c6"}.phpdebugbar-fa-thermometer-4:before,.phpdebugbar-fa-thermometer:before,.phpdebugbar-fa-thermometer-full:before{content:"\f2c7"}.phpdebugbar-fa-thermometer-3:before,.phpdebugbar-fa-thermometer-three-quarters:before{content:"\f2c8"}.phpdebugbar-fa-thermometer-2:before,.phpdebugbar-fa-thermometer-half:before{content:"\f2c9"}.phpdebugbar-fa-thermometer-1:before,.phpdebugbar-fa-thermometer-quarter:before{content:"\f2ca"}.phpdebugbar-fa-thermometer-0:before,.phpdebugbar-fa-thermometer-empty:before{content:"\f2cb"}.phpdebugbar-fa-shower:before{content:"\f2cc"}.phpdebugbar-fa-bathtub:before,.phpdebugbar-fa-s15:before,.phpdebugbar-fa-bath:before{content:"\f2cd"}.phpdebugbar-fa-podcast:before{content:"\f2ce"}.phpdebugbar-fa-window-maximize:before{content:"\f2d0"}.phpdebugbar-fa-window-minimize:before{content:"\f2d1"}.phpdebugbar-fa-window-restore:before{content:"\f2d2"}.phpdebugbar-fa-times-rectangle:before,.phpdebugbar-fa-window-close:before{content:"\f2d3"}.phpdebugbar-fa-times-rectangle-o:before,.phpdebugbar-fa-window-close-o:before{content:"\f2d4"}.phpdebugbar-fa-bandcamp:before{content:"\f2d5"}.phpdebugbar-fa-grav:before{content:"\f2d6"}.phpdebugbar-fa-etsy:before{content:"\f2d7"}.phpdebugbar-fa-imdb:before{content:"\f2d8"}.phpdebugbar-fa-ravelry:before{content:"\f2d9"}.phpdebugbar-fa-eercast:before{content:"\f2da"}.phpdebugbar-fa-microchip:before{content:"\f2db"}.phpdebugbar-fa-snowflake-o:before{content:"\f2dc"}.phpdebugbar-fa-superpowers:before{content:"\f2dd"}.phpdebugbar-fa-wpexplorer:before{content:"\f2de"}.phpdebugbar-fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/src/DebugBar/Resources/vendor/font-awesome/fonts/FontAwesome.otf b/src/DebugBar/Resources/vendor/font-awesome/fonts/FontAwesome.otf
deleted file mode 100644
index 401ec0f36..000000000
Binary files a/src/DebugBar/Resources/vendor/font-awesome/fonts/FontAwesome.otf and /dev/null differ
diff --git a/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.eot b/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.eot
deleted file mode 100644
index e9f60ca95..000000000
Binary files a/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.eot and /dev/null differ
diff --git a/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.svg b/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.svg
deleted file mode 100644
index 855c845e5..000000000
--- a/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,2671 +0,0 @@
-
-
-
diff --git a/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index 35acda2fa..000000000
Binary files a/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.ttf and /dev/null differ
diff --git a/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff b/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff
deleted file mode 100644
index 400014a4b..000000000
Binary files a/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff and /dev/null differ
diff --git a/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff2 b/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff2
deleted file mode 100644
index 4d13fc604..000000000
Binary files a/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff2 and /dev/null differ
diff --git a/src/DebugBar/Resources/vendor/highlightjs/highlight.pack.js b/src/DebugBar/Resources/vendor/highlightjs/highlight.pack.js
deleted file mode 100644
index cf7215a66..000000000
--- a/src/DebugBar/Resources/vendor/highlightjs/highlight.pack.js
+++ /dev/null
@@ -1 +0,0 @@
-var hljs=new function(){function k(v){return v.replace(/&/gm,"&").replace(//gm,">")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\n/g,""):w.nodeValue}if(t(w)=="br"){return"\n"}return d(w)}).join("")}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^language-/,"")});return v.filter(function(x){return j(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset"}function E(G){F+=""+t(G)+">"}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b=D.bK.split(" ").join("|")}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?\\b("+F.b+")\\b\\.?":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T";U+=Z+'">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=k(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=""}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"")+'"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=""}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"
")}return v}function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("scilab",function(a){var b=[a.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[a.BE,{b:"''"}]}];return{k:{keyword:"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function endfunction",e:"$",k:"function endfunction|10",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},],},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",r:0,c:b},{cN:"comment",b:"//",e:"$"}].concat(b)}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/,r:0,c:[d,{cN:"attribute",b:c,r:0},{b:"=",r:0,c:[{cN:"value",v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s\/>]+/}]}]}]};return{aliases:["html"],cI:true,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",rE:true,sL:"css"}},{cN:"tag",b:"' . "\n", $nonce, $file);
+ }
+
+ foreach ($inlineJs as $content) {
+ $html .= sprintf('' . "\n", $nonce, $content);
+ }
+
+ foreach ($inlineHead as $content) {
+ if ($nonce !== '') {
+ $content = preg_replace(
+ '/<(script|style)(?![^>]*nonce=)/i',
+ '<$1' . $nonce,
+ $content
+ );
+ }
+
+ $html .= $content . "\n";
+ }
+
+ return $html;
+ }
+
+ /**
+ * @param string[] $files
+ */
+ protected function getFilesModifiedTime(array $files): int
+ {
+ $modifiedTime = 0;
+ foreach ($files as $file) {
+ $fileTime = filemtime($file);
+ $modifiedTime = $fileTime !== false ? max($modifiedTime, $fileTime) : $modifiedTime;
+ }
+ return $modifiedTime;
+ }
+
+ public function injectInHtmlResponse(string $content, bool $withHead = true): string
+ {
+ $widget = "\n" . ($withHead ? $this->renderHead() : '') . $this->render();
+
+ // Try to put the widget at the end, directly before the
+ $pos = strripos($content, '