From 96a01e3ab44f8ff3127e4c22b10f1d6e3ef331e5 Mon Sep 17 00:00:00 2001 From: smokephil Date: Tue, 11 Nov 2025 19:27:29 +0100 Subject: [PATCH] (Grav GitSync) Automatic Commit from smokephil --- pages/01.home/modular.md | 4 +- plugins/admin/CHANGELOG.md | 21 + plugins/admin/admin.php | 5 +- plugins/admin/blueprints.yaml | 4 +- plugins/admin/classes/plugin/Admin.php | 2 +- plugins/admin/composer.json | 10 +- plugins/admin/composer.lock | 532 +- plugins/admin/languages/en.yaml | 10 +- plugins/admin/languages/es.yaml | 2 + plugins/admin/themes/grav/app/forms/state.js | 22 +- .../admin/themes/grav/app/updates/index.js | 2 +- .../admin/themes/grav/app/updates/update.js | 13 +- .../admin/themes/grav/app/utils/request.js | 4 +- .../admin/themes/grav/app/utils/response.js | 2 +- .../themes/grav/css/fontawesome7.min.css | 9 + .../themes/grav/css/fork-awesome-shim.css | 651 ++ .../themes/grav/css/fork-awesome.min.css | 12 - .../themes/grav/fonts/forkawesome-webfont.eot | Bin 186490 -> 0 bytes .../themes/grav/fonts/forkawesome-webfont.svg | 2810 ------ .../themes/grav/fonts/forkawesome-webfont.ttf | Bin 186300 -> 0 bytes .../grav/fonts/forkawesome-webfont.woff | Bin 113404 -> 0 bytes .../grav/fonts/forkawesome-webfont.woff2 | Bin 90420 -> 0 bytes plugins/admin/themes/grav/js/admin.min.js | 59 +- .../admin/themes/grav/js/clipboard-helper.js | 129 + .../admin/themes/grav/js/fork-awesome-shim.js | 1389 +++ .../admin/themes/grav/js/icon-mappings.json | 800 ++ .../admin/themes/grav/js/scheduler-admin.js | 144 + .../forms/fields/file/file.html.twig | 4 +- .../webhook-status/webhook-status.html.twig | 33 + .../templates/partials/base-root.html.twig | 12 +- .../grav/templates/partials/footer.html.twig | 2 +- .../partials/javascript-config.html.twig | 7 +- .../templates/partials/stylesheets.html.twig | 3 +- .../partials/tools-scheduler.html.twig | 60 +- plugins/admin/themes/grav/test-icons.html | 40 + .../themes/grav/webfonts/fa-brands-400.woff2 | Bin 0 -> 101088 bytes .../themes/grav/webfonts/fa-regular-400.woff2 | Bin 0 -> 18892 bytes .../themes/grav/webfonts/fa-solid-900.woff2 | Bin 0 -> 113108 bytes .../grav/webfonts/fa-v4compatibility.woff2 | Bin 0 -> 4132 bytes plugins/admin/vendor/bin/pscss | 5 +- .../admin/vendor/composer/autoload_files.php | 10 - .../admin/vendor/composer/autoload_psr4.php | 1 - .../admin/vendor/composer/autoload_real.php | 12 - .../admin/vendor/composer/autoload_static.php | 9 - plugins/admin/vendor/composer/installed.json | 85 +- plugins/admin/vendor/composer/installed.php | 25 +- .../.github/FUNDING.yml | 1 - .../workflows/continuous-integration.yml | 32 - .../workflows/release-on-milestone-closed.yml | 61 - .../.laminas-ci.json | 5 - .../laminas-zendframework-bridge/COPYRIGHT.md | 1 - .../laminas-zendframework-bridge/LICENSE.md | 26 - .../laminas-zendframework-bridge/README.md | 30 - .../composer.json | 61 - .../composer.lock | 3841 ------- .../config/replacements.php | 372 - .../psalm-baseline.xml | 345 - .../psalm.xml.dist | 33 - .../src/Autoloader.php | 181 - .../src/ConfigPostProcessor.php | 426 - .../src/Module.php | 48 - .../src/Replacements.php | 40 - .../src/RewriteRules.php | 73 - .../src/autoload.php | 3 - .../vendor/scssphp/scssphp/composer.json | 2 +- .../scssphp/src/Block/CallableBlock.php | 3 +- .../scssphp/src/Block/DirectiveBlock.php | 3 +- .../scssphp/scssphp/src/Block/EachBlock.php | 3 +- .../scssphp/scssphp/src/Block/ElseifBlock.php | 3 +- .../scssphp/scssphp/src/Block/ForBlock.php | 5 +- .../scssphp/scssphp/src/Block/IfBlock.php | 3 +- .../scssphp/scssphp/src/Block/MediaBlock.php | 3 +- .../vendor/scssphp/scssphp/src/Compiler.php | 144 +- .../scssphp/scssphp/src/Node/Number.php | 18 +- .../scssphp/scssphp/src/OutputStyle.php | 53 + .../vendor/scssphp/scssphp/src/Parser.php | 117 +- .../admin/vendor/scssphp/scssphp/src/Type.php | 3 + .../vendor/scssphp/scssphp/src/Version.php | 2 +- plugins/devtools/CHANGELOG.md | 9 + plugins/devtools/README.md | 6 +- plugins/devtools/blueprints.yaml | 4 +- plugins/devtools/classes/DevToolsCommand.php | 3 +- .../plugin/blank/composer.json.twig | 1 + .../components/plugin/flex/composer.json.twig | 1 + .../theme/inheritance/README.md.twig | 2 +- .../theme/pure-blank/README.md.twig | 2 +- .../theme/tailwind-mix/README.md.twig | 2 +- .../theme/tailwind-mix/package.json.twig | 10 +- .../templates/partials/base.html.twig | 4 +- .../components/theme/tailwind/README.md.twig | 2 +- .../templates/partials/base.html.twig | 2 +- plugins/email/CHANGELOG.md | 8 + plugins/email/blueprints.yaml | 2 +- plugins/email/classes/Email.php | 4 +- plugins/email/composer.lock | 61 +- plugins/email/vendor/autoload.php | 5 +- .../vendor/composer/InstalledVersions.php | 38 +- plugins/email/vendor/composer/installed.json | 69 +- plugins/email/vendor/composer/installed.php | 26 +- .../email/vendor/composer/platform_check.php | 5 +- .../doctrine/deprecations/composer.json | 9 +- .../src/PHPUnit/VerifyDeprecations.php | 4 + .../vendor/symfony/polyfill-intl-idn/Idn.php | 8 + .../symfony/polyfill-php80/PhpToken.php | 7 +- plugins/error/.gitignore | 9 + plugins/error/CHANGELOG.md | 7 + plugins/error/blueprints.yaml | 2 +- plugins/error/cli/LogCommand.php | 50 +- plugins/error/hebe.json | 15 + plugins/form/.gitignore | 4 + plugins/form/CHANGELOG.md | 1146 ++- plugins/form/app/fields/file.js | 94 +- .../assets/captcha/basic-captcha-refresh.js | 128 + .../form/assets/captcha/recaptcha-handler.js | 166 + .../form/assets/captcha/turnstile-handler.js | 121 + plugins/form/assets/dropzone-reinit.js | 311 + plugins/form/assets/filepond-handler.js | 662 ++ plugins/form/assets/filepond-reinit.js | 141 + .../filepond-plugin-file-validate-size.min.js | 9 + .../filepond-plugin-file-validate-type.min.js | 9 + .../filepond-plugin-image-preview.min.css | 8 + .../filepond-plugin-image-preview.min.js | 9 + .../filepond-plugin-image-resize.min.js | 9 + .../filepond-plugin-image-transform.min.js | 9 + plugins/form/assets/filepond/filepond.min.css | 8 + plugins/form/assets/filepond/filepond.min.js | 9 + plugins/form/assets/form-styles.css | 2 +- plugins/form/assets/form-styles.css.map | 2 +- plugins/form/assets/form.min.js | 277 +- plugins/form/assets/form.vendor.js | 50 +- plugins/form/assets/xhr-submitter.js | 481 +- plugins/form/blueprints.yaml | 167 +- plugins/form/classes/BasicCaptcha.php | 122 - plugins/form/classes/Captcha/BasicCaptcha.php | 596 ++ .../classes/Captcha/BasicCaptchaProvider.php | 134 + .../form/classes/Captcha/CaptchaFactory.php | 84 + .../form/classes/Captcha/CaptchaManager.php | 244 + .../Captcha/CaptchaProviderInterface.php | 33 + .../classes/Captcha/ReCaptchaProvider.php | 252 + .../classes/Captcha/TurnstileProvider.php | 134 + plugins/form/classes/Form.php | 72 +- plugins/form/classes/Forms.php | 2 +- plugins/form/classes/TwigExtension.php | 2 +- plugins/form/form.php | 280 +- plugins/form/form.yaml | 37 +- plugins/form/languages.yaml | 1282 ++- plugins/form/package-lock.json | 8861 +++++++++++++++++ plugins/form/package.json | 21 +- plugins/form/scss/form-styles.scss | 34 +- .../templates/forms/default/data.html.twig | 140 +- .../templates/forms/default/data.txt.twig | 2 +- .../templates/forms/default/form.html.twig | 6 +- .../basic-captcha/basic-captcha.html.twig | 33 +- .../forms/fields/captcha/captcha.html.twig | 108 +- .../forms/fields/file/file.html.twig | 15 +- .../forms/fields/filepond/filepond.html.twig | 128 + .../fields/recaptcha/recaptcha.html.twig | 393 + .../forms/fields/spacer/spacer.html.twig | 4 +- .../forms/fields/tabs/tabs.html.twig | 4 +- .../fields/turnstile/turnstile.html.twig | 110 +- plugins/form/templates/forms/form.html.twig | 2 +- .../forms/layouts/form/default-form.html.twig | 1 + .../templates/forms/layouts/xhr.html.twig | 21 +- plugins/form/test-captcha.php | 133 + .../recaptcha/src/ReCaptcha/ReCaptcha.php | 2 +- .../src/ReCaptcha/RequestMethod/CurlPost.php | 2 +- .../ReCaptcha/RequestMethod/SocketPost.php | 2 +- plugins/form/webpack.conf.js | 38 +- plugins/form/yarn.lock | 6127 ++++-------- plugins/git-sync/CHANGELOG.md | 9 + plugins/git-sync/README.md | 6 +- plugins/git-sync/blueprints.yaml | 6 +- plugins/git-sync/classes/GitSync.php | 2 + plugins/git-sync/classes/Helper.php | 2 +- plugins/git-sync/cli/InitCommand.php | 2 + plugins/git-sync/cli/PasswdCommand.php | 2 + plugins/git-sync/cli/StatusCommand.php | 2 + plugins/git-sync/cli/SyncCommand.php | 2 + plugins/git-sync/git-sync.php | 4 +- plugins/login/CHANGELOG.md | 9 + plugins/login/README.md | 2 +- plugins/login/blueprints.yaml | 2 +- plugins/login/classes/Email.php | 12 +- .../classes/Events/PageAuthorizeEvent.php | 2 +- plugins/login/classes/Login.php | 16 +- plugins/login/composer.json | 7 +- plugins/login/composer.lock | 118 +- plugins/login/vendor/autoload.php | 5 +- .../bacon-qr-code/src/Common/BitMatrix.php | 4 +- .../src/Common/ReedSolomonCodec.php | 2 +- .../bacon-qr-code/src/Encoder/Encoder.php | 2 +- plugins/login/vendor/composer/ClassLoader.php | 96 +- .../vendor/composer/InstalledVersions.php | 45 +- .../login/vendor/composer/autoload_psr4.php | 2 +- .../login/vendor/composer/autoload_static.php | 2 +- plugins/login/vendor/composer/installed.json | 114 +- plugins/login/vendor/composer/installed.php | 28 +- .../login/vendor/composer/platform_check.php | 5 +- .../dasprid/enum/.github/workflows/tests.yml | 47 - .../login/vendor/dasprid/enum/composer.json | 2 +- .../vendor/dasprid/enum/phpunit.xml.dist | 17 - .../dasprid/enum/test/AbstractEnumTest.php | 121 - .../vendor/dasprid/enum/test/EnumMapTest.php | 243 - .../dasprid/enum/test/NullValueTest.php | 31 - .../login/vendor/dasprid/enum/test/Planet.php | 73 - .../vendor/dasprid/enum/test/WeekDay.php | 26 - .../{birke => mober}/rememberme/.gitignore | 0 .../{birke => mober}/rememberme/LICENSE | 0 .../{birke => mober}/rememberme/README.md | 0 .../{birke => mober}/rememberme/composer.json | 0 .../rememberme/example/action.php | 0 .../rememberme/example/css/style.css | 0 .../rememberme/example/index.php | 0 .../example/templates/cookie_was_stolen.php | 0 .../rememberme/example/templates/login.php | 0 .../example/templates/user_is_logged_in.php | 0 .../{birke => mober}/rememberme/phpunit.xml | 0 .../src/Rememberme/Authenticator.php | 0 .../rememberme/src/Rememberme/Cookie.php | 0 .../rememberme/src/Rememberme/Storage/DB.php | 0 .../src/Rememberme/Storage/File.php | 0 .../rememberme/src/Rememberme/Storage/PDO.php | 0 .../Rememberme/Storage/StorageInterface.php | 0 .../rememberme/test/CookieTest.php | 0 .../rememberme/test/RemembermeTest.php | 0 .../rememberme/test/Storage/PDO.php | 0 .../rememberme/test/Storage/tokens.xml | 0 .../rememberme/test/bootstrap.php | 0 .../lib/Providers/Time/HttpTimeProvider.php | 2 +- .../twofactorauth/lib/TwoFactorAuth.php | 4 +- plugins/problems/CHANGELOG.md | 29 + plugins/problems/README.md | 8 +- plugins/problems/blueprints.yaml | 4 +- plugins/problems/classes/Problems/Apache.php | 2 +- .../classes/Problems/EssentialFolders.php | 1 + .../problems/classes/Problems/PHPModules.php | 153 +- .../problems/classes/Problems/Permissions.php | 6 + plugins/problems/cli/CheckCommand.php | 11 + plugins/problems/templates/problems.html.twig | 2 +- .../reports/problems-report.html.twig | 9 + plugins/problems/yarn.lock | 12 +- plugins/quick-tray-links/CHANGELOG.md | 6 + plugins/quick-tray-links/blueprints.yaml | 16 +- plugins/quick-tray-links/languages.yaml | 33 +- themes/quark/.gitignore | 2 + themes/quark/CHANGELOG.md | 35 + themes/quark/README.md | 1 + themes/quark/blueprints.yaml | 62 +- themes/quark/blueprints/modular.yaml | 47 + themes/quark/images/favicon.png | Bin 8056 -> 13203 bytes themes/quark/images/grav-logo.svg | 2 +- themes/quark/languages.yaml | 150 +- themes/quark/templates/comments.html.twig | 7 + .../templates/partials/archives.html.twig | 2 +- .../quark/templates/partials/base.html.twig | 6 +- .../quark/templates/partials/footer.html.twig | 3 +- .../templates/partials/relatedpages.html.twig | 2 +- .../templates/partials/sidebar.html.twig | 2 +- .../templates/partials/taxonomylist.html.twig | 2 +- themes/quark/yarn.lock | 3680 +++++++ 260 files changed, 25905 insertions(+), 16011 deletions(-) create mode 100644 plugins/admin/themes/grav/css/fontawesome7.min.css create mode 100644 plugins/admin/themes/grav/css/fork-awesome-shim.css delete mode 100644 plugins/admin/themes/grav/css/fork-awesome.min.css delete mode 100644 plugins/admin/themes/grav/fonts/forkawesome-webfont.eot delete mode 100644 plugins/admin/themes/grav/fonts/forkawesome-webfont.svg delete mode 100644 plugins/admin/themes/grav/fonts/forkawesome-webfont.ttf delete mode 100644 plugins/admin/themes/grav/fonts/forkawesome-webfont.woff delete mode 100644 plugins/admin/themes/grav/fonts/forkawesome-webfont.woff2 create mode 100644 plugins/admin/themes/grav/js/clipboard-helper.js create mode 100644 plugins/admin/themes/grav/js/fork-awesome-shim.js create mode 100644 plugins/admin/themes/grav/js/icon-mappings.json create mode 100644 plugins/admin/themes/grav/js/scheduler-admin.js create mode 100644 plugins/admin/themes/grav/templates/forms/fields/webhook-status/webhook-status.html.twig create mode 100644 plugins/admin/themes/grav/test-icons.html create mode 100644 plugins/admin/themes/grav/webfonts/fa-brands-400.woff2 create mode 100644 plugins/admin/themes/grav/webfonts/fa-regular-400.woff2 create mode 100644 plugins/admin/themes/grav/webfonts/fa-solid-900.woff2 create mode 100644 plugins/admin/themes/grav/webfonts/fa-v4compatibility.woff2 delete mode 100644 plugins/admin/vendor/composer/autoload_files.php delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/FUNDING.yml delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/workflows/continuous-integration.yml delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/workflows/release-on-milestone-closed.yml delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/.laminas-ci.json delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/COPYRIGHT.md delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/LICENSE.md delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/README.md delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/composer.json delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/composer.lock delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/config/replacements.php delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/psalm-baseline.xml delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/psalm.xml.dist delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Autoloader.php delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/ConfigPostProcessor.php delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Module.php delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Replacements.php delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/RewriteRules.php delete mode 100644 plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/autoload.php create mode 100644 plugins/error/.gitignore create mode 100644 plugins/error/hebe.json create mode 100644 plugins/form/assets/captcha/basic-captcha-refresh.js create mode 100644 plugins/form/assets/captcha/recaptcha-handler.js create mode 100644 plugins/form/assets/captcha/turnstile-handler.js create mode 100644 plugins/form/assets/dropzone-reinit.js create mode 100644 plugins/form/assets/filepond-handler.js create mode 100644 plugins/form/assets/filepond-reinit.js create mode 100644 plugins/form/assets/filepond/filepond-plugin-file-validate-size.min.js create mode 100644 plugins/form/assets/filepond/filepond-plugin-file-validate-type.min.js create mode 100644 plugins/form/assets/filepond/filepond-plugin-image-preview.min.css create mode 100644 plugins/form/assets/filepond/filepond-plugin-image-preview.min.js create mode 100644 plugins/form/assets/filepond/filepond-plugin-image-resize.min.js create mode 100644 plugins/form/assets/filepond/filepond-plugin-image-transform.min.js create mode 100644 plugins/form/assets/filepond/filepond.min.css create mode 100644 plugins/form/assets/filepond/filepond.min.js delete mode 100644 plugins/form/classes/BasicCaptcha.php create mode 100644 plugins/form/classes/Captcha/BasicCaptcha.php create mode 100644 plugins/form/classes/Captcha/BasicCaptchaProvider.php create mode 100644 plugins/form/classes/Captcha/CaptchaFactory.php create mode 100644 plugins/form/classes/Captcha/CaptchaManager.php create mode 100644 plugins/form/classes/Captcha/CaptchaProviderInterface.php create mode 100644 plugins/form/classes/Captcha/ReCaptchaProvider.php create mode 100644 plugins/form/classes/Captcha/TurnstileProvider.php create mode 100644 plugins/form/package-lock.json create mode 100644 plugins/form/templates/forms/fields/filepond/filepond.html.twig create mode 100644 plugins/form/templates/forms/fields/recaptcha/recaptcha.html.twig create mode 100644 plugins/form/test-captcha.php delete mode 100644 plugins/login/vendor/dasprid/enum/.github/workflows/tests.yml delete mode 100644 plugins/login/vendor/dasprid/enum/phpunit.xml.dist delete mode 100644 plugins/login/vendor/dasprid/enum/test/AbstractEnumTest.php delete mode 100644 plugins/login/vendor/dasprid/enum/test/EnumMapTest.php delete mode 100644 plugins/login/vendor/dasprid/enum/test/NullValueTest.php delete mode 100644 plugins/login/vendor/dasprid/enum/test/Planet.php delete mode 100644 plugins/login/vendor/dasprid/enum/test/WeekDay.php rename plugins/login/vendor/{birke => mober}/rememberme/.gitignore (100%) rename plugins/login/vendor/{birke => mober}/rememberme/LICENSE (100%) rename plugins/login/vendor/{birke => mober}/rememberme/README.md (100%) rename plugins/login/vendor/{birke => mober}/rememberme/composer.json (100%) rename plugins/login/vendor/{birke => mober}/rememberme/example/action.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/example/css/style.css (100%) rename plugins/login/vendor/{birke => mober}/rememberme/example/index.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/example/templates/cookie_was_stolen.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/example/templates/login.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/example/templates/user_is_logged_in.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/phpunit.xml (100%) rename plugins/login/vendor/{birke => mober}/rememberme/src/Rememberme/Authenticator.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/src/Rememberme/Cookie.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/src/Rememberme/Storage/DB.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/src/Rememberme/Storage/File.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/src/Rememberme/Storage/PDO.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/src/Rememberme/Storage/StorageInterface.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/test/CookieTest.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/test/RemembermeTest.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/test/Storage/PDO.php (100%) rename plugins/login/vendor/{birke => mober}/rememberme/test/Storage/tokens.xml (100%) rename plugins/login/vendor/{birke => mober}/rememberme/test/bootstrap.php (100%) create mode 100644 themes/quark/.gitignore create mode 100644 themes/quark/blueprints/modular.yaml create mode 100644 themes/quark/templates/comments.html.twig create mode 100644 themes/quark/yarn.lock diff --git a/pages/01.home/modular.md b/pages/01.home/modular.md index 27ecd1e..82662a3 100644 --- a/pages/01.home/modular.md +++ b/pages/01.home/modular.md @@ -1,5 +1,5 @@ --- -onpage_menu: true +onpage_menu: '1' body_classes: 'title-h1h2 header-dark header-transparent' content: items: '@self.modular' @@ -7,6 +7,6 @@ menu: LT24 taxonomy: tag: - hidden -published: false +published: true --- diff --git a/plugins/admin/CHANGELOG.md b/plugins/admin/CHANGELOG.md index 0f941ab..d9e23d6 100644 --- a/plugins/admin/CHANGELOG.md +++ b/plugins/admin/CHANGELOG.md @@ -1,3 +1,24 @@ +# v1.10.49.1 +## 09/03/2025 + +1. [](#bugfix) + * Fixed several JS issues with Notifications and Scheduler + +# v1.10.49 +## 08/25/2025 + +1. [](#new) + * Upgraded to very latest FontAwesome 7.0 with custom ForkAwesome Shim + * Support for enhanced Scheduler in admin + * PHP 8.4 compatibility +1. [](#improved) + * Vendor libraries updated + * Added translations for Fetchpriority Trait [#2436](https://github.com/getgrav/grav-plugin-admin/pull/2346) + * Other various missing langs strings added to 'english' translation +1. [](#bugfix) + * Fix `force_ssl` use schema instead of server var [#2435](https://github.com/getgrav/grav-plugin-admin/pull/2345) + * Fix for fully turning off notifications JS + # v1.10.48 ## 10/28/2024 diff --git a/plugins/admin/admin.php b/plugins/admin/admin.php index 123831e..305b768 100644 --- a/plugins/admin/admin.php +++ b/plugins/admin/admin.php @@ -396,9 +396,10 @@ class AdminPlugin extends Plugin // Force SSL with redirect if required if ($config->get('system.force_ssl')) { - if (!isset($_SERVER['HTTPS']) || strtolower($_SERVER['HTTPS']) !== 'on') { + $scheme = $this->uri->scheme(true); + if ($scheme !== 'https') { Admin::DEBUG && Admin::addDebugMessage('Admin SSL forced on, redirect'); - $url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; + $url = 'https://' . $this->uri->host() . $this->uri->uri(); $this->grav->redirect($url); } } diff --git a/plugins/admin/blueprints.yaml b/plugins/admin/blueprints.yaml index 921e11e..2a6b038 100644 --- a/plugins/admin/blueprints.yaml +++ b/plugins/admin/blueprints.yaml @@ -1,7 +1,7 @@ name: Admin Panel slug: admin type: plugin -version: 1.10.48 +version: 1.10.49.1 description: Adds an advanced administration panel to manage your site icon: empire author: @@ -15,7 +15,7 @@ docs: https://github.com/getgrav/grav-plugin-admin/blob/develop/README.md license: MIT dependencies: - - { name: grav, version: '>=1.7.42' } + - { name: grav, version: '>=1.7.49' } - { name: form, version: '>=6.0.1' } - { name: login, version: '>=3.7.8' } - { name: email, version: '>=3.1.6' } diff --git a/plugins/admin/classes/plugin/Admin.php b/plugins/admin/classes/plugin/Admin.php index df1c735..56958e5 100644 --- a/plugins/admin/classes/plugin/Admin.php +++ b/plugins/admin/classes/plugin/Admin.php @@ -2413,7 +2413,7 @@ class Admin */ public function getLogFiles() { - $logs = new GravData(['grav.log' => 'Grav System Log', 'email.log' => 'Email Log']); + $logs = new GravData(['grav.log' => 'Grav System Log', 'email.log' => 'Email Log', 'scheduler.log' => 'Scheduler Log']); Grav::instance()->fireEvent('onAdminLogFiles', new Event(['logs' => &$logs])); return $logs->toArray(); } diff --git a/plugins/admin/composer.json b/plugins/admin/composer.json index 328482a..a836d2e 100644 --- a/plugins/admin/composer.json +++ b/plugins/admin/composer.json @@ -22,20 +22,18 @@ "require": { "php": "^7.3.6 || ^8.0", "ext-json": "*", - "scssphp/scssphp": "^1.11", - "laminas/laminas-zendframework-bridge": "^1.4", - "p3k/picofeed": "@stable" + "scssphp/scssphp": "^1.13", + "p3k/picofeed": "^1.0" }, "require-dev": { - "codeception/codeception": "^2.4", - "fzaninotto/faker": "^1.8", + "codeception/codeception": "^2.5", + "fzaninotto/faker": "^1.9", "symfony/yaml": "~4.4", "symfony/console": "~4.4", "symfony/finder": "~4.4", "symfony/event-dispatcher": "~4.4" }, "replace": { - "symfony/polyfill-php72": "*", "symfony/polyfill-php73": "*" }, "autoload": { diff --git a/plugins/admin/composer.lock b/plugins/admin/composer.lock index 6e850a0..e0ed410 100644 --- a/plugins/admin/composer.lock +++ b/plugins/admin/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bc8a9ba032ce28a2c93282b6f1a6e7b9", + "content-hash": "a7aa8659d733e6cb2b5a6e4c6754cc6e", "packages": [ { "name": "laminas/laminas-xml", @@ -66,68 +66,6 @@ ], "time": "2021-11-30T02:16:35+00:00" }, - { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "88bf037259869891afce6504cacc4f8a07b24d0f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/88bf037259869891afce6504cacc4f8a07b24d0f", - "reference": "88bf037259869891afce6504cacc4f8a07b24d0f", - "shasum": "" - }, - "require": { - "php": "^7.3 || ~8.0.0 || ~8.1.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "psalm/plugin-phpunit": "^0.15.1", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.6" - }, - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "support": { - "forum": "https://discourse.laminas.dev/", - "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", - "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", - "source": "https://github.com/laminas/laminas-zendframework-bridge" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2021-12-21T14:34:37+00:00" - }, { "name": "p3k/picofeed", "version": "1.0.0", @@ -188,16 +126,16 @@ }, { "name": "scssphp/scssphp", - "version": "v1.11.0", + "version": "v1.13.0", "source": { "type": "git", "url": "https://github.com/scssphp/scssphp.git", - "reference": "33749d12c2569bb24071f94e9af828662dabb068" + "reference": "63d1157457e5554edf00b0c1fabab4c1511d2520" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scssphp/scssphp/zipball/33749d12c2569bb24071f94e9af828662dabb068", - "reference": "33749d12c2569bb24071f94e9af828662dabb068", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/63d1157457e5554edf00b0c1fabab4c1511d2520", + "reference": "63d1157457e5554edf00b0c1fabab4c1511d2520", "shasum": "" }, "require": { @@ -214,7 +152,7 @@ "thoughtbot/bourbon": "^7.0", "twbs/bootstrap": "~5.0", "twbs/bootstrap4": "4.6.1", - "zurb/foundation": "~6.5" + "zurb/foundation": "~6.7.0" }, "suggest": { "ext-iconv": "Can be used as fallback when ext-mbstring is not available", @@ -226,8 +164,8 @@ "type": "library", "extra": { "bamarni-bin": { - "forward-command": false, - "bin-links": false + "bin-links": false, + "forward-command": false } }, "autoload": { @@ -262,33 +200,33 @@ ], "support": { "issues": "https://github.com/scssphp/scssphp/issues", - "source": "https://github.com/scssphp/scssphp/tree/v1.11.0" + "source": "https://github.com/scssphp/scssphp/tree/v1.13.0" }, - "time": "2022-09-02T21:24:55+00:00" + "time": "2024-08-17T21:02:11+00:00" } ], "packages-dev": [ { "name": "behat/gherkin", - "version": "v4.9.0", + "version": "v4.10.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4" + "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4", - "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6", + "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6", "shasum": "" }, "require": { "php": "~7.2|~8.0" }, "require-dev": { - "cucumber/cucumber": "dev-gherkin-22.0.0", + "cucumber/cucumber": "dev-gherkin-24.1.0", "phpunit/phpunit": "~8|~9", - "symfony/yaml": "~3|~4|~5" + "symfony/yaml": "~3|~4|~5|~6|~7" }, "suggest": { "symfony/yaml": "If you want to parse features, represented in YAML files" @@ -327,9 +265,9 @@ ], "support": { "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.9.0" + "source": "https://github.com/Behat/Gherkin/tree/v4.10.0" }, - "time": "2021-10-12T13:05:09+00:00" + "time": "2024-10-19T14:46:06+00:00" }, { "name": "codeception/codeception", @@ -508,6 +446,51 @@ }, "time": "2019-03-02T15:35:10+00:00" }, + { + "name": "doctrine/deprecations", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "1.4.10 || 2.0.3", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + }, + "time": "2024-12-07T21:18:45+00:00" + }, { "name": "doctrine/instantiator", "version": "1.5.0", @@ -1000,16 +983,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", "shasum": "" }, "require": { @@ -1017,11 +1000,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -1047,7 +1031,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" }, "funding": [ { @@ -1055,7 +1039,7 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-11-08T17:47:46+00:00" }, { "name": "phar-io/manifest", @@ -1279,25 +1263,33 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.1", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" }, "require-dev": { "ext-tokenizer": "*", - "psalm/phar": "^4.8" + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" }, "type": "library", "extra": { @@ -1323,35 +1315,36 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" }, - "time": "2022-03-15T21:29:03+00:00" + "time": "2024-11-09T15:12:26+00:00" }, { "name": "phpspec/prophecy", - "version": "v1.17.0", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "15873c65b207b07765dbc3c95d20fdf4a320cbe2" + "reference": "a0165c648cab6a80311c74ffc708a07bb53ecc93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/15873c65b207b07765dbc3c95d20fdf4a320cbe2", - "reference": "15873c65b207b07765dbc3c95d20fdf4a320cbe2", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/a0165c648cab6a80311c74ffc708a07bb53ecc93", + "reference": "a0165c648cab6a80311c74ffc708a07bb53ecc93", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2 || ^2.0", - "php": "^7.2 || 8.0.* || 8.1.* || 8.2.*", + "php": "^7.2 || 8.0.* || 8.1.* || 8.2.* || 8.3.* || 8.4.*", "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" + "sebastian/comparator": "^3.0 || ^4.0 || ^5.0 || ^6.0", + "sebastian/recursion-context": "^3.0 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { + "friendsofphp/php-cs-fixer": "^3.40", "phpspec/phpspec": "^6.0 || ^7.0", "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^8.0 || ^9.0" + "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0" }, "type": "library", "extra": { @@ -1384,6 +1377,7 @@ "keywords": [ "Double", "Dummy", + "dev", "fake", "mock", "spy", @@ -1391,9 +1385,56 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.17.0" + "source": "https://github.com/phpspec/prophecy/tree/v1.20.0" }, - "time": "2023-02-02T15:41:36+00:00" + "time": "2024-11-19T13:12:41+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.33.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.33.0" + }, + "time": "2024-10-13T11:25:22+00:00" }, { "name": "phpunit/php-code-coverage", @@ -1464,16 +1505,16 @@ }, { "name": "phpunit/php-file-iterator", - "version": "2.0.5", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5" + "reference": "69deeb8664f611f156a924154985fbd4911eb36b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/69deeb8664f611f156a924154985fbd4911eb36b", + "reference": "69deeb8664f611f156a924154985fbd4911eb36b", "shasum": "" }, "require": { @@ -1512,7 +1553,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.6" }, "funding": [ { @@ -1520,7 +1561,7 @@ "type": "github" } ], - "time": "2021-12-02T12:42:26+00:00" + "time": "2024-03-01T13:39:50+00:00" }, { "name": "phpunit/php-text-template", @@ -1569,16 +1610,16 @@ }, { "name": "phpunit/php-timer", - "version": "2.1.3", + "version": "2.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" + "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a691211e94ff39a34811abd521c31bd5b305b0bb", + "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb", "shasum": "" }, "require": { @@ -1616,7 +1657,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" + "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.4" }, "funding": [ { @@ -1624,7 +1665,7 @@ "type": "github" } ], - "time": "2020-11-30T08:20:02+00:00" + "time": "2024-03-01T13:42:41+00:00" }, { "name": "phpunit/php-token-stream", @@ -1921,16 +1962,16 @@ }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" + "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", + "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", "shasum": "" }, "require": { @@ -1964,7 +2005,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.3" }, "funding": [ { @@ -1972,7 +2013,7 @@ "type": "github" } ], - "time": "2020-11-30T08:15:22+00:00" + "time": "2024-03-01T13:45:45+00:00" }, { "name": "sebastian/comparator", @@ -2050,16 +2091,16 @@ }, { "name": "sebastian/diff", - "version": "3.0.4", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae" + "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/6296a0c086dd0117c1b78b059374d7fcbe7545ae", - "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/98ff311ca519c3aa73ccd3de053bdb377171d7b6", + "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6", "shasum": "" }, "require": { @@ -2104,7 +2145,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/3.0.6" }, "funding": [ { @@ -2112,20 +2153,20 @@ "type": "github" } ], - "time": "2023-05-07T05:30:20+00:00" + "time": "2024-03-02T06:16:36+00:00" }, { "name": "sebastian/environment", - "version": "4.2.4", + "version": "4.2.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" + "reference": "56932f6049a0482853056ffd617c91ffcc754205" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/56932f6049a0482853056ffd617c91ffcc754205", + "reference": "56932f6049a0482853056ffd617c91ffcc754205", "shasum": "" }, "require": { @@ -2167,7 +2208,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" + "source": "https://github.com/sebastianbergmann/environment/tree/4.2.5" }, "funding": [ { @@ -2175,24 +2216,24 @@ "type": "github" } ], - "time": "2020-11-30T07:53:42+00:00" + "time": "2024-03-01T13:49:59+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.5", + "version": "3.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6" + "reference": "1939bc8fd1d39adcfa88c5b35335910869214c56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6", - "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/1939bc8fd1d39adcfa88c5b35335910869214c56", + "reference": "1939bc8fd1d39adcfa88c5b35335910869214c56", "shasum": "" }, "require": { - "php": ">=7.0", + "php": ">=7.2", "sebastian/recursion-context": "^3.0" }, "require-dev": { @@ -2244,7 +2285,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.6" }, "funding": [ { @@ -2252,7 +2293,7 @@ "type": "github" } ], - "time": "2022-09-14T06:00:17+00:00" + "time": "2024-03-02T06:21:38+00:00" }, { "name": "sebastian/global-state", @@ -2311,16 +2352,16 @@ }, { "name": "sebastian/object-enumerator", - "version": "3.0.4", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" + "reference": "ac5b293dba925751b808e02923399fb44ff0d541" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/ac5b293dba925751b808e02923399fb44ff0d541", + "reference": "ac5b293dba925751b808e02923399fb44ff0d541", "shasum": "" }, "require": { @@ -2356,7 +2397,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.5" }, "funding": [ { @@ -2364,20 +2405,20 @@ "type": "github" } ], - "time": "2020-11-30T07:40:27+00:00" + "time": "2024-03-01T13:54:02+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" + "reference": "1d439c229e61f244ff1f211e5c99737f90c67def" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d439c229e61f244ff1f211e5c99737f90c67def", + "reference": "1d439c229e61f244ff1f211e5c99737f90c67def", "shasum": "" }, "require": { @@ -2411,7 +2452,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.3" }, "funding": [ { @@ -2419,20 +2460,20 @@ "type": "github" } ], - "time": "2020-11-30T07:37:18+00:00" + "time": "2024-03-01T13:56:04+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" + "reference": "9bfd3c6f1f08c026f542032dfb42813544f7d64c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/9bfd3c6f1f08c026f542032dfb42813544f7d64c", + "reference": "9bfd3c6f1f08c026f542032dfb42813544f7d64c", "shasum": "" }, "require": { @@ -2474,7 +2515,7 @@ "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.2" }, "funding": [ { @@ -2482,20 +2523,20 @@ "type": "github" } ], - "time": "2020-11-30T07:34:24+00:00" + "time": "2024-03-01T14:07:30+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" + "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/72a7f7674d053d548003b16ff5a106e7e0e06eee", + "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee", "shasum": "" }, "require": { @@ -2525,8 +2566,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.3" }, "funding": [ { @@ -2534,7 +2574,7 @@ "type": "github" } ], - "time": "2020-11-30T07:30:19+00:00" + "time": "2024-03-01T13:59:09+00:00" }, { "name": "sebastian/version", @@ -2813,16 +2853,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", "shasum": "" }, "require": { @@ -2860,7 +2900,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4" }, "funding": [ { @@ -2876,7 +2916,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/dom-crawler", @@ -3038,16 +3078,16 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.13", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e" + "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/1d5cd762abaa6b2a4169d3e77610193a7157129e", - "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/761c8b8387cfe5f8026594a75fdf0a4e83ba6974", + "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974", "shasum": "" }, "require": { @@ -3097,7 +3137,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.13" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.10.0" }, "funding": [ { @@ -3113,7 +3153,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:41:36+00:00" + "time": "2022-07-20T09:59:04+00:00" }, { "name": "symfony/finder", @@ -3179,20 +3219,20 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -3202,12 +3242,9 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -3241,7 +3278,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -3257,35 +3294,31 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.28.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3328,7 +3361,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -3344,36 +3377,33 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:30:37+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -3412,7 +3442,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -3428,24 +3458,24 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -3455,9 +3485,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3495,7 +3522,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -3511,33 +3538,30 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -3578,7 +3602,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -3594,7 +3618,7 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", @@ -3660,16 +3684,16 @@ }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", "shasum": "" }, "require": { @@ -3723,7 +3747,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.4" }, "funding": [ { @@ -3739,7 +3763,7 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/yaml", @@ -3814,16 +3838,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -3852,7 +3876,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -3860,7 +3884,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2024-03-03T12:36:25+00:00" }, { "name": "webmozart/assert", @@ -3923,18 +3947,16 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "p3k/picofeed": 0 - }, + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { "php": "^7.3.6 || ^8.0", "ext-json": "*" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { "php": "7.3.6" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/plugins/admin/languages/en.yaml b/plugins/admin/languages/en.yaml index 2f3ec86..9738edc 100644 --- a/plugins/admin/languages/en.yaml +++ b/plugins/admin/languages/en.yaml @@ -383,6 +383,8 @@ PLUGIN_ADMIN: CACHE_JOB_TYPE: "Cache Job Type" CACHE_JOB_TYPE_HELP: "Either clear with the 'standard' folders cache clear, or with 'all' folders" CACHE_PURGE: "Purge Old Cache" + CACHE_PURGE_AGE: "Cache Purge Age" + CACHE_PURGE_AGE_HELP: "Purge all cache items older than this age (in seconds)" LIFETIME: "Lifetime" LIFETIME_HELP: "Sets the cache lifetime in seconds. 0 = infinite" GZIP_COMPRESSION: "Gzip compression" @@ -449,6 +451,8 @@ PLUGIN_ADMIN: DEBUG_TWIG_HELP: "Enable debugging of Twig templates" SHUTDOWN_CLOSE_CONNECTION: "Shutdown close connection" SHUTDOWN_CLOSE_CONNECTION_HELP: "Close the connection before calling onShutdown(). false for debugging" + IMAGE_ADAPTER: "Image Adapter" + IMAGE_ADAPTER_HELP: "The image adapter to use for image manipulation. 'GD' is the default, 'Imagick' is an alternative" DEFAULT_IMAGE_QUALITY: "Default image quality" DEFAULT_IMAGE_QUALITY_HELP: "Default image quality to use when resampling or caching images (85%)" CACHE_ALL: "Cache all images" @@ -459,6 +463,8 @@ PLUGIN_ADMIN: IMAGES_LOADING_HELP: "The loading attribute allows a browser to defer loading offscreen images and iframes until users scroll near them. loading supports three values: auto, lazy, eager" IMAGES_DECODING: "Image decoding behavior" IMAGES_DECODING_HELP: "The decoding attribute allows a browser to defer decoding offscreen images until users scroll near them. decoding supports three values: auto, sync, async" + IMAGES_FETCHPRIORITY: "Image Fetchpriority Property" + IMAGES_FETCHPRIORITY_HELP: "The fetchpriority property in HTML is an attribute that specifies the priority for loading certain resources, such as images or iframes, to optimize performance. Possible values are high, low, or auto." # Removed in Grav 1.8 IMAGES_SEOFRIENDLY: "SEO-Friendly Image names" IMAGES_SEOFRIENDLY_HELP: "When enabled, the image name is displayed first, then a smaller hash to reflect processed operations" @@ -794,7 +800,7 @@ PLUGIN_ADMIN: STRICT_TWIG_COMPAT_HELP: "Enables deprecated Twig autoescape setting. When disabled, |raw filter is required to output HTML as Twig will autoescape output" SCHEDULER: "Scheduler" SCHEDULER_INSTALL_INSTRUCTIONS: "Install Instructions" - SCHEDULER_INSTALLED_READY: "Installed and Ready" + SCHEDULER_INSTALLED_READY: "Scheduler Ready" SCHEDULER_CRON_NA: "Cron Not Available for user: %s" SCHEDULER_NOT_ENABLED: "Not Enabled for user: %s" SCHEDULER_SETUP: "Scheduler Setup" @@ -810,7 +816,7 @@ PLUGIN_ADMIN: SCHEDULER_OUTPUT_TYPE_HELP: "Either append to the same file each run, or overwrite the file with each run" SCHEDULER_EMAIL: "Email" SCHEDULER_EMAIL_HELP: "Email to send output to. NOTE: requires output file to be set" - SCHEDULER_WARNING: "The scheduler uses your system's crontab system to execute commands. You should use this only if you are an advanced user and know what you are doing. Misconfiguration or abuse can lead to security vulnerabilities." + SCHEDULER_WARNING: "The scheduler can use either system crontab or webhook triggers to execute commands. Webhooks are recommended for cloud environments. Only advanced users should configure custom jobs. Misconfiguration or abuse can lead to security vulnerabilities." SECURITY: "Security" XSS_SECURITY: "XSS Security for Content" XSS_WHITELIST_PERMISSIONS: "Whitelist Permissions" diff --git a/plugins/admin/languages/es.yaml b/plugins/admin/languages/es.yaml index 5867370..df72388 100644 --- a/plugins/admin/languages/es.yaml +++ b/plugins/admin/languages/es.yaml @@ -460,6 +460,8 @@ PLUGIN_ADMIN: IMAGES_LOADING_HELP: "El atributo cargando, permite al navegador diferir la carga de las imágenes que están fuera de pantalla y los iframes, hasta que el usuario se acerca a ellos. Cargando soporta tres valores: auto, lazy, eager" IMAGES_DECODING: "Comportamiento de decodificación de imágenes" IMAGES_DECODING_HELP: "El atributo de decodificación permite a un navegador posponer la decodificación de imágenes fuera de la pantalla hasta que los usuarios se desplacen cerca de ellas. la decodificación admite tres valores: auto, sync, async" + IMAGES_FETCHPRIORITY: Propiedad de Imagen Fetchpriority" + IMAGES_FETCHPRIORITY_HELP: "La propiedad fetchpriority en HTML es un atributo que permite indicar la prioridad con la que los navegadores deben cargar ciertos recursos, como imágenes o iframes, optimizando el rendimiento. Los valores posibles son high, low o auto." #Removed in Grav 1.8 IMAGES_SEOFRIENDLY: "Nombres de imágenes SEO-Friendly" IMAGES_SEOFRIENDLY_HELP: "Cuando está activado, el nombre de la imagen se muestra primero, luego un hash menor para reflejar las operaciones procesadas" diff --git a/plugins/admin/themes/grav/app/forms/state.js b/plugins/admin/themes/grav/app/forms/state.js index 01d069f..4356e3d 100644 --- a/plugins/admin/themes/grav/app/forms/state.js +++ b/plugins/admin/themes/grav/app/forms/state.js @@ -13,8 +13,15 @@ const DOMBehaviors = { preventUnload() { let selector = '[name="task"][value^="save"], [data-delete-action], [data-flex-safe-action]'; - if ($._data(window, 'events') && ($._data(window, 'events').beforeunload || []).filter((event) => event.namespace === '_grav').length) { - return; + // jQuery 3.x removed $._data, use $._data only if available (jQuery < 3.0) + // or check with jQuery's internal data store for jQuery >= 3.0 + try { + const hasData = typeof $._data === 'function'; + if (hasData && $._data(window, 'events') && ($._data(window, 'events').beforeunload || []).filter((event) => event.namespace === '_grav').length) { + return; + } + } catch (e) { + // $._data not available in jQuery 3.x+, continue with adding event handler } // Allow some elements to leave the page without native confirmation @@ -33,8 +40,15 @@ const DOMBehaviors = { preventClickAway() { let selector = 'a[href]:not([href^="#"]):not([target="_blank"]):not([href^="javascript:"])'; - if ($._data($(selector).get(0), 'events') && ($._data($(selector).get(0), 'events').click || []).filter((event) => event.namespace === '_grav')) { - return; + // jQuery 3.x removed $._data, use $._data only if available (jQuery < 3.0) + try { + const hasData = typeof $._data === 'function'; + const element = $(selector).get(0); + if (element && hasData && $._data(element, 'events') && ($._data(element, 'events').click || []).filter((event) => event.namespace === '_grav')) { + return; + } + } catch (e) { + // $._data not available in jQuery 3.x+, continue with adding event handler } // Prevent clicking away if the form state is dirty diff --git a/plugins/admin/themes/grav/app/updates/index.js b/plugins/admin/themes/grav/app/updates/index.js index 31f5151..6284e6d 100644 --- a/plugins/admin/themes/grav/app/updates/index.js +++ b/plugins/admin/themes/grav/app/updates/index.js @@ -99,7 +99,7 @@ export default class Updates { if (!this.payload.resources.total) { return this; } [plugins, themes].forEach(function(resources, index) { - if (!resources || Array.isArray(resources)) { return; } + if (!resources || Array.isArray(resources) || typeof resources !== 'object') { return; } let length = Object.keys(resources).length; let type = map[index]; diff --git a/plugins/admin/themes/grav/app/updates/update.js b/plugins/admin/themes/grav/app/updates/update.js index 851486a..5878bed 100644 --- a/plugins/admin/themes/grav/app/updates/update.js +++ b/plugins/admin/themes/grav/app/updates/update.js @@ -7,7 +7,18 @@ import { Instance as Update } from './index'; // Dashboard update and Grav update $(document).on('click.remodal', '[data-remodal-id="update-grav"] [data-remodal-action="confirm"]', () => { const element = $('#grav-update-button'); - element.html(`${translations.PLUGIN_ADMIN.UPDATING_PLEASE_WAIT} ${formatBytes(Update.payload.grav.assets['grav-update'].size)}..`); + + // Safely get the file size with fallback + let sizeText = ''; + if (Update.payload && + Update.payload.grav && + Update.payload.grav.assets && + Update.payload.grav.assets['grav-update'] && + Update.payload.grav.assets['grav-update'].size) { + sizeText = ` ${formatBytes(Update.payload.grav.assets['grav-update'].size)}`; + } + + element.html(`${translations.PLUGIN_ADMIN.UPDATING_PLEASE_WAIT}${sizeText}..`); element.attr('disabled', 'disabled').find('> .fa').removeClass('fa-cloud-download').addClass('fa-refresh fa-spin'); diff --git a/plugins/admin/themes/grav/app/utils/request.js b/plugins/admin/themes/grav/app/utils/request.js index 2b7911f..b5a2f0e 100644 --- a/plugins/admin/themes/grav/app/utils/request.js +++ b/plugins/admin/themes/grav/app/utils/request.js @@ -12,7 +12,9 @@ let request = function(url, options = {}, callback = () => true) { let data = new FormData(); options.body = Object.assign({ 'admin-nonce': config.admin_nonce }, options.body || {}); - Object.keys(options.body).map((key) => data.append(key, options.body[key])); + if (options.body && typeof options.body === 'object') { + Object.keys(options.body).map((key) => data.append(key, options.body[key])); + } options.body = data; } diff --git a/plugins/admin/themes/grav/app/utils/response.js b/plugins/admin/themes/grav/app/utils/response.js index 9cb8d05..6bcde80 100644 --- a/plugins/admin/themes/grav/app/utils/response.js +++ b/plugins/admin/themes/grav/app/utils/response.js @@ -73,7 +73,7 @@ export function userFeedback(response) { break; } - if (settings) { + if (settings && typeof settings === 'object' && settings !== null) { backup = Object.assign({}, toastr.options); Object.keys(settings).forEach((key) => { toastr.options[key] = settings[key]; }); } diff --git a/plugins/admin/themes/grav/css/fontawesome7.min.css b/plugins/admin/themes/grav/css/fontawesome7.min.css new file mode 100644 index 0000000..6591894 --- /dev/null +++ b/plugins/admin/themes/grav/css/fontawesome7.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2025 Fonticons, Inc. + */ +.fa,.fa-brands,.fa-classic,.fa-regular,.fa-solid,.fab,.far,.fas{--_fa-family:var(--fa-family,var(--fa-style-family,"Font Awesome 7 Free"));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:var(--fa-display,inline-block);font-family:var(--_fa-family);font-feature-settings:normal;font-style:normal;font-synthesis:none;font-variant:normal;font-weight:var(--fa-style,900);line-height:1;text-align:center;text-rendering:auto;width:var(--fa-width,1.25em)}:is(.fas,.far,.fab,.fa-solid,.fa-regular,.fa-brands,.fa-classic,.fa):before{content:var(--fa);content:var(--fa)/""}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-width-auto{--fa-width:auto}.fa-fw,.fa-width-fixed{--fa-width:1.25em}.fa-ul{list-style-type:none;margin-inline-start:var(--fa-li-margin,2.5em);padding-inline-start:0}.fa-ul>li{position:relative}.fa-li{inset-inline-start:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.0625em) var(--fa-border-style,solid) var(--fa-border-color,#eee);box-sizing:var(--fa-border-box-sizing,content-box);padding:var(--fa-border-padding,.1875em .25em)}.fa-pull-left,.fa-pull-start{float:inline-start;margin-inline-end:var(--fa-pull-margin,.3em)}.fa-pull-end,.fa-pull-right{float:inline-end;margin-inline-start:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation:none!important;transition:none!important}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} + +.fa-0{--fa:"\30 "}.fa-1{--fa:"\31 "}.fa-2{--fa:"\32 "}.fa-3{--fa:"\33 "}.fa-4{--fa:"\34 "}.fa-5{--fa:"\35 "}.fa-6{--fa:"\36 "}.fa-7{--fa:"\37 "}.fa-8{--fa:"\38 "}.fa-9{--fa:"\39 "}.fa-exclamation{--fa:"\!"}.fa-hashtag{--fa:"\#"}.fa-dollar,.fa-dollar-sign,.fa-usd{--fa:"\$"}.fa-percent,.fa-percentage{--fa:"\%"}.fa-asterisk{--fa:"\*"}.fa-add,.fa-plus{--fa:"\+"}.fa-less-than{--fa:"\<"}.fa-equals{--fa:"\="}.fa-greater-than{--fa:"\>"}.fa-question{--fa:"\?"}.fa-at{--fa:"\@"}.fa-a{--fa:"A"}.fa-b{--fa:"B"}.fa-c{--fa:"C"}.fa-d{--fa:"D"}.fa-e{--fa:"E"}.fa-f{--fa:"F"}.fa-g{--fa:"G"}.fa-h{--fa:"H"}.fa-i{--fa:"I"}.fa-j{--fa:"J"}.fa-k{--fa:"K"}.fa-l{--fa:"L"}.fa-m{--fa:"M"}.fa-n{--fa:"N"}.fa-o{--fa:"O"}.fa-p{--fa:"P"}.fa-q{--fa:"Q"}.fa-r{--fa:"R"}.fa-s{--fa:"S"}.fa-t{--fa:"T"}.fa-u{--fa:"U"}.fa-v{--fa:"V"}.fa-w{--fa:"W"}.fa-x{--fa:"X"}.fa-y{--fa:"Y"}.fa-z{--fa:"Z"}.fa-faucet{--fa:"\e005"}.fa-faucet-drip{--fa:"\e006"}.fa-house-chimney-window{--fa:"\e00d"}.fa-house-signal{--fa:"\e012"}.fa-temperature-arrow-down,.fa-temperature-down{--fa:"\e03f"}.fa-temperature-arrow-up,.fa-temperature-up{--fa:"\e040"}.fa-trailer{--fa:"\e041"}.fa-bacteria{--fa:"\e059"}.fa-bacterium{--fa:"\e05a"}.fa-box-tissue{--fa:"\e05b"}.fa-hand-holding-medical{--fa:"\e05c"}.fa-hand-sparkles{--fa:"\e05d"}.fa-hands-bubbles,.fa-hands-wash{--fa:"\e05e"}.fa-handshake-alt-slash,.fa-handshake-simple-slash,.fa-handshake-slash{--fa:"\e060"}.fa-head-side-cough{--fa:"\e061"}.fa-head-side-cough-slash{--fa:"\e062"}.fa-head-side-mask{--fa:"\e063"}.fa-head-side-virus{--fa:"\e064"}.fa-house-chimney-user{--fa:"\e065"}.fa-house-laptop,.fa-laptop-house{--fa:"\e066"}.fa-lungs-virus{--fa:"\e067"}.fa-people-arrows,.fa-people-arrows-left-right{--fa:"\e068"}.fa-plane-slash{--fa:"\e069"}.fa-pump-medical{--fa:"\e06a"}.fa-pump-soap{--fa:"\e06b"}.fa-shield-virus{--fa:"\e06c"}.fa-sink{--fa:"\e06d"}.fa-soap{--fa:"\e06e"}.fa-stopwatch-20{--fa:"\e06f"}.fa-shop-slash,.fa-store-alt-slash{--fa:"\e070"}.fa-store-slash{--fa:"\e071"}.fa-toilet-paper-slash{--fa:"\e072"}.fa-users-slash{--fa:"\e073"}.fa-virus{--fa:"\e074"}.fa-virus-slash{--fa:"\e075"}.fa-viruses{--fa:"\e076"}.fa-vest{--fa:"\e085"}.fa-vest-patches{--fa:"\e086"}.fa-arrow-trend-down{--fa:"\e097"}.fa-arrow-trend-up{--fa:"\e098"}.fa-arrow-up-from-bracket{--fa:"\e09a"}.fa-austral-sign{--fa:"\e0a9"}.fa-baht-sign{--fa:"\e0ac"}.fa-bitcoin-sign{--fa:"\e0b4"}.fa-bolt-lightning{--fa:"\e0b7"}.fa-book-bookmark{--fa:"\e0bb"}.fa-camera-rotate{--fa:"\e0d8"}.fa-cedi-sign{--fa:"\e0df"}.fa-chart-column{--fa:"\e0e3"}.fa-chart-gantt{--fa:"\e0e4"}.fa-clapperboard{--fa:"\e131"}.fa-clover{--fa:"\e139"}.fa-code-compare{--fa:"\e13a"}.fa-code-fork{--fa:"\e13b"}.fa-code-pull-request{--fa:"\e13c"}.fa-colon-sign{--fa:"\e140"}.fa-cruzeiro-sign{--fa:"\e152"}.fa-display{--fa:"\e163"}.fa-dong-sign{--fa:"\e169"}.fa-elevator{--fa:"\e16d"}.fa-filter-circle-xmark{--fa:"\e17b"}.fa-florin-sign{--fa:"\e184"}.fa-folder-closed{--fa:"\e185"}.fa-franc-sign{--fa:"\e18f"}.fa-guarani-sign{--fa:"\e19a"}.fa-gun{--fa:"\e19b"}.fa-hands-clapping{--fa:"\e1a8"}.fa-home-user,.fa-house-user{--fa:"\e1b0"}.fa-indian-rupee,.fa-indian-rupee-sign,.fa-inr{--fa:"\e1bc"}.fa-kip-sign{--fa:"\e1c4"}.fa-lari-sign{--fa:"\e1c8"}.fa-litecoin-sign{--fa:"\e1d3"}.fa-manat-sign{--fa:"\e1d5"}.fa-mask-face{--fa:"\e1d7"}.fa-mill-sign{--fa:"\e1ed"}.fa-money-bills{--fa:"\e1f3"}.fa-naira-sign{--fa:"\e1f6"}.fa-notdef{--fa:"\e1fe"}.fa-panorama{--fa:"\e209"}.fa-peseta-sign{--fa:"\e221"}.fa-peso-sign{--fa:"\e222"}.fa-plane-up{--fa:"\e22d"}.fa-rupiah-sign{--fa:"\e23d"}.fa-stairs{--fa:"\e289"}.fa-timeline{--fa:"\e29c"}.fa-truck-front{--fa:"\e2b7"}.fa-try,.fa-turkish-lira,.fa-turkish-lira-sign{--fa:"\e2bb"}.fa-vault{--fa:"\e2c5"}.fa-magic-wand-sparkles,.fa-wand-magic-sparkles{--fa:"\e2ca"}.fa-wheat-alt,.fa-wheat-awn{--fa:"\e2cd"}.fa-wheelchair-alt,.fa-wheelchair-move{--fa:"\e2ce"}.fa-bangladeshi-taka-sign{--fa:"\e2e6"}.fa-bowl-rice{--fa:"\e2eb"}.fa-person-pregnant{--fa:"\e31e"}.fa-home-lg,.fa-house-chimney{--fa:"\e3af"}.fa-house-crack{--fa:"\e3b1"}.fa-house-medical{--fa:"\e3b2"}.fa-cent-sign{--fa:"\e3f5"}.fa-plus-minus{--fa:"\e43c"}.fa-sailboat{--fa:"\e445"}.fa-section{--fa:"\e447"}.fa-shrimp{--fa:"\e448"}.fa-brazilian-real-sign{--fa:"\e46c"}.fa-chart-simple{--fa:"\e473"}.fa-diagram-next{--fa:"\e476"}.fa-diagram-predecessor{--fa:"\e477"}.fa-diagram-successor{--fa:"\e47a"}.fa-earth-oceania,.fa-globe-oceania{--fa:"\e47b"}.fa-bug-slash{--fa:"\e490"}.fa-file-circle-plus{--fa:"\e494"}.fa-shop-lock{--fa:"\e4a5"}.fa-virus-covid{--fa:"\e4a8"}.fa-virus-covid-slash{--fa:"\e4a9"}.fa-anchor-circle-check{--fa:"\e4aa"}.fa-anchor-circle-exclamation{--fa:"\e4ab"}.fa-anchor-circle-xmark{--fa:"\e4ac"}.fa-anchor-lock{--fa:"\e4ad"}.fa-arrow-down-up-across-line{--fa:"\e4af"}.fa-arrow-down-up-lock{--fa:"\e4b0"}.fa-arrow-right-to-city{--fa:"\e4b3"}.fa-arrow-up-from-ground-water{--fa:"\e4b5"}.fa-arrow-up-from-water-pump{--fa:"\e4b6"}.fa-arrow-up-right-dots{--fa:"\e4b7"}.fa-arrows-down-to-line{--fa:"\e4b8"}.fa-arrows-down-to-people{--fa:"\e4b9"}.fa-arrows-left-right-to-line{--fa:"\e4ba"}.fa-arrows-spin{--fa:"\e4bb"}.fa-arrows-split-up-and-left{--fa:"\e4bc"}.fa-arrows-to-circle{--fa:"\e4bd"}.fa-arrows-to-dot{--fa:"\e4be"}.fa-arrows-to-eye{--fa:"\e4bf"}.fa-arrows-turn-right{--fa:"\e4c0"}.fa-arrows-turn-to-dots{--fa:"\e4c1"}.fa-arrows-up-to-line{--fa:"\e4c2"}.fa-bore-hole{--fa:"\e4c3"}.fa-bottle-droplet{--fa:"\e4c4"}.fa-bottle-water{--fa:"\e4c5"}.fa-bowl-food{--fa:"\e4c6"}.fa-boxes-packing{--fa:"\e4c7"}.fa-bridge{--fa:"\e4c8"}.fa-bridge-circle-check{--fa:"\e4c9"}.fa-bridge-circle-exclamation{--fa:"\e4ca"}.fa-bridge-circle-xmark{--fa:"\e4cb"}.fa-bridge-lock{--fa:"\e4cc"}.fa-bridge-water{--fa:"\e4ce"}.fa-bucket{--fa:"\e4cf"}.fa-bugs{--fa:"\e4d0"}.fa-building-circle-arrow-right{--fa:"\e4d1"}.fa-building-circle-check{--fa:"\e4d2"}.fa-building-circle-exclamation{--fa:"\e4d3"}.fa-building-circle-xmark{--fa:"\e4d4"}.fa-building-flag{--fa:"\e4d5"}.fa-building-lock{--fa:"\e4d6"}.fa-building-ngo{--fa:"\e4d7"}.fa-building-shield{--fa:"\e4d8"}.fa-building-un{--fa:"\e4d9"}.fa-building-user{--fa:"\e4da"}.fa-building-wheat{--fa:"\e4db"}.fa-burst{--fa:"\e4dc"}.fa-car-on{--fa:"\e4dd"}.fa-car-tunnel{--fa:"\e4de"}.fa-child-combatant,.fa-child-rifle{--fa:"\e4e0"}.fa-children{--fa:"\e4e1"}.fa-circle-nodes{--fa:"\e4e2"}.fa-clipboard-question{--fa:"\e4e3"}.fa-cloud-showers-water{--fa:"\e4e4"}.fa-computer{--fa:"\e4e5"}.fa-cubes-stacked{--fa:"\e4e6"}.fa-envelope-circle-check{--fa:"\e4e8"}.fa-explosion{--fa:"\e4e9"}.fa-ferry{--fa:"\e4ea"}.fa-file-circle-exclamation{--fa:"\e4eb"}.fa-file-circle-minus{--fa:"\e4ed"}.fa-file-circle-question{--fa:"\e4ef"}.fa-file-shield{--fa:"\e4f0"}.fa-fire-burner{--fa:"\e4f1"}.fa-fish-fins{--fa:"\e4f2"}.fa-flask-vial{--fa:"\e4f3"}.fa-glass-water{--fa:"\e4f4"}.fa-glass-water-droplet{--fa:"\e4f5"}.fa-group-arrows-rotate{--fa:"\e4f6"}.fa-hand-holding-hand{--fa:"\e4f7"}.fa-handcuffs{--fa:"\e4f8"}.fa-hands-bound{--fa:"\e4f9"}.fa-hands-holding-child{--fa:"\e4fa"}.fa-hands-holding-circle{--fa:"\e4fb"}.fa-heart-circle-bolt{--fa:"\e4fc"}.fa-heart-circle-check{--fa:"\e4fd"}.fa-heart-circle-exclamation{--fa:"\e4fe"}.fa-heart-circle-minus{--fa:"\e4ff"}.fa-heart-circle-plus{--fa:"\e500"}.fa-heart-circle-xmark{--fa:"\e501"}.fa-helicopter-symbol{--fa:"\e502"}.fa-helmet-un{--fa:"\e503"}.fa-hill-avalanche{--fa:"\e507"}.fa-hill-rockslide{--fa:"\e508"}.fa-house-circle-check{--fa:"\e509"}.fa-house-circle-exclamation{--fa:"\e50a"}.fa-house-circle-xmark{--fa:"\e50b"}.fa-house-fire{--fa:"\e50c"}.fa-house-flag{--fa:"\e50d"}.fa-house-flood-water{--fa:"\e50e"}.fa-house-flood-water-circle-arrow-right{--fa:"\e50f"}.fa-house-lock{--fa:"\e510"}.fa-house-medical-circle-check{--fa:"\e511"}.fa-house-medical-circle-exclamation{--fa:"\e512"}.fa-house-medical-circle-xmark{--fa:"\e513"}.fa-house-medical-flag{--fa:"\e514"}.fa-house-tsunami{--fa:"\e515"}.fa-jar{--fa:"\e516"}.fa-jar-wheat{--fa:"\e517"}.fa-jet-fighter-up{--fa:"\e518"}.fa-jug-detergent{--fa:"\e519"}.fa-kitchen-set{--fa:"\e51a"}.fa-land-mine-on{--fa:"\e51b"}.fa-landmark-flag{--fa:"\e51c"}.fa-laptop-file{--fa:"\e51d"}.fa-lines-leaning{--fa:"\e51e"}.fa-location-pin-lock{--fa:"\e51f"}.fa-locust{--fa:"\e520"}.fa-magnifying-glass-arrow-right{--fa:"\e521"}.fa-magnifying-glass-chart{--fa:"\e522"}.fa-mars-and-venus-burst{--fa:"\e523"}.fa-mask-ventilator{--fa:"\e524"}.fa-mattress-pillow{--fa:"\e525"}.fa-mobile-retro{--fa:"\e527"}.fa-money-bill-transfer{--fa:"\e528"}.fa-money-bill-trend-up{--fa:"\e529"}.fa-money-bill-wheat{--fa:"\e52a"}.fa-mosquito{--fa:"\e52b"}.fa-mosquito-net{--fa:"\e52c"}.fa-mound{--fa:"\e52d"}.fa-mountain-city{--fa:"\e52e"}.fa-mountain-sun{--fa:"\e52f"}.fa-oil-well{--fa:"\e532"}.fa-people-group{--fa:"\e533"}.fa-people-line{--fa:"\e534"}.fa-people-pulling{--fa:"\e535"}.fa-people-robbery{--fa:"\e536"}.fa-people-roof{--fa:"\e537"}.fa-person-arrow-down-to-line{--fa:"\e538"}.fa-person-arrow-up-from-line{--fa:"\e539"}.fa-person-breastfeeding{--fa:"\e53a"}.fa-person-burst{--fa:"\e53b"}.fa-person-cane{--fa:"\e53c"}.fa-person-chalkboard{--fa:"\e53d"}.fa-person-circle-check{--fa:"\e53e"}.fa-person-circle-exclamation{--fa:"\e53f"}.fa-person-circle-minus{--fa:"\e540"}.fa-person-circle-plus{--fa:"\e541"}.fa-person-circle-question{--fa:"\e542"}.fa-person-circle-xmark{--fa:"\e543"}.fa-person-dress-burst{--fa:"\e544"}.fa-person-drowning{--fa:"\e545"}.fa-person-falling{--fa:"\e546"}.fa-person-falling-burst{--fa:"\e547"}.fa-person-half-dress{--fa:"\e548"}.fa-person-harassing{--fa:"\e549"}.fa-person-military-pointing{--fa:"\e54a"}.fa-person-military-rifle{--fa:"\e54b"}.fa-person-military-to-person{--fa:"\e54c"}.fa-person-rays{--fa:"\e54d"}.fa-person-rifle{--fa:"\e54e"}.fa-person-shelter{--fa:"\e54f"}.fa-person-walking-arrow-loop-left{--fa:"\e551"}.fa-person-walking-arrow-right{--fa:"\e552"}.fa-person-walking-dashed-line-arrow-right{--fa:"\e553"}.fa-person-walking-luggage{--fa:"\e554"}.fa-plane-circle-check{--fa:"\e555"}.fa-plane-circle-exclamation{--fa:"\e556"}.fa-plane-circle-xmark{--fa:"\e557"}.fa-plane-lock{--fa:"\e558"}.fa-plate-wheat{--fa:"\e55a"}.fa-plug-circle-bolt{--fa:"\e55b"}.fa-plug-circle-check{--fa:"\e55c"}.fa-plug-circle-exclamation{--fa:"\e55d"}.fa-plug-circle-minus{--fa:"\e55e"}.fa-plug-circle-plus{--fa:"\e55f"}.fa-plug-circle-xmark{--fa:"\e560"}.fa-ranking-star{--fa:"\e561"}.fa-road-barrier{--fa:"\e562"}.fa-road-bridge{--fa:"\e563"}.fa-road-circle-check{--fa:"\e564"}.fa-road-circle-exclamation{--fa:"\e565"}.fa-road-circle-xmark{--fa:"\e566"}.fa-road-lock{--fa:"\e567"}.fa-road-spikes{--fa:"\e568"}.fa-rug{--fa:"\e569"}.fa-sack-xmark{--fa:"\e56a"}.fa-school-circle-check{--fa:"\e56b"}.fa-school-circle-exclamation{--fa:"\e56c"}.fa-school-circle-xmark{--fa:"\e56d"}.fa-school-flag{--fa:"\e56e"}.fa-school-lock{--fa:"\e56f"}.fa-sheet-plastic{--fa:"\e571"}.fa-shield-cat{--fa:"\e572"}.fa-shield-dog{--fa:"\e573"}.fa-shield-heart{--fa:"\e574"}.fa-square-nfi{--fa:"\e576"}.fa-square-person-confined{--fa:"\e577"}.fa-square-virus{--fa:"\e578"}.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius,.fa-staff-snake{--fa:"\e579"}.fa-sun-plant-wilt{--fa:"\e57a"}.fa-tarp{--fa:"\e57b"}.fa-tarp-droplet{--fa:"\e57c"}.fa-tent{--fa:"\e57d"}.fa-tent-arrow-down-to-line{--fa:"\e57e"}.fa-tent-arrow-left-right{--fa:"\e57f"}.fa-tent-arrow-turn-left{--fa:"\e580"}.fa-tent-arrows-down{--fa:"\e581"}.fa-tents{--fa:"\e582"}.fa-toilet-portable{--fa:"\e583"}.fa-toilets-portable{--fa:"\e584"}.fa-tower-cell{--fa:"\e585"}.fa-tower-observation{--fa:"\e586"}.fa-tree-city{--fa:"\e587"}.fa-trowel{--fa:"\e589"}.fa-trowel-bricks{--fa:"\e58a"}.fa-truck-arrow-right{--fa:"\e58b"}.fa-truck-droplet{--fa:"\e58c"}.fa-truck-field{--fa:"\e58d"}.fa-truck-field-un{--fa:"\e58e"}.fa-truck-plane{--fa:"\e58f"}.fa-users-between-lines{--fa:"\e591"}.fa-users-line{--fa:"\e592"}.fa-users-rays{--fa:"\e593"}.fa-users-rectangle{--fa:"\e594"}.fa-users-viewfinder{--fa:"\e595"}.fa-vial-circle-check{--fa:"\e596"}.fa-vial-virus{--fa:"\e597"}.fa-wheat-awn-circle-exclamation{--fa:"\e598"}.fa-worm{--fa:"\e599"}.fa-xmarks-lines{--fa:"\e59a"}.fa-child-dress{--fa:"\e59c"}.fa-child-reaching{--fa:"\e59d"}.fa-file-circle-check{--fa:"\e5a0"}.fa-file-circle-xmark{--fa:"\e5a1"}.fa-person-through-window{--fa:"\e5a9"}.fa-plant-wilt{--fa:"\e5aa"}.fa-stapler{--fa:"\e5af"}.fa-train-tram{--fa:"\e5b4"}.fa-table-cells-column-lock{--fa:"\e678"}.fa-table-cells-row-lock{--fa:"\e67a"}.fa-thumb-tack-slash,.fa-thumbtack-slash{--fa:"\e68f"}.fa-table-cells-row-unlock{--fa:"\e691"}.fa-chart-diagram{--fa:"\e695"}.fa-comment-nodes{--fa:"\e696"}.fa-file-fragment{--fa:"\e697"}.fa-file-half-dashed{--fa:"\e698"}.fa-hexagon-nodes{--fa:"\e699"}.fa-hexagon-nodes-bolt{--fa:"\e69a"}.fa-square-binary{--fa:"\e69b"}.fa-pentagon{--fa:"\e790"}.fa-non-binary{--fa:"\e807"}.fa-spiral{--fa:"\e80a"}.fa-mobile-vibrate{--fa:"\e816"}.fa-single-quote-left{--fa:"\e81b"}.fa-single-quote-right{--fa:"\e81c"}.fa-bus-side{--fa:"\e81d"}.fa-heptagon,.fa-septagon{--fa:"\e820"}.fa-glass-martini,.fa-martini-glass-empty{--fa:"\f000"}.fa-music{--fa:"\f001"}.fa-magnifying-glass,.fa-search{--fa:"\f002"}.fa-heart{--fa:"\f004"}.fa-star{--fa:"\f005"}.fa-user,.fa-user-alt,.fa-user-large{--fa:"\f007"}.fa-film,.fa-film-alt,.fa-film-simple{--fa:"\f008"}.fa-table-cells-large,.fa-th-large{--fa:"\f009"}.fa-table-cells,.fa-th{--fa:"\f00a"}.fa-table-list,.fa-th-list{--fa:"\f00b"}.fa-check{--fa:"\f00c"}.fa-close,.fa-multiply,.fa-remove,.fa-times,.fa-xmark{--fa:"\f00d"}.fa-magnifying-glass-plus,.fa-search-plus{--fa:"\f00e"}.fa-magnifying-glass-minus,.fa-search-minus{--fa:"\f010"}.fa-power-off{--fa:"\f011"}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa:"\f012"}.fa-cog,.fa-gear{--fa:"\f013"}.fa-home,.fa-home-alt,.fa-home-lg-alt,.fa-house{--fa:"\f015"}.fa-clock,.fa-clock-four{--fa:"\f017"}.fa-road{--fa:"\f018"}.fa-download{--fa:"\f019"}.fa-inbox{--fa:"\f01c"}.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-arrow-rotate-right,.fa-redo{--fa:"\f01e"}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa:"\f021"}.fa-list-alt,.fa-rectangle-list{--fa:"\f022"}.fa-lock{--fa:"\f023"}.fa-flag{--fa:"\f024"}.fa-headphones,.fa-headphones-alt,.fa-headphones-simple{--fa:"\f025"}.fa-volume-off{--fa:"\f026"}.fa-volume-down,.fa-volume-low{--fa:"\f027"}.fa-volume-high,.fa-volume-up{--fa:"\f028"}.fa-qrcode{--fa:"\f029"}.fa-barcode{--fa:"\f02a"}.fa-tag{--fa:"\f02b"}.fa-tags{--fa:"\f02c"}.fa-book{--fa:"\f02d"}.fa-bookmark{--fa:"\f02e"}.fa-print{--fa:"\f02f"}.fa-camera,.fa-camera-alt{--fa:"\f030"}.fa-font{--fa:"\f031"}.fa-bold{--fa:"\f032"}.fa-italic{--fa:"\f033"}.fa-text-height{--fa:"\f034"}.fa-text-width{--fa:"\f035"}.fa-align-left{--fa:"\f036"}.fa-align-center{--fa:"\f037"}.fa-align-right{--fa:"\f038"}.fa-align-justify{--fa:"\f039"}.fa-list,.fa-list-squares{--fa:"\f03a"}.fa-dedent,.fa-outdent{--fa:"\f03b"}.fa-indent{--fa:"\f03c"}.fa-video,.fa-video-camera{--fa:"\f03d"}.fa-image{--fa:"\f03e"}.fa-location-pin,.fa-map-marker{--fa:"\f041"}.fa-adjust,.fa-circle-half-stroke{--fa:"\f042"}.fa-droplet,.fa-tint{--fa:"\f043"}.fa-edit,.fa-pen-to-square{--fa:"\f044"}.fa-arrows,.fa-arrows-up-down-left-right{--fa:"\f047"}.fa-backward-step,.fa-step-backward{--fa:"\f048"}.fa-backward-fast,.fa-fast-backward{--fa:"\f049"}.fa-backward{--fa:"\f04a"}.fa-play{--fa:"\f04b"}.fa-pause{--fa:"\f04c"}.fa-stop{--fa:"\f04d"}.fa-forward{--fa:"\f04e"}.fa-fast-forward,.fa-forward-fast{--fa:"\f050"}.fa-forward-step,.fa-step-forward{--fa:"\f051"}.fa-eject{--fa:"\f052"}.fa-chevron-left{--fa:"\f053"}.fa-chevron-right{--fa:"\f054"}.fa-circle-plus,.fa-plus-circle{--fa:"\f055"}.fa-circle-minus,.fa-minus-circle{--fa:"\f056"}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa:"\f057"}.fa-check-circle,.fa-circle-check{--fa:"\f058"}.fa-circle-question,.fa-question-circle{--fa:"\f059"}.fa-circle-info,.fa-info-circle{--fa:"\f05a"}.fa-crosshairs{--fa:"\f05b"}.fa-ban,.fa-cancel{--fa:"\f05e"}.fa-arrow-left{--fa:"\f060"}.fa-arrow-right{--fa:"\f061"}.fa-arrow-up{--fa:"\f062"}.fa-arrow-down{--fa:"\f063"}.fa-mail-forward,.fa-share{--fa:"\f064"}.fa-expand{--fa:"\f065"}.fa-compress{--fa:"\f066"}.fa-minus,.fa-subtract{--fa:"\f068"}.fa-circle-exclamation,.fa-exclamation-circle{--fa:"\f06a"}.fa-gift{--fa:"\f06b"}.fa-leaf{--fa:"\f06c"}.fa-fire{--fa:"\f06d"}.fa-eye{--fa:"\f06e"}.fa-eye-slash{--fa:"\f070"}.fa-exclamation-triangle,.fa-triangle-exclamation,.fa-warning{--fa:"\f071"}.fa-plane{--fa:"\f072"}.fa-calendar-alt,.fa-calendar-days{--fa:"\f073"}.fa-random,.fa-shuffle{--fa:"\f074"}.fa-comment{--fa:"\f075"}.fa-magnet{--fa:"\f076"}.fa-chevron-up{--fa:"\f077"}.fa-chevron-down{--fa:"\f078"}.fa-retweet{--fa:"\f079"}.fa-cart-shopping,.fa-shopping-cart{--fa:"\f07a"}.fa-folder,.fa-folder-blank{--fa:"\f07b"}.fa-folder-open{--fa:"\f07c"}.fa-arrows-up-down,.fa-arrows-v{--fa:"\f07d"}.fa-arrows-h,.fa-arrows-left-right{--fa:"\f07e"}.fa-bar-chart,.fa-chart-bar{--fa:"\f080"}.fa-camera-retro{--fa:"\f083"}.fa-key{--fa:"\f084"}.fa-cogs,.fa-gears{--fa:"\f085"}.fa-comments{--fa:"\f086"}.fa-star-half{--fa:"\f089"}.fa-arrow-right-from-bracket,.fa-sign-out{--fa:"\f08b"}.fa-thumb-tack,.fa-thumbtack{--fa:"\f08d"}.fa-arrow-up-right-from-square,.fa-external-link{--fa:"\f08e"}.fa-arrow-right-to-bracket,.fa-sign-in{--fa:"\f090"}.fa-trophy{--fa:"\f091"}.fa-upload{--fa:"\f093"}.fa-lemon{--fa:"\f094"}.fa-phone{--fa:"\f095"}.fa-phone-square,.fa-square-phone{--fa:"\f098"}.fa-unlock{--fa:"\f09c"}.fa-credit-card,.fa-credit-card-alt{--fa:"\f09d"}.fa-feed,.fa-rss{--fa:"\f09e"}.fa-hard-drive,.fa-hdd{--fa:"\f0a0"}.fa-bullhorn{--fa:"\f0a1"}.fa-certificate{--fa:"\f0a3"}.fa-hand-point-right{--fa:"\f0a4"}.fa-hand-point-left{--fa:"\f0a5"}.fa-hand-point-up{--fa:"\f0a6"}.fa-hand-point-down{--fa:"\f0a7"}.fa-arrow-circle-left,.fa-circle-arrow-left{--fa:"\f0a8"}.fa-arrow-circle-right,.fa-circle-arrow-right{--fa:"\f0a9"}.fa-arrow-circle-up,.fa-circle-arrow-up{--fa:"\f0aa"}.fa-arrow-circle-down,.fa-circle-arrow-down{--fa:"\f0ab"}.fa-globe{--fa:"\f0ac"}.fa-wrench{--fa:"\f0ad"}.fa-list-check,.fa-tasks{--fa:"\f0ae"}.fa-filter{--fa:"\f0b0"}.fa-briefcase{--fa:"\f0b1"}.fa-arrows-alt,.fa-up-down-left-right{--fa:"\f0b2"}.fa-users{--fa:"\f0c0"}.fa-chain,.fa-link{--fa:"\f0c1"}.fa-cloud{--fa:"\f0c2"}.fa-flask{--fa:"\f0c3"}.fa-cut,.fa-scissors{--fa:"\f0c4"}.fa-copy{--fa:"\f0c5"}.fa-paperclip{--fa:"\f0c6"}.fa-floppy-disk,.fa-save{--fa:"\f0c7"}.fa-square{--fa:"\f0c8"}.fa-bars,.fa-navicon{--fa:"\f0c9"}.fa-list-dots,.fa-list-ul{--fa:"\f0ca"}.fa-list-1-2,.fa-list-numeric,.fa-list-ol{--fa:"\f0cb"}.fa-strikethrough{--fa:"\f0cc"}.fa-underline{--fa:"\f0cd"}.fa-table{--fa:"\f0ce"}.fa-magic,.fa-wand-magic{--fa:"\f0d0"}.fa-truck{--fa:"\f0d1"}.fa-money-bill{--fa:"\f0d6"}.fa-caret-down{--fa:"\f0d7"}.fa-caret-up{--fa:"\f0d8"}.fa-caret-left{--fa:"\f0d9"}.fa-caret-right{--fa:"\f0da"}.fa-columns,.fa-table-columns{--fa:"\f0db"}.fa-sort,.fa-unsorted{--fa:"\f0dc"}.fa-sort-desc,.fa-sort-down{--fa:"\f0dd"}.fa-sort-asc,.fa-sort-up{--fa:"\f0de"}.fa-envelope{--fa:"\f0e0"}.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-arrow-rotate-left,.fa-undo{--fa:"\f0e2"}.fa-gavel,.fa-legal{--fa:"\f0e3"}.fa-bolt,.fa-zap{--fa:"\f0e7"}.fa-sitemap{--fa:"\f0e8"}.fa-umbrella{--fa:"\f0e9"}.fa-file-clipboard,.fa-paste{--fa:"\f0ea"}.fa-lightbulb{--fa:"\f0eb"}.fa-arrow-right-arrow-left,.fa-exchange{--fa:"\f0ec"}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa:"\f0ed"}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa:"\f0ee"}.fa-user-doctor,.fa-user-md{--fa:"\f0f0"}.fa-stethoscope{--fa:"\f0f1"}.fa-suitcase{--fa:"\f0f2"}.fa-bell{--fa:"\f0f3"}.fa-coffee,.fa-mug-saucer{--fa:"\f0f4"}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa:"\f0f8"}.fa-ambulance,.fa-truck-medical{--fa:"\f0f9"}.fa-medkit,.fa-suitcase-medical{--fa:"\f0fa"}.fa-fighter-jet,.fa-jet-fighter{--fa:"\f0fb"}.fa-beer,.fa-beer-mug-empty{--fa:"\f0fc"}.fa-h-square,.fa-square-h{--fa:"\f0fd"}.fa-plus-square,.fa-square-plus{--fa:"\f0fe"}.fa-angle-double-left,.fa-angles-left{--fa:"\f100"}.fa-angle-double-right,.fa-angles-right{--fa:"\f101"}.fa-angle-double-up,.fa-angles-up{--fa:"\f102"}.fa-angle-double-down,.fa-angles-down{--fa:"\f103"}.fa-angle-left{--fa:"\f104"}.fa-angle-right{--fa:"\f105"}.fa-angle-up{--fa:"\f106"}.fa-angle-down{--fa:"\f107"}.fa-laptop{--fa:"\f109"}.fa-tablet-button{--fa:"\f10a"}.fa-mobile-button{--fa:"\f10b"}.fa-quote-left,.fa-quote-left-alt{--fa:"\f10d"}.fa-quote-right,.fa-quote-right-alt{--fa:"\f10e"}.fa-spinner{--fa:"\f110"}.fa-circle{--fa:"\f111"}.fa-face-smile,.fa-smile{--fa:"\f118"}.fa-face-frown,.fa-frown{--fa:"\f119"}.fa-face-meh,.fa-meh{--fa:"\f11a"}.fa-gamepad{--fa:"\f11b"}.fa-keyboard{--fa:"\f11c"}.fa-flag-checkered{--fa:"\f11e"}.fa-terminal{--fa:"\f120"}.fa-code{--fa:"\f121"}.fa-mail-reply-all,.fa-reply-all{--fa:"\f122"}.fa-location-arrow{--fa:"\f124"}.fa-crop{--fa:"\f125"}.fa-code-branch{--fa:"\f126"}.fa-chain-broken,.fa-chain-slash,.fa-link-slash,.fa-unlink{--fa:"\f127"}.fa-info{--fa:"\f129"}.fa-superscript{--fa:"\f12b"}.fa-subscript{--fa:"\f12c"}.fa-eraser{--fa:"\f12d"}.fa-puzzle-piece{--fa:"\f12e"}.fa-microphone{--fa:"\f130"}.fa-microphone-slash{--fa:"\f131"}.fa-shield,.fa-shield-blank{--fa:"\f132"}.fa-calendar{--fa:"\f133"}.fa-fire-extinguisher{--fa:"\f134"}.fa-rocket{--fa:"\f135"}.fa-chevron-circle-left,.fa-circle-chevron-left{--fa:"\f137"}.fa-chevron-circle-right,.fa-circle-chevron-right{--fa:"\f138"}.fa-chevron-circle-up,.fa-circle-chevron-up{--fa:"\f139"}.fa-chevron-circle-down,.fa-circle-chevron-down{--fa:"\f13a"}.fa-anchor{--fa:"\f13d"}.fa-unlock-alt,.fa-unlock-keyhole{--fa:"\f13e"}.fa-bullseye{--fa:"\f140"}.fa-ellipsis,.fa-ellipsis-h{--fa:"\f141"}.fa-ellipsis-v,.fa-ellipsis-vertical{--fa:"\f142"}.fa-rss-square,.fa-square-rss{--fa:"\f143"}.fa-circle-play,.fa-play-circle{--fa:"\f144"}.fa-ticket{--fa:"\f145"}.fa-minus-square,.fa-square-minus{--fa:"\f146"}.fa-arrow-turn-up,.fa-level-up{--fa:"\f148"}.fa-arrow-turn-down,.fa-level-down{--fa:"\f149"}.fa-check-square,.fa-square-check{--fa:"\f14a"}.fa-pen-square,.fa-pencil-square,.fa-square-pen{--fa:"\f14b"}.fa-external-link-square,.fa-square-arrow-up-right{--fa:"\f14c"}.fa-share-from-square,.fa-share-square{--fa:"\f14d"}.fa-compass{--fa:"\f14e"}.fa-caret-square-down,.fa-square-caret-down{--fa:"\f150"}.fa-caret-square-up,.fa-square-caret-up{--fa:"\f151"}.fa-caret-square-right,.fa-square-caret-right{--fa:"\f152"}.fa-eur,.fa-euro,.fa-euro-sign{--fa:"\f153"}.fa-gbp,.fa-pound-sign,.fa-sterling-sign{--fa:"\f154"}.fa-rupee,.fa-rupee-sign{--fa:"\f156"}.fa-cny,.fa-jpy,.fa-rmb,.fa-yen,.fa-yen-sign{--fa:"\f157"}.fa-rouble,.fa-rub,.fa-ruble,.fa-ruble-sign{--fa:"\f158"}.fa-krw,.fa-won,.fa-won-sign{--fa:"\f159"}.fa-file{--fa:"\f15b"}.fa-file-alt,.fa-file-lines,.fa-file-text{--fa:"\f15c"}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa:"\f15d"}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa:"\f15e"}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa:"\f160"}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa:"\f161"}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa:"\f162"}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa:"\f163"}.fa-thumbs-up{--fa:"\f164"}.fa-thumbs-down{--fa:"\f165"}.fa-arrow-down-long,.fa-long-arrow-down{--fa:"\f175"}.fa-arrow-up-long,.fa-long-arrow-up{--fa:"\f176"}.fa-arrow-left-long,.fa-long-arrow-left{--fa:"\f177"}.fa-arrow-right-long,.fa-long-arrow-right{--fa:"\f178"}.fa-female,.fa-person-dress{--fa:"\f182"}.fa-male,.fa-person{--fa:"\f183"}.fa-sun{--fa:"\f185"}.fa-moon{--fa:"\f186"}.fa-archive,.fa-box-archive{--fa:"\f187"}.fa-bug{--fa:"\f188"}.fa-caret-square-left,.fa-square-caret-left{--fa:"\f191"}.fa-circle-dot,.fa-dot-circle{--fa:"\f192"}.fa-wheelchair{--fa:"\f193"}.fa-lira-sign{--fa:"\f195"}.fa-shuttle-space,.fa-space-shuttle{--fa:"\f197"}.fa-envelope-square,.fa-square-envelope{--fa:"\f199"}.fa-bank,.fa-building-columns,.fa-institution,.fa-museum,.fa-university{--fa:"\f19c"}.fa-graduation-cap,.fa-mortar-board{--fa:"\f19d"}.fa-language{--fa:"\f1ab"}.fa-fax{--fa:"\f1ac"}.fa-building{--fa:"\f1ad"}.fa-child{--fa:"\f1ae"}.fa-paw{--fa:"\f1b0"}.fa-cube{--fa:"\f1b2"}.fa-cubes{--fa:"\f1b3"}.fa-recycle{--fa:"\f1b8"}.fa-automobile,.fa-car{--fa:"\f1b9"}.fa-cab,.fa-taxi{--fa:"\f1ba"}.fa-tree{--fa:"\f1bb"}.fa-database{--fa:"\f1c0"}.fa-file-pdf{--fa:"\f1c1"}.fa-file-word{--fa:"\f1c2"}.fa-file-excel{--fa:"\f1c3"}.fa-file-powerpoint{--fa:"\f1c4"}.fa-file-image{--fa:"\f1c5"}.fa-file-archive,.fa-file-zipper{--fa:"\f1c6"}.fa-file-audio{--fa:"\f1c7"}.fa-file-video{--fa:"\f1c8"}.fa-file-code{--fa:"\f1c9"}.fa-life-ring{--fa:"\f1cd"}.fa-circle-notch{--fa:"\f1ce"}.fa-paper-plane{--fa:"\f1d8"}.fa-clock-rotate-left,.fa-history{--fa:"\f1da"}.fa-header,.fa-heading{--fa:"\f1dc"}.fa-paragraph{--fa:"\f1dd"}.fa-sliders,.fa-sliders-h{--fa:"\f1de"}.fa-share-alt,.fa-share-nodes{--fa:"\f1e0"}.fa-share-alt-square,.fa-square-share-nodes{--fa:"\f1e1"}.fa-bomb{--fa:"\f1e2"}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa:"\f1e3"}.fa-teletype,.fa-tty{--fa:"\f1e4"}.fa-binoculars{--fa:"\f1e5"}.fa-plug{--fa:"\f1e6"}.fa-newspaper{--fa:"\f1ea"}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa:"\f1eb"}.fa-calculator{--fa:"\f1ec"}.fa-bell-slash{--fa:"\f1f6"}.fa-trash{--fa:"\f1f8"}.fa-copyright{--fa:"\f1f9"}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa:"\f1fb"}.fa-paint-brush,.fa-paintbrush{--fa:"\f1fc"}.fa-birthday-cake,.fa-cake,.fa-cake-candles{--fa:"\f1fd"}.fa-area-chart,.fa-chart-area{--fa:"\f1fe"}.fa-chart-pie,.fa-pie-chart{--fa:"\f200"}.fa-chart-line,.fa-line-chart{--fa:"\f201"}.fa-toggle-off{--fa:"\f204"}.fa-toggle-on{--fa:"\f205"}.fa-bicycle{--fa:"\f206"}.fa-bus{--fa:"\f207"}.fa-closed-captioning{--fa:"\f20a"}.fa-ils,.fa-shekel,.fa-shekel-sign,.fa-sheqel,.fa-sheqel-sign{--fa:"\f20b"}.fa-cart-plus{--fa:"\f217"}.fa-cart-arrow-down{--fa:"\f218"}.fa-diamond{--fa:"\f219"}.fa-ship{--fa:"\f21a"}.fa-user-secret{--fa:"\f21b"}.fa-motorcycle{--fa:"\f21c"}.fa-street-view{--fa:"\f21d"}.fa-heart-pulse,.fa-heartbeat{--fa:"\f21e"}.fa-venus{--fa:"\f221"}.fa-mars{--fa:"\f222"}.fa-mercury{--fa:"\f223"}.fa-mars-and-venus{--fa:"\f224"}.fa-transgender,.fa-transgender-alt{--fa:"\f225"}.fa-venus-double{--fa:"\f226"}.fa-mars-double{--fa:"\f227"}.fa-venus-mars{--fa:"\f228"}.fa-mars-stroke{--fa:"\f229"}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa:"\f22a"}.fa-mars-stroke-h,.fa-mars-stroke-right{--fa:"\f22b"}.fa-neuter{--fa:"\f22c"}.fa-genderless{--fa:"\f22d"}.fa-server{--fa:"\f233"}.fa-user-plus{--fa:"\f234"}.fa-user-times,.fa-user-xmark{--fa:"\f235"}.fa-bed{--fa:"\f236"}.fa-train{--fa:"\f238"}.fa-subway,.fa-train-subway{--fa:"\f239"}.fa-battery,.fa-battery-5,.fa-battery-full{--fa:"\f240"}.fa-battery-4,.fa-battery-three-quarters{--fa:"\f241"}.fa-battery-3,.fa-battery-half{--fa:"\f242"}.fa-battery-2,.fa-battery-quarter{--fa:"\f243"}.fa-battery-0,.fa-battery-empty{--fa:"\f244"}.fa-arrow-pointer,.fa-mouse-pointer{--fa:"\f245"}.fa-i-cursor{--fa:"\f246"}.fa-object-group{--fa:"\f247"}.fa-object-ungroup{--fa:"\f248"}.fa-note-sticky,.fa-sticky-note{--fa:"\f249"}.fa-clone{--fa:"\f24d"}.fa-balance-scale,.fa-scale-balanced{--fa:"\f24e"}.fa-hourglass-1,.fa-hourglass-start{--fa:"\f251"}.fa-hourglass-2,.fa-hourglass-half{--fa:"\f252"}.fa-hourglass-3,.fa-hourglass-end{--fa:"\f253"}.fa-hourglass,.fa-hourglass-empty{--fa:"\f254"}.fa-hand-back-fist,.fa-hand-rock{--fa:"\f255"}.fa-hand,.fa-hand-paper{--fa:"\f256"}.fa-hand-scissors{--fa:"\f257"}.fa-hand-lizard{--fa:"\f258"}.fa-hand-spock{--fa:"\f259"}.fa-hand-pointer{--fa:"\f25a"}.fa-hand-peace{--fa:"\f25b"}.fa-trademark{--fa:"\f25c"}.fa-registered{--fa:"\f25d"}.fa-television,.fa-tv,.fa-tv-alt{--fa:"\f26c"}.fa-calendar-plus{--fa:"\f271"}.fa-calendar-minus{--fa:"\f272"}.fa-calendar-times,.fa-calendar-xmark{--fa:"\f273"}.fa-calendar-check{--fa:"\f274"}.fa-industry{--fa:"\f275"}.fa-map-pin{--fa:"\f276"}.fa-map-signs,.fa-signs-post{--fa:"\f277"}.fa-map{--fa:"\f279"}.fa-comment-alt,.fa-message{--fa:"\f27a"}.fa-circle-pause,.fa-pause-circle{--fa:"\f28b"}.fa-circle-stop,.fa-stop-circle{--fa:"\f28d"}.fa-bag-shopping,.fa-shopping-bag{--fa:"\f290"}.fa-basket-shopping,.fa-shopping-basket{--fa:"\f291"}.fa-universal-access{--fa:"\f29a"}.fa-blind,.fa-person-walking-with-cane{--fa:"\f29d"}.fa-audio-description{--fa:"\f29e"}.fa-phone-volume,.fa-volume-control-phone{--fa:"\f2a0"}.fa-braille{--fa:"\f2a1"}.fa-assistive-listening-systems,.fa-ear-listen{--fa:"\f2a2"}.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting,.fa-hands-asl-interpreting{--fa:"\f2a3"}.fa-deaf,.fa-deafness,.fa-ear-deaf,.fa-hard-of-hearing{--fa:"\f2a4"}.fa-hands,.fa-sign-language,.fa-signing{--fa:"\f2a7"}.fa-eye-low-vision,.fa-low-vision{--fa:"\f2a8"}.fa-handshake,.fa-handshake-alt,.fa-handshake-simple{--fa:"\f2b5"}.fa-envelope-open{--fa:"\f2b6"}.fa-address-book,.fa-contact-book{--fa:"\f2b9"}.fa-address-card,.fa-contact-card,.fa-vcard{--fa:"\f2bb"}.fa-circle-user,.fa-user-circle{--fa:"\f2bd"}.fa-id-badge{--fa:"\f2c1"}.fa-drivers-license,.fa-id-card{--fa:"\f2c2"}.fa-temperature-4,.fa-temperature-full,.fa-thermometer-4,.fa-thermometer-full{--fa:"\f2c7"}.fa-temperature-3,.fa-temperature-three-quarters,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa:"\f2c8"}.fa-temperature-2,.fa-temperature-half,.fa-thermometer-2,.fa-thermometer-half{--fa:"\f2c9"}.fa-temperature-1,.fa-temperature-quarter,.fa-thermometer-1,.fa-thermometer-quarter{--fa:"\f2ca"}.fa-temperature-0,.fa-temperature-empty,.fa-thermometer-0,.fa-thermometer-empty{--fa:"\f2cb"}.fa-shower{--fa:"\f2cc"}.fa-bath,.fa-bathtub{--fa:"\f2cd"}.fa-podcast{--fa:"\f2ce"}.fa-window-maximize{--fa:"\f2d0"}.fa-window-minimize{--fa:"\f2d1"}.fa-window-restore{--fa:"\f2d2"}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa:"\f2d3"}.fa-microchip{--fa:"\f2db"}.fa-snowflake{--fa:"\f2dc"}.fa-spoon,.fa-utensil-spoon{--fa:"\f2e5"}.fa-cutlery,.fa-utensils{--fa:"\f2e7"}.fa-rotate-back,.fa-rotate-backward,.fa-rotate-left,.fa-undo-alt{--fa:"\f2ea"}.fa-trash-alt,.fa-trash-can{--fa:"\f2ed"}.fa-rotate,.fa-sync-alt{--fa:"\f2f1"}.fa-stopwatch{--fa:"\f2f2"}.fa-right-from-bracket,.fa-sign-out-alt{--fa:"\f2f5"}.fa-right-to-bracket,.fa-sign-in-alt{--fa:"\f2f6"}.fa-redo-alt,.fa-rotate-forward,.fa-rotate-right{--fa:"\f2f9"}.fa-poo{--fa:"\f2fe"}.fa-images{--fa:"\f302"}.fa-pencil,.fa-pencil-alt{--fa:"\f303"}.fa-pen{--fa:"\f304"}.fa-pen-alt,.fa-pen-clip{--fa:"\f305"}.fa-octagon{--fa:"\f306"}.fa-down-long,.fa-long-arrow-alt-down{--fa:"\f309"}.fa-left-long,.fa-long-arrow-alt-left{--fa:"\f30a"}.fa-long-arrow-alt-right,.fa-right-long{--fa:"\f30b"}.fa-long-arrow-alt-up,.fa-up-long{--fa:"\f30c"}.fa-hexagon{--fa:"\f312"}.fa-file-edit,.fa-file-pen{--fa:"\f31c"}.fa-expand-arrows-alt,.fa-maximize{--fa:"\f31e"}.fa-clipboard{--fa:"\f328"}.fa-arrows-alt-h,.fa-left-right{--fa:"\f337"}.fa-arrows-alt-v,.fa-up-down{--fa:"\f338"}.fa-alarm-clock{--fa:"\f34e"}.fa-arrow-alt-circle-down,.fa-circle-down{--fa:"\f358"}.fa-arrow-alt-circle-left,.fa-circle-left{--fa:"\f359"}.fa-arrow-alt-circle-right,.fa-circle-right{--fa:"\f35a"}.fa-arrow-alt-circle-up,.fa-circle-up{--fa:"\f35b"}.fa-external-link-alt,.fa-up-right-from-square{--fa:"\f35d"}.fa-external-link-square-alt,.fa-square-up-right{--fa:"\f360"}.fa-exchange-alt,.fa-right-left{--fa:"\f362"}.fa-repeat{--fa:"\f363"}.fa-code-commit{--fa:"\f386"}.fa-code-merge{--fa:"\f387"}.fa-desktop,.fa-desktop-alt{--fa:"\f390"}.fa-gem{--fa:"\f3a5"}.fa-level-down-alt,.fa-turn-down{--fa:"\f3be"}.fa-level-up-alt,.fa-turn-up{--fa:"\f3bf"}.fa-lock-open{--fa:"\f3c1"}.fa-location-dot,.fa-map-marker-alt{--fa:"\f3c5"}.fa-microphone-alt,.fa-microphone-lines{--fa:"\f3c9"}.fa-mobile-alt,.fa-mobile-screen-button{--fa:"\f3cd"}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa:"\f3ce"}.fa-mobile-android-alt,.fa-mobile-screen{--fa:"\f3cf"}.fa-money-bill-1,.fa-money-bill-alt{--fa:"\f3d1"}.fa-phone-slash{--fa:"\f3dd"}.fa-image-portrait,.fa-portrait{--fa:"\f3e0"}.fa-mail-reply,.fa-reply{--fa:"\f3e5"}.fa-shield-alt,.fa-shield-halved{--fa:"\f3ed"}.fa-tablet-alt,.fa-tablet-screen-button{--fa:"\f3fa"}.fa-tablet,.fa-tablet-android{--fa:"\f3fb"}.fa-ticket-alt,.fa-ticket-simple{--fa:"\f3ff"}.fa-rectangle-times,.fa-rectangle-xmark,.fa-times-rectangle,.fa-window-close{--fa:"\f410"}.fa-compress-alt,.fa-down-left-and-up-right-to-center{--fa:"\f422"}.fa-expand-alt,.fa-up-right-and-down-left-from-center{--fa:"\f424"}.fa-baseball-bat-ball{--fa:"\f432"}.fa-baseball,.fa-baseball-ball{--fa:"\f433"}.fa-basketball,.fa-basketball-ball{--fa:"\f434"}.fa-bowling-ball{--fa:"\f436"}.fa-chess{--fa:"\f439"}.fa-chess-bishop{--fa:"\f43a"}.fa-chess-board{--fa:"\f43c"}.fa-chess-king{--fa:"\f43f"}.fa-chess-knight{--fa:"\f441"}.fa-chess-pawn{--fa:"\f443"}.fa-chess-queen{--fa:"\f445"}.fa-chess-rook{--fa:"\f447"}.fa-dumbbell{--fa:"\f44b"}.fa-football,.fa-football-ball{--fa:"\f44e"}.fa-golf-ball,.fa-golf-ball-tee{--fa:"\f450"}.fa-hockey-puck{--fa:"\f453"}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa:"\f458"}.fa-square-full{--fa:"\f45c"}.fa-ping-pong-paddle-ball,.fa-table-tennis,.fa-table-tennis-paddle-ball{--fa:"\f45d"}.fa-volleyball,.fa-volleyball-ball{--fa:"\f45f"}.fa-allergies,.fa-hand-dots{--fa:"\f461"}.fa-band-aid,.fa-bandage{--fa:"\f462"}.fa-box{--fa:"\f466"}.fa-boxes,.fa-boxes-alt,.fa-boxes-stacked{--fa:"\f468"}.fa-briefcase-medical{--fa:"\f469"}.fa-burn,.fa-fire-flame-simple{--fa:"\f46a"}.fa-capsules{--fa:"\f46b"}.fa-clipboard-check{--fa:"\f46c"}.fa-clipboard-list{--fa:"\f46d"}.fa-diagnoses,.fa-person-dots-from-line{--fa:"\f470"}.fa-dna{--fa:"\f471"}.fa-dolly,.fa-dolly-box{--fa:"\f472"}.fa-cart-flatbed,.fa-dolly-flatbed{--fa:"\f474"}.fa-file-medical{--fa:"\f477"}.fa-file-medical-alt,.fa-file-waveform{--fa:"\f478"}.fa-first-aid,.fa-kit-medical{--fa:"\f479"}.fa-circle-h,.fa-hospital-symbol{--fa:"\f47e"}.fa-id-card-alt,.fa-id-card-clip{--fa:"\f47f"}.fa-notes-medical{--fa:"\f481"}.fa-pallet{--fa:"\f482"}.fa-pills{--fa:"\f484"}.fa-prescription-bottle{--fa:"\f485"}.fa-prescription-bottle-alt,.fa-prescription-bottle-medical{--fa:"\f486"}.fa-bed-pulse,.fa-procedures{--fa:"\f487"}.fa-shipping-fast,.fa-truck-fast{--fa:"\f48b"}.fa-smoking{--fa:"\f48d"}.fa-syringe{--fa:"\f48e"}.fa-tablets{--fa:"\f490"}.fa-thermometer{--fa:"\f491"}.fa-vial{--fa:"\f492"}.fa-vials{--fa:"\f493"}.fa-warehouse{--fa:"\f494"}.fa-weight,.fa-weight-scale{--fa:"\f496"}.fa-x-ray{--fa:"\f497"}.fa-box-open{--fa:"\f49e"}.fa-comment-dots,.fa-commenting{--fa:"\f4ad"}.fa-comment-slash{--fa:"\f4b3"}.fa-couch{--fa:"\f4b8"}.fa-circle-dollar-to-slot,.fa-donate{--fa:"\f4b9"}.fa-dove{--fa:"\f4ba"}.fa-hand-holding{--fa:"\f4bd"}.fa-hand-holding-heart{--fa:"\f4be"}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa:"\f4c0"}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa:"\f4c1"}.fa-hands-holding{--fa:"\f4c2"}.fa-hands-helping,.fa-handshake-angle{--fa:"\f4c4"}.fa-parachute-box{--fa:"\f4cd"}.fa-people-carry,.fa-people-carry-box{--fa:"\f4ce"}.fa-piggy-bank{--fa:"\f4d3"}.fa-ribbon{--fa:"\f4d6"}.fa-route{--fa:"\f4d7"}.fa-seedling,.fa-sprout{--fa:"\f4d8"}.fa-sign,.fa-sign-hanging{--fa:"\f4d9"}.fa-face-smile-wink,.fa-smile-wink{--fa:"\f4da"}.fa-tape{--fa:"\f4db"}.fa-truck-loading,.fa-truck-ramp-box{--fa:"\f4de"}.fa-truck-moving{--fa:"\f4df"}.fa-video-slash{--fa:"\f4e2"}.fa-wine-glass{--fa:"\f4e3"}.fa-user-astronaut{--fa:"\f4fb"}.fa-user-check{--fa:"\f4fc"}.fa-user-clock{--fa:"\f4fd"}.fa-user-cog,.fa-user-gear{--fa:"\f4fe"}.fa-user-edit,.fa-user-pen{--fa:"\f4ff"}.fa-user-friends,.fa-user-group{--fa:"\f500"}.fa-user-graduate{--fa:"\f501"}.fa-user-lock{--fa:"\f502"}.fa-user-minus{--fa:"\f503"}.fa-user-ninja{--fa:"\f504"}.fa-user-shield{--fa:"\f505"}.fa-user-alt-slash,.fa-user-large-slash,.fa-user-slash{--fa:"\f506"}.fa-user-tag{--fa:"\f507"}.fa-user-tie{--fa:"\f508"}.fa-users-cog,.fa-users-gear{--fa:"\f509"}.fa-balance-scale-left,.fa-scale-unbalanced{--fa:"\f515"}.fa-balance-scale-right,.fa-scale-unbalanced-flip{--fa:"\f516"}.fa-blender{--fa:"\f517"}.fa-book-open{--fa:"\f518"}.fa-broadcast-tower,.fa-tower-broadcast{--fa:"\f519"}.fa-broom{--fa:"\f51a"}.fa-blackboard,.fa-chalkboard{--fa:"\f51b"}.fa-chalkboard-teacher,.fa-chalkboard-user{--fa:"\f51c"}.fa-church{--fa:"\f51d"}.fa-coins{--fa:"\f51e"}.fa-compact-disc{--fa:"\f51f"}.fa-crow{--fa:"\f520"}.fa-crown{--fa:"\f521"}.fa-dice{--fa:"\f522"}.fa-dice-five{--fa:"\f523"}.fa-dice-four{--fa:"\f524"}.fa-dice-one{--fa:"\f525"}.fa-dice-six{--fa:"\f526"}.fa-dice-three{--fa:"\f527"}.fa-dice-two{--fa:"\f528"}.fa-divide{--fa:"\f529"}.fa-door-closed{--fa:"\f52a"}.fa-door-open{--fa:"\f52b"}.fa-feather{--fa:"\f52d"}.fa-frog{--fa:"\f52e"}.fa-gas-pump{--fa:"\f52f"}.fa-glasses{--fa:"\f530"}.fa-greater-than-equal{--fa:"\f532"}.fa-helicopter{--fa:"\f533"}.fa-infinity{--fa:"\f534"}.fa-kiwi-bird{--fa:"\f535"}.fa-less-than-equal{--fa:"\f537"}.fa-memory{--fa:"\f538"}.fa-microphone-alt-slash,.fa-microphone-lines-slash{--fa:"\f539"}.fa-money-bill-wave{--fa:"\f53a"}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa:"\f53b"}.fa-money-check{--fa:"\f53c"}.fa-money-check-alt,.fa-money-check-dollar{--fa:"\f53d"}.fa-not-equal{--fa:"\f53e"}.fa-palette{--fa:"\f53f"}.fa-parking,.fa-square-parking{--fa:"\f540"}.fa-diagram-project,.fa-project-diagram{--fa:"\f542"}.fa-receipt{--fa:"\f543"}.fa-robot{--fa:"\f544"}.fa-ruler{--fa:"\f545"}.fa-ruler-combined{--fa:"\f546"}.fa-ruler-horizontal{--fa:"\f547"}.fa-ruler-vertical{--fa:"\f548"}.fa-school{--fa:"\f549"}.fa-screwdriver{--fa:"\f54a"}.fa-shoe-prints{--fa:"\f54b"}.fa-skull{--fa:"\f54c"}.fa-ban-smoking,.fa-smoking-ban{--fa:"\f54d"}.fa-store{--fa:"\f54e"}.fa-shop,.fa-store-alt{--fa:"\f54f"}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa:"\f550"}.fa-stroopwafel{--fa:"\f551"}.fa-toolbox{--fa:"\f552"}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa:"\f553"}.fa-person-walking,.fa-walking{--fa:"\f554"}.fa-wallet{--fa:"\f555"}.fa-angry,.fa-face-angry{--fa:"\f556"}.fa-archway{--fa:"\f557"}.fa-atlas,.fa-book-atlas{--fa:"\f558"}.fa-award{--fa:"\f559"}.fa-backspace,.fa-delete-left{--fa:"\f55a"}.fa-bezier-curve{--fa:"\f55b"}.fa-bong{--fa:"\f55c"}.fa-brush{--fa:"\f55d"}.fa-bus-alt,.fa-bus-simple{--fa:"\f55e"}.fa-cannabis{--fa:"\f55f"}.fa-check-double{--fa:"\f560"}.fa-cocktail,.fa-martini-glass-citrus{--fa:"\f561"}.fa-bell-concierge,.fa-concierge-bell{--fa:"\f562"}.fa-cookie{--fa:"\f563"}.fa-cookie-bite{--fa:"\f564"}.fa-crop-alt,.fa-crop-simple{--fa:"\f565"}.fa-digital-tachograph,.fa-tachograph-digital{--fa:"\f566"}.fa-dizzy,.fa-face-dizzy{--fa:"\f567"}.fa-compass-drafting,.fa-drafting-compass{--fa:"\f568"}.fa-drum{--fa:"\f569"}.fa-drum-steelpan{--fa:"\f56a"}.fa-feather-alt,.fa-feather-pointed{--fa:"\f56b"}.fa-file-contract{--fa:"\f56c"}.fa-file-arrow-down,.fa-file-download{--fa:"\f56d"}.fa-arrow-right-from-file,.fa-file-export{--fa:"\f56e"}.fa-arrow-right-to-file,.fa-file-import{--fa:"\f56f"}.fa-file-invoice{--fa:"\f570"}.fa-file-invoice-dollar{--fa:"\f571"}.fa-file-prescription{--fa:"\f572"}.fa-file-signature{--fa:"\f573"}.fa-file-arrow-up,.fa-file-upload{--fa:"\f574"}.fa-fill{--fa:"\f575"}.fa-fill-drip{--fa:"\f576"}.fa-fingerprint{--fa:"\f577"}.fa-fish{--fa:"\f578"}.fa-face-flushed,.fa-flushed{--fa:"\f579"}.fa-face-frown-open,.fa-frown-open{--fa:"\f57a"}.fa-glass-martini-alt,.fa-martini-glass{--fa:"\f57b"}.fa-earth-africa,.fa-globe-africa{--fa:"\f57c"}.fa-earth,.fa-earth-america,.fa-earth-americas,.fa-globe-americas{--fa:"\f57d"}.fa-earth-asia,.fa-globe-asia{--fa:"\f57e"}.fa-face-grimace,.fa-grimace{--fa:"\f57f"}.fa-face-grin,.fa-grin{--fa:"\f580"}.fa-face-grin-wide,.fa-grin-alt{--fa:"\f581"}.fa-face-grin-beam,.fa-grin-beam{--fa:"\f582"}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa:"\f583"}.fa-face-grin-hearts,.fa-grin-hearts{--fa:"\f584"}.fa-face-grin-squint,.fa-grin-squint{--fa:"\f585"}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa:"\f586"}.fa-face-grin-stars,.fa-grin-stars{--fa:"\f587"}.fa-face-grin-tears,.fa-grin-tears{--fa:"\f588"}.fa-face-grin-tongue,.fa-grin-tongue{--fa:"\f589"}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa:"\f58a"}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa:"\f58b"}.fa-face-grin-wink,.fa-grin-wink{--fa:"\f58c"}.fa-grid-horizontal,.fa-grip,.fa-grip-horizontal{--fa:"\f58d"}.fa-grid-vertical,.fa-grip-vertical{--fa:"\f58e"}.fa-headset{--fa:"\f590"}.fa-highlighter{--fa:"\f591"}.fa-hot-tub,.fa-hot-tub-person{--fa:"\f593"}.fa-hotel{--fa:"\f594"}.fa-joint{--fa:"\f595"}.fa-face-kiss,.fa-kiss{--fa:"\f596"}.fa-face-kiss-beam,.fa-kiss-beam{--fa:"\f597"}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa:"\f598"}.fa-face-laugh,.fa-laugh{--fa:"\f599"}.fa-face-laugh-beam,.fa-laugh-beam{--fa:"\f59a"}.fa-face-laugh-squint,.fa-laugh-squint{--fa:"\f59b"}.fa-face-laugh-wink,.fa-laugh-wink{--fa:"\f59c"}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa:"\f59d"}.fa-map-location,.fa-map-marked{--fa:"\f59f"}.fa-map-location-dot,.fa-map-marked-alt{--fa:"\f5a0"}.fa-marker{--fa:"\f5a1"}.fa-medal{--fa:"\f5a2"}.fa-face-meh-blank,.fa-meh-blank{--fa:"\f5a4"}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa:"\f5a5"}.fa-monument{--fa:"\f5a6"}.fa-mortar-pestle{--fa:"\f5a7"}.fa-paint-roller{--fa:"\f5aa"}.fa-passport{--fa:"\f5ab"}.fa-pen-fancy{--fa:"\f5ac"}.fa-pen-nib{--fa:"\f5ad"}.fa-pen-ruler,.fa-pencil-ruler{--fa:"\f5ae"}.fa-plane-arrival{--fa:"\f5af"}.fa-plane-departure{--fa:"\f5b0"}.fa-prescription{--fa:"\f5b1"}.fa-face-sad-cry,.fa-sad-cry{--fa:"\f5b3"}.fa-face-sad-tear,.fa-sad-tear{--fa:"\f5b4"}.fa-shuttle-van,.fa-van-shuttle{--fa:"\f5b6"}.fa-signature{--fa:"\f5b7"}.fa-face-smile-beam,.fa-smile-beam{--fa:"\f5b8"}.fa-solar-panel{--fa:"\f5ba"}.fa-spa{--fa:"\f5bb"}.fa-splotch{--fa:"\f5bc"}.fa-spray-can{--fa:"\f5bd"}.fa-stamp{--fa:"\f5bf"}.fa-star-half-alt,.fa-star-half-stroke{--fa:"\f5c0"}.fa-suitcase-rolling{--fa:"\f5c1"}.fa-face-surprise,.fa-surprise{--fa:"\f5c2"}.fa-swatchbook{--fa:"\f5c3"}.fa-person-swimming,.fa-swimmer{--fa:"\f5c4"}.fa-ladder-water,.fa-swimming-pool,.fa-water-ladder{--fa:"\f5c5"}.fa-droplet-slash,.fa-tint-slash{--fa:"\f5c7"}.fa-face-tired,.fa-tired{--fa:"\f5c8"}.fa-tooth{--fa:"\f5c9"}.fa-umbrella-beach{--fa:"\f5ca"}.fa-weight-hanging{--fa:"\f5cd"}.fa-wine-glass-alt,.fa-wine-glass-empty{--fa:"\f5ce"}.fa-air-freshener,.fa-spray-can-sparkles{--fa:"\f5d0"}.fa-apple-alt,.fa-apple-whole{--fa:"\f5d1"}.fa-atom{--fa:"\f5d2"}.fa-bone{--fa:"\f5d7"}.fa-book-open-reader,.fa-book-reader{--fa:"\f5da"}.fa-brain{--fa:"\f5dc"}.fa-car-alt,.fa-car-rear{--fa:"\f5de"}.fa-battery-car,.fa-car-battery{--fa:"\f5df"}.fa-car-burst,.fa-car-crash{--fa:"\f5e1"}.fa-car-side{--fa:"\f5e4"}.fa-charging-station{--fa:"\f5e7"}.fa-diamond-turn-right,.fa-directions{--fa:"\f5eb"}.fa-draw-polygon,.fa-vector-polygon{--fa:"\f5ee"}.fa-laptop-code{--fa:"\f5fc"}.fa-layer-group{--fa:"\f5fd"}.fa-location,.fa-location-crosshairs{--fa:"\f601"}.fa-lungs{--fa:"\f604"}.fa-microscope{--fa:"\f610"}.fa-oil-can{--fa:"\f613"}.fa-poop{--fa:"\f619"}.fa-shapes,.fa-triangle-circle-square{--fa:"\f61f"}.fa-star-of-life{--fa:"\f621"}.fa-dashboard,.fa-gauge,.fa-gauge-med,.fa-tachometer-alt-average{--fa:"\f624"}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa:"\f625"}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa:"\f629"}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa:"\f62a"}.fa-teeth{--fa:"\f62e"}.fa-teeth-open{--fa:"\f62f"}.fa-masks-theater,.fa-theater-masks{--fa:"\f630"}.fa-traffic-light{--fa:"\f637"}.fa-truck-monster{--fa:"\f63b"}.fa-truck-pickup{--fa:"\f63c"}.fa-ad,.fa-rectangle-ad{--fa:"\f641"}.fa-ankh{--fa:"\f644"}.fa-bible,.fa-book-bible{--fa:"\f647"}.fa-briefcase-clock,.fa-business-time{--fa:"\f64a"}.fa-city{--fa:"\f64f"}.fa-comment-dollar{--fa:"\f651"}.fa-comments-dollar{--fa:"\f653"}.fa-cross{--fa:"\f654"}.fa-dharmachakra{--fa:"\f655"}.fa-envelope-open-text{--fa:"\f658"}.fa-folder-minus{--fa:"\f65d"}.fa-folder-plus{--fa:"\f65e"}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa:"\f662"}.fa-gopuram{--fa:"\f664"}.fa-hamsa{--fa:"\f665"}.fa-bahai,.fa-haykal{--fa:"\f666"}.fa-jedi{--fa:"\f669"}.fa-book-journal-whills,.fa-journal-whills{--fa:"\f66a"}.fa-kaaba{--fa:"\f66b"}.fa-khanda{--fa:"\f66d"}.fa-landmark{--fa:"\f66f"}.fa-envelopes-bulk,.fa-mail-bulk{--fa:"\f674"}.fa-menorah{--fa:"\f676"}.fa-mosque{--fa:"\f678"}.fa-om{--fa:"\f679"}.fa-pastafarianism,.fa-spaghetti-monster-flying{--fa:"\f67b"}.fa-peace{--fa:"\f67c"}.fa-place-of-worship{--fa:"\f67f"}.fa-poll,.fa-square-poll-vertical{--fa:"\f681"}.fa-poll-h,.fa-square-poll-horizontal{--fa:"\f682"}.fa-person-praying,.fa-pray{--fa:"\f683"}.fa-hands-praying,.fa-praying-hands{--fa:"\f684"}.fa-book-quran,.fa-quran{--fa:"\f687"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa:"\f688"}.fa-magnifying-glass-location,.fa-search-location{--fa:"\f689"}.fa-socks{--fa:"\f696"}.fa-square-root-alt,.fa-square-root-variable{--fa:"\f698"}.fa-star-and-crescent{--fa:"\f699"}.fa-star-of-david{--fa:"\f69a"}.fa-synagogue{--fa:"\f69b"}.fa-scroll-torah,.fa-torah{--fa:"\f6a0"}.fa-torii-gate{--fa:"\f6a1"}.fa-vihara{--fa:"\f6a7"}.fa-volume-mute,.fa-volume-times,.fa-volume-xmark{--fa:"\f6a9"}.fa-yin-yang{--fa:"\f6ad"}.fa-blender-phone{--fa:"\f6b6"}.fa-book-dead,.fa-book-skull{--fa:"\f6b7"}.fa-campground{--fa:"\f6bb"}.fa-cat{--fa:"\f6be"}.fa-chair{--fa:"\f6c0"}.fa-cloud-moon{--fa:"\f6c3"}.fa-cloud-sun{--fa:"\f6c4"}.fa-cow{--fa:"\f6c8"}.fa-dice-d20{--fa:"\f6cf"}.fa-dice-d6{--fa:"\f6d1"}.fa-dog{--fa:"\f6d3"}.fa-dragon{--fa:"\f6d5"}.fa-drumstick-bite{--fa:"\f6d7"}.fa-dungeon{--fa:"\f6d9"}.fa-file-csv{--fa:"\f6dd"}.fa-fist-raised,.fa-hand-fist{--fa:"\f6de"}.fa-ghost{--fa:"\f6e2"}.fa-hammer{--fa:"\f6e3"}.fa-hanukiah{--fa:"\f6e6"}.fa-hat-wizard{--fa:"\f6e8"}.fa-hiking,.fa-person-hiking{--fa:"\f6ec"}.fa-hippo{--fa:"\f6ed"}.fa-horse{--fa:"\f6f0"}.fa-house-chimney-crack,.fa-house-damage{--fa:"\f6f1"}.fa-hryvnia,.fa-hryvnia-sign{--fa:"\f6f2"}.fa-mask{--fa:"\f6fa"}.fa-mountain{--fa:"\f6fc"}.fa-network-wired{--fa:"\f6ff"}.fa-otter{--fa:"\f700"}.fa-ring{--fa:"\f70b"}.fa-person-running,.fa-running{--fa:"\f70c"}.fa-scroll{--fa:"\f70e"}.fa-skull-crossbones{--fa:"\f714"}.fa-slash{--fa:"\f715"}.fa-spider{--fa:"\f717"}.fa-toilet-paper,.fa-toilet-paper-alt,.fa-toilet-paper-blank{--fa:"\f71e"}.fa-tractor{--fa:"\f722"}.fa-user-injured{--fa:"\f728"}.fa-vr-cardboard{--fa:"\f729"}.fa-wand-sparkles{--fa:"\f72b"}.fa-wind{--fa:"\f72e"}.fa-wine-bottle{--fa:"\f72f"}.fa-cloud-meatball{--fa:"\f73b"}.fa-cloud-moon-rain{--fa:"\f73c"}.fa-cloud-rain{--fa:"\f73d"}.fa-cloud-showers-heavy{--fa:"\f740"}.fa-cloud-sun-rain{--fa:"\f743"}.fa-democrat{--fa:"\f747"}.fa-flag-usa{--fa:"\f74d"}.fa-hurricane{--fa:"\f751"}.fa-landmark-alt,.fa-landmark-dome{--fa:"\f752"}.fa-meteor{--fa:"\f753"}.fa-person-booth{--fa:"\f756"}.fa-poo-bolt,.fa-poo-storm{--fa:"\f75a"}.fa-rainbow{--fa:"\f75b"}.fa-republican{--fa:"\f75e"}.fa-smog{--fa:"\f75f"}.fa-temperature-high{--fa:"\f769"}.fa-temperature-low{--fa:"\f76b"}.fa-cloud-bolt,.fa-thunderstorm{--fa:"\f76c"}.fa-tornado{--fa:"\f76f"}.fa-volcano{--fa:"\f770"}.fa-check-to-slot,.fa-vote-yea{--fa:"\f772"}.fa-water{--fa:"\f773"}.fa-baby{--fa:"\f77c"}.fa-baby-carriage,.fa-carriage-baby{--fa:"\f77d"}.fa-biohazard{--fa:"\f780"}.fa-blog{--fa:"\f781"}.fa-calendar-day{--fa:"\f783"}.fa-calendar-week{--fa:"\f784"}.fa-candy-cane{--fa:"\f786"}.fa-carrot{--fa:"\f787"}.fa-cash-register{--fa:"\f788"}.fa-compress-arrows-alt,.fa-minimize{--fa:"\f78c"}.fa-dumpster{--fa:"\f793"}.fa-dumpster-fire{--fa:"\f794"}.fa-ethernet{--fa:"\f796"}.fa-gifts{--fa:"\f79c"}.fa-champagne-glasses,.fa-glass-cheers{--fa:"\f79f"}.fa-glass-whiskey,.fa-whiskey-glass{--fa:"\f7a0"}.fa-earth-europe,.fa-globe-europe{--fa:"\f7a2"}.fa-grip-lines{--fa:"\f7a4"}.fa-grip-lines-vertical{--fa:"\f7a5"}.fa-guitar{--fa:"\f7a6"}.fa-heart-broken,.fa-heart-crack{--fa:"\f7a9"}.fa-holly-berry{--fa:"\f7aa"}.fa-horse-head{--fa:"\f7ab"}.fa-icicles{--fa:"\f7ad"}.fa-igloo{--fa:"\f7ae"}.fa-mitten{--fa:"\f7b5"}.fa-mug-hot{--fa:"\f7b6"}.fa-radiation{--fa:"\f7b9"}.fa-circle-radiation,.fa-radiation-alt{--fa:"\f7ba"}.fa-restroom{--fa:"\f7bd"}.fa-satellite{--fa:"\f7bf"}.fa-satellite-dish{--fa:"\f7c0"}.fa-sd-card{--fa:"\f7c2"}.fa-sim-card{--fa:"\f7c4"}.fa-person-skating,.fa-skating{--fa:"\f7c5"}.fa-person-skiing,.fa-skiing{--fa:"\f7c9"}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa:"\f7ca"}.fa-sleigh{--fa:"\f7cc"}.fa-comment-sms,.fa-sms{--fa:"\f7cd"}.fa-person-snowboarding,.fa-snowboarding{--fa:"\f7ce"}.fa-snowman{--fa:"\f7d0"}.fa-snowplow{--fa:"\f7d2"}.fa-tenge,.fa-tenge-sign{--fa:"\f7d7"}.fa-toilet{--fa:"\f7d8"}.fa-screwdriver-wrench,.fa-tools{--fa:"\f7d9"}.fa-cable-car,.fa-tram{--fa:"\f7da"}.fa-fire-alt,.fa-fire-flame-curved{--fa:"\f7e4"}.fa-bacon{--fa:"\f7e5"}.fa-book-medical{--fa:"\f7e6"}.fa-bread-slice{--fa:"\f7ec"}.fa-cheese{--fa:"\f7ef"}.fa-clinic-medical,.fa-house-chimney-medical{--fa:"\f7f2"}.fa-clipboard-user{--fa:"\f7f3"}.fa-comment-medical{--fa:"\f7f5"}.fa-crutch{--fa:"\f7f7"}.fa-disease{--fa:"\f7fa"}.fa-egg{--fa:"\f7fb"}.fa-folder-tree{--fa:"\f802"}.fa-burger,.fa-hamburger{--fa:"\f805"}.fa-hand-middle-finger{--fa:"\f806"}.fa-hard-hat,.fa-hat-hard,.fa-helmet-safety{--fa:"\f807"}.fa-hospital-user{--fa:"\f80d"}.fa-hotdog{--fa:"\f80f"}.fa-ice-cream{--fa:"\f810"}.fa-laptop-medical{--fa:"\f812"}.fa-pager{--fa:"\f815"}.fa-pepper-hot{--fa:"\f816"}.fa-pizza-slice{--fa:"\f818"}.fa-sack-dollar{--fa:"\f81d"}.fa-book-tanakh,.fa-tanakh{--fa:"\f827"}.fa-bars-progress,.fa-tasks-alt{--fa:"\f828"}.fa-trash-arrow-up,.fa-trash-restore{--fa:"\f829"}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa:"\f82a"}.fa-user-nurse{--fa:"\f82f"}.fa-wave-square{--fa:"\f83e"}.fa-biking,.fa-person-biking{--fa:"\f84a"}.fa-border-all{--fa:"\f84c"}.fa-border-none{--fa:"\f850"}.fa-border-style,.fa-border-top-left{--fa:"\f853"}.fa-digging,.fa-person-digging{--fa:"\f85e"}.fa-fan{--fa:"\f863"}.fa-heart-music-camera-bolt,.fa-icons{--fa:"\f86d"}.fa-phone-alt,.fa-phone-flip{--fa:"\f879"}.fa-phone-square-alt,.fa-square-phone-flip{--fa:"\f87b"}.fa-photo-film,.fa-photo-video{--fa:"\f87c"}.fa-remove-format,.fa-text-slash{--fa:"\f87d"}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa:"\f881"}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa:"\f882"}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa:"\f884"}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa:"\f885"}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa:"\f886"}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa:"\f887"}.fa-spell-check{--fa:"\f891"}.fa-voicemail{--fa:"\f897"}.fa-hat-cowboy{--fa:"\f8c0"}.fa-hat-cowboy-side{--fa:"\f8c1"}.fa-computer-mouse,.fa-mouse{--fa:"\f8cc"}.fa-radio{--fa:"\f8d7"}.fa-record-vinyl{--fa:"\f8d9"}.fa-walkie-talkie{--fa:"\f8ef"}.fa-caravan{--fa:"\f8ff"} +:host,:root{--fa-family-brands:"Font Awesome 7 Brands";--fa-font-brands:normal 400 1em/1 var(--fa-family-brands)}@font-face{font-family:"Font Awesome 7 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2)}.fa-brands,.fa-classic.fa-brands,.fab{--fa-family:var(--fa-family-brands);--fa-style:400}.fa-firefox-browser{--fa:"\e007"}.fa-ideal{--fa:"\e013"}.fa-microblog{--fa:"\e01a"}.fa-pied-piper-square,.fa-square-pied-piper{--fa:"\e01e"}.fa-unity{--fa:"\e049"}.fa-dailymotion{--fa:"\e052"}.fa-instagram-square,.fa-square-instagram{--fa:"\e055"}.fa-mixer{--fa:"\e056"}.fa-shopify{--fa:"\e057"}.fa-deezer{--fa:"\e077"}.fa-edge-legacy{--fa:"\e078"}.fa-google-pay{--fa:"\e079"}.fa-rust{--fa:"\e07a"}.fa-tiktok{--fa:"\e07b"}.fa-unsplash{--fa:"\e07c"}.fa-cloudflare{--fa:"\e07d"}.fa-guilded{--fa:"\e07e"}.fa-hive{--fa:"\e07f"}.fa-42-group,.fa-innosoft{--fa:"\e080"}.fa-instalod{--fa:"\e081"}.fa-octopus-deploy{--fa:"\e082"}.fa-perbyte{--fa:"\e083"}.fa-uncharted{--fa:"\e084"}.fa-watchman-monitoring{--fa:"\e087"}.fa-wodu{--fa:"\e088"}.fa-wirsindhandwerk,.fa-wsh{--fa:"\e2d0"}.fa-bots{--fa:"\e340"}.fa-cmplid{--fa:"\e360"}.fa-bilibili{--fa:"\e3d9"}.fa-golang{--fa:"\e40f"}.fa-pix{--fa:"\e43a"}.fa-sitrox{--fa:"\e44a"}.fa-hashnode{--fa:"\e499"}.fa-meta{--fa:"\e49b"}.fa-padlet{--fa:"\e4a0"}.fa-nfc-directional{--fa:"\e530"}.fa-nfc-symbol{--fa:"\e531"}.fa-screenpal{--fa:"\e570"}.fa-space-awesome{--fa:"\e5ac"}.fa-square-font-awesome{--fa:"\e5ad"}.fa-gitlab-square,.fa-square-gitlab{--fa:"\e5ae"}.fa-odysee{--fa:"\e5c6"}.fa-stubber{--fa:"\e5c7"}.fa-debian{--fa:"\e60b"}.fa-shoelace{--fa:"\e60c"}.fa-threads{--fa:"\e618"}.fa-square-threads{--fa:"\e619"}.fa-square-x-twitter{--fa:"\e61a"}.fa-x-twitter{--fa:"\e61b"}.fa-opensuse{--fa:"\e62b"}.fa-letterboxd{--fa:"\e62d"}.fa-square-letterboxd{--fa:"\e62e"}.fa-mintbit{--fa:"\e62f"}.fa-google-scholar{--fa:"\e63b"}.fa-brave{--fa:"\e63c"}.fa-brave-reverse{--fa:"\e63d"}.fa-pixiv{--fa:"\e640"}.fa-upwork{--fa:"\e641"}.fa-webflow{--fa:"\e65c"}.fa-signal-messenger{--fa:"\e663"}.fa-bluesky{--fa:"\e671"}.fa-jxl{--fa:"\e67b"}.fa-square-upwork{--fa:"\e67c"}.fa-web-awesome{--fa:"\e682"}.fa-square-web-awesome{--fa:"\e683"}.fa-square-web-awesome-stroke{--fa:"\e684"}.fa-dart-lang{--fa:"\e693"}.fa-flutter{--fa:"\e694"}.fa-files-pinwheel{--fa:"\e69f"}.fa-css{--fa:"\e6a2"}.fa-square-bluesky{--fa:"\e6a3"}.fa-openai{--fa:"\e7cf"}.fa-square-linkedin{--fa:"\e7d0"}.fa-cash-app{--fa:"\e7d4"}.fa-disqus{--fa:"\e7d5"}.fa-11ty,.fa-eleventy{--fa:"\e7d6"}.fa-kakao-talk{--fa:"\e7d7"}.fa-linktree{--fa:"\e7d8"}.fa-notion{--fa:"\e7d9"}.fa-pandora{--fa:"\e7da"}.fa-pixelfed{--fa:"\e7db"}.fa-tidal{--fa:"\e7dc"}.fa-vsco{--fa:"\e7dd"}.fa-w3c{--fa:"\e7de"}.fa-lumon{--fa:"\e7e2"}.fa-lumon-drop{--fa:"\e7e3"}.fa-square-figma{--fa:"\e7e4"}.fa-tex{--fa:"\e7ff"}.fa-duolingo{--fa:"\e812"}.fa-square-twitter,.fa-twitter-square{--fa:"\f081"}.fa-facebook-square,.fa-square-facebook{--fa:"\f082"}.fa-linkedin{--fa:"\f08c"}.fa-github-square,.fa-square-github{--fa:"\f092"}.fa-twitter{--fa:"\f099"}.fa-facebook{--fa:"\f09a"}.fa-github{--fa:"\f09b"}.fa-pinterest{--fa:"\f0d2"}.fa-pinterest-square,.fa-square-pinterest{--fa:"\f0d3"}.fa-google-plus-square,.fa-square-google-plus{--fa:"\f0d4"}.fa-google-plus-g{--fa:"\f0d5"}.fa-linkedin-in{--fa:"\f0e1"}.fa-github-alt{--fa:"\f113"}.fa-maxcdn{--fa:"\f136"}.fa-html5{--fa:"\f13b"}.fa-css3{--fa:"\f13c"}.fa-btc{--fa:"\f15a"}.fa-youtube{--fa:"\f167"}.fa-xing{--fa:"\f168"}.fa-square-xing,.fa-xing-square{--fa:"\f169"}.fa-dropbox{--fa:"\f16b"}.fa-stack-overflow{--fa:"\f16c"}.fa-instagram{--fa:"\f16d"}.fa-flickr{--fa:"\f16e"}.fa-adn{--fa:"\f170"}.fa-bitbucket{--fa:"\f171"}.fa-tumblr{--fa:"\f173"}.fa-square-tumblr,.fa-tumblr-square{--fa:"\f174"}.fa-apple{--fa:"\f179"}.fa-windows{--fa:"\f17a"}.fa-android{--fa:"\f17b"}.fa-linux{--fa:"\f17c"}.fa-dribbble{--fa:"\f17d"}.fa-skype{--fa:"\f17e"}.fa-foursquare{--fa:"\f180"}.fa-trello{--fa:"\f181"}.fa-gratipay{--fa:"\f184"}.fa-vk{--fa:"\f189"}.fa-weibo{--fa:"\f18a"}.fa-renren{--fa:"\f18b"}.fa-pagelines{--fa:"\f18c"}.fa-stack-exchange{--fa:"\f18d"}.fa-square-vimeo,.fa-vimeo-square{--fa:"\f194"}.fa-slack,.fa-slack-hash{--fa:"\f198"}.fa-wordpress{--fa:"\f19a"}.fa-openid{--fa:"\f19b"}.fa-yahoo{--fa:"\f19e"}.fa-google{--fa:"\f1a0"}.fa-reddit{--fa:"\f1a1"}.fa-reddit-square,.fa-square-reddit{--fa:"\f1a2"}.fa-stumbleupon-circle{--fa:"\f1a3"}.fa-stumbleupon{--fa:"\f1a4"}.fa-delicious{--fa:"\f1a5"}.fa-digg{--fa:"\f1a6"}.fa-pied-piper-pp{--fa:"\f1a7"}.fa-pied-piper-alt{--fa:"\f1a8"}.fa-drupal{--fa:"\f1a9"}.fa-joomla{--fa:"\f1aa"}.fa-behance{--fa:"\f1b4"}.fa-behance-square,.fa-square-behance{--fa:"\f1b5"}.fa-steam{--fa:"\f1b6"}.fa-square-steam,.fa-steam-square{--fa:"\f1b7"}.fa-spotify{--fa:"\f1bc"}.fa-deviantart{--fa:"\f1bd"}.fa-soundcloud{--fa:"\f1be"}.fa-vine{--fa:"\f1ca"}.fa-codepen{--fa:"\f1cb"}.fa-jsfiddle{--fa:"\f1cc"}.fa-rebel{--fa:"\f1d0"}.fa-empire{--fa:"\f1d1"}.fa-git-square,.fa-square-git{--fa:"\f1d2"}.fa-git{--fa:"\f1d3"}.fa-hacker-news{--fa:"\f1d4"}.fa-tencent-weibo{--fa:"\f1d5"}.fa-qq{--fa:"\f1d6"}.fa-weixin{--fa:"\f1d7"}.fa-slideshare{--fa:"\f1e7"}.fa-twitch{--fa:"\f1e8"}.fa-yelp{--fa:"\f1e9"}.fa-paypal{--fa:"\f1ed"}.fa-google-wallet{--fa:"\f1ee"}.fa-cc-visa{--fa:"\f1f0"}.fa-cc-mastercard{--fa:"\f1f1"}.fa-cc-discover{--fa:"\f1f2"}.fa-cc-amex{--fa:"\f1f3"}.fa-cc-paypal{--fa:"\f1f4"}.fa-cc-stripe{--fa:"\f1f5"}.fa-lastfm{--fa:"\f202"}.fa-lastfm-square,.fa-square-lastfm{--fa:"\f203"}.fa-ioxhost{--fa:"\f208"}.fa-angellist{--fa:"\f209"}.fa-buysellads{--fa:"\f20d"}.fa-connectdevelop{--fa:"\f20e"}.fa-dashcube{--fa:"\f210"}.fa-forumbee{--fa:"\f211"}.fa-leanpub{--fa:"\f212"}.fa-sellsy{--fa:"\f213"}.fa-shirtsinbulk{--fa:"\f214"}.fa-simplybuilt{--fa:"\f215"}.fa-skyatlas{--fa:"\f216"}.fa-pinterest-p{--fa:"\f231"}.fa-whatsapp{--fa:"\f232"}.fa-viacoin{--fa:"\f237"}.fa-medium,.fa-medium-m{--fa:"\f23a"}.fa-y-combinator{--fa:"\f23b"}.fa-optin-monster{--fa:"\f23c"}.fa-opencart{--fa:"\f23d"}.fa-expeditedssl{--fa:"\f23e"}.fa-cc-jcb{--fa:"\f24b"}.fa-cc-diners-club{--fa:"\f24c"}.fa-creative-commons{--fa:"\f25e"}.fa-gg{--fa:"\f260"}.fa-gg-circle{--fa:"\f261"}.fa-odnoklassniki{--fa:"\f263"}.fa-odnoklassniki-square,.fa-square-odnoklassniki{--fa:"\f264"}.fa-get-pocket{--fa:"\f265"}.fa-wikipedia-w{--fa:"\f266"}.fa-safari{--fa:"\f267"}.fa-chrome{--fa:"\f268"}.fa-firefox{--fa:"\f269"}.fa-opera{--fa:"\f26a"}.fa-internet-explorer{--fa:"\f26b"}.fa-contao{--fa:"\f26d"}.fa-500px{--fa:"\f26e"}.fa-amazon{--fa:"\f270"}.fa-houzz{--fa:"\f27c"}.fa-vimeo-v{--fa:"\f27d"}.fa-black-tie{--fa:"\f27e"}.fa-fonticons{--fa:"\f280"}.fa-reddit-alien{--fa:"\f281"}.fa-edge{--fa:"\f282"}.fa-codiepie{--fa:"\f284"}.fa-modx{--fa:"\f285"}.fa-fort-awesome{--fa:"\f286"}.fa-usb{--fa:"\f287"}.fa-product-hunt{--fa:"\f288"}.fa-mixcloud{--fa:"\f289"}.fa-scribd{--fa:"\f28a"}.fa-bluetooth{--fa:"\f293"}.fa-bluetooth-b{--fa:"\f294"}.fa-gitlab{--fa:"\f296"}.fa-wpbeginner{--fa:"\f297"}.fa-wpforms{--fa:"\f298"}.fa-envira{--fa:"\f299"}.fa-glide{--fa:"\f2a5"}.fa-glide-g{--fa:"\f2a6"}.fa-viadeo{--fa:"\f2a9"}.fa-square-viadeo,.fa-viadeo-square{--fa:"\f2aa"}.fa-snapchat,.fa-snapchat-ghost{--fa:"\f2ab"}.fa-snapchat-square,.fa-square-snapchat{--fa:"\f2ad"}.fa-pied-piper{--fa:"\f2ae"}.fa-first-order{--fa:"\f2b0"}.fa-yoast{--fa:"\f2b1"}.fa-themeisle{--fa:"\f2b2"}.fa-google-plus{--fa:"\f2b3"}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa:"\f2b4"}.fa-linode{--fa:"\f2b8"}.fa-quora{--fa:"\f2c4"}.fa-free-code-camp{--fa:"\f2c5"}.fa-telegram,.fa-telegram-plane{--fa:"\f2c6"}.fa-bandcamp{--fa:"\f2d5"}.fa-grav{--fa:"\f2d6"}.fa-etsy{--fa:"\f2d7"}.fa-imdb{--fa:"\f2d8"}.fa-ravelry{--fa:"\f2d9"}.fa-sellcast{--fa:"\f2da"}.fa-superpowers{--fa:"\f2dd"}.fa-wpexplorer{--fa:"\f2de"}.fa-meetup{--fa:"\f2e0"}.fa-font-awesome-alt,.fa-square-font-awesome-stroke{--fa:"\f35c"}.fa-accessible-icon{--fa:"\f368"}.fa-accusoft{--fa:"\f369"}.fa-adversal{--fa:"\f36a"}.fa-affiliatetheme{--fa:"\f36b"}.fa-algolia{--fa:"\f36c"}.fa-amilia{--fa:"\f36d"}.fa-angrycreative{--fa:"\f36e"}.fa-app-store{--fa:"\f36f"}.fa-app-store-ios{--fa:"\f370"}.fa-apper{--fa:"\f371"}.fa-asymmetrik{--fa:"\f372"}.fa-audible{--fa:"\f373"}.fa-avianex{--fa:"\f374"}.fa-aws{--fa:"\f375"}.fa-bimobject{--fa:"\f378"}.fa-bitcoin{--fa:"\f379"}.fa-bity{--fa:"\f37a"}.fa-blackberry{--fa:"\f37b"}.fa-blogger{--fa:"\f37c"}.fa-blogger-b{--fa:"\f37d"}.fa-buromobelexperte{--fa:"\f37f"}.fa-centercode{--fa:"\f380"}.fa-cloudscale{--fa:"\f383"}.fa-cloudsmith{--fa:"\f384"}.fa-cloudversify{--fa:"\f385"}.fa-cpanel{--fa:"\f388"}.fa-css3-alt{--fa:"\f38b"}.fa-cuttlefish{--fa:"\f38c"}.fa-d-and-d{--fa:"\f38d"}.fa-deploydog{--fa:"\f38e"}.fa-deskpro{--fa:"\f38f"}.fa-digital-ocean{--fa:"\f391"}.fa-discord{--fa:"\f392"}.fa-discourse{--fa:"\f393"}.fa-dochub{--fa:"\f394"}.fa-docker{--fa:"\f395"}.fa-draft2digital{--fa:"\f396"}.fa-dribbble-square,.fa-square-dribbble{--fa:"\f397"}.fa-dyalog{--fa:"\f399"}.fa-earlybirds{--fa:"\f39a"}.fa-erlang{--fa:"\f39d"}.fa-facebook-f{--fa:"\f39e"}.fa-facebook-messenger{--fa:"\f39f"}.fa-firstdraft{--fa:"\f3a1"}.fa-fonticons-fi{--fa:"\f3a2"}.fa-fort-awesome-alt{--fa:"\f3a3"}.fa-freebsd{--fa:"\f3a4"}.fa-gitkraken{--fa:"\f3a6"}.fa-gofore{--fa:"\f3a7"}.fa-goodreads{--fa:"\f3a8"}.fa-goodreads-g{--fa:"\f3a9"}.fa-google-drive{--fa:"\f3aa"}.fa-google-play{--fa:"\f3ab"}.fa-gripfire{--fa:"\f3ac"}.fa-grunt{--fa:"\f3ad"}.fa-gulp{--fa:"\f3ae"}.fa-hacker-news-square,.fa-square-hacker-news{--fa:"\f3af"}.fa-hire-a-helper{--fa:"\f3b0"}.fa-hotjar{--fa:"\f3b1"}.fa-hubspot{--fa:"\f3b2"}.fa-itunes{--fa:"\f3b4"}.fa-itunes-note{--fa:"\f3b5"}.fa-jenkins{--fa:"\f3b6"}.fa-joget{--fa:"\f3b7"}.fa-js{--fa:"\f3b8"}.fa-js-square,.fa-square-js{--fa:"\f3b9"}.fa-keycdn{--fa:"\f3ba"}.fa-kickstarter,.fa-square-kickstarter{--fa:"\f3bb"}.fa-kickstarter-k{--fa:"\f3bc"}.fa-laravel{--fa:"\f3bd"}.fa-line{--fa:"\f3c0"}.fa-lyft{--fa:"\f3c3"}.fa-magento{--fa:"\f3c4"}.fa-medapps{--fa:"\f3c6"}.fa-medrt{--fa:"\f3c8"}.fa-microsoft{--fa:"\f3ca"}.fa-mix{--fa:"\f3cb"}.fa-mizuni{--fa:"\f3cc"}.fa-monero{--fa:"\f3d0"}.fa-napster{--fa:"\f3d2"}.fa-node-js{--fa:"\f3d3"}.fa-npm{--fa:"\f3d4"}.fa-ns8{--fa:"\f3d5"}.fa-nutritionix{--fa:"\f3d6"}.fa-page4{--fa:"\f3d7"}.fa-palfed{--fa:"\f3d8"}.fa-patreon{--fa:"\f3d9"}.fa-periscope{--fa:"\f3da"}.fa-phabricator{--fa:"\f3db"}.fa-phoenix-framework{--fa:"\f3dc"}.fa-playstation{--fa:"\f3df"}.fa-pushed{--fa:"\f3e1"}.fa-python{--fa:"\f3e2"}.fa-red-river{--fa:"\f3e3"}.fa-rendact,.fa-wpressr{--fa:"\f3e4"}.fa-replyd{--fa:"\f3e6"}.fa-resolving{--fa:"\f3e7"}.fa-rocketchat{--fa:"\f3e8"}.fa-rockrms{--fa:"\f3e9"}.fa-schlix{--fa:"\f3ea"}.fa-searchengin{--fa:"\f3eb"}.fa-servicestack{--fa:"\f3ec"}.fa-sistrix{--fa:"\f3ee"}.fa-speakap{--fa:"\f3f3"}.fa-staylinked{--fa:"\f3f5"}.fa-steam-symbol{--fa:"\f3f6"}.fa-sticker-mule{--fa:"\f3f7"}.fa-studiovinari{--fa:"\f3f8"}.fa-supple{--fa:"\f3f9"}.fa-uber{--fa:"\f402"}.fa-uikit{--fa:"\f403"}.fa-uniregistry{--fa:"\f404"}.fa-untappd{--fa:"\f405"}.fa-ussunnah{--fa:"\f407"}.fa-vaadin{--fa:"\f408"}.fa-viber{--fa:"\f409"}.fa-vimeo{--fa:"\f40a"}.fa-vnv{--fa:"\f40b"}.fa-square-whatsapp,.fa-whatsapp-square{--fa:"\f40c"}.fa-whmcs{--fa:"\f40d"}.fa-wordpress-simple{--fa:"\f411"}.fa-xbox{--fa:"\f412"}.fa-yandex{--fa:"\f413"}.fa-yandex-international{--fa:"\f414"}.fa-apple-pay{--fa:"\f415"}.fa-cc-apple-pay{--fa:"\f416"}.fa-fly{--fa:"\f417"}.fa-node{--fa:"\f419"}.fa-osi{--fa:"\f41a"}.fa-react{--fa:"\f41b"}.fa-autoprefixer{--fa:"\f41c"}.fa-less{--fa:"\f41d"}.fa-sass{--fa:"\f41e"}.fa-vuejs{--fa:"\f41f"}.fa-angular{--fa:"\f420"}.fa-aviato{--fa:"\f421"}.fa-ember{--fa:"\f423"}.fa-gitter{--fa:"\f426"}.fa-hooli{--fa:"\f427"}.fa-strava{--fa:"\f428"}.fa-stripe{--fa:"\f429"}.fa-stripe-s{--fa:"\f42a"}.fa-typo3{--fa:"\f42b"}.fa-amazon-pay{--fa:"\f42c"}.fa-cc-amazon-pay{--fa:"\f42d"}.fa-ethereum{--fa:"\f42e"}.fa-korvue{--fa:"\f42f"}.fa-elementor{--fa:"\f430"}.fa-square-youtube,.fa-youtube-square{--fa:"\f431"}.fa-flipboard{--fa:"\f44d"}.fa-hips{--fa:"\f452"}.fa-php{--fa:"\f457"}.fa-quinscape{--fa:"\f459"}.fa-readme{--fa:"\f4d5"}.fa-java{--fa:"\f4e4"}.fa-pied-piper-hat{--fa:"\f4e5"}.fa-creative-commons-by{--fa:"\f4e7"}.fa-creative-commons-nc{--fa:"\f4e8"}.fa-creative-commons-nc-eu{--fa:"\f4e9"}.fa-creative-commons-nc-jp{--fa:"\f4ea"}.fa-creative-commons-nd{--fa:"\f4eb"}.fa-creative-commons-pd{--fa:"\f4ec"}.fa-creative-commons-pd-alt{--fa:"\f4ed"}.fa-creative-commons-remix{--fa:"\f4ee"}.fa-creative-commons-sa{--fa:"\f4ef"}.fa-creative-commons-sampling{--fa:"\f4f0"}.fa-creative-commons-sampling-plus{--fa:"\f4f1"}.fa-creative-commons-share{--fa:"\f4f2"}.fa-creative-commons-zero{--fa:"\f4f3"}.fa-ebay{--fa:"\f4f4"}.fa-keybase{--fa:"\f4f5"}.fa-mastodon{--fa:"\f4f6"}.fa-r-project{--fa:"\f4f7"}.fa-researchgate{--fa:"\f4f8"}.fa-teamspeak{--fa:"\f4f9"}.fa-first-order-alt{--fa:"\f50a"}.fa-fulcrum{--fa:"\f50b"}.fa-galactic-republic{--fa:"\f50c"}.fa-galactic-senate{--fa:"\f50d"}.fa-jedi-order{--fa:"\f50e"}.fa-mandalorian{--fa:"\f50f"}.fa-old-republic{--fa:"\f510"}.fa-phoenix-squadron{--fa:"\f511"}.fa-sith{--fa:"\f512"}.fa-trade-federation{--fa:"\f513"}.fa-wolf-pack-battalion{--fa:"\f514"}.fa-hornbill{--fa:"\f592"}.fa-mailchimp{--fa:"\f59e"}.fa-megaport{--fa:"\f5a3"}.fa-nimblr{--fa:"\f5a8"}.fa-rev{--fa:"\f5b2"}.fa-shopware{--fa:"\f5b5"}.fa-squarespace{--fa:"\f5be"}.fa-themeco{--fa:"\f5c6"}.fa-weebly{--fa:"\f5cc"}.fa-wix{--fa:"\f5cf"}.fa-ello{--fa:"\f5f1"}.fa-hackerrank{--fa:"\f5f7"}.fa-kaggle{--fa:"\f5fa"}.fa-markdown{--fa:"\f60f"}.fa-neos{--fa:"\f612"}.fa-zhihu{--fa:"\f63f"}.fa-alipay{--fa:"\f642"}.fa-the-red-yeti{--fa:"\f69d"}.fa-critical-role{--fa:"\f6c9"}.fa-d-and-d-beyond{--fa:"\f6ca"}.fa-dev{--fa:"\f6cc"}.fa-fantasy-flight-games{--fa:"\f6dc"}.fa-wizards-of-the-coast{--fa:"\f730"}.fa-think-peaks{--fa:"\f731"}.fa-reacteurope{--fa:"\f75d"}.fa-artstation{--fa:"\f77a"}.fa-atlassian{--fa:"\f77b"}.fa-canadian-maple-leaf{--fa:"\f785"}.fa-centos{--fa:"\f789"}.fa-confluence{--fa:"\f78d"}.fa-dhl{--fa:"\f790"}.fa-diaspora{--fa:"\f791"}.fa-fedex{--fa:"\f797"}.fa-fedora{--fa:"\f798"}.fa-figma{--fa:"\f799"}.fa-intercom{--fa:"\f7af"}.fa-invision{--fa:"\f7b0"}.fa-jira{--fa:"\f7b1"}.fa-mendeley{--fa:"\f7b3"}.fa-raspberry-pi{--fa:"\f7bb"}.fa-redhat{--fa:"\f7bc"}.fa-sketch{--fa:"\f7c6"}.fa-sourcetree{--fa:"\f7d3"}.fa-suse{--fa:"\f7d6"}.fa-ubuntu{--fa:"\f7df"}.fa-ups{--fa:"\f7e0"}.fa-usps{--fa:"\f7e1"}.fa-yarn{--fa:"\f7e3"}.fa-airbnb{--fa:"\f834"}.fa-battle-net{--fa:"\f835"}.fa-bootstrap{--fa:"\f836"}.fa-buffer{--fa:"\f837"}.fa-chromecast{--fa:"\f838"}.fa-evernote{--fa:"\f839"}.fa-itch-io{--fa:"\f83a"}.fa-salesforce{--fa:"\f83b"}.fa-speaker-deck{--fa:"\f83c"}.fa-symfony{--fa:"\f83d"}.fa-waze{--fa:"\f83f"}.fa-yammer{--fa:"\f840"}.fa-git-alt{--fa:"\f841"}.fa-stackpath{--fa:"\f842"}.fa-cotton-bureau{--fa:"\f89e"}.fa-buy-n-large{--fa:"\f8a6"}.fa-mdb{--fa:"\f8ca"}.fa-orcid{--fa:"\f8d2"}.fa-swift{--fa:"\f8e1"}.fa-umbraco{--fa:"\f8e8"}:host,:root{--fa-font-regular:normal 400 1em/1 var(--fa-family-classic)}@font-face{font-family:"Font Awesome 7 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2)}.far{--fa-family:var(--fa-family-classic)}.fa-regular,.far{--fa-style:400}:host,:root{--fa-family-classic:"Font Awesome 7 Free";--fa-font-solid:normal 900 1em/1 var(--fa-family-classic);--fa-style-family-classic:var(--fa-family-classic)}@font-face{font-family:"Font Awesome 7 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2)}.fas{--fa-style:900}.fa-classic,.fas{--fa-family:var(--fa-family-classic)}.fa-solid{--fa-style:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/plugins/admin/themes/grav/css/fork-awesome-shim.css b/plugins/admin/themes/grav/css/fork-awesome-shim.css new file mode 100644 index 0000000..2ba3487 --- /dev/null +++ b/plugins/admin/themes/grav/css/fork-awesome-shim.css @@ -0,0 +1,651 @@ +/*! + * ForkAwesome to FontAwesome 7 Compatibility Shim + * Version: 1.0.0 + * + * This CSS shim provides compatibility for ForkAwesome 1.1.5 classes + * when migrating to FontAwesome 7 + */ + +/* Base Font Family Override */ +.fa { + font-family: 'Font Awesome 7 Free' , 'Font Awesome 7 Brands' !important; + font-weight: 900 !important; /* Default to solid style */ +} + +/* Utility Classes */ +.fa-fw { + width: 1.25em !important; + text-align: center !important; +} + +.fa-ul { + padding-left: 0 !important; + margin-left: 2.5em !important; + list-style-type: none !important; +} + +.fa-ul > li { + position: relative !important; +} + +.fa-li { + position: absolute !important; + left: -2.5em !important; + width: 2.5em !important; + text-align: center !important; +} + +.fa-border { + padding: .2em .25em .15em !important; + border: solid 0.08em #eee !important; + border-radius: .1em !important; +} + +.fa-pull-left { + float: left !important; + margin-right: .3em !important; +} + +.fa-pull-right { + float: right !important; + margin-left: .3em !important; +} + +.fa-spin { + animation: fa-spin 2s infinite linear !important; +} + +.fa-pulse { + animation: fa-spin 1s infinite steps(8) !important; +} + +@keyframes fa-spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +/* Size modifiers */ +.fa-lg { + font-size: 1.33333333em !important; + line-height: 0.75em !important; + vertical-align: -15% !important; +} + +.fa-2x { + font-size: 2em !important; +} + +.fa-3x { + font-size: 3em !important; +} + +.fa-4x { + font-size: 4em !important; +} + +.fa-5x { + font-size: 5em !important; +} + +/* Rotation & Flip */ +.fa-rotate-90 { + transform: rotate(90deg) !important; +} + +.fa-rotate-180 { + transform: rotate(180deg) !important; +} + +.fa-rotate-270 { + transform: rotate(270deg) !important; +} + +.fa-flip-horizontal { + transform: scale(-1, 1) !important; +} + +.fa-flip-vertical { + transform: scale(1, -1) !important; +} + +/* Stack Support */ +.fa-stack { + position: relative !important; + display: inline-block !important; + width: 2em !important; + height: 2em !important; + line-height: 2em !important; + vertical-align: middle !important; +} + +.fa-stack-1x, .fa-stack-2x { + position: absolute !important; + left: 0 !important; + width: 100% !important; + text-align: center !important; +} + +.fa-stack-1x { + line-height: inherit !important; +} + +.fa-stack-2x { + font-size: 2em !important; +} + +.fa-inverse { + color: #fff !important; +} + +/* Icon Remapping - Direct mappings */ +.fa.fa-home:before { content: "\f015"; } /* house */ +.fa.fa-warning:before { content: "\f071"; } /* triangle-exclamation */ +.fa.fa-close:before { content: "\f00d"; } /* xmark */ +.fa.fa-remove:before { content: "\f00d"; } /* xmark */ +.fa.fa-trash-o:before { content: "\f2ed"; } /* trash-can */ +.fa.fa-file-text-o:before { content: "\f15c"; } /* file-lines */ +.fa.fa-clock-o:before { content: "\f017"; } /* clock regular */ +.fa.fa-check-circle-o:before { content: "\f058"; } /* circle-check regular */ +.fa.fa-circle-o:before { content: "\f111"; } /* circle regular */ +.fa.fa-dot-circle-o:before { content: "\f192"; } /* circle-dot regular */ +.fa.fa-minus-square-o:before { content: "\f146"; } /* square-minus regular */ +.fa.fa-plus-square-o:before { content: "\f0fe"; } /* square-plus regular */ +.fa.fa-square-o:before { content: "\f0c8"; } /* square regular */ +.fa.fa-envelope-o:before { content: "\f0e0"; } /* envelope regular */ +.fa.fa-file-o:before { content: "\f15b"; } /* file regular */ +.fa.fa-file-text-o:before { content: "\f15c"; } /* file-lines regular */ +.fa.fa-file-audio-o:before { content: "\f1c7"; } /* file-audio regular */ +.fa.fa-file-photo-o:before { content: "\f1c5"; } /* file-image regular */ +.fa.fa-files-o:before { content: "\f0c5"; } /* copy regular */ +.fa.fa-folder-o:before { content: "\f07b"; } /* folder regular */ +.fa.fa-folder-open-o:before { content: "\f07c"; } /* folder-open regular */ +.fa.fa-heart-o:before { content: "\f004"; } /* heart regular */ +.fa.fa-star-o:before { content: "\f005"; } /* star regular */ +.fa.fa-star-half-o:before { content: "\f089"; } /* star-half regular */ +.fa.fa-user-o:before { content: "\f007"; } /* user regular */ +.fa.fa-bell-o:before { content: "\f0f3"; } /* bell regular */ +.fa.fa-bookmark-o:before { content: "\f02e"; } /* bookmark regular */ +.fa.fa-building-o:before { content: "\f1ad"; } /* building regular */ +.fa.fa-calendar-o:before { content: "\f133"; } /* calendar regular */ +.fa.fa-comment-o:before { content: "\f075"; } /* comment regular */ +.fa.fa-comments-o:before { content: "\f086"; } /* comments regular */ +.fa.fa-flag-o:before { content: "\f024"; } /* flag regular */ +.fa.fa-lemon-o:before { content: "\f094"; } /* lemon regular */ +.fa.fa-thumbs-up-o:before { content: "\f164"; } /* thumbs-up regular */ +.fa.fa-thumbs-down-o:before { content: "\f165"; } /* thumbs-down regular */ +.fa.fa-picture-o:before { content: "\f03e"; } /* image regular */ +.fa.fa-map-o:before { content: "\f279"; } /* map regular */ +.fa.fa-lightbulb-o:before { content: "\f0eb"; } /* lightbulb regular */ +.fa.fa-sign-out:before { content: "\f08b"; } /* arrow-right-from-bracket */ +.fa.fa-list-ol:before { content: "\f0cb"; } /* list-ol */ +.fa.fa-toggle-on:before { content: "\f205"; } /* toggle-on */ +.fa.fa-toggle-off:before { content: "\f204"; } /* toggle-off */ +.fa.fa-bell-slash-o:before { content: "\f1f6"; } /* bell-slash regular */ +.fa.fa-paper-plane-o:before { content: "\f1d8"; } /* paper-plane regular */ +.fa.fa-keyboard-o:before { content: "\f11c"; } /* keyboard regular */ +.fa.fa-pencil-square-o:before { content: "\f044"; } /* pen-to-square regular */ +.fa.fa-smile-o:before { content: "\f118"; } /* face-smile regular */ +.fa.fa-hdd-o:before { content: "\f0a0"; } /* hard-drive regular */ + +/* Icon Remapping - Name changes */ +.fa.fa-home:before { content: "\f015"; } /* house */ +.fa.fa-gear:before { content: "\f013"; } /* gear */ +.fa.fa-gears:before { content: "\f085"; } /* gears */ +.fa.fa-remove:before { content: "\f00d"; } /* xmark */ +.fa.fa-close:before { content: "\f00d"; } /* xmark */ +.fa.fa-warning:before { content: "\f071"; } /* triangle-exclamation */ +.fa.fa-exclamation-triangle:before { content: "\f071"; } /* triangle-exclamation */ +.fa.fa-exclamation-circle:before { content: "\f06a"; } /* circle-exclamation */ +.fa.fa-check-circle:before { content: "\f058"; } /* circle-check */ +.fa.fa-times-circle:before { content: "\f057"; } /* circle-xmark */ +.fa.fa-times-circle-o:before { content: "\f057"; } /* circle-xmark regular */ +.fa.fa-chevron-circle-left:before { content: "\f137"; } /* circle-chevron-left */ +.fa.fa-chevron-circle-right:before { content: "\f138"; } /* circle-chevron-right */ +.fa.fa-chevron-circle-up:before { content: "\f139"; } /* circle-chevron-up */ +.fa.fa-chevron-circle-down:before { content: "\f13a"; } /* circle-chevron-down */ +.fa.fa-arrow-circle-left:before { content: "\f0a8"; } /* circle-arrow-left */ +.fa.fa-arrow-circle-right:before { content: "\f0a9"; } /* circle-arrow-right */ +.fa.fa-arrow-circle-up:before { content: "\f0aa"; } /* circle-arrow-up */ +.fa.fa-arrow-circle-down:before { content: "\f0ab"; } /* circle-arrow-down */ +.fa.fa-arrow-circle-o-left:before { content: "\f359"; } /* circle-left regular */ +.fa.fa-arrow-circle-o-right:before { content: "\f35a"; } /* circle-right regular */ +.fa.fa-arrow-circle-o-up:before { content: "\f358"; } /* circle-up regular */ +.fa.fa-arrow-circle-o-down:before { content: "\f356"; } /* circle-down regular */ +.fa.fa-mail-forward:before { content: "\f064"; } /* share */ +.fa.fa-mail-reply:before { content: "\f3e5"; } /* reply */ +.fa.fa-mail-reply-all:before { content: "\f122"; } /* reply-all */ +.fa.fa-chain:before { content: "\f0c1"; } /* link */ +.fa.fa-chain-broken:before { content: "\f127"; } /* link-slash */ +.fa.fa-shield:before { content: "\f3ed"; } /* shield */ +.fa.fa-calendar-o:before { content: "\f133"; } /* calendar regular */ +.fa.fa-ticket:before { content: "\f3ff"; } /* ticket-simple */ +.fa.fa-minus-square-o:before { content: "\f146"; } /* square-minus regular */ +.fa.fa-plus-square-o:before { content: "\f0fe"; } /* square-plus regular */ +.fa.fa-level-up:before { content: "\f3bf"; } /* turn-up */ +.fa.fa-level-down:before { content: "\f3be"; } /* turn-down */ +.fa.fa-pencil-square-o:before { content: "\f044"; } /* pen-to-square regular */ +.fa.fa-external-link:before { content: "\f35d"; } /* up-right-from-square */ +.fa.fa-compass:before { content: "\f14e"; } /* compass */ +.fa.fa-caret-square-o-down:before { content: "\f150"; } /* square-caret-down regular */ +.fa.fa-caret-square-o-up:before { content: "\f151"; } /* square-caret-up regular */ +.fa.fa-caret-square-o-right:before { content: "\f152"; } /* square-caret-right regular */ +.fa.fa-eur:before, .fa.fa-euro:before { content: "\f153"; } /* euro-sign */ +.fa.fa-gbp:before { content: "\f154"; } /* sterling-sign */ +.fa.fa-usd:before, .fa.fa-dollar:before { content: "\f155"; } /* dollar-sign */ +.fa.fa-inr:before, .fa.fa-rupee:before { content: "\e1bc"; } /* indian-rupee-sign */ +.fa.fa-jpy:before, .fa.fa-cny:before, .fa.fa-rmb:before, .fa.fa-yen:before { content: "\f157"; } /* yen-sign */ +.fa.fa-rub:before, .fa.fa-ruble:before, .fa.fa-rouble:before { content: "\f158"; } /* ruble-sign */ +.fa.fa-krw:before, .fa.fa-won:before { content: "\f159"; } /* won-sign */ +.fa.fa-btc:before, .fa.fa-bitcoin:before { content: "\f15a"; } /* bitcoin */ +.fa.fa-youtube-play:before { content: "\f167"; } /* youtube */ +.fa.fa-adn:before { content: "\f170"; } /* adn */ +.fa.fa-bitbucket-square:before { content: "\f171"; } /* bitbucket */ +.fa.fa-long-arrow-down:before { content: "\f309"; } /* arrow-down-long */ +.fa.fa-long-arrow-up:before { content: "\f30c"; } /* arrow-up-long */ +.fa.fa-long-arrow-left:before { content: "\f30a"; } /* arrow-left-long */ +.fa.fa-long-arrow-right:before { content: "\f30b"; } /* arrow-right-long */ +.fa.fa-apple:before { content: "\f179"; } /* apple */ +.fa.fa-windows:before { content: "\f17a"; } /* windows */ +.fa.fa-android:before { content: "\f17b"; } /* android */ +.fa.fa-linux:before { content: "\f17c"; } /* linux */ +.fa.fa-dribbble:before { content: "\f17d"; } /* dribbble */ +.fa.fa-skype:before { content: "\f17e"; } /* skype */ +.fa.fa-foursquare:before { content: "\f180"; } /* foursquare */ +.fa.fa-trello:before { content: "\f181"; } /* trello */ +.fa.fa-gratipay:before { content: "\f184"; } /* gratipay */ +.fa.fa-gittip:before { content: "\f184"; } /* gratipay */ +.fa.fa-sun-o:before { content: "\f185"; } /* sun regular */ +.fa.fa-moon-o:before { content: "\f186"; } /* moon regular */ +.fa.fa-vk:before { content: "\f189"; } /* vk */ +.fa.fa-weibo:before { content: "\f18a"; } /* weibo */ +.fa.fa-renren:before { content: "\f18b"; } /* renren */ +.fa.fa-pagelines:before { content: "\f18c"; } /* pagelines */ +.fa.fa-stack-exchange:before { content: "\f18d"; } /* stack-exchange */ +.fa.fa-arrow-circle-o-right:before { content: "\f35a"; } /* circle-right regular */ +.fa.fa-arrow-circle-o-left:before { content: "\f359"; } /* circle-left regular */ +.fa.fa-caret-square-o-left:before { content: "\f191"; } /* square-caret-left regular */ +.fa.fa-toggle-left:before { content: "\f191"; } /* square-caret-left regular */ +.fa.fa-dot-circle-o:before { content: "\f192"; } /* circle-dot regular */ +.fa.fa-vimeo-square:before { content: "\f194"; } /* vimeo */ +.fa.fa-try:before, .fa.fa-turkish-lira:before { content: "\e2bb"; } /* turkish-lira-sign */ +.fa.fa-plus-square-o:before { content: "\f0fe"; } /* square-plus regular */ +.fa.fa-slack:before { content: "\f198"; } /* slack */ +.fa.fa-wordpress:before { content: "\f19a"; } /* wordpress */ +.fa.fa-openid:before { content: "\f19b"; } /* openid */ +.fa.fa-institution:before, .fa.fa-bank:before, .fa.fa-university:before { content: "\f19c"; } /* building-columns */ +.fa.fa-mortar-board:before, .fa.fa-graduation-cap:before { content: "\f19d"; } /* graduation-cap */ +.fa.fa-yahoo:before { content: "\f19e"; } /* yahoo */ +.fa.fa-google:before { content: "\f1a0"; } /* google */ +.fa.fa-reddit:before { content: "\f1a1"; } /* reddit */ +.fa.fa-reddit-square:before { content: "\f1a2"; } /* reddit-square */ +.fa.fa-stumbleupon-circle:before { content: "\f1a3"; } /* stumbleupon-circle */ +.fa.fa-stumbleupon:before { content: "\f1a4"; } /* stumbleupon */ +.fa.fa-delicious:before { content: "\f1a5"; } /* delicious */ +.fa.fa-digg:before { content: "\f1a6"; } /* digg */ +.fa.fa-pied-piper-pp:before { content: "\f1a7"; } /* pied-piper-pp */ +.fa.fa-pied-piper-alt:before { content: "\f1a8"; } /* pied-piper-alt */ +.fa.fa-drupal:before { content: "\f1a9"; } /* drupal */ +.fa.fa-joomla:before { content: "\f1aa"; } /* joomla */ +.fa.fa-behance:before { content: "\f1b4"; } /* behance */ +.fa.fa-behance-square:before { content: "\f1b5"; } /* behance-square */ +.fa.fa-steam:before { content: "\f1b6"; } /* steam */ +.fa.fa-steam-square:before { content: "\f1b7"; } /* steam-square */ +.fa.fa-spotify:before { content: "\f1bc"; } /* spotify */ +.fa.fa-deviantart:before { content: "\f1bd"; } /* deviantart */ +.fa.fa-soundcloud:before { content: "\f1be"; } /* soundcloud */ +.fa.fa-vine:before { content: "\f1ca"; } /* vine */ +.fa.fa-codepen:before { content: "\f1cb"; } /* codepen */ +.fa.fa-jsfiddle:before { content: "\f1cc"; } /* jsfiddle */ +.fa.fa-life-ring:before, .fa.fa-life-bouy:before, .fa.fa-life-buoy:before, .fa.fa-life-saver:before, .fa.fa-support:before { content: "\f1cd"; } /* life-ring */ +.fa.fa-circle-o-notch:before { content: "\f1ce"; } /* circle-notch */ +.fa.fa-rebel:before, .fa.fa-ra:before, .fa.fa-resistance:before { content: "\f1d0"; } /* rebel */ +.fa.fa-empire:before, .fa.fa-ge:before { content: "\f1d1"; } /* empire */ +.fa.fa-git-square:before { content: "\f1d2"; } /* git-square */ +.fa.fa-git:before { content: "\f1d3"; } /* git */ +.fa.fa-hacker-news:before, .fa.fa-y-combinator-square:before, .fa.fa-yc-square:before { content: "\f1d4"; } /* hacker-news */ +.fa.fa-tencent-weibo:before { content: "\f1d5"; } /* tencent-weibo */ +.fa.fa-qq:before { content: "\f1d6"; } /* qq */ +.fa.fa-weixin:before, .fa.fa-wechat:before { content: "\f1d7"; } /* weixin */ +.fa.fa-paper-plane:before, .fa.fa-send:before { content: "\f1d8"; } /* paper-plane */ +.fa.fa-paper-plane-o:before, .fa.fa-send-o:before { content: "\f1d8"; } /* paper-plane regular */ +.fa.fa-circle-thin:before { content: "\f111"; } /* circle regular */ +.fa.fa-header:before { content: "\f1dc"; } /* heading */ +.fa.fa-futbol-o:before, .fa.fa-soccer-ball-o:before { content: "\f1e3"; } /* futbol regular */ +.fa.fa-tty:before { content: "\f1e4"; } /* tty */ +.fa.fa-binoculars:before { content: "\f1e5"; } /* binoculars */ +.fa.fa-plug:before { content: "\f1e6"; } /* plug */ +.fa.fa-slideshare:before { content: "\f1e7"; } /* slideshare */ +.fa.fa-twitch:before { content: "\f1e8"; } /* twitch */ +.fa.fa-yelp:before { content: "\f1e9"; } /* yelp */ +.fa.fa-newspaper-o:before { content: "\f1ea"; } /* newspaper regular */ +.fa.fa-wifi:before { content: "\f1eb"; } /* wifi */ +.fa.fa-paypal:before { content: "\f1ed"; } /* paypal */ +.fa.fa-google-wallet:before { content: "\f1ee"; } /* google-wallet */ +.fa.fa-cc-visa:before { content: "\f1f0"; } /* cc-visa */ +.fa.fa-cc-mastercard:before { content: "\f1f1"; } /* cc-mastercard */ +.fa.fa-cc-discover:before { content: "\f1f2"; } /* cc-discover */ +.fa.fa-cc-amex:before { content: "\f1f3"; } /* cc-amex */ +.fa.fa-cc-paypal:before { content: "\f1f4"; } /* cc-paypal */ +.fa.fa-cc-stripe:before { content: "\f1f5"; } /* cc-stripe */ +.fa.fa-bell-slash:before { content: "\f1f6"; } /* bell-slash */ +.fa.fa-bell-slash-o:before { content: "\f1f6"; } /* bell-slash regular */ +.fa.fa-cc:before { content: "\f20a"; } /* closed-captioning regular */ +.fa.fa-ils:before, .fa.fa-shekel:before, .fa.fa-sheqel:before { content: "\f20b"; } /* shekel-sign */ +.fa.fa-meanpath:before { content: "\f20c"; } /* font-awesome */ +.fa.fa-buysellads:before { content: "\f20d"; } /* buysellads */ +.fa.fa-connectdevelop:before { content: "\f20e"; } /* connectdevelop */ +.fa.fa-dashcube:before { content: "\f210"; } /* dashcube */ +.fa.fa-forumbee:before { content: "\f211"; } /* forumbee */ +.fa.fa-leanpub:before { content: "\f212"; } /* leanpub */ +.fa.fa-sellsy:before { content: "\f213"; } /* sellsy */ +.fa.fa-shirtsinbulk:before { content: "\f214"; } /* shirtsinbulk */ +.fa.fa-simplybuilt:before { content: "\f215"; } /* simplybuilt */ +.fa.fa-skyatlas:before { content: "\f216"; } /* skyatlas */ +.fa.fa-diamond:before { content: "\f3a5"; } /* gem */ +.fa.fa-intersex:before, .fa.fa-transgender:before { content: "\f224"; } /* mars-and-venus */ +.fa.fa-transgender-alt:before { content: "\f225"; } /* transgender */ +.fa.fa-pinterest-p:before { content: "\f231"; } /* pinterest-p */ +.fa.fa-whatsapp:before { content: "\f232"; } /* whatsapp */ +.fa.fa-hotel:before, .fa.fa-bed:before { content: "\f236"; } /* bed */ +.fa.fa-viacoin:before { content: "\f237"; } /* viacoin */ +.fa.fa-medium:before { content: "\f23a"; } /* medium */ +.fa.fa-y-combinator:before, .fa.fa-yc:before { content: "\f23b"; } /* y-combinator */ +.fa.fa-optin-monster:before { content: "\f23c"; } /* optin-monster */ +.fa.fa-opencart:before { content: "\f23d"; } /* opencart */ +.fa.fa-expeditedssl:before { content: "\f23e"; } /* expeditedssl */ +.fa.fa-battery-4:before, .fa.fa-battery:before, .fa.fa-battery-full:before { content: "\f240"; } /* battery-full */ +.fa.fa-battery-3:before, .fa.fa-battery-three-quarters:before { content: "\f241"; } /* battery-three-quarters */ +.fa.fa-battery-2:before, .fa.fa-battery-half:before { content: "\f242"; } /* battery-half */ +.fa.fa-battery-1:before, .fa.fa-battery-quarter:before { content: "\f243"; } /* battery-quarter */ +.fa.fa-battery-0:before, .fa.fa-battery-empty:before { content: "\f244"; } /* battery-empty */ +.fa.fa-sticky-note:before { content: "\f249"; } /* note-sticky */ +.fa.fa-sticky-note-o:before { content: "\f249"; } /* note-sticky regular */ +.fa.fa-cc-jcb:before { content: "\f24b"; } /* cc-jcb */ +.fa.fa-cc-diners-club:before { content: "\f24c"; } /* cc-diners-club */ +.fa.fa-clone:before { content: "\f24d"; } /* clone */ +.fa.fa-hourglass-o:before { content: "\f254"; } /* hourglass regular */ +.fa.fa-hourglass-1:before, .fa.fa-hourglass-start:before { content: "\f251"; } /* hourglass-start */ +.fa.fa-hourglass-2:before, .fa.fa-hourglass-half:before { content: "\f252"; } /* hourglass-half */ +.fa.fa-hourglass-3:before, .fa.fa-hourglass-end:before { content: "\f253"; } /* hourglass-end */ +.fa.fa-hand-rock-o:before { content: "\f255"; } /* hand-back-fist regular */ +.fa.fa-hand-grab-o:before, .fa.fa-hand-stop-o:before { content: "\f256"; } /* hand regular */ +.fa.fa-hand-paper-o:before { content: "\f256"; } /* hand regular */ +.fa.fa-hand-scissors-o:before { content: "\f257"; } /* hand-scissors regular */ +.fa.fa-hand-lizard-o:before { content: "\f258"; } /* hand-lizard regular */ +.fa.fa-hand-spock-o:before { content: "\f259"; } /* hand-spock regular */ +.fa.fa-hand-pointer-o:before { content: "\f25a"; } /* hand-pointer regular */ +.fa.fa-hand-peace-o:before { content: "\f25b"; } /* hand-peace regular */ +.fa.fa-registered:before { content: "\f25d"; } /* registered regular */ +.fa.fa-creative-commons:before { content: "\f25e"; } /* creative-commons */ +.fa.fa-gg:before { content: "\f260"; } /* gg */ +.fa.fa-gg-circle:before { content: "\f261"; } /* gg-circle */ +.fa.fa-odnoklassniki:before { content: "\f263"; } /* odnoklassniki */ +.fa.fa-odnoklassniki-square:before { content: "\f264"; } /* odnoklassniki-square */ +.fa.fa-get-pocket:before { content: "\f265"; } /* get-pocket */ +.fa.fa-wikipedia-w:before { content: "\f266"; } /* wikipedia-w */ +.fa.fa-safari:before { content: "\f267"; } /* safari */ +.fa.fa-chrome:before { content: "\f268"; } /* chrome */ +.fa.fa-firefox:before { content: "\f269"; } /* firefox */ +.fa.fa-opera:before { content: "\f26a"; } /* opera */ +.fa.fa-internet-explorer:before { content: "\f26b"; } /* internet-explorer */ +.fa.fa-television:before, .fa.fa-tv:before { content: "\f26c"; } /* tv */ +.fa.fa-contao:before { content: "\f26d"; } /* contao */ +.fa.fa-500px:before { content: "\f26e"; } /* 500px */ +.fa.fa-amazon:before { content: "\f270"; } /* amazon */ +.fa.fa-calendar-plus-o:before { content: "\f271"; } /* calendar-plus regular */ +.fa.fa-calendar-minus-o:before { content: "\f272"; } /* calendar-minus regular */ +.fa.fa-calendar-times-o:before { content: "\f273"; } /* calendar-xmark regular */ +.fa.fa-calendar-check-o:before { content: "\f274"; } /* calendar-check regular */ +.fa.fa-map-o:before { content: "\f279"; } /* map regular */ +.fa.fa-commenting:before { content: "\f4ad"; } /* comment-dots */ +.fa.fa-commenting-o:before { content: "\f4ad"; } /* comment-dots regular */ +.fa.fa-houzz:before { content: "\f27c"; } /* houzz */ +.fa.fa-vimeo:before { content: "\f27d"; } /* vimeo-v */ +.fa.fa-black-tie:before { content: "\f27e"; } /* black-tie */ +.fa.fa-fonticons:before { content: "\f280"; } /* fonticons */ +.fa.fa-reddit-alien:before { content: "\f281"; } /* reddit-alien */ +.fa.fa-edge:before { content: "\f282"; } /* edge */ +.fa.fa-codiepie:before { content: "\f284"; } /* codiepie */ +.fa.fa-modx:before { content: "\f285"; } /* modx */ +.fa.fa-fort-awesome:before { content: "\f286"; } /* fort-awesome */ +.fa.fa-usb:before { content: "\f287"; } /* usb */ +.fa.fa-product-hunt:before { content: "\f288"; } /* product-hunt */ +.fa.fa-mixcloud:before { content: "\f289"; } /* mixcloud */ +.fa.fa-scribd:before { content: "\f28a"; } /* scribd */ +.fa.fa-pause-circle-o:before { content: "\f28c"; } /* circle-pause regular */ +.fa.fa-stop-circle:before { content: "\f28d"; } /* circle-stop */ +.fa.fa-stop-circle-o:before { content: "\f28d"; } /* circle-stop regular */ +.fa.fa-bluetooth:before { content: "\f293"; } /* bluetooth */ +.fa.fa-bluetooth-b:before { content: "\f294"; } /* bluetooth-b */ +.fa.fa-gitlab:before { content: "\f296"; } /* gitlab */ +.fa.fa-wpbeginner:before { content: "\f297"; } /* wpbeginner */ +.fa.fa-wpforms:before { content: "\f298"; } /* wpforms */ +.fa.fa-envira:before { content: "\f299"; } /* envira */ +.fa.fa-wheelchair-alt:before { content: "\f368"; } /* accessible-icon */ +.fa.fa-question-circle-o:before { content: "\f059"; } /* circle-question regular */ +.fa.fa-blind:before { content: "\f29d"; } /* person-walking-with-cane */ +.fa.fa-audio-description:before { content: "\f29e"; } /* audio-description */ +.fa.fa-phone-volume:before, .fa.fa-volume-control-phone:before { content: "\f2a0"; } /* phone-volume */ +.fa.fa-braille:before { content: "\f2a1"; } /* braille */ +.fa.fa-assistive-listening-systems:before { content: "\f2a2"; } /* assistive-listening-systems */ +.fa.fa-american-sign-language-interpreting:before, .fa.fa-asl-interpreting:before { content: "\f2a3"; } /* hands-asl-interpreting */ +.fa.fa-deaf:before, .fa.fa-deafness:before, .fa.fa-hard-of-hearing:before { content: "\f2a4"; } /* ear-deaf */ +.fa.fa-glide:before { content: "\f2a5"; } /* glide */ +.fa.fa-glide-g:before { content: "\f2a6"; } /* glide-g */ +.fa.fa-sign-language:before, .fa.fa-signing:before { content: "\f2a7"; } /* hands */ +.fa.fa-viadeo:before { content: "\f2a9"; } /* viadeo */ +.fa.fa-viadeo-square:before { content: "\f2aa"; } /* viadeo-square */ +.fa.fa-snapchat:before { content: "\f2ab"; } /* snapchat */ +.fa.fa-snapchat-ghost:before { content: "\f2ac"; } /* snapchat */ +.fa.fa-snapchat-square:before { content: "\f2ad"; } /* snapchat-square */ +.fa.fa-pied-piper:before { content: "\f2ae"; } /* pied-piper */ +.fa.fa-first-order:before { content: "\f2b0"; } /* first-order */ +.fa.fa-yoast:before { content: "\f2b1"; } /* yoast */ +.fa.fa-themeisle:before { content: "\f2b2"; } /* themeisle */ +.fa.fa-google-plus-official:before, .fa.fa-google-plus-circle:before { content: "\f2b3"; } /* google-plus */ +.fa.fa-fa:before, .fa.fa-font-awesome:before { content: "\f2b4"; } /* font-awesome */ +.fa.fa-user-o:before { content: "\f007"; } /* user regular */ +.fa.fa-id-badge:before { content: "\f2c1"; } /* id-badge */ +.fa.fa-id-badge-o:before { content: "\f2c1"; } /* id-badge regular */ +.fa.fa-id-card:before { content: "\f2c2"; } /* id-card */ +.fa.fa-id-card-o:before { content: "\f2c2"; } /* id-card regular */ +.fa.fa-quora:before { content: "\f2c4"; } /* quora */ +.fa.fa-free-code-camp:before { content: "\f2c5"; } /* free-code-camp */ +.fa.fa-telegram:before { content: "\f2c6"; } /* telegram */ +.fa.fa-shower:before { content: "\f2cc"; } /* shower */ +.fa.fa-bath:before, .fa.fa-bathtub:before, .fa.fa-s15:before { content: "\f2cd"; } /* bath */ +.fa.fa-imdb:before { content: "\f2d8"; } /* imdb */ +.fa.fa-ravelry:before { content: "\f2d9"; } /* ravelry */ +.fa.fa-eercast:before { content: "\f2da"; } /* sellcast */ +.fa.fa-linode:before { content: "\f2b8"; } /* linode */ +.fa.fa-address-book-o:before { content: "\f2b9"; } /* address-book regular */ +.fa.fa-address-card-o:before { content: "\f2bb"; } /* address-card regular */ +.fa.fa-user-circle-o:before { content: "\f2bd"; } /* circle-user regular */ +.fa.fa-user-circle:before { content: "\f2bd"; } /* circle-user */ +.fa.fa-bandcamp:before { content: "\f2d5"; } /* bandcamp */ +/*.fa.fa-grav:before { content: "\f2d6"; } !* grav *!*/ +.fa.fa-etsy:before { content: "\f2d7"; } /* etsy */ +.fa.fa-meetup:before { content: "\f2e0"; } /* meetup */ + +/* Brands requiring explicit font-family */ +.fa.fa-twitter:before { content: "\e61b"; } /* x-twitter */ +.fa.fa-facebook-square:before { content: "\f082"; } /* square-facebook */ +.fa.fa-facebook:before { content: "\f09a"; } /* facebook */ +.fa.fa-github:before { content: "\f09b"; } /* github */ +.fa.fa-github-square:before { content: "\f092"; } /* square-github */ +.fa.fa-google-plus:before { content: "\f0d5"; } /* google-plus */ +.fa.fa-google-plus-square:before { content: "\f0d4"; } /* square-google-plus */ +.fa.fa-linkedin:before { content: "\f08c"; } /* linkedin */ +.fa.fa-linkedin-square:before { content: "\f08c"; } /* square-linkedin */ +.fa.fa-pinterest:before { content: "\f0d2"; } /* pinterest */ +.fa.fa-pinterest-square:before { content: "\f0d3"; } /* square-pinterest */ +.fa.fa-reddit-square:before { content: "\f1a2"; } /* square-reddit */ +.fa.fa-tumblr:before { content: "\f173"; } /* tumblr */ +.fa.fa-tumblr-square:before { content: "\f174"; } /* square-tumblr */ +.fa.fa-twitter-square:before { content: "\e61a"; } /* square-x-twitter */ +.fa.fa-vimeo-square:before { content: "\f194"; } /* square-vimeo */ +.fa.fa-youtube:before { content: "\f167"; } /* youtube */ +.fa.fa-youtube-square:before { content: "\f431"; } /* square-youtube */ +.fa.fa-xing:before { content: "\f168"; } /* xing */ +.fa.fa-xing-square:before { content: "\f169"; } /* square-xing */ +.fa.fa-unsplash:before { content: "\e07c"; } /* unsplash */ +.fa.fa-artstation:before { content: "\f77a"; } /* artstation */ +.fa.fa-cc-by:before { content: "\f4e7"; } /* creative-commons-by */ +.fa.fa-cc-nc:before { content: "\f4e8"; } /* creative-commons-nc */ +.fa.fa-cc-nc-eu:before { content: "\f4e9"; } /* creative-commons-nc-eu */ +.fa.fa-cc-nc-jp:before { content: "\f4ea"; } /* creative-commons-nc-jp */ +.fa.fa-cc-nd:before { content: "\f4eb"; } /* creative-commons-nd */ +.fa.fa-cc-pd:before { content: "\f4ec"; } /* creative-commons-pd */ +.fa.fa-cc-remix:before { content: "\f4ee"; } /* creative-commons-remix */ +.fa.fa-cc-sa:before { content: "\f4ef"; } /* creative-commons-sa */ +.fa.fa-cc-share:before { content: "\f4f1"; } /* creative-commons-share */ +.fa.fa-cc-zero:before { content: "\f4f3"; } /* creative-commons-zero */ +.fa.fa-digitalocean:before { content: "\f391"; } /* digital-ocean */ +.fa.fa-discord:before { content: "\f392"; } /* discord */ +.fa.fa-ethereum:before { content: "\f42e"; } /* ethereum */ +.fa.fa-f-droid:before { content: "\f17b"; } /* android */ +.fa.fa-facebook-messenger:before { content: "\f39f"; } /* facebook-messenger */ +.fa.fa-laravel:before { content: "\f3bd"; } /* laravel */ +.fa.fa-mastodon:before { content: "\f4f6"; } /* mastodon */ +.fa.fa-nodejs:before { content: "\f3d3"; } /* node-js */ +.fa.fa-orcid:before { content: "\f8d2"; } /* orcid */ +.fa.fa-patreon:before { content: "\f3d9"; } /* patreon */ +.fa.fa-php:before { content: "\f457"; } /* php */ +.fa.fa-python:before { content: "\f3e2"; } /* python */ +.fa.fa-react:before { content: "\f41b"; } /* react */ +.fa.fa-researchgate:before { content: "\f4f8"; } /* researchgate */ +.fa.fa-signal:before { content: "\f694"; } /* signal-messenger */ + + +/* Fork Awesome specific icon fallbacks */ +.fa.fa-activitypub:before { content: "\f1e0"; } /* share-nodes */ +.fa.fa-archive-org:before { content: "\f19c"; } /* building-columns */ +.fa.fa-biometric:before { content: "\f577"; } /* fingerprint */ +.fa.fa-c:before { content: "\43"; } /* letter C fallback */ +.fa.fa-dat:before { content: "\f1c0"; } /* database */ +.fa.fa-diaspora:before { content: "\f069"; } /* asterisk */ +.fa.fa-emby:before { content: "\f144"; } /* play-circle */ +.fa.fa-foster:before { content: "\e58b"; } /* hands-holding-child */ +.fa.fa-friendica:before { content: "\f0c0"; } /* users */ +.fa.fa-galaxy:before { content: "\f135"; } /* rocket */ +.fa.fa-gimp:before { content: "\f53f"; } /* palette */ +.fa.fa-gitea:before { content: "\f0f4"; } /* mug-hot */ +.fa.fa-gnu-social:before { content: "\e60c"; } /* gnu */ +.fa.fa-google-auth:before { content: "\f3ed"; } /* shield */ +.fa.fa-hackaday:before { content: "\f0ad"; } /* wrench */ +.fa.fa-hackster:before { content: "\f2db"; } /* microchip */ +.fa.fa-inkscape:before { content: "\f5c3"; } /* pen-nib */ +.fa.fa-jirafeau:before { content: "\f064"; } /* share */ +.fa.fa-joplin:before { content: "\f02d"; } /* book */ +.fa.fa-jsdelivr:before { content: "\f48b"; } /* truck-fast */ +.fa.fa-keybase:before { content: "\f084"; } /* key */ +.fa.fa-liberapay:before { content: "\f4b9"; } /* hand-holding-heart */ +.fa.fa-libreoffice:before { content: "\f1c2"; } /* file-word */ +.fa.fa-line-graph:before { content: "\f201"; } /* chart-line */ +.fa.fa-matrix-org:before { content: "\f4ad"; } /* comment-dots */ +.fa.fa-nextcloud:before { content: "\f0c2"; } /* cloud */ +.fa.fa-peertube:before { content: "\f03d"; } /* video */ +.fa.fa-pi-hole:before { content: "\f3ed"; } /* shield-halved */ +.fa.fa-pixelfed:before { content: "\f083"; } /* camera-retro */ +.fa.fa-plume:before { content: "\f56b"; } /* feather */ +.fa.fa-postgresql:before { content: "\f1c0"; } /* database */ +.fa.fa-riot:before { content: "\f086"; } /* comments */ +.fa.fa-scuttlebutt:before { content: "\f578"; } /* fish */ +.fa.fa-sketchfab:before { content: "\f1b2"; } /* cube */ +.fa.fa-snowdrift:before { content: "\f2dc"; } /* snowflake */ +.fa.fa-social-home:before { content: "\e57f"; } /* house-user */ +.fa.fa-syncthing:before { content: "\f2f1"; } /* arrows-rotate */ +.fa.fa-tex:before { content: "\f121"; } /* code */ +.fa.fa-tor:before { content: "\f4f5"; } /* user-secret */ + +.fa.fa-vagrant:before { content: "\56"; } /* letter V fallback */ +.fa.fa-vscode:before { content: "\f121"; } /* code */ +.fa.fa-xmpp:before { content: "\f075"; } /* comment */ +.fa.fa-zotero:before { content: "\f02e"; } /* bookmark */ + +/* Additional common icons from Grav admin usage */ +.fa.fa-paint-brush:before { content: "\f53c"; } /* paintbrush */ +.fa.fa-birthday-cake:before { content: "\f1fd"; } /* cake-candles */ +.fa.fa-chart-pie:before { content: "\f200"; } /* chart-pie */ +.fa.fa-chart-line:before { content: "\f201"; } /* chart-line */ +.fa.fa-toggle-off:before { content: "\f204"; } /* toggle-off */ +.fa.fa-toggle-on:before { content: "\f205"; } /* toggle-on */ +.fa.fa-bicycle:before { content: "\f206"; } /* bicycle */ +.fa.fa-bus:before { content: "\f207"; } /* bus */ +.fa.fa-closed-captioning:before { content: "\f20a"; } /* closed-captioning regular */ +.fa.fa-shekel:before, .fa.fa-sheqel:before, .fa.fa-ils:before { content: "\f20b"; } /* shekel-sign */ +.fa.fa-cart-plus:before { content: "\f217"; } /* cart-plus */ +.fa.fa-cart-arrow-down:before { content: "\f218"; } /* cart-arrow-down */ +.fa.fa-ship:before { content: "\f21a"; } /* ship */ +.fa.fa-user-secret:before { content: "\f21b"; } /* user-secret */ +.fa.fa-motorcycle:before { content: "\f21c"; } /* motorcycle */ +.fa.fa-street-view:before { content: "\f21d"; } /* street-view */ +.fa.fa-heartbeat:before { content: "\f21e"; } /* heart-pulse */ +.fa.fa-venus:before { content: "\f221"; } /* venus */ +.fa.fa-mars:before { content: "\f222"; } /* mars */ +.fa.fa-mercury:before { content: "\f223"; } /* mercury */ +.fa.fa-transgender:before { content: "\f224"; } /* mars-and-venus */ +.fa.fa-transgender-alt:before { content: "\f225"; } /* transgender */ +.fa.fa-venus-double:before { content: "\f226"; } /* venus-double */ +.fa.fa-mars-double:before { content: "\f227"; } /* mars-double */ +.fa.fa-venus-mars:before { content: "\f228"; } /* venus-mars */ +.fa.fa-mars-stroke:before { content: "\f229"; } /* mars-stroke */ +.fa.fa-mars-stroke-v:before { content: "\f22a"; } /* mars-stroke-up */ +.fa.fa-mars-stroke-h:before { content: "\f22b"; } /* mars-stroke-right */ +.fa.fa-neuter:before { content: "\f22c"; } /* neuter */ +.fa.fa-genderless:before { content: "\f22d"; } /* genderless */ +.fa.fa-server:before { content: "\f233"; } /* server */ +.fa.fa-user-plus:before { content: "\f234"; } /* user-plus */ +.fa.fa-user-times:before { content: "\f235"; } /* user-xmark */ +.fa.fa-vcard:before, .fa.fa-vcard-o:before { content: "\f2bb"; } /* address-card */ +.fa.fa-balance-scale:before { content: "\f24e"; } /* scale-balanced */ +.fa.fa-balance-scale-left:before { content: "\f515"; } /* scale-unbalanced */ +.fa.fa-balance-scale-right:before { content: "\f516"; } /* scale-unbalanced-flip */ +.fa.fa-map-signs:before { content: "\f277"; } /* signs-post */ +.fa.fa-map-marker-alt:before { content: "\f3c5"; } /* location-dot */ +.fa.fa-mobile-phone:before, .fa.fa-mobile:before { content: "\f3cd"; } /* mobile-screen-button */ +.fa.fa-money:before { content: "\f3d1"; } /* money-bill */ +.fa.fa-euro-sign:before, .fa.fa-eur:before, .fa.fa-euro:before { content: "\f153"; } /* euro-sign */ +.fa.fa-pound-sign:before, .fa.fa-gbp:before { content: "\f154"; } /* sterling-sign */ +.fa.fa-dollar-sign:before, .fa.fa-dollar:before, .fa.fa-usd:before { content: "\f155"; } /* dollar-sign */ +.fa.fa-rupee-sign:before, .fa.fa-rupee:before, .fa.fa-inr:before { content: "\e1bc"; } /* indian-rupee-sign */ +.fa.fa-yen-sign:before, .fa.fa-cny:before, .fa.fa-rmb:before, .fa.fa-yen:before, .fa.fa-jpy:before { content: "\f157"; } /* yen-sign */ +.fa.fa-ruble-sign:before, .fa.fa-ruble:before, .fa.fa-rouble:before, .fa.fa-rub:before { content: "\f158"; } /* ruble-sign */ +.fa.fa-won-sign:before, .fa.fa-krw:before, .fa.fa-won:before { content: "\f159"; } /* won-sign */ +.fa.fa-lira-sign:before, .fa.fa-try:before { content: "\f195"; } /* turkish-lira-sign */ +.fa.fa-thermometer-empty:before { content: "\f2cb"; } /* temperature-empty */ +.fa.fa-thermometer-full:before { content: "\f2c7"; } /* temperature-full */ +.fa.fa-thermometer-half:before { content: "\f2c9"; } /* temperature-half */ +.fa.fa-thermometer-quarter:before { content: "\f2ca"; } /* temperature-quarter */ +.fa.fa-thermometer-three-quarters:before { content: "\f2c8"; } /* temperature-three-quarters */ +.fa.fa-bath:before, .fa.fa-bathtub:before { content: "\f2cd"; } /* bath */ +.fa.fa-times-rectangle:before, .fa.fa-window-close:before, .fa.fa-times-rectangle-o:before, .fa.fa-window-close-o:before { content: "\f410"; } /* rectangle-xmark */ +.fa.fa-power-off:before { content: "\f011"; } /* power-off */ + +/* Ensure FA4 style classes work */ +.fa.pull-left { + float: left; + margin-right: .3em; +} + +.fa.pull-right { + float: right; + margin-left: .3em; +} + +/* Compatibility for -o outline variants using CSS pseudo-elements */ +/*[class*=" fa-"][class*="-o"]:not(.fa-spotify):not(.fa-edge-o):not(.fa-sign-o),*/ +/*[class^="fa-"][class*="-o"]:not(.fa-spotify):not(.fa-edge-o):not(.fa-sign-o) {*/ +/* font-weight: 400 !important;*/ +/*}*/ + +/* Handle special cases for icons ending in -o that aren't outline variants */ +/*.fa-spotify:before,*/ +/*.fa-edge-o:before,*/ +/*.fa-sign-o:before {*/ +/* font-weight: 900 !important;*/ +/*}*/ \ No newline at end of file diff --git a/plugins/admin/themes/grav/css/fork-awesome.min.css b/plugins/admin/themes/grav/css/fork-awesome.min.css deleted file mode 100644 index 82222e0..0000000 --- a/plugins/admin/themes/grav/css/fork-awesome.min.css +++ /dev/null @@ -1,12 +0,0 @@ -/*! -Fork Awesome 1.1.5 -License - http://forkawesome.github.io/Fork-Awesome/license - -Copyright 2018 Dave Gandy & Fork Awesome - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */@font-face{font-family:FontAwesome;src:url(../fonts/forkawesome-webfont.eot?v=1.1.5);src:url(../fonts/forkawesome-webfont.eot?#iefix&v=1.1.5) format('embedded-opentype'),url(../fonts/forkawesome-webfont.woff2?v=1.1.5) format('woff2'),url(../fonts/forkawesome-webfont.woff?v=1.1.5) format('woff'),url(../fonts/forkawesome-webfont.ttf?v=1.1.5) format('truetype'),url(../fonts/forkawesome-webfont.svg?v=1.1.5#forkawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.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)}.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 .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell-o:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-globe-e:before{content:"\f304"}.fa-globe-w:before{content:"\f305"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-community:before,.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus-g:before,.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before,.fa-utensils:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before,.fa-pound:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-desc:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-desc:before,.fa-sort-amount-up:before{content:"\f161"}.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-desc:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before,.fa-closed-captioning:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before,.fa-gem:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-medium-square:before{content:"\f2f8"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo-v:before,.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.fa-mastodon:before{content:"\f2e1"}.fa-mastodon-alt:before{content:"\f2e2"}.fa-fork-awesome:before,.fa-fork-circle:before{content:"\f2e3"}.fa-peertube:before{content:"\f2e4"}.fa-diaspora:before{content:"\f2e5"}.fa-friendica:before{content:"\f2e6"}.fa-gnu-social:before{content:"\f2e7"}.fa-liberapay-square:before{content:"\f2e8"}.fa-liberapay:before{content:"\f2e9"}.fa-scuttlebutt:before,.fa-ssb:before{content:"\f2ea"}.fa-hubzilla:before{content:"\f2eb"}.fa-social-home:before{content:"\f2ec"}.fa-artstation:before{content:"\f2ed"}.fa-discord:before{content:"\f2ee"}.fa-discord-alt:before{content:"\f2ef"}.fa-patreon:before{content:"\f2f0"}.fa-snowdrift:before{content:"\f2f1"}.fa-activitypub:before{content:"\f2f2"}.fa-ethereum:before{content:"\f2f3"}.fa-keybase:before{content:"\f2f4"}.fa-shaarli:before{content:"\f2f5"}.fa-shaarli-o:before{content:"\f2f6"}.fa-cut-key:before,.fa-key-modern:before{content:"\f2f7"}.fa-xmpp:before{content:"\f2f9"}.fa-archive-org:before{content:"\f2fc"}.fa-freedombox:before{content:"\f2fd"}.fa-facebook-messenger:before{content:"\f2fe"}.fa-debian:before{content:"\f2ff"}.fa-mastodon-square:before{content:"\f300"}.fa-tipeee:before{content:"\f301"}.fa-react:before{content:"\f302"}.fa-dogmazic:before{content:"\f303"}.fa-zotero:before{content:"\f309"}.fa-nodejs:before{content:"\f308"}.fa-nextcloud:before{content:"\f306"}.fa-nextcloud-square:before{content:"\f307"}.fa-hackaday:before{content:"\f30a"}.fa-laravel:before{content:"\f30b"}.fa-signalapp:before{content:"\f30c"}.fa-gnupg:before{content:"\f30d"}.fa-php:before{content:"\f30e"}.fa-ffmpeg:before{content:"\f30f"}.fa-joplin:before{content:"\f310"}.fa-syncthing:before{content:"\f311"}.fa-inkscape:before{content:"\f312"}.fa-matrix-org:before{content:"\f313"}.fa-pixelfed:before{content:"\f314"}.fa-bootstrap:before{content:"\f315"}.fa-dev-to:before{content:"\f316"}.fa-hashnode:before{content:"\f317"}.fa-jirafeau:before{content:"\f318"}.fa-emby:before{content:"\f319"}.fa-wikidata:before{content:"\f31a"}.fa-gimp:before{content:"\f31b"}.fa-c:before{content:"\f31c"}.fa-digitalocean:before{content:"\f31d"}.fa-att:before{content:"\f31e"}.fa-gitea:before{content:"\f31f"}.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/plugins/admin/themes/grav/fonts/forkawesome-webfont.eot b/plugins/admin/themes/grav/fonts/forkawesome-webfont.eot deleted file mode 100644 index 23b4f41fde8bd764a9e9edf4ee828cdd17a51c84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186490 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 z 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 - - - - -Created by FontForge 20180321 at Mon Oct 15 10:55:59 2018 - By Julien Deswaef -The Fork Awesome font is licensed under the SIL OFL 1.1 (http://scripts.sil.org/OFL). Fork Awesome is a fork based of off Font Awesome 4.7.0 by Dave Gandy. More info on licenses at https://forkawesome.github.io - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/admin/themes/grav/fonts/forkawesome-webfont.ttf b/plugins/admin/themes/grav/fonts/forkawesome-webfont.ttf deleted file mode 100644 index c8a662667b94f9c02549fb943bfc910654fa64bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186300 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

#p&xy8&C2-{y=Be^gTD<{ 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%0D%vp^CP&nR*dgT1&j2$hqa31FS6~Y8lF=D`QwT-7 zO1x^$yF1;5iab-9r1*>UIaekD>SjgS3~=C>`o<3N*h0w6<5;BG5+caTRj<(^R4O(c zQlLIaP#@HNr7V`yH8uzD=^PTr(P34VX2LNBw6!V?>t4e}Rs>ef_6$8n0m2k>E0Exp zo0xu3HS*TYyGu9BvR<8;G2Z|(X}M6T@yswzLC&exiT0hY#(vPyS?Xg==+MU}g8 z?_icCu{%J%npaponYnv|Hm#u?g(11S=;|D+-|>OGuKCe@PlYDMZ8q0t3|*vAH<{Sq z7RrV4ml%s+X;I+qMICIlLi)%|;WY}>E~GfvyBukRQDBqvAaIe4jE1t2nFpZtI`NtX zgQT=Jb{8yTxYhJAMRA@*MljU3Bj_JfdswGIO?%I+f+%a9y3T7pU=u~w*#(OF#y0Z( zpq@oR0G^1Wnc?AdzPUn8nw3z1g@RP*sU!!@nwdu2JTYRnREFsn+) zCX`)exg2>>n)#3?kfVU>d}Loz7g$D``(bCP;(TmITMs1bEFiT_E;El|EIouIkTY#W z;sWVcLG}4qN9|5=O;C_R#Tq#VFNh$jfN9eMS$=PbYyAde83hX>u)5yn&dCuI>cF0A zjF77g(_u7ND6_*}QR#5%MMW6~CPTS9Mr|v%E~y}PRc(z78Pq03jxJ}(w7#q=pKNaC z0EIVf&9v`DHDJ9;_oHkN%B~z57Kx4QX5W`6)`LX3Y3`OGG~iMj5gO=CKZ7Fj%Rt#6 z2Z(iOf(25jKo|n_v3Ur^j(I>Yk?Sx69i>RfJ7XOs5Hlw9$^qEXEiuxeDJZQB-?G*b zI_?J%(oPz5@Q!?JMXXjRp2|^@VUO$t5dDa>68oYSLt6xT$}PLQ3P~Fbi+TcC$*%w| zEOV;o%G3{AYqmks#CC5K=GZ*d*rWP}X{np>HE62on(gc!<%PXeRY1n5emg22y>C_S zVhg}dZah9xpX7r@=$6{eb1YZ^2o3E#&2o&aWe*v|Q$Zgb;v@DAUJxG;ZVPv5)OS=R z6W{|;0MUqbnPxd8n1huw5FHrOH48gYd%3AQRiJe|@my1(E}a>4(($c>B1Y)7A$cl*=j9fj0bP=QW5NtT;r$B=gMaj59~=mTxvrm0A}YhqS#k+@hvy zHj*Gh=AiFw+PH%H){Y-no~bE89G)B3RBUwTI7Du>hm%gWb;LG0x!gSBoAFPNxY(HC z%B$<~^Cq-&&+b5ZsoD`nl&Pdzo?>!Cb2oTXbUL2olX zCeZq|5MFDj&%f3hY8{*nAd4!*!?JJA4}tZextenpRNAmI!EameBGF8anC3V+Lj}^c zx?|`WL4of;y<(&hhN~xy9&qCbwT%kqYHRI0#cF?~v`B#;J4qJoO=ecUE|kXFKp}gR zyvTwIKnx*h2T8PNvvJQ=DG8&HAiEo`XMM1 zQWcY_RGDREI9^$fXO4zq*BdQzPt9$y*9G4?lMEBL$RR}73o+VSU=`z$#!C((*nSTJCwkV5wA!7 z4+9jrb(9Ad!XiQ%P23H6nBy_fhBC?u8*9%Te3Sfjnk{Cr-M0Gp!b)L{uxV)xnNXEgJ}|;8 z3$k?58aBb3Q;`+}gBq>|3~sjL$OC~w#&F~(vsxIInb=&-aQYBcg+jSvriF6R9Ao*2Jyb+c zP6K5&L{&-OoD`uz=mW5B5l6%3iV6*Pkl+yl>9ke=tr*@*@_f811d92{peTSg$oBTH zbO>l$D~P?K7bp*v$<}JE+CmknMVa$13~LZ%b7Y3d@7wcWM>W^QFjae{CC}}Z)xN-l z&OzNfjD%if15+Ki5V3toaAIU;YUm#J^+fH{)M z4w60ebAm;S_RORPd9FRm diff --git a/plugins/admin/themes/grav/fonts/forkawesome-webfont.woff2 b/plugins/admin/themes/grav/fonts/forkawesome-webfont.woff2 deleted file mode 100644 index 50e052263252c40d4b7244baaeabf4ec3fce52fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90420 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 z 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 shqCjxw9$Q(zx&Coue4{or8#1w3nXod5s; diff --git a/plugins/admin/themes/grav/js/admin.min.js b/plugins/admin/themes/grav/js/admin.min.js index 56b2d19..77c1704 100644 --- a/plugins/admin/themes/grav/js/admin.min.js +++ b/plugins/admin/themes/grav/js/admin.min.js @@ -704,6 +704,7 @@ const external_GravAdmin_namespaceObject = GravAdmin; var trim = __webpack_require__(35814); var trim_default = /*#__PURE__*/__webpack_require__.n(trim); ;// CONCATENATED MODULE: ./app/utils/response.js +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -770,7 +771,7 @@ function userFeedback(response) { message = message || 'Invalid AJAX response.'; break; } - if (settings) { + if (settings && _typeof(settings) === 'object' && settings !== null) { backup = Object.assign({}, utils_toastr.options); Object.keys(settings).forEach(function (key) { utils_toastr.options[key] = settings[key]; @@ -796,6 +797,7 @@ external_jQuery_default()(__webpack_require__.g).on('beforeunload._ajax', functi UNLOADING = true; }); ;// CONCATENATED MODULE: ./app/utils/request.js +function request_typeof(o) { "@babel/helpers - typeof"; return request_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, request_typeof(o); } var raw; @@ -813,9 +815,11 @@ var request = function request(url) { options.body = Object.assign({ 'admin-nonce': external_GravAdmin_namespaceObject.config.admin_nonce }, options.body || {}); - Object.keys(options.body).map(function (key) { - return data.append(key, options.body[key]); - }); + if (options.body && request_typeof(options.body) === 'object') { + Object.keys(options.body).map(function (key) { + return data.append(key, options.body[key]); + }); + } options.body = data; } options = Object.assign({ @@ -833,12 +837,12 @@ var request = function request(url) { }; /* harmony default export */ const utils_request = (request); ;// CONCATENATED MODULE: ./app/forms/fields/files.js -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function files_typeof(o) { "@babel/helpers - typeof"; return files_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, files_typeof(o); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == files_typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != files_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != files_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // import EXIF from 'exif-js'; @@ -1692,7 +1696,13 @@ function formatBytes(bytes, decimals) { // Dashboard update and Grav update external_jQuery_default()(document).on('click.remodal', '[data-remodal-id="update-grav"] [data-remodal-action="confirm"]', function () { var element = external_jQuery_default()('#grav-update-button'); - element.html("".concat(external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.UPDATING_PLEASE_WAIT, " ").concat(formatBytes(updates_Instance.payload.grav.assets['grav-update'].size), "..")); + + // Safely get the file size with fallback + var sizeText = ''; + if (updates_Instance.payload && updates_Instance.payload.grav && updates_Instance.payload.grav.assets && updates_Instance.payload.grav.assets['grav-update'] && updates_Instance.payload.grav.assets['grav-update'].size) { + sizeText = " ".concat(formatBytes(updates_Instance.payload.grav.assets['grav-update'].size)); + } + element.html("".concat(external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.UPDATING_PLEASE_WAIT).concat(sizeText, "..")); element.attr('disabled', 'disabled').find('> .fa').removeClass('fa-cloud-download').addClass('fa-refresh fa-spin'); utils_request(updates_Instance.updateURL, function (response) { if (response.type === 'updategrav') { @@ -1824,7 +1834,7 @@ var Updates = /*#__PURE__*/function () { return this; } [plugins, themes].forEach(function (resources, index) { - if (!resources || Array.isArray(resources)) { + if (!resources || Array.isArray(resources) || updates_typeof(resources) !== 'object') { return; } var length = Object.keys(resources).length; @@ -4225,10 +4235,17 @@ var DOMBehaviors = { }, preventUnload: function preventUnload() { var selector = '[name="task"][value^="save"], [data-delete-action], [data-flex-safe-action]'; - if (external_jQuery_default()._data(window, 'events') && (external_jQuery_default()._data(window, 'events').beforeunload || []).filter(function (event) { - return event.namespace === '_grav'; - }).length) { - return; + // jQuery 3.x removed $._data, use $._data only if available (jQuery < 3.0) + // or check with jQuery's internal data store for jQuery >= 3.0 + try { + var hasData = typeof (external_jQuery_default())._data === 'function'; + if (hasData && external_jQuery_default()._data(window, 'events') && (external_jQuery_default()._data(window, 'events').beforeunload || []).filter(function (event) { + return event.namespace === '_grav'; + }).length) { + return; + } + } catch (e) { + // $._data not available in jQuery 3.x+, continue with adding event handler } // Allow some elements to leave the page without native confirmation @@ -4245,10 +4262,18 @@ var DOMBehaviors = { }, preventClickAway: function preventClickAway() { var selector = 'a[href]:not([href^="#"]):not([target="_blank"]):not([href^="javascript:"])'; - if (external_jQuery_default()._data(external_jQuery_default()(selector).get(0), 'events') && (external_jQuery_default()._data(external_jQuery_default()(selector).get(0), 'events').click || []).filter(function (event) { - return event.namespace === '_grav'; - })) { - return; + + // jQuery 3.x removed $._data, use $._data only if available (jQuery < 3.0) + try { + var hasData = typeof (external_jQuery_default())._data === 'function'; + var element = external_jQuery_default()(selector).get(0); + if (element && hasData && external_jQuery_default()._data(element, 'events') && (external_jQuery_default()._data(element, 'events').click || []).filter(function (event) { + return event.namespace === '_grav'; + })) { + return; + } + } catch (e) { + // $._data not available in jQuery 3.x+, continue with adding event handler } // Prevent clicking away if the form state is dirty diff --git a/plugins/admin/themes/grav/js/clipboard-helper.js b/plugins/admin/themes/grav/js/clipboard-helper.js new file mode 100644 index 0000000..9a6db31 --- /dev/null +++ b/plugins/admin/themes/grav/js/clipboard-helper.js @@ -0,0 +1,129 @@ +/** + * Clipboard Helper for Grav Admin + * Provides copy-to-clipboard functionality with visual feedback + */ + +window.GravClipboard = { + /** + * Copy the value from an input/textarea element with visual feedback + * @param {HTMLElement} buttonElement - The button element that was clicked + * @param {string} inputId - Optional ID of input to copy from (if not previous sibling) + */ + copy: function(buttonElement, inputId) { + var input; + + if (inputId) { + input = document.getElementById(inputId); + } else { + input = buttonElement.previousElementSibling; + } + + if (!input) { + console.error('No input element found to copy from'); + return; + } + + // Select and copy the text + input.select(); + var success = document.execCommand('copy'); + + if (success) { + // Store original content + var originalHTML = buttonElement.innerHTML; + + // Show success feedback + buttonElement.innerHTML = ' Copied!'; + + // Restore original content after delay + setTimeout(function() { + buttonElement.innerHTML = originalHTML; + }, 2000); + } else { + console.error('Failed to copy to clipboard'); + } + }, + + /** + * Update webhook commands with actual token and URL values + * @param {string} tokenFieldSelector - Selector for the token input field + */ + updateWebhookCommands: function(tokenFieldSelector) { + tokenFieldSelector = tokenFieldSelector || '[name="data[scheduler][modern][webhook][token]"]'; + + // Try multiple ways to get the token field + var tokenField = document.querySelector(tokenFieldSelector); + if (!tokenField) { + tokenField = document.querySelector('input[name*="webhook][token"]'); + } + if (!tokenField) { + // Look for the token input by searching in the webhook section + var inputs = document.querySelectorAll('input[type="text"]'); + for (var i = 0; i < inputs.length; i++) { + if (inputs[i].name && inputs[i].name.includes('webhook') && inputs[i].name.includes('token')) { + tokenField = inputs[i]; + break; + } + } + } + + var token = (tokenField && tokenField.value && tokenField.value.trim()) ? tokenField.value.trim() : 'YOUR_TOKEN'; + var siteUrl = window.location.origin + window.location.pathname.replace(/\/admin.*$/, ''); + + // Update webhook commands with actual values (URLs quoted for shell compatibility) + var webhookAllCmd = 'curl -X POST "' + siteUrl + '/scheduler/webhook" \\\n -H "Authorization: Bearer ' + token + '"'; + var webhookJobCmd = 'curl -X POST "' + siteUrl + '/scheduler/webhook?job=backup" \\\n -H "Authorization: Bearer ' + token + '"'; + var healthCmd = 'curl "' + siteUrl + '/scheduler/health"'; + + // Set values in input fields if they exist + var allInput = document.getElementById('webhook-all-cmd'); + var jobInput = document.getElementById('webhook-job-cmd'); + var healthInput = document.getElementById('webhook-health-cmd'); + + if (allInput) allInput.value = webhookAllCmd; + if (jobInput) jobInput.value = webhookJobCmd; + if (healthInput) healthInput.value = healthCmd; + + return { + token: token, + siteUrl: siteUrl, + webhookAllCmd: webhookAllCmd, + webhookJobCmd: webhookJobCmd, + healthCmd: healthCmd + }; + }, + + /** + * Initialize webhook command updates and listeners + */ + initWebhookCommands: function() { + var self = this; + + // Update on page load + self.updateWebhookCommands(); + + // Also update when token field changes + setTimeout(function() { + var tokenField = document.querySelector('[name="data[scheduler][modern][webhook][token]"]'); + if (!tokenField) { + tokenField = document.querySelector('input[name*="webhook][token"]'); + } + if (tokenField) { + tokenField.addEventListener('change', function() { self.updateWebhookCommands(); }); + tokenField.addEventListener('input', function() { self.updateWebhookCommands(); }); + } + }, 500); + } +}; + +// Auto-initialize when DOM is ready +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', function() { + if (document.getElementById('webhook-all-cmd')) { + GravClipboard.initWebhookCommands(); + } + }); +} else { + if (document.getElementById('webhook-all-cmd')) { + GravClipboard.initWebhookCommands(); + } +} \ No newline at end of file diff --git a/plugins/admin/themes/grav/js/fork-awesome-shim.js b/plugins/admin/themes/grav/js/fork-awesome-shim.js new file mode 100644 index 0000000..4074593 --- /dev/null +++ b/plugins/admin/themes/grav/js/fork-awesome-shim.js @@ -0,0 +1,1389 @@ +/*! + * ForkAwesome to FontAwesome 7 JavaScript Shim + * Version: 1.0.0 + * + * This JavaScript shim provides runtime compatibility for ForkAwesome 1.1.5 + * when migrating to FontAwesome 7 + */ + +(function() { + 'use strict'; + + // Icon mapping database - loaded from external JSON or embedded + const iconMappings = { + // Direct mappings (icon name changes) + 'home': 'house', + 'warning': 'triangle-exclamation', + 'close': 'xmark', + 'remove': 'xmark', + 'trash-o': 'trash-can', + 'file-text-o': 'file-lines', + 'gear': 'gear', + 'gears': 'gears', + 'exclamation-triangle': 'triangle-exclamation', + 'exclamation-circle': 'circle-exclamation', + 'check-circle': 'circle-check', + 'times-circle': 'circle-xmark', + 'chevron-circle-left': 'circle-chevron-left', + 'chevron-circle-right': 'circle-chevron-right', + 'chevron-circle-up': 'circle-chevron-up', + 'chevron-circle-down': 'circle-chevron-down', + 'arrow-circle-left': 'circle-arrow-left', + 'arrow-circle-right': 'circle-arrow-right', + 'arrow-circle-up': 'circle-arrow-up', + 'arrow-circle-down': 'circle-arrow-down', + 'mail-forward': 'share', + 'mail-reply': 'reply', + 'mail-reply-all': 'reply-all', + 'chain': 'link', + 'chain-broken': 'link-slash', + 'external-link': 'up-right-from-square', + 'level-up': 'turn-up', + 'level-down': 'turn-down', + 'pencil-square-o': 'pen-to-square', + 'ticket': 'ticket-simple', + 'diamond': 'gem', + 'bank': 'building-columns', + 'institution': 'building-columns', + 'university': 'building-columns', + 'mortar-board': 'graduation-cap', + 'graduation-cap': 'graduation-cap', + 'euro': 'euro-sign', + 'eur': 'euro-sign', + 'dollar': 'dollar-sign', + 'usd': 'dollar-sign', + 'rupee': 'indian-rupee-sign', + 'inr': 'indian-rupee-sign', + 'cny': 'yen-sign', + 'rmb': 'yen-sign', + 'yen': 'yen-sign', + 'jpy': 'yen-sign', + 'ruble': 'ruble-sign', + 'rouble': 'ruble-sign', + 'rub': 'ruble-sign', + 'won': 'won-sign', + 'krw': 'won-sign', + 'bitcoin': 'bitcoin', + 'btc': 'bitcoin', + 'youtube-play': 'youtube', + 'television': 'tv', + 'tv': 'tv', + 'calendar': 'calendar', + 'calendar-o': 'calendar', + 'arrows': 'arrows-up-down-left-right', + 'arrows-alt': 'maximize', + 'arrows-h': 'arrows-left-right', + 'arrows-v': 'arrows-up-down', + 'bar-chart': 'chart-column', + 'bar-chart-o': 'chart-bar', + 'line-chart': 'chart-line', + 'pie-chart': 'chart-pie', + 'battery': 'battery-full', + 'battery-4': 'battery-full', + 'battery-3': 'battery-three-quarters', + 'battery-2': 'battery-half', + 'battery-1': 'battery-quarter', + 'battery-0': 'battery-empty', + 'sign-in': 'right-to-bracket', + 'sign-out': 'right-from-bracket', + 'sign-in-alt': 'right-to-bracket', + 'sign-out-alt': 'right-from-bracket', + 'map-marker': 'location-dot', + 'map-marker-alt': 'location-dot', + 'refresh': 'rotate', + 'shield': 'shield', + 'shield-alt': 'shield-halved', + 'shopping-cart': 'cart-shopping', + 'shopping-bag': 'bag-shopping', + 'trash': 'trash', + 'angle-double-down': 'angles-down', + 'angle-double-left': 'angles-left', + 'angle-double-right': 'angles-right', + 'angle-double-up': 'angles-up', + 'long-arrow-down': 'arrow-down-long', + 'long-arrow-up': 'arrow-up-long', + 'long-arrow-left': 'arrow-left-long', + 'long-arrow-right': 'arrow-right-long', + 'magic': 'wand-magic-sparkles', + 'envelope': 'envelope', + 'envelope-o': 'envelope', + 'cloud-download': 'cloud-arrow-down', + 'cloud-upload': 'cloud-arrow-up', + 'reply': 'reply', + 'reply-all': 'reply-all', + 'forward': 'forward', + 'paper-plane': 'paper-plane', + 'paper-plane-o': 'paper-plane', + 'send': 'paper-plane', + 'send-o': 'paper-plane', + 'history': 'clock-rotate-left', + 'circle-thin': 'circle', + 'header': 'heading', + 'sliders': 'sliders', + 'list-ul': 'list-ul', + 'list-ol': 'list-ol', + 'th-large': 'table-cells-large', + 'th-list': 'table-list', + 'th': 'table-cells', + 'check': 'check', + 'times': 'xmark', + 'search-plus': 'magnifying-glass-plus', + 'search-minus': 'magnifying-glass-minus', + 'search': 'magnifying-glass', + 'power-off': 'power-off', + 'signal': 'signal', + 'cog': 'gear', + 'cogs': 'gears', + 'home': 'house', + 'clock-o': 'clock', + 'road': 'road', + 'download': 'download', + 'inbox': 'inbox', + 'repeat': 'repeat', + 'rotate': 'rotate', + 'retweet': 'retweet', + 'lock': 'lock', + 'unlock': 'unlock', + 'flag': 'flag', + 'flag-o': 'flag', + 'headphones': 'headphones', + 'volume-off': 'volume-xmark', + 'volume-down': 'volume-low', + 'volume-up': 'volume-high', + 'qrcode': 'qrcode', + 'barcode': 'barcode', + 'tag': 'tag', + 'tags': 'tags', + 'book': 'book', + 'bookmark': 'bookmark', + 'bookmark-o': 'bookmark', + 'print': 'print', + 'camera': 'camera', + 'font': 'font', + 'bold': 'bold', + 'italic': 'italic', + 'text-height': 'text-height', + 'text-width': 'text-width', + 'align-left': 'align-left', + 'align-center': 'align-center', + 'align-right': 'align-right', + 'align-justify': 'align-justify', + 'list': 'list', + 'dedent': 'outdent', + 'outdent': 'outdent', + 'indent': 'indent', + 'video': 'video', + 'image': 'image', + 'photo': 'image', + 'picture': 'image', + 'picture-o': 'image', + 'pencil': 'pencil', + 'map-marker': 'location-dot', + 'adjust': 'circle-half-stroke', + 'tint': 'droplet', + 'edit': 'pen-to-square', + 'pencil-square': 'pen-to-square', + 'share-square-o': 'share-from-square', + 'check-square-o': 'square-check', + 'arrows': 'arrows-up-down-left-right', + 'step-backward': 'backward-step', + 'fast-backward': 'backward-fast', + 'backward': 'backward', + 'play': 'play', + 'pause': 'pause', + 'stop': 'stop', + 'forward': 'forward', + 'fast-forward': 'forward-fast', + 'step-forward': 'forward-step', + 'eject': 'eject', + 'chevron-left': 'chevron-left', + 'chevron-right': 'chevron-right', + 'plus-circle': 'circle-plus', + 'minus-circle': 'circle-minus', + 'times-circle-o': 'circle-xmark', + 'check-circle-o': 'circle-check', + 'question-circle': 'circle-question', + 'question-circle-o': 'circle-question', + 'info-circle': 'circle-info', + 'crosshairs': 'crosshairs', + 'ban': 'ban', + 'arrow-left': 'arrow-left', + 'arrow-right': 'arrow-right', + 'arrow-up': 'arrow-up', + 'arrow-down': 'arrow-down', + 'share': 'share', + 'expand': 'expand', + 'compress': 'compress', + 'plus': 'plus', + 'minus': 'minus', + 'asterisk': 'asterisk', + 'exclamation': 'exclamation', + 'gift': 'gift', + 'leaf': 'leaf', + 'fire': 'fire', + 'eye': 'eye', + 'eye-slash': 'eye-slash', + 'exclamation-triangle': 'triangle-exclamation', + 'plane': 'plane', + 'random': 'shuffle', + 'magnet': 'magnet', + 'chevron-up': 'chevron-up', + 'chevron-down': 'chevron-down', + 'retweet': 'retweet', + 'folder': 'folder', + 'folder-open': 'folder-open', + 'folder-o': 'folder', + 'folder-open-o': 'folder-open', + 'bar-chart': 'chart-column', + 'bar-chart-o': 'chart-bar', + 'caret-down': 'caret-down', + 'caret-up': 'caret-up', + 'caret-left': 'caret-left', + 'caret-right': 'caret-right', + 'sort': 'sort', + 'sort-down': 'sort-down', + 'sort-desc': 'sort-down', + 'sort-up': 'sort-up', + 'sort-asc': 'sort-up', + 'envelope': 'envelope', + 'linkedin-in': 'linkedin-in', + 'rotate-left': 'rotate-left', + 'undo': 'rotate-left', + 'gavel': 'gavel', + 'legal': 'gavel', + 'tachometer': 'gauge-high', + 'dashboard': 'gauge-high', + 'comment-o': 'comment', + 'comments-o': 'comments', + 'flash': 'bolt', + 'bolt': 'bolt', + 'sitemap': 'sitemap', + 'umbrella': 'umbrella', + 'lightbulb': 'lightbulb', + 'lightbulb-o': 'lightbulb', + 'exchange': 'arrow-right-arrow-left', + 'cloud-download-alt': 'cloud-arrow-down', + 'cloud-upload-alt': 'cloud-arrow-up', + 'user-md': 'user-doctor', + 'stethoscope': 'stethoscope', + 'suitcase': 'suitcase', + 'bell-o': 'bell', + 'coffee': 'mug-hot', + 'cutlery': 'utensils', + 'file-text-o': 'file-lines', + 'building-o': 'building', + 'hospital-o': 'hospital', + 'ambulance': 'truck-medical', + 'medkit': 'suitcase-medical', + 'fighter-jet': 'jet-fighter', + 'beer': 'beer-mug-empty', + 'h-square': 'square-h', + 'plus-square-o': 'square-plus', + 'angle-double-left': 'angles-left', + 'angle-double-right': 'angles-right', + 'angle-double-up': 'angles-up', + 'angle-double-down': 'angles-down', + 'angle-left': 'angle-left', + 'angle-right': 'angle-right', + 'angle-up': 'angle-up', + 'angle-down': 'angle-down', + 'desktop': 'desktop', + 'laptop': 'laptop', + 'tablet': 'tablet-screen-button', + 'mobile': 'mobile-screen-button', + 'mobile-phone': 'mobile-screen-button', + 'circle-o': 'circle', + 'quote-left': 'quote-left', + 'quote-right': 'quote-right', + 'spinner': 'spinner', + 'circle': 'circle', + 'mail-reply': 'reply', + 'github-alt': 'github-alt', + 'folder-o': 'folder', + 'folder-open-o': 'folder-open', + 'smile-o': 'face-smile', + 'frown-o': 'face-frown', + 'meh-o': 'face-meh', + 'gamepad': 'gamepad', + 'keyboard': 'keyboard', + 'keyboard-o': 'keyboard', + 'flag-checkered': 'flag-checkered', + 'terminal': 'terminal', + 'code': 'code', + 'mail-reply-all': 'reply-all', + 'star-half-o': 'star-half', + 'location-arrow': 'location-arrow', + 'crop': 'crop-simple', + 'code-fork': 'code-branch', + 'chain-broken': 'link-slash', + 'unlink': 'link-slash', + 'question': 'question', + 'info': 'info', + 'exclamation': 'exclamation', + 'superscript': 'superscript', + 'subscript': 'subscript', + 'eraser': 'eraser', + 'puzzle-piece': 'puzzle-piece', + 'microphone': 'microphone', + 'microphone-slash': 'microphone-slash', + 'shield': 'shield', + 'calendar-o': 'calendar', + 'fire-extinguisher': 'fire-extinguisher', + 'rocket': 'rocket', + 'maxcdn': 'maxcdn', + 'chevron-circle-left': 'circle-chevron-left', + 'chevron-circle-right': 'circle-chevron-right', + 'chevron-circle-up': 'circle-chevron-up', + 'chevron-circle-down': 'circle-chevron-down', + 'html5': 'html5', + 'css3': 'css3', + 'anchor': 'anchor', + 'unlock-alt': 'unlock-keyhole', + 'bullseye': 'bullseye', + 'ellipsis-h': 'ellipsis', + 'ellipsis-v': 'ellipsis-vertical', + 'rss-square': 'square-rss', + 'play-circle-o': 'circle-play', + 'minus-square-o': 'square-minus', + 'check-square': 'square-check', + 'pen-square': 'pen-to-square', + 'share-square': 'share-from-square', + 'compass': 'compass', + 'caret-square-o-down': 'square-caret-down', + 'toggle-down': 'square-caret-down', + 'caret-square-o-up': 'square-caret-up', + 'toggle-up': 'square-caret-up', + 'caret-square-o-right': 'square-caret-right', + 'toggle-right': 'square-caret-right', + 'eur': 'euro-sign', + 'euro': 'euro-sign', + 'gbp': 'sterling-sign', + 'usd': 'dollar-sign', + 'dollar': 'dollar-sign', + 'inr': 'indian-rupee-sign', + 'rupee': 'indian-rupee-sign', + 'jpy': 'yen-sign', + 'cny': 'yen-sign', + 'rmb': 'yen-sign', + 'yen': 'yen-sign', + 'rub': 'ruble-sign', + 'ruble': 'ruble-sign', + 'rouble': 'ruble-sign', + 'krw': 'won-sign', + 'won': 'won-sign', + 'bitcoin': 'bitcoin', + 'btc': 'bitcoin', + 'file': 'file', + 'file-o': 'file', + 'file-text': 'file-lines', + 'sort-alpha-asc': 'arrow-down-a-z', + 'sort-alpha-desc': 'arrow-down-z-a', + 'sort-amount-asc': 'arrow-down-short-wide', + 'sort-amount-desc': 'arrow-down-wide-short', + 'sort-numeric-asc': 'arrow-down-1-9', + 'sort-numeric-desc': 'arrow-down-9-1', + 'thumbs-up': 'thumbs-up', + 'thumbs-down': 'thumbs-down', + 'thumbs-o-up': 'thumbs-up', + 'thumbs-o-down': 'thumbs-down', + 'heart-o': 'heart', + 'lemon-o': 'lemon', + 'phone-square': 'square-phone', + 'twitter-square': 'square-x-twitter', + 'facebook-square': 'square-facebook', + 'github-square': 'square-github', + 'credit-card': 'credit-card', + 'credit-card-o': 'credit-card', + 'rss': 'rss', + 'hdd-o': 'hard-drive', + 'bullhorn': 'bullhorn', + 'bell': 'bell', + 'certificate': 'certificate', + 'hand-o-right': 'hand-point-right', + 'hand-o-left': 'hand-point-left', + 'hand-o-up': 'hand-point-up', + 'hand-o-down': 'hand-point-down', + 'arrow-circle-left': 'circle-arrow-left', + 'arrow-circle-right': 'circle-arrow-right', + 'arrow-circle-up': 'circle-arrow-up', + 'arrow-circle-down': 'circle-arrow-down', + 'globe': 'globe', + 'wrench': 'wrench', + 'tasks': 'list-check', + 'filter': 'filter', + 'briefcase': 'briefcase', + 'arrows-alt': 'maximize', + 'group': 'users', + 'users': 'users', + 'link': 'link', + 'cloud': 'cloud', + 'flask': 'flask', + 'cut': 'scissors', + 'scissors': 'scissors', + 'copy': 'copy', + 'files-o': 'copy', + 'paperclip': 'paperclip', + 'floppy-o': 'floppy-disk', + 'save': 'floppy-disk', + 'square': 'square', + 'square-o': 'square', + 'navicon': 'bars', + 'reorder': 'bars', + 'bars': 'bars', + 'list-ul': 'list-ul', + 'list-ol': 'list-ol', + 'strikethrough': 'strikethrough', + 'underline': 'underline', + 'table': 'table', + 'magic': 'wand-magic-sparkles', + 'truck': 'truck', + 'pinterest-square': 'square-pinterest', + 'google-plus-square': 'square-google-plus', + 'google-plus': 'google-plus', + 'money': 'money-bill', + 'caret-down': 'caret-down', + 'caret-up': 'caret-up', + 'caret-left': 'caret-left', + 'caret-right': 'caret-right', + 'columns': 'columns', + 'sort': 'sort', + 'sort-down': 'sort-down', + 'sort-desc': 'sort-down', + 'sort-up': 'sort-up', + 'sort-asc': 'sort-up', + 'envelope': 'envelope', + 'undo': 'rotate-left', + 'gavel': 'gavel', + 'legal': 'gavel', + 'tachometer': 'gauge-high', + 'dashboard': 'gauge-high', + 'comment-o': 'comment', + 'comments-o': 'comments', + 'flash': 'bolt', + 'bolt': 'bolt', + 'sitemap': 'sitemap', + 'umbrella': 'umbrella', + 'paste': 'clipboard', + 'clipboard': 'clipboard', + 'lightbulb-o': 'lightbulb', + 'exchange': 'arrow-right-arrow-left', + 'cloud-download': 'cloud-arrow-down', + 'cloud-upload': 'cloud-arrow-up', + 'user-md': 'user-doctor', + 'stethoscope': 'stethoscope', + 'suitcase': 'suitcase', + 'bell-o': 'bell', + 'coffee': 'mug-hot', + 'cutlery': 'utensils', + 'file-text-o': 'file-lines', + 'building-o': 'building', + 'hospital-o': 'hospital', + 'ambulance': 'truck-medical', + 'medkit': 'suitcase-medical', + 'fighter-jet': 'jet-fighter', + 'beer': 'beer-mug-empty', + 'h-square': 'square-h', + 'plus-square': 'square-plus', + 'angle-double-left': 'angles-left', + 'angle-double-right': 'angles-right', + 'angle-double-up': 'angles-up', + 'angle-double-down': 'angles-down', + 'angle-left': 'angle-left', + 'angle-right': 'angle-right', + 'angle-up': 'angle-up', + 'angle-down': 'angle-down', + 'desktop': 'desktop', + 'laptop': 'laptop', + 'tablet': 'tablet-screen-button', + 'mobile': 'mobile-screen-button', + 'mobile-phone': 'mobile-screen-button', + 'circle-o': 'circle', + 'quote-left': 'quote-left', + 'quote-right': 'quote-right', + 'spinner': 'spinner', + 'circle': 'circle', + 'smile-o': 'face-smile', + 'frown-o': 'face-frown', + 'meh-o': 'face-meh', + 'gamepad': 'gamepad', + 'keyboard-o': 'keyboard', + 'flag-checkered': 'flag-checkered', + 'terminal': 'terminal', + 'code': 'code', + 'star-half': 'star-half', + 'star-half-empty': 'star-half', + 'star-half-o': 'star-half', + 'star-half-full': 'star-half', + 'location-arrow': 'location-arrow', + 'crop': 'crop-simple', + 'code-fork': 'code-branch', + 'chain-broken': 'link-slash', + 'unlink': 'link-slash', + 'question': 'question', + 'info': 'info', + 'exclamation': 'exclamation', + 'superscript': 'superscript', + 'subscript': 'subscript', + 'eraser': 'eraser', + 'puzzle-piece': 'puzzle-piece', + 'microphone': 'microphone', + 'microphone-slash': 'microphone-slash', + 'shield': 'shield', + 'calendar-o': 'calendar', + 'fire-extinguisher': 'fire-extinguisher', + 'rocket': 'rocket', + 'maxcdn': 'maxcdn', + 'chevron-circle-left': 'circle-chevron-left', + 'chevron-circle-right': 'circle-chevron-right', + 'chevron-circle-up': 'circle-chevron-up', + 'chevron-circle-down': 'circle-chevron-down', + 'html5': 'html5', + 'css3': 'css3', + 'anchor': 'anchor', + 'unlock-alt': 'unlock-keyhole', + 'bullseye': 'bullseye', + 'ellipsis-h': 'ellipsis', + 'ellipsis-v': 'ellipsis-vertical', + 'rss-square': 'square-rss', + 'play-circle': 'circle-play', + 'minus-square': 'square-minus', + 'check-square': 'square-check', + 'pen-square': 'pen-to-square', + 'share-square': 'share-from-square', + 'cc': 'closed-captioning', + 'dedent': 'outdent', + 'outdent': 'outdent', + 'indent': 'indent', + 'video-camera': 'video', + 'picture-o': 'image', + 'pencil': 'pencil', + 'map-marker': 'location-dot', + 'adjust': 'circle-half-stroke', + 'tint': 'droplet', + 'pencil-square': 'pen-to-square', + 'share-square-o': 'share-from-square', + 'check-square-o': 'square-check', + 'arrows': 'arrows-up-down-left-right', + 'step-backward': 'backward-step', + 'fast-backward': 'backward-fast', + 'backward': 'backward', + 'play': 'play', + 'pause': 'pause', + 'stop': 'stop', + 'forward': 'forward', + 'fast-forward': 'forward-fast', + 'step-forward': 'forward-step', + 'eject': 'eject', + 'chevron-left': 'chevron-left', + 'chevron-right': 'chevron-right', + 'plus-circle': 'circle-plus', + 'minus-circle': 'circle-minus', + 'times-circle': 'circle-xmark', + 'check-circle': 'circle-check', + 'question-circle': 'circle-question', + 'info-circle': 'circle-info', + 'screenshot': 'crosshairs', + 'remove-circle': 'circle-xmark', + 'ok-circle': 'circle-check', + 'ban-circle': 'ban', + 'mail-forward': 'share', + 'resize-full': 'maximize', + 'resize-small': 'minimize', + 'plus': 'plus', + 'minus': 'minus', + 'asterisk': 'asterisk', + 'exclamation-sign': 'exclamation', + 'gift': 'gift', + 'leaf': 'leaf', + 'fire': 'fire', + 'eye-open': 'eye', + 'eye-close': 'eye-slash', + 'warning-sign': 'triangle-exclamation', + 'plane': 'plane', + 'random': 'shuffle', + 'comment': 'comment', + 'chevron-up': 'chevron-up', + 'chevron-down': 'chevron-down', + 'shopping-cart': 'cart-shopping', + 'bar-chart': 'chart-column', + 'bar-chart-o': 'chart-bar', + 'facebook-official': 'facebook', + 'pinterest-p': 'pinterest-p', + 'whatsapp': 'whatsapp', + 'server': 'server', + 'user-plus': 'user-plus', + 'user-times': 'user-xmark', + 'bed': 'bed', + 'train': 'train', + 'subway': 'train-subway', + 'battery-full': 'battery-full', + 'battery-three-quarters': 'battery-three-quarters', + 'battery-half': 'battery-half', + 'battery-quarter': 'battery-quarter', + 'battery-empty': 'battery-empty', + 'mouse-pointer': 'arrow-pointer', + 'i-cursor': 'i-cursor', + 'object-group': 'object-group', + 'object-ungroup': 'object-ungroup', + 'sticky-note': 'note-sticky', + 'sticky-note-o': 'note-sticky', + 'clone': 'clone', + 'hourglass-o': 'hourglass', + 'hourglass-start': 'hourglass-start', + 'hourglass-1': 'hourglass-start', + 'hourglass-half': 'hourglass-half', + 'hourglass-2': 'hourglass-half', + 'hourglass-end': 'hourglass-end', + 'hourglass-3': 'hourglass-end', + 'hand-rock-o': 'hand-back-fist', + 'hand-grab-o': 'hand', + 'hand-stop-o': 'hand', + 'hand-paper-o': 'hand', + 'hand-scissors-o': 'hand-scissors', + 'hand-lizard-o': 'hand-lizard', + 'hand-spock-o': 'hand-spock', + 'hand-pointer-o': 'hand-pointer', + 'hand-peace-o': 'hand-peace', + 'registered': 'registered', + 'creative-commons': 'creative-commons', + 'television': 'tv', + 'contao': 'contao', + 'paypal': 'paypal', + 'industry': 'industry', + 'map-pin': 'map-pin', + 'map-signs': 'signs-post', + 'map-o': 'map', + 'map': 'map', + 'commenting': 'comment-dots', + 'commenting-o': 'comment-dots', + 'houzz': 'houzz', + 'vimeo': 'vimeo-v', + 'black-tie': 'black-tie', + 'fonticons': 'fonticons', + 'reddit-alien': 'reddit-alien', + 'edge': 'edge', + 'codiepie': 'codiepie', + 'modx': 'modx', + 'fort-awesome': 'fort-awesome', + 'usb': 'usb', + 'product-hunt': 'product-hunt', + 'mixcloud': 'mixcloud', + 'scribd': 'scribd', + 'pause-circle': 'circle-pause', + 'pause-circle-o': 'circle-pause', + 'stop-circle': 'circle-stop', + 'stop-circle-o': 'circle-stop', + 'bluetooth': 'bluetooth', + 'bluetooth-b': 'bluetooth-b', + 'gitlab': 'gitlab', + 'wpbeginner': 'wpbeginner', + 'wpforms': 'wpforms', + 'envira': 'envira', + 'universal-access': 'universal-access', + 'wheelchair-alt': 'accessible-icon', + 'question-circle': 'circle-question', + 'blind': 'person-walking-with-cane', + 'audio-description': 'audio-description', + 'volume-control-phone': 'phone-volume', + 'phone-volume': 'phone-volume', + 'braille': 'braille', + 'assistive-listening-systems': 'assistive-listening-systems', + 'american-sign-language-interpreting': 'hands-asl-interpreting', + 'asl-interpreting': 'hands-asl-interpreting', + 'deaf': 'ear-deaf', + 'deafness': 'ear-deaf', + 'hard-of-hearing': 'ear-deaf', + 'glide': 'glide', + 'glide-g': 'glide-g', + 'sign-language': 'hands', + 'signing': 'hands', + 'viadeo': 'viadeo', + 'viadeo-square': 'square-viadeo', + 'snapchat': 'snapchat', + 'snapchat-ghost': 'snapchat', + 'snapchat-square': 'square-snapchat', + 'pied-piper': 'pied-piper', + 'first-order': 'first-order', + 'yoast': 'yoast', + 'themeisle': 'themeisle', + 'google-plus-official': 'google-plus', + 'google-plus-circle': 'google-plus', + 'font-awesome': 'font-awesome', + 'fa': 'font-awesome', + 'shower': 'shower', + 'bath': 'bath', + 'bathtub': 'bath', + 's15': 'bath', + 'bandcamp': 'bandcamp', + 'grav': 'grav', + 'etsy': 'etsy', + 'imdb': 'imdb', + 'ravelry': 'ravelry', + 'eercast': 'sellcast', + 'snowflake-o': 'snowflake', + 'superpowers': 'superpowers', + 'wpexplorer': 'wpexplorer', + 'meetup': 'meetup', + 'linode': 'linode', + 'angellist': 'angellist', + 'bitbucket': 'bitbucket', + 'drupal': 'drupal', + 'joomla': 'joomla', + 'behance': 'behance', + 'behance-square': 'square-behance', + 'steam': 'steam', + 'steam-square': 'square-steam', + 'spotify': 'spotify', + 'deviantart': 'deviantart', + 'soundcloud': 'soundcloud', + 'vine': 'vine', + 'codepen': 'codepen', + 'jsfiddle': 'jsfiddle', + 'rebel': 'rebel', + 'ra': 'rebel', + 'resistance': 'rebel', + 'empire': 'empire', + 'ge': 'empire', + 'git-square': 'square-git', + 'git': 'git', + 'hacker-news': 'hacker-news', + 'yc-square': 'hacker-news', + 'y-combinator-square': 'hacker-news', + 'tencent-weibo': 'tencent-weibo', + 'qq': 'qq', + 'weixin': 'weixin', + 'wechat': 'weixin', + 'slideshare': 'slideshare', + 'twitch': 'twitch', + 'yelp': 'yelp', + 'paypal': 'paypal', + 'google-wallet': 'google-wallet', + 'cc-visa': 'cc-visa', + 'cc-mastercard': 'cc-mastercard', + 'cc-discover': 'cc-discover', + 'cc-amex': 'cc-amex', + 'cc-paypal': 'cc-paypal', + 'cc-stripe': 'cc-stripe', + 'bell-slash': 'bell-slash', + 'bell-slash-o': 'bell-slash', + 'meanpath': 'font-awesome', + 'buysellads': 'buysellads', + 'connectdevelop': 'connectdevelop', + 'dashcube': 'dashcube', + 'forumbee': 'forumbee', + 'leanpub': 'leanpub', + 'sellsy': 'sellsy', + 'shirtsinbulk': 'shirtsinbulk', + 'simplybuilt': 'simplybuilt', + 'skyatlas': 'skyatlas', + 'pinterest-p': 'pinterest-p', + 'viacoin': 'viacoin', + 'medium': 'medium', + 'y-combinator': 'y-combinator', + 'yc': 'y-combinator', + 'optin-monster': 'optin-monster', + 'opencart': 'opencart', + 'expeditedssl': 'expeditedssl', + 'cc-jcb': 'cc-jcb', + 'cc-diners-club': 'cc-diners-club', + 'creative-commons': 'creative-commons', + 'gg': 'gg', + 'gg-circle': 'gg-circle', + 'odnoklassniki': 'odnoklassniki', + 'odnoklassniki-square': 'square-odnoklassniki', + 'get-pocket': 'get-pocket', + 'wikipedia-w': 'wikipedia-w', + 'safari': 'safari', + 'chrome': 'chrome', + 'firefox': 'firefox', + 'opera': 'opera', + 'internet-explorer': 'internet-explorer', + 'amazon': 'amazon', + 'reddit': 'reddit', + 'reddit-square': 'square-reddit', + 'stumbleupon-circle': 'stumbleupon-circle', + 'stumbleupon': 'stumbleupon', + 'delicious': 'delicious', + 'digg': 'digg', + 'drupal': 'drupal', + 'joomla': 'joomla', + 'behance': 'behance', + 'behance-square': 'square-behance', + 'steam': 'steam', + 'steam-square': 'square-steam', + 'spotify': 'spotify', + 'deviantart': 'deviantart', + 'soundcloud': 'soundcloud', + 'vine': 'vine', + 'codepen': 'codepen', + 'jsfiddle': 'jsfiddle', + 'rebel': 'rebel', + 'empire': 'empire', + 'git-square': 'square-git', + 'git': 'git', + 'hacker-news': 'hacker-news', + 'tencent-weibo': 'tencent-weibo', + 'qq': 'qq', + 'weixin': 'weixin', + 'slideshare': 'slideshare', + 'twitch': 'twitch', + 'yelp': 'yelp', + 'lastfm': 'lastfm', + 'lastfm-square': 'square-lastfm', + 'ioxhost': 'ioxhost', + 'angellist': 'angellist', + 'meanpath': 'font-awesome', + 'pagelines': 'pagelines', + 'stack-exchange': 'stack-exchange', + 'stack-overflow': 'stack-overflow', + 'pinterest': 'pinterest', + 'pinterest-square': 'square-pinterest', + 'maxcdn': 'maxcdn', + 'adn': 'adn', + 'behance': 'behance', + 'behance-square': 'square-behance', + 'bitbucket': 'bitbucket', + 'bitbucket-square': 'bitbucket', + 'tumblr': 'tumblr', + 'tumblr-square': 'square-tumblr', + 'apple': 'apple', + 'windows': 'windows', + 'android': 'android', + 'linux': 'linux', + 'dribbble': 'dribbble', + 'skype': 'skype', + 'foursquare': 'foursquare', + 'trello': 'trello', + 'gratipay': 'gratipay', + 'gittip': 'gratipay', + 'star': 'star', + 'star-o': 'star', + 'sun-o': 'sun', + 'moon-o': 'moon', + 'vk': 'vk', + 'weibo': 'weibo', + 'renren': 'renren', + 'pagelines': 'pagelines', + 'stack-exchange': 'stack-exchange', + 'arrow-circle-o-right': 'circle-right', + 'arrow-circle-o-left': 'circle-left', + 'arrow-circle-o-up': 'circle-up', + 'arrow-circle-o-down': 'circle-down', + 'caret-square-o-left': 'square-caret-left', + 'toggle-left': 'square-caret-left', + 'dot-circle-o': 'circle-dot', + 'vimeo-square': 'square-vimeo', + 'try': 'turkish-lira-sign', + 'turkish-lira': 'turkish-lira-sign', + 'slack': 'slack', + 'wordpress': 'wordpress', + 'openid': 'openid', + 'yahoo': 'yahoo', + 'google': 'google', + 'reddit': 'reddit', + 'reddit-square': 'square-reddit', + 'stumbleupon-circle': 'stumbleupon-circle', + 'stumbleupon': 'stumbleupon', + 'delicious': 'delicious', + 'digg': 'digg', + 'pied-piper-pp': 'pied-piper-pp', + 'pied-piper-alt': 'pied-piper-alt', + 'drupal': 'drupal', + 'joomla': 'joomla', + 'fax': 'fax', + 'child': 'child', + 'paw': 'paw', + 'cube': 'cube', + 'cubes': 'cubes', + 'recycle': 'recycle', + 'car': 'car', + 'automobile': 'car', + 'cab': 'taxi', + 'taxi': 'taxi', + 'tree': 'tree', + 'database': 'database', + 'file-pdf-o': 'file-pdf', + 'file-word-o': 'file-word', + 'file-excel-o': 'file-excel', + 'file-powerpoint-o': 'file-powerpoint', + 'file-image-o': 'file-image', + 'file-photo-o': 'file-image', + 'file-picture-o': 'file-image', + 'file-archive-o': 'file-zipper', + 'file-zip-o': 'file-zipper', + 'file-audio-o': 'file-audio', + 'file-sound-o': 'file-audio', + 'file-video-o': 'file-video', + 'file-movie-o': 'file-video', + 'file-code-o': 'file-code', + 'life-ring': 'life-ring', + 'life-bouy': 'life-ring', + 'life-buoy': 'life-ring', + 'life-saver': 'life-ring', + 'support': 'life-ring', + 'circle-o-notch': 'circle-notch', + 'rebel': 'rebel', + 'ra': 'rebel', + 'resistance': 'rebel', + 'empire': 'empire', + 'ge': 'empire', + 'git-square': 'square-git', + 'git': 'git', + 'hacker-news': 'hacker-news', + 'yc-square': 'hacker-news', + 'y-combinator-square': 'hacker-news', + 'tencent-weibo': 'tencent-weibo', + 'qq': 'qq', + 'weixin': 'weixin', + 'wechat': 'weixin', + 'paper-plane': 'paper-plane', + 'paper-plane-o': 'paper-plane', + 'send': 'paper-plane', + 'send-o': 'paper-plane', + 'circle-thin': 'circle', + 'futbol-o': 'futbol', + 'soccer-ball-o': 'futbol', + 'tty': 'tty', + 'binoculars': 'binoculars', + 'plug': 'plug', + 'newspaper-o': 'newspaper', + 'wifi': 'wifi', + 'calculator': 'calculator', + 'cc': 'closed-captioning', + 'ils': 'shekel-sign', + 'shekel': 'shekel-sign', + 'sheqel': 'shekel-sign', + 'transgender': 'mars-and-venus', + 'intersex': 'mars-and-venus', + 'transgender-alt': 'transgender', + 'venus-double': 'venus-double', + 'mars-double': 'mars-double', + 'venus-mars': 'venus-mars', + 'mars-stroke': 'mars-stroke', + 'mars-stroke-v': 'mars-stroke-up', + 'mars-stroke-h': 'mars-stroke-right', + 'neuter': 'neuter', + 'genderless': 'genderless', + 'user-plus': 'user-plus', + 'user-times': 'user-xmark', + 'user-circle': 'circle-user', + 'user-circle-o': 'circle-user', + 'bed': 'bed', + 'vcard': 'address-card', + 'vcard-o': 'address-card', + 'facebook-official': 'facebook', + 'pinterest-p': 'pinterest-p', + 'whatsapp': 'whatsapp', + 'server': 'server', + 'balance-scale': 'scale-balanced', + 'balance-scale-left': 'scale-unbalanced', + 'balance-scale-right': 'scale-unbalanced-flip', + 'hourglass': 'hourglass', + 'hourglass-o': 'hourglass', + 'hourglass-1': 'hourglass-start', + 'hourglass-start': 'hourglass-start', + 'hourglass-2': 'hourglass-half', + 'hourglass-half': 'hourglass-half', + 'hourglass-3': 'hourglass-end', + 'hourglass-end': 'hourglass-end', + 'hand-grab-o': 'hand', + 'hand-rock-o': 'hand-back-fist', + 'hand-paper-o': 'hand', + 'hand-stop-o': 'hand', + 'hand-scissors-o': 'hand-scissors', + 'hand-lizard-o': 'hand-lizard', + 'hand-spock-o': 'hand-spock', + 'hand-pointer-o': 'hand-pointer', + 'hand-peace-o': 'hand-peace', + '500px': '500px', + 'adn': 'adn', + 'bitbucket': 'bitbucket', + 'bitbucket-square': 'bitbucket', + 'tumblr': 'tumblr', + 'tumblr-square': 'square-tumblr', + 'apple': 'apple', + 'windows': 'windows', + 'android': 'android', + 'linux': 'linux', + 'dribbble': 'dribbble', + 'skype': 'skype', + 'foursquare': 'foursquare', + 'trello': 'trello', + 'female': 'person-dress', + 'male': 'person', + 'gratipay': 'gratipay', + 'gittip': 'gratipay', + 'sun-o': 'sun', + 'moon-o': 'moon', + 'vk': 'vk', + 'weibo': 'weibo', + 'renren': 'renren', + 'pagelines': 'pagelines', + 'stack-exchange': 'stack-exchange', + 'arrow-circle-o-right': 'circle-right', + 'arrow-circle-o-left': 'circle-left', + 'caret-square-o-left': 'square-caret-left', + 'toggle-left': 'square-caret-left', + 'dot-circle-o': 'circle-dot', + 'vimeo-square': 'square-vimeo', + 'try': 'turkish-lira-sign', + 'turkish-lira': 'turkish-lira-sign', + 'plus-square-o': 'square-plus', + }; + + // Outline icons (-o suffix) mappings to regular style + const outlineIcons = { + 'address-book-o': 'address-book', + 'address-card-o': 'address-card', + 'arrow-circle-o-down': 'circle-down', + 'arrow-circle-o-left': 'circle-left', + 'arrow-circle-o-right': 'circle-right', + 'arrow-circle-o-up': 'circle-up', + 'bar-chart-o': 'chart-bar', + 'bell-o': 'bell', + 'bell-slash-o': 'bell-slash', + 'bookmark-o': 'bookmark', + 'building-o': 'building', + 'calendar-check-o': 'calendar-check', + 'calendar-minus-o': 'calendar-minus', + 'calendar-o': 'calendar', + 'calendar-plus-o': 'calendar-plus', + 'calendar-times-o': 'calendar-xmark', + 'caret-square-o-down': 'square-caret-down', + 'caret-square-o-left': 'square-caret-left', + 'caret-square-o-right': 'square-caret-right', + 'caret-square-o-up': 'square-caret-up', + 'cc-o': 'closed-captioning', + 'check-circle-o': 'circle-check', + 'check-square-o': 'square-check', + 'circle-o': 'circle', + 'clock-o': 'clock', + 'clone-o': 'clone', + 'comment-o': 'comment', + 'commenting-o': 'comment-dots', + 'comments-o': 'comments', + 'copy-o': 'copy', + 'copyright-o': 'copyright', + 'credit-card-o': 'credit-card', + 'dot-circle-o': 'circle-dot', + 'envelope-o': 'envelope', + 'envelope-open-o': 'envelope-open', + 'eye-o': 'eye', + 'file-archive-o': 'file-zipper', + 'file-audio-o': 'file-audio', + 'file-code-o': 'file-code', + 'file-excel-o': 'file-excel', + 'file-image-o': 'file-image', + 'file-o': 'file', + 'file-pdf-o': 'file-pdf', + 'file-photo-o': 'file-image', + 'file-powerpoint-o': 'file-powerpoint', + 'file-text-o': 'file-lines', + 'file-video-o': 'file-video', + 'file-word-o': 'file-word', + 'files-o': 'copy', + 'flag-o': 'flag', + 'floppy-o': 'floppy-disk', + 'folder-o': 'folder', + 'folder-open-o': 'folder-open', + 'frown-o': 'face-frown', + 'futbol-o': 'futbol', + 'gem-o': 'gem', + 'hand-lizard-o': 'hand-lizard', + 'hand-o-down': 'hand-point-down', + 'hand-o-left': 'hand-point-left', + 'hand-o-right': 'hand-point-right', + 'hand-o-up': 'hand-point-up', + 'hand-paper-o': 'hand', + 'hand-peace-o': 'hand-peace', + 'hand-pointer-o': 'hand-pointer', + 'hand-rock-o': 'hand-back-fist', + 'hand-scissors-o': 'hand-scissors', + 'hand-spock-o': 'hand-spock', + 'handshake-o': 'handshake', + 'hdd-o': 'hard-drive', + 'heart-o': 'heart', + 'hospital-o': 'hospital', + 'hourglass-o': 'hourglass', + 'id-badge-o': 'id-badge', + 'id-card-o': 'id-card', + 'image-o': 'image', + 'keyboard-o': 'keyboard', + 'lemon-o': 'lemon', + 'life-ring-o': 'life-ring', + 'lightbulb-o': 'lightbulb', + 'map-o': 'map', + 'meh-o': 'face-meh', + 'minus-square-o': 'square-minus', + 'money-o': 'money-bill', + 'moon-o': 'moon', + 'newspaper-o': 'newspaper', + 'object-group-o': 'object-group', + 'object-ungroup-o': 'object-ungroup', + 'paper-plane-o': 'paper-plane', + 'pause-circle-o': 'circle-pause', + 'pencil-square-o': 'pen-to-square', + 'picture-o': 'image', + 'play-circle-o': 'circle-play', + 'plus-square-o': 'square-plus', + 'question-circle-o': 'circle-question', + 'registered-o': 'registered', + 'share-square-o': 'share-from-square', + 'smile-o': 'face-smile', + 'snowflake-o': 'snowflake', + 'square-o': 'square', + 'star-half-o': 'star-half', + 'star-o': 'star', + 'sticky-note-o': 'note-sticky', + 'stop-circle-o': 'circle-stop', + 'sun-o': 'sun', + 'thumbs-down-o': 'thumbs-down', + 'thumbs-o-down': 'thumbs-down', + 'thumbs-o-up': 'thumbs-up', + 'thumbs-up-o': 'thumbs-up', + 'times-circle-o': 'circle-xmark', + 'trash-o': 'trash-can', + 'user-circle-o': 'circle-user', + 'user-o': 'user', + 'window-close-o': 'rectangle-xmark', + 'window-maximize-o': 'window-maximize', + 'window-minimize-o': 'window-minimize', + 'window-restore-o': 'window-restore' + }; + + // Brand icons that need explicit font-family + const brandIcons = [ + '500px', 'adn', 'amazon', 'android', 'angellist', 'apple', 'bandcamp', 'behance', + 'bitbucket', 'bitcoin', 'black-tie', 'bluetooth', 'bluetooth-b', 'buysellads', + 'cc-amex', 'cc-diners-club', 'cc-discover', 'cc-jcb', 'cc-mastercard', 'cc-paypal', + 'cc-stripe', 'cc-visa', 'chrome', 'codepen', 'codiepie', 'connectdevelop', 'contao', + 'css3', 'dashcube', 'delicious', 'deviantart', 'digg', 'dribbble', 'dropbox', 'drupal', + 'edge', 'empire', 'envira', 'etsy', 'expeditedssl', 'facebook', 'facebook-f', + 'firefox', 'flickr', 'fonticons', 'fort-awesome', 'forumbee', 'foursquare', + 'free-code-camp', 'get-pocket', 'gg', 'gg-circle', 'git', 'github', 'github-alt', + 'gitlab', 'glide', 'glide-g', 'google', 'google-plus', 'google-wallet', 'gratipay', + 'grav', 'hacker-news', 'houzz', 'html5', 'imdb', 'instagram', 'internet-explorer', + 'ioxhost', 'joomla', 'jsfiddle', 'lastfm', 'leanpub', 'linkedin', 'linode', 'linux', + 'maxcdn', 'meanpath', 'medium', 'meetup', 'mixcloud', 'modx', 'odnoklassniki', + 'opencart', 'openid', 'opera', 'optin-monster', 'pagelines', 'paypal', 'pied-piper', + 'pied-piper-alt', 'pied-piper-pp', 'pinterest', 'pinterest-p', 'product-hunt', 'qq', + 'quora', 'ravelry', 'rebel', 'reddit', 'reddit-alien', 'renren', 'safari', 'scribd', + 'sellsy', 'shirtsinbulk', 'simplybuilt', 'skyatlas', 'skype', 'slack', 'slideshare', + 'snapchat', 'soundcloud', 'spotify', 'stack-exchange', 'stack-overflow', 'steam', + 'stumbleupon', 'stumbleupon-circle', 'superpowers', 'telegram', 'tencent-weibo', + 'themeisle', 'trello', 'tumblr', 'twitch', 'twitter', 'usb', 'viacoin', 'viadeo', + 'vimeo', 'vine', 'vk', 'weibo', 'weixin', 'whatsapp', 'wikipedia-w', 'windows', + 'wordpress', 'wpbeginner', 'wpexplorer', 'wpforms', 'xing', 'y-combinator', 'yahoo', + 'yelp', 'yoast', 'youtube' + ]; + + // Fork Awesome specific icons fallback mappings + const forkSpecificIcons = { + 'activitypub': 'share-nodes', + 'archive-org': 'building-columns', + 'artstation': 'artstation', + 'bell-slash-o': 'bell-slash', + 'biometric': 'fingerprint', + 'c': 'c', + 'cc-by': 'creative-commons-by', + 'cc-nc': 'creative-commons-nc', + 'cc-nc-eu': 'creative-commons-nc-eu', + 'cc-nc-jp': 'creative-commons-nc-jp', + 'cc-nd': 'creative-commons-nd', + 'cc-pd': 'creative-commons-pd', + 'cc-remix': 'creative-commons-remix', + 'cc-sa': 'creative-commons-sa', + 'cc-share': 'creative-commons-share', + 'cc-zero': 'creative-commons-zero', + 'commenting': 'comment-dots', + 'commenting-o': 'comment-dots', + 'dat': 'database', + 'diaspora': 'asterisk', + 'digitalocean': 'digital-ocean', + 'discord': 'discord', + 'emby': 'circle-play', + 'ethereum': 'ethereum', + 'f-droid': 'android', + 'facebook-messenger': 'facebook-messenger', + 'foster': 'hands-holding-child', + 'friendica': 'users', + 'galaxy': 'rocket', + 'gimp': 'palette', + 'gitea': 'mug-hot', + 'gnu-social': 'gnu', + 'google-auth': 'shield', + 'hackaday': 'wrench', + 'hackster': 'microchip', + 'inkscape': 'pen-nib', + 'jirafeau': 'share', + 'joplin': 'book', + 'jsdelivr': 'truck-fast', + 'keybase': 'key', + 'laravel': 'laravel', + 'liberapay': 'hand-holding-heart', + 'libreoffice': 'file-word', + 'line-graph': 'chart-line', + 'mastodon': 'mastodon', + 'matrix-org': 'comment-dots', + 'nextcloud': 'cloud', + 'nodejs': 'node-js', + 'orcid': 'orcid', + 'patreon': 'patreon', + 'peertube': 'video', + 'php': 'php', + 'pi-hole': 'shield-halved', + 'pixelfed': 'camera-retro', + 'plume': 'feather', + 'postgresql': 'database', + 'python': 'python', + 'react': 'react', + 'researchgate': 'researchgate', + 'riot': 'comments', + 'scuttlebutt': 'fish', + 'signal': 'signal-messenger', + 'sketchfab': 'cube', + 'snowdrift': 'snowflake', + 'social-home': 'house-user', + 'syncthing': 'arrows-rotate', + 'tex': 'code', + 'tor': 'user-secret', + 'unsplash': 'unsplash', + 'vagrant': 'v', + 'vscode': 'code', + 'xmpp': 'comment', + 'zotero': 'bookmark' + }; + + // Determine if an icon needs regular style + function isRegularIcon(iconName) { + return iconName in outlineIcons || iconName.endsWith('-o'); + } + + // Determine if an icon is a brand icon + function isBrandIcon(iconName) { + return brandIcons.includes(iconName) || iconName in forkSpecificIcons; + } + + // Get the mapped icon name and style + function getMappedIcon(iconName) { + // Check direct mappings first + if (iconName in iconMappings) { + return { name: iconMappings[iconName], style: 'solid' }; + } + + // Check outline icons + if (iconName in outlineIcons) { + return { name: outlineIcons[iconName], style: 'regular' }; + } + + // Check Fork-specific icons + if (iconName in forkSpecificIcons) { + const mappedName = forkSpecificIcons[iconName]; + const style = isBrandIcon(mappedName) ? 'brands' : 'solid'; + return { name: mappedName, style: style }; + } + + // Default: return as-is + return { name: iconName, style: 'solid' }; + } + + // Transform icon classes + function transformIconClasses(element) { + if (!element || !element.classList) return; + + const classList = element.classList; + let iconClass = null; + let hasFA = false; + + // Check if element has 'fa' class + for (let i = 0; i < classList.length; i++) { + if (classList[i] === 'fa') { + hasFA = true; + } else if (classList[i].startsWith('fa-') && !classList[i].match(/^fa-(fw|spin|pulse|rotate|flip|stack|inverse|border|pull|li|lg|2x|3x|4x|5x)/)) { + iconClass = classList[i].substring(3); // Remove 'fa-' prefix + } + } + + if (!hasFA || !iconClass) return; + + // Get mapped icon + const mapped = getMappedIcon(iconClass); + + // Remove old icon class + classList.remove('fa-' + iconClass); + + // Add new icon class + classList.add('fa-' + mapped.name); + + // Handle style-specific classes + if (mapped.style === 'regular') { + classList.add('far'); + classList.remove('fas', 'fab'); + } else if (mapped.style === 'brands') { + classList.add('fab'); + classList.remove('fas', 'far'); + } else { + classList.add('fas'); + classList.remove('far', 'fab'); + } + } + + // Process all icons on the page + function processAllIcons() { + const icons = document.querySelectorAll('.fa'); + for (let i = 0; i < icons.length; i++) { + transformIconClasses(icons[i]); + } + } + + // MutationObserver to handle dynamically added icons + function observeDynamicIcons() { + const observer = new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + mutation.addedNodes.forEach(function(node) { + if (node.nodeType === 1) { // Element node + if (node.classList && node.classList.contains('fa')) { + transformIconClasses(node); + } + // Check child nodes + const childIcons = node.querySelectorAll('.fa'); + for (let i = 0; i < childIcons.length; i++) { + transformIconClasses(childIcons[i]); + } + } + }); + }); + }); + + observer.observe(document.body, { + childList: true, + subtree: true + }); + } + + // Initialize shim + function init() { + // Process existing icons + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', function() { + processAllIcons(); + observeDynamicIcons(); + }); + } else { + processAllIcons(); + observeDynamicIcons(); + } + } + + // Expose API + window.ForkAwesomeShim = { + init: init, + processAllIcons: processAllIcons, + transformIconClasses: transformIconClasses, + getMappedIcon: getMappedIcon + }; + + // Auto-initialize + init(); + +})(); \ No newline at end of file diff --git a/plugins/admin/themes/grav/js/icon-mappings.json b/plugins/admin/themes/grav/js/icon-mappings.json new file mode 100644 index 0000000..f1ad1c8 --- /dev/null +++ b/plugins/admin/themes/grav/js/icon-mappings.json @@ -0,0 +1,800 @@ +{ + "version": "1.0.0", + "description": "ForkAwesome 1.1.5 to FontAwesome 7 icon mappings", + "mappings": { + "direct": { + "comment": "Icons that map directly without changes", + "icons": { + "anchor": "anchor", + "archive": "archive", + "asterisk": "asterisk", + "ban": "ban", + "barcode": "barcode", + "bars": "bars", + "battery-full": "battery-full", + "battery-three-quarters": "battery-three-quarters", + "battery-half": "battery-half", + "battery-quarter": "battery-quarter", + "battery-empty": "battery-empty", + "bed": "bed", + "beer": "beer", + "bell": "bell", + "bell-slash": "bell-slash", + "bicycle": "bicycle", + "binoculars": "binoculars", + "birthday-cake": "cake-candles", + "bitcoin": "bitcoin", + "bold": "bold", + "bolt": "bolt", + "bomb": "bomb", + "book": "book", + "bookmark": "bookmark", + "briefcase": "briefcase", + "bug": "bug", + "building": "building", + "bullhorn": "bullhorn", + "bullseye": "bullseye", + "bus": "bus", + "calculator": "calculator", + "calendar": "calendar", + "camera": "camera", + "car": "car", + "caret-down": "caret-down", + "caret-left": "caret-left", + "caret-right": "caret-right", + "caret-up": "caret-up", + "cart-plus": "cart-plus", + "certificate": "certificate", + "check": "check", + "check-circle": "circle-check", + "chevron-down": "chevron-down", + "chevron-left": "chevron-left", + "chevron-right": "chevron-right", + "chevron-up": "chevron-up", + "child": "child", + "circle": "circle", + "clipboard": "clipboard", + "clock": "clock", + "cloud": "cloud", + "cloud-download": "cloud-arrow-down", + "cloud-upload": "cloud-arrow-up", + "code": "code", + "coffee": "mug-hot", + "cog": "gear", + "cogs": "gears", + "comment": "comment", + "comments": "comments", + "compass": "compass", + "copy": "copy", + "copyright": "copyright", + "credit-card": "credit-card", + "crop": "crop-simple", + "crosshairs": "crosshairs", + "cube": "cube", + "cubes": "cubes", + "database": "database", + "desktop": "desktop", + "diamond": "gem", + "download": "download", + "edit": "pen-to-square", + "eject": "eject", + "ellipsis-h": "ellipsis", + "ellipsis-v": "ellipsis-vertical", + "envelope": "envelope", + "eraser": "eraser", + "exclamation": "exclamation", + "exclamation-circle": "circle-exclamation", + "exclamation-triangle": "triangle-exclamation", + "external-link": "up-right-from-square", + "eye": "eye", + "eye-slash": "eye-slash", + "eyedropper": "eye-dropper", + "fax": "fax", + "file": "file", + "file-archive": "file-zipper", + "file-audio": "file-audio", + "file-code": "file-code", + "file-excel": "file-excel", + "file-image": "file-image", + "file-pdf": "file-pdf", + "file-powerpoint": "file-powerpoint", + "file-text": "file-lines", + "file-video": "file-video", + "file-word": "file-word", + "film": "film", + "filter": "filter", + "fire": "fire", + "flag": "flag", + "flask": "flask", + "folder": "folder", + "folder-open": "folder-open", + "font": "font", + "forward": "forward", + "gamepad": "gamepad", + "gavel": "gavel", + "gift": "gift", + "globe": "globe", + "graduation-cap": "graduation-cap", + "h-square": "square-h", + "hand-point-down": "hand-point-down", + "hand-point-left": "hand-point-left", + "hand-point-right": "hand-point-right", + "hand-point-up": "hand-point-up", + "hashtag": "hashtag", + "headphones": "headphones", + "heart": "heart", + "history": "clock-rotate-left", + "home": "house", + "hospital": "hospital", + "hourglass": "hourglass", + "image": "image", + "inbox": "inbox", + "indent": "indent", + "info": "info", + "info-circle": "circle-info", + "italic": "italic", + "key": "key", + "keyboard": "keyboard", + "language": "language", + "laptop": "laptop", + "leaf": "leaf", + "lemon": "lemon", + "level-down": "turn-down", + "level-up": "turn-up", + "life-ring": "life-ring", + "lightbulb": "lightbulb", + "link": "link", + "list": "list", + "list-alt": "rectangle-list", + "list-ol": "list-ol", + "list-ul": "list-ul", + "location-arrow": "location-arrow", + "lock": "lock", + "magic": "wand-magic-sparkles", + "magnet": "magnet", + "mail-forward": "share", + "mail-reply": "reply", + "mail-reply-all": "reply-all", + "map": "map", + "map-marker": "location-dot", + "map-pin": "map-pin", + "microphone": "microphone", + "microphone-slash": "microphone-slash", + "minus": "minus", + "minus-circle": "circle-minus", + "mobile": "mobile-screen-button", + "money": "money-bill", + "moon": "moon", + "music": "music", + "paint-brush": "paintbrush", + "paper-plane": "paper-plane", + "paperclip": "paperclip", + "pause": "pause", + "paw": "paw", + "pencil": "pencil", + "phone": "phone", + "picture": "image", + "pie-chart": "chart-pie", + "plane": "plane", + "play": "play", + "plug": "plug", + "plus": "plus", + "plus-circle": "circle-plus", + "power-off": "power-off", + "print": "print", + "puzzle-piece": "puzzle-piece", + "qrcode": "qrcode", + "question": "question", + "question-circle": "circle-question", + "quote-left": "quote-left", + "quote-right": "quote-right", + "random": "shuffle", + "recycle": "recycle", + "refresh": "rotate", + "registered": "registered", + "remove": "xmark", + "reorder": "bars", + "repeat": "repeat", + "reply": "reply", + "reply-all": "reply-all", + "retweet": "retweet", + "road": "road", + "rocket": "rocket", + "rss": "rss", + "save": "floppy-disk", + "scissors": "scissors", + "search": "magnifying-glass", + "search-minus": "magnifying-glass-minus", + "search-plus": "magnifying-glass-plus", + "server": "server", + "share": "share", + "share-alt": "share-nodes", + "shield": "shield", + "shopping-cart": "cart-shopping", + "sign-in": "right-to-bracket", + "sign-out": "right-from-bracket", + "signal": "signal", + "sitemap": "sitemap", + "sliders": "sliders", + "smile": "face-smile", + "sort": "sort", + "sort-alpha-asc": "arrow-down-a-z", + "sort-alpha-desc": "arrow-down-z-a", + "sort-amount-asc": "arrow-down-short-wide", + "sort-amount-desc": "arrow-down-wide-short", + "sort-asc": "sort-up", + "sort-desc": "sort-down", + "sort-numeric-asc": "arrow-down-1-9", + "sort-numeric-desc": "arrow-down-9-1", + "spinner": "spinner", + "square": "square", + "star": "star", + "star-half": "star-half", + "stop": "stop", + "strikethrough": "strikethrough", + "subscript": "subscript", + "sun": "sun", + "superscript": "superscript", + "table": "table", + "tablet": "tablet-screen-button", + "tag": "tag", + "tags": "tags", + "tasks": "list-check", + "terminal": "terminal", + "text-height": "text-height", + "text-width": "text-width", + "th": "table-cells", + "th-large": "table-cells-large", + "th-list": "table-list", + "thumbs-down": "thumbs-down", + "thumbs-up": "thumbs-up", + "ticket": "ticket", + "times": "xmark", + "times-circle": "circle-xmark", + "tint": "droplet", + "toggle-off": "toggle-off", + "toggle-on": "toggle-on", + "trademark": "trademark", + "trash": "trash", + "tree": "tree", + "trophy": "trophy", + "truck": "truck", + "umbrella": "umbrella", + "underline": "underline", + "undo": "rotate-left", + "unlock": "unlock", + "upload": "upload", + "user": "user", + "users": "users", + "video-camera": "video", + "volume-down": "volume-low", + "volume-off": "volume-xmark", + "volume-up": "volume-high", + "warning": "triangle-exclamation", + "wheelchair": "wheelchair", + "wifi": "wifi", + "wrench": "wrench" + } + }, + "outline": { + "comment": "Icons with -o suffix that map to FontAwesome regular style", + "icons": { + "address-book-o": { "name": "address-book", "style": "regular" }, + "address-card-o": { "name": "address-card", "style": "regular" }, + "bell-o": { "name": "bell", "style": "regular" }, + "bookmark-o": { "name": "bookmark", "style": "regular" }, + "building-o": { "name": "building", "style": "regular" }, + "calendar-o": { "name": "calendar", "style": "regular" }, + "check-circle-o": { "name": "circle-check", "style": "regular" }, + "check-square-o": { "name": "square-check", "style": "regular" }, + "circle-o": { "name": "circle", "style": "regular" }, + "clock-o": { "name": "clock", "style": "regular" }, + "comment-o": { "name": "comment", "style": "regular" }, + "comments-o": { "name": "comments", "style": "regular" }, + "credit-card-o": { "name": "credit-card", "style": "regular" }, + "dot-circle-o": { "name": "circle-dot", "style": "regular" }, + "envelope-o": { "name": "envelope", "style": "regular" }, + "envelope-open-o": { "name": "envelope-open", "style": "regular" }, + "eye-o": { "name": "eye", "style": "regular" }, + "file-o": { "name": "file", "style": "regular" }, + "file-text-o": { "name": "file-lines", "style": "regular" }, + "flag-o": { "name": "flag", "style": "regular" }, + "floppy-o": { "name": "floppy-disk", "style": "regular" }, + "folder-o": { "name": "folder", "style": "regular" }, + "folder-open-o": { "name": "folder-open", "style": "regular" }, + "frown-o": { "name": "face-frown", "style": "regular" }, + "hand-o-down": { "name": "hand-point-down", "style": "regular" }, + "hand-o-left": { "name": "hand-point-left", "style": "regular" }, + "hand-o-right": { "name": "hand-point-right", "style": "regular" }, + "hand-o-up": { "name": "hand-point-up", "style": "regular" }, + "heart-o": { "name": "heart", "style": "regular" }, + "hospital-o": { "name": "hospital", "style": "regular" }, + "hourglass-o": { "name": "hourglass", "style": "regular" }, + "image-o": { "name": "image", "style": "regular" }, + "keyboard-o": { "name": "keyboard", "style": "regular" }, + "lemon-o": { "name": "lemon", "style": "regular" }, + "lightbulb-o": { "name": "lightbulb", "style": "regular" }, + "map-o": { "name": "map", "style": "regular" }, + "meh-o": { "name": "face-meh", "style": "regular" }, + "minus-square-o": { "name": "square-minus", "style": "regular" }, + "moon-o": { "name": "moon", "style": "regular" }, + "newspaper-o": { "name": "newspaper", "style": "regular" }, + "paper-plane-o": { "name": "paper-plane", "style": "regular" }, + "pause-circle-o": { "name": "circle-pause", "style": "regular" }, + "picture-o": { "name": "image", "style": "regular" }, + "play-circle-o": { "name": "circle-play", "style": "regular" }, + "plus-square-o": { "name": "square-plus", "style": "regular" }, + "question-circle-o": { "name": "circle-question", "style": "regular" }, + "share-square-o": { "name": "share-from-square", "style": "regular" }, + "smile-o": { "name": "face-smile", "style": "regular" }, + "snowflake-o": { "name": "snowflake", "style": "regular" }, + "square-o": { "name": "square", "style": "regular" }, + "star-half-o": { "name": "star-half", "style": "regular" }, + "star-o": { "name": "star", "style": "regular" }, + "sticky-note-o": { "name": "note-sticky", "style": "regular" }, + "stop-circle-o": { "name": "circle-stop", "style": "regular" }, + "sun-o": { "name": "sun", "style": "regular" }, + "thumbs-down-o": { "name": "thumbs-down", "style": "regular" }, + "thumbs-up-o": { "name": "thumbs-up", "style": "regular" }, + "times-circle-o": { "name": "circle-xmark", "style": "regular" }, + "trash-o": { "name": "trash-can", "style": "regular" }, + "user-o": { "name": "user", "style": "regular" } + } + }, + "directional": { + "comment": "Directional and arrow icons with special mappings", + "icons": { + "angle-double-down": "angles-down", + "angle-double-left": "angles-left", + "angle-double-right": "angles-right", + "angle-double-up": "angles-up", + "angle-down": "angle-down", + "angle-left": "angle-left", + "angle-right": "angle-right", + "angle-up": "angle-up", + "arrow-circle-down": "circle-arrow-down", + "arrow-circle-left": "circle-arrow-left", + "arrow-circle-right": "circle-arrow-right", + "arrow-circle-up": "circle-arrow-up", + "arrow-circle-o-down": { "name": "circle-down", "style": "regular" }, + "arrow-circle-o-left": { "name": "circle-left", "style": "regular" }, + "arrow-circle-o-right": { "name": "circle-right", "style": "regular" }, + "arrow-circle-o-up": { "name": "circle-up", "style": "regular" }, + "arrow-down": "arrow-down", + "arrow-left": "arrow-left", + "arrow-right": "arrow-right", + "arrow-up": "arrow-up", + "arrows": "arrows-up-down-left-right", + "arrows-alt": "maximize", + "arrows-h": "arrows-left-right", + "arrows-v": "arrows-up-down", + "caret-square-o-down": { "name": "square-caret-down", "style": "regular" }, + "caret-square-o-left": { "name": "square-caret-left", "style": "regular" }, + "caret-square-o-right": { "name": "square-caret-right", "style": "regular" }, + "caret-square-o-up": { "name": "square-caret-up", "style": "regular" }, + "chevron-circle-down": "circle-chevron-down", + "chevron-circle-left": "circle-chevron-left", + "chevron-circle-right": "circle-chevron-right", + "chevron-circle-up": "circle-chevron-up", + "long-arrow-down": "arrow-down-long", + "long-arrow-left": "arrow-left-long", + "long-arrow-right": "arrow-right-long", + "long-arrow-up": "arrow-up-long" + } + }, + "brands": { + "comment": "Brand icons that need explicit brand style", + "icons": { + "500px": { "name": "500px", "style": "brands" }, + "adn": { "name": "adn", "style": "brands" }, + "amazon": { "name": "amazon", "style": "brands" }, + "android": { "name": "android", "style": "brands" }, + "angellist": { "name": "angellist", "style": "brands" }, + "apple": { "name": "apple", "style": "brands" }, + "bandcamp": { "name": "bandcamp", "style": "brands" }, + "behance": { "name": "behance", "style": "brands" }, + "bitbucket": { "name": "bitbucket", "style": "brands" }, + "bitcoin": { "name": "bitcoin", "style": "brands" }, + "black-tie": { "name": "black-tie", "style": "brands" }, + "bluetooth": { "name": "bluetooth", "style": "brands" }, + "bluetooth-b": { "name": "bluetooth-b", "style": "brands" }, + "buysellads": { "name": "buysellads", "style": "brands" }, + "cc-amex": { "name": "cc-amex", "style": "brands" }, + "cc-diners-club": { "name": "cc-diners-club", "style": "brands" }, + "cc-discover": { "name": "cc-discover", "style": "brands" }, + "cc-jcb": { "name": "cc-jcb", "style": "brands" }, + "cc-mastercard": { "name": "cc-mastercard", "style": "brands" }, + "cc-paypal": { "name": "cc-paypal", "style": "brands" }, + "cc-stripe": { "name": "cc-stripe", "style": "brands" }, + "cc-visa": { "name": "cc-visa", "style": "brands" }, + "chrome": { "name": "chrome", "style": "brands" }, + "codepen": { "name": "codepen", "style": "brands" }, + "connectdevelop": { "name": "connectdevelop", "style": "brands" }, + "contao": { "name": "contao", "style": "brands" }, + "css3": { "name": "css3", "style": "brands" }, + "dashcube": { "name": "dashcube", "style": "brands" }, + "delicious": { "name": "delicious", "style": "brands" }, + "deviantart": { "name": "deviantart", "style": "brands" }, + "digg": { "name": "digg", "style": "brands" }, + "dribbble": { "name": "dribbble", "style": "brands" }, + "dropbox": { "name": "dropbox", "style": "brands" }, + "drupal": { "name": "drupal", "style": "brands" }, + "edge": { "name": "edge", "style": "brands" }, + "empire": { "name": "empire", "style": "brands" }, + "envira": { "name": "envira", "style": "brands" }, + "expeditedssl": { "name": "expeditedssl", "style": "brands" }, + "facebook": { "name": "facebook", "style": "brands" }, + "facebook-f": { "name": "facebook-f", "style": "brands" }, + "facebook-official": { "name": "facebook", "style": "brands" }, + "facebook-square": { "name": "square-facebook", "style": "brands" }, + "firefox": { "name": "firefox", "style": "brands" }, + "flickr": { "name": "flickr", "style": "brands" }, + "fonticons": { "name": "fonticons", "style": "brands" }, + "fort-awesome": { "name": "fort-awesome", "style": "brands" }, + "forumbee": { "name": "forumbee", "style": "brands" }, + "foursquare": { "name": "foursquare", "style": "brands" }, + "free-code-camp": { "name": "free-code-camp", "style": "brands" }, + "get-pocket": { "name": "get-pocket", "style": "brands" }, + "gg": { "name": "gg", "style": "brands" }, + "gg-circle": { "name": "gg-circle", "style": "brands" }, + "git": { "name": "git", "style": "brands" }, + "git-square": { "name": "square-git", "style": "brands" }, + "github": { "name": "github", "style": "brands" }, + "github-alt": { "name": "github-alt", "style": "brands" }, + "github-square": { "name": "square-github", "style": "brands" }, + "gitlab": { "name": "gitlab", "style": "brands" }, + "gittip": { "name": "gratipay", "style": "brands" }, + "glide": { "name": "glide", "style": "brands" }, + "glide-g": { "name": "glide-g", "style": "brands" }, + "google": { "name": "google", "style": "brands" }, + "google-plus": { "name": "google-plus", "style": "brands" }, + "google-plus-circle": { "name": "google-plus", "style": "brands" }, + "google-plus-square": { "name": "square-google-plus", "style": "brands" }, + "google-wallet": { "name": "google-wallet", "style": "brands" }, + "gratipay": { "name": "gratipay", "style": "brands" }, + "grav": { "name": "grav", "style": "brands" }, + "hacker-news": { "name": "hacker-news", "style": "brands" }, + "houzz": { "name": "houzz", "style": "brands" }, + "html5": { "name": "html5", "style": "brands" }, + "imdb": { "name": "imdb", "style": "brands" }, + "instagram": { "name": "instagram", "style": "brands" }, + "internet-explorer": { "name": "internet-explorer", "style": "brands" }, + "ioxhost": { "name": "ioxhost", "style": "brands" }, + "joomla": { "name": "joomla", "style": "brands" }, + "jsfiddle": { "name": "jsfiddle", "style": "brands" }, + "lastfm": { "name": "lastfm", "style": "brands" }, + "lastfm-square": { "name": "square-lastfm", "style": "brands" }, + "leanpub": { "name": "leanpub", "style": "brands" }, + "linkedin": { "name": "linkedin", "style": "brands" }, + "linkedin-square": { "name": "square-linkedin", "style": "brands" }, + "linux": { "name": "linux", "style": "brands" }, + "maxcdn": { "name": "maxcdn", "style": "brands" }, + "meanpath": { "name": "font-awesome", "style": "brands" }, + "medium": { "name": "medium", "style": "brands" }, + "meetup": { "name": "meetup", "style": "brands" }, + "mixcloud": { "name": "mixcloud", "style": "brands" }, + "modx": { "name": "modx", "style": "brands" }, + "odnoklassniki": { "name": "odnoklassniki", "style": "brands" }, + "odnoklassniki-square": { "name": "square-odnoklassniki", "style": "brands" }, + "opencart": { "name": "opencart", "style": "brands" }, + "openid": { "name": "openid", "style": "brands" }, + "opera": { "name": "opera", "style": "brands" }, + "optin-monster": { "name": "optin-monster", "style": "brands" }, + "pagelines": { "name": "pagelines", "style": "brands" }, + "paypal": { "name": "paypal", "style": "brands" }, + "pied-piper": { "name": "pied-piper", "style": "brands" }, + "pied-piper-alt": { "name": "pied-piper-alt", "style": "brands" }, + "pied-piper-pp": { "name": "pied-piper-pp", "style": "brands" }, + "pinterest": { "name": "pinterest", "style": "brands" }, + "pinterest-p": { "name": "pinterest-p", "style": "brands" }, + "pinterest-square": { "name": "square-pinterest", "style": "brands" }, + "product-hunt": { "name": "product-hunt", "style": "brands" }, + "qq": { "name": "qq", "style": "brands" }, + "quora": { "name": "quora", "style": "brands" }, + "ra": { "name": "rebel", "style": "brands" }, + "rebel": { "name": "rebel", "style": "brands" }, + "reddit": { "name": "reddit", "style": "brands" }, + "reddit-alien": { "name": "reddit-alien", "style": "brands" }, + "reddit-square": { "name": "square-reddit", "style": "brands" }, + "renren": { "name": "renren", "style": "brands" }, + "resistance": { "name": "rebel", "style": "brands" }, + "safari": { "name": "safari", "style": "brands" }, + "scribd": { "name": "scribd", "style": "brands" }, + "sellsy": { "name": "sellsy", "style": "brands" }, + "shirtsinbulk": { "name": "shirtsinbulk", "style": "brands" }, + "simplybuilt": { "name": "simplybuilt", "style": "brands" }, + "skyatlas": { "name": "skyatlas", "style": "brands" }, + "skype": { "name": "skype", "style": "brands" }, + "slack": { "name": "slack", "style": "brands" }, + "slideshare": { "name": "slideshare", "style": "brands" }, + "snapchat": { "name": "snapchat", "style": "brands" }, + "snapchat-ghost": { "name": "snapchat", "style": "brands" }, + "snapchat-square": { "name": "square-snapchat", "style": "brands" }, + "soundcloud": { "name": "soundcloud", "style": "brands" }, + "spotify": { "name": "spotify", "style": "brands" }, + "stack-exchange": { "name": "stack-exchange", "style": "brands" }, + "stack-overflow": { "name": "stack-overflow", "style": "brands" }, + "steam": { "name": "steam", "style": "brands" }, + "steam-square": { "name": "square-steam", "style": "brands" }, + "stumbleupon": { "name": "stumbleupon", "style": "brands" }, + "stumbleupon-circle": { "name": "stumbleupon-circle", "style": "brands" }, + "tencent-weibo": { "name": "tencent-weibo", "style": "brands" }, + "themeisle": { "name": "themeisle", "style": "brands" }, + "trello": { "name": "trello", "style": "brands" }, + "tripadvisor": { "name": "tripadvisor", "style": "brands" }, + "tumblr": { "name": "tumblr", "style": "brands" }, + "tumblr-square": { "name": "square-tumblr", "style": "brands" }, + "twitch": { "name": "twitch", "style": "brands" }, + "twitter": { "name": "x-twitter", "style": "brands" }, + "twitter-square": { "name": "square-x-twitter", "style": "brands" }, + "usb": { "name": "usb", "style": "brands" }, + "viacoin": { "name": "viacoin", "style": "brands" }, + "viadeo": { "name": "viadeo", "style": "brands" }, + "viadeo-square": { "name": "square-viadeo", "style": "brands" }, + "vimeo": { "name": "vimeo-v", "style": "brands" }, + "vimeo-square": { "name": "square-vimeo", "style": "brands" }, + "vine": { "name": "vine", "style": "brands" }, + "vk": { "name": "vk", "style": "brands" }, + "wechat": { "name": "weixin", "style": "brands" }, + "weibo": { "name": "weibo", "style": "brands" }, + "weixin": { "name": "weixin", "style": "brands" }, + "whatsapp": { "name": "whatsapp", "style": "brands" }, + "wikipedia-w": { "name": "wikipedia-w", "style": "brands" }, + "windows": { "name": "windows", "style": "brands" }, + "wordpress": { "name": "wordpress", "style": "brands" }, + "wpbeginner": { "name": "wpbeginner", "style": "brands" }, + "wpexplorer": { "name": "wpexplorer", "style": "brands" }, + "wpforms": { "name": "wpforms", "style": "brands" }, + "xing": { "name": "xing", "style": "brands" }, + "xing-square": { "name": "square-xing", "style": "brands" }, + "y-combinator": { "name": "y-combinator", "style": "brands" }, + "yahoo": { "name": "yahoo", "style": "brands" }, + "yc": { "name": "y-combinator", "style": "brands" }, + "yelp": { "name": "yelp", "style": "brands" }, + "yoast": { "name": "yoast", "style": "brands" }, + "youtube": { "name": "youtube", "style": "brands" }, + "youtube-play": { "name": "youtube", "style": "brands" }, + "youtube-square": { "name": "square-youtube", "style": "brands" } + } + }, + "forkSpecific": { + "comment": "Fork Awesome specific icons that need fallbacks in FontAwesome 6", + "icons": { + "activitypub": { "name": "share-nodes", "fallback": true }, + "archive-org": { "name": "building-columns", "fallback": true }, + "artstation": { "name": "artstation", "style": "brands" }, + "bell-slash-o": { "name": "bell-slash", "style": "regular" }, + "biometric": { "name": "fingerprint", "fallback": true }, + "c": { "name": "c", "fallback": true }, + "cc-by": { "name": "creative-commons-by", "style": "brands" }, + "cc-nc": { "name": "creative-commons-nc", "style": "brands" }, + "cc-nc-eu": { "name": "creative-commons-nc-eu", "style": "brands" }, + "cc-nc-jp": { "name": "creative-commons-nc-jp", "style": "brands" }, + "cc-nd": { "name": "creative-commons-nd", "style": "brands" }, + "cc-pd": { "name": "creative-commons-pd", "style": "brands" }, + "cc-remix": { "name": "creative-commons-remix", "style": "brands" }, + "cc-sa": { "name": "creative-commons-sa", "style": "brands" }, + "cc-share": { "name": "creative-commons-share", "style": "brands" }, + "cc-zero": { "name": "creative-commons-zero", "style": "brands" }, + "commenting": { "name": "comment-dots", "fallback": true }, + "commenting-o": { "name": "comment-dots", "style": "regular", "fallback": true }, + "dat": { "name": "database", "fallback": true }, + "diaspora": { "name": "asterisk", "fallback": true }, + "digitalocean": { "name": "digital-ocean", "style": "brands" }, + "discord": { "name": "discord", "style": "brands" }, + "emby": { "name": "play-circle", "fallback": true }, + "ethereum": { "name": "ethereum", "style": "brands" }, + "f-droid": { "name": "android", "style": "brands", "fallback": true }, + "facebook-messenger": { "name": "facebook-messenger", "style": "brands" }, + "foster": { "name": "hands-holding-child", "fallback": true }, + "friendica": { "name": "users", "fallback": true }, + "galaxy": { "name": "rocket", "fallback": true }, + "gimp": { "name": "palette", "fallback": true }, + "gitea": { "name": "mug-hot", "fallback": true }, + "gnu-social": { "name": "gnu", "fallback": true }, + "google-auth": { "name": "shield", "fallback": true }, + "hackaday": { "name": "wrench", "fallback": true }, + "hackster": { "name": "microchip", "fallback": true }, + "inkscape": { "name": "pen-nib", "fallback": true }, + "jirafeau": { "name": "share", "fallback": true }, + "joplin": { "name": "book", "fallback": true }, + "jsdelivr": { "name": "truck-fast", "fallback": true }, + "keybase": { "name": "key", "fallback": true }, + "laravel": { "name": "laravel", "style": "brands" }, + "liberapay": { "name": "hand-holding-heart", "fallback": true }, + "libreoffice": { "name": "file-word", "fallback": true }, + "line-graph": { "name": "chart-line", "fallback": true }, + "mastodon": { "name": "mastodon", "style": "brands" }, + "matrix-org": { "name": "comment-dots", "fallback": true }, + "meetup": { "name": "meetup", "style": "brands" }, + "nextcloud": { "name": "cloud", "fallback": true }, + "nodejs": { "name": "node-js", "style": "brands" }, + "orcid": { "name": "orcid", "style": "brands" }, + "patreon": { "name": "patreon", "style": "brands" }, + "peertube": { "name": "video", "fallback": true }, + "php": { "name": "php", "style": "brands" }, + "pi-hole": { "name": "shield-halved", "fallback": true }, + "pixelfed": { "name": "camera-retro", "fallback": true }, + "plume": { "name": "feather", "fallback": true }, + "postgresql": { "name": "database", "fallback": true }, + "python": { "name": "python", "style": "brands" }, + "react": { "name": "react", "style": "brands" }, + "researchgate": { "name": "researchgate", "style": "brands" }, + "riot": { "name": "comments", "fallback": true }, + "scuttlebutt": { "name": "fish", "fallback": true }, + "signal": { "name": "signal-messenger", "style": "brands" }, + "sketchfab": { "name": "cube", "fallback": true }, + "snowdrift": { "name": "snowflake", "fallback": true }, + "social-home": { "name": "house-user", "fallback": true }, + "syncthing": { "name": "arrows-rotate", "fallback": true }, + "telegram": { "name": "telegram", "style": "brands" }, + "tex": { "name": "code", "fallback": true }, + "tor": { "name": "user-secret", "fallback": true }, + "unsplash": { "name": "unsplash", "style": "brands" }, + "vagrant": { "name": "v", "fallback": true }, + "vscode": { "name": "code", "fallback": true }, + "xmpp": { "name": "comment", "fallback": true }, + "zotero": { "name": "bookmark", "fallback": true } + } + }, + "aliases": { + "comment": "Common aliases and alternative names", + "icons": { + "automobile": "car", + "bank": "building-columns", + "bar-chart": "chart-column", + "bar-chart-o": { "name": "chart-bar", "style": "regular" }, + "battery": "battery-full", + "battery-0": "battery-empty", + "battery-1": "battery-quarter", + "battery-2": "battery-half", + "battery-3": "battery-three-quarters", + "battery-4": "battery-full", + "calendar-check-o": { "name": "calendar-check", "style": "regular" }, + "calendar-minus-o": { "name": "calendar-minus", "style": "regular" }, + "calendar-plus-o": { "name": "calendar-plus", "style": "regular" }, + "calendar-times-o": { "name": "calendar-xmark", "style": "regular" }, + "cc": { "name": "closed-captioning", "style": "regular" }, + "chain": "link", + "chain-broken": "link-slash", + "close": "xmark", + "cloud-download-alt": "cloud-arrow-down", + "cloud-upload-alt": "cloud-arrow-up", + "code-fork": "code-branch", + "dashboard": "gauge-high", + "deaf": "ear-deaf", + "deafness": "ear-deaf", + "edit": "pen-to-square", + "euro": "euro-sign", + "eur": "euro-sign", + "eyedropper": "eye-dropper", + "fa": { "name": "font-awesome", "style": "brands" }, + "facebook-official": { "name": "facebook", "style": "brands" }, + "feed": "rss", + "file-archive-o": { "name": "file-zipper", "style": "regular" }, + "file-audio-o": { "name": "file-audio", "style": "regular" }, + "file-code-o": { "name": "file-code", "style": "regular" }, + "file-excel-o": { "name": "file-excel", "style": "regular" }, + "file-image-o": { "name": "file-image", "style": "regular" }, + "file-movie-o": { "name": "file-video", "style": "regular" }, + "file-pdf-o": { "name": "file-pdf", "style": "regular" }, + "file-photo-o": { "name": "file-image", "style": "regular" }, + "file-picture-o": { "name": "file-image", "style": "regular" }, + "file-powerpoint-o": { "name": "file-powerpoint", "style": "regular" }, + "file-sound-o": { "name": "file-audio", "style": "regular" }, + "file-video-o": { "name": "file-video", "style": "regular" }, + "file-word-o": { "name": "file-word", "style": "regular" }, + "file-zip-o": { "name": "file-zipper", "style": "regular" }, + "flash": "bolt", + "futbol-o": { "name": "futbol", "style": "regular" }, + "gbp": "sterling-sign", + "ge": "greater-than-equal", + "gear": "gear", + "gears": "gears", + "google-plus-circle": { "name": "google-plus", "style": "brands" }, + "google-plus-official": { "name": "google-plus", "style": "brands" }, + "group": "users", + "hand-grab-o": { "name": "hand", "style": "regular" }, + "hand-lizard-o": { "name": "hand-lizard", "style": "regular" }, + "hand-paper-o": { "name": "hand", "style": "regular" }, + "hand-peace-o": { "name": "hand-peace", "style": "regular" }, + "hand-pointer-o": { "name": "hand-pointer", "style": "regular" }, + "hand-rock-o": { "name": "hand-back-fist", "style": "regular" }, + "hand-scissors-o": { "name": "hand-scissors", "style": "regular" }, + "hand-spock-o": { "name": "hand-spock", "style": "regular" }, + "hand-stop-o": { "name": "hand", "style": "regular" }, + "hard-of-hearing": "ear-deaf", + "header": "heading", + "hotel": "bed", + "hourglass-1": "hourglass-start", + "hourglass-2": "hourglass-half", + "hourglass-3": "hourglass-end", + "id-badge-o": { "name": "id-badge", "style": "regular" }, + "id-card-o": { "name": "id-card", "style": "regular" }, + "ils": "shekel-sign", + "image": "image", + "inr": "indian-rupee-sign", + "institution": "building-columns", + "intersex": "mars-and-venus", + "jpy": "yen-sign", + "krw": "won-sign", + "legal": "gavel", + "life-bouy": "life-ring", + "life-buoy": "life-ring", + "life-saver": "life-ring", + "line-chart": "chart-line", + "linkedin-in": { "name": "linkedin-in", "style": "brands" }, + "map-o": { "name": "map", "style": "regular" }, + "mortar-board": "graduation-cap", + "navicon": "bars", + "newspaper-o": { "name": "newspaper", "style": "regular" }, + "paste": "clipboard", + "pencil-square-o": { "name": "pen-to-square", "style": "regular" }, + "pencil-square": "pen-to-square", + "photo": "image", + "pie-chart": "chart-pie", + "refresh": "rotate", + "registered": { "name": "registered", "style": "regular" }, + "remove": "xmark", + "reorder": "bars", + "rmb": "yen-sign", + "rouble": "ruble-sign", + "rub": "ruble-sign", + "ruble": "ruble-sign", + "rupee": "indian-rupee-sign", + "s15": "bath", + "save": "floppy-disk", + "send": "paper-plane", + "send-o": { "name": "paper-plane", "style": "regular" }, + "shekel": "shekel-sign", + "sheqel": "shekel-sign", + "shield-alt": "shield-halved", + "shopping-bag": "bag-shopping", + "sign-in-alt": "right-to-bracket", + "sign-out-alt": "right-from-bracket", + "signing": "hands", + "soccer-ball-o": { "name": "futbol", "style": "regular" }, + "sort-alpha-down": "arrow-down-a-z", + "sort-alpha-up": "arrow-up-a-z", + "sort-amount-down": "arrow-down-short-wide", + "sort-amount-up": "arrow-up-short-wide", + "sort-numeric-down": "arrow-down-1-9", + "sort-numeric-up": "arrow-up-1-9", + "spoon": "utensil-spoon", + "support": "life-ring", + "tablet": "tablet-screen-button", + "tachometer": "gauge-high", + "television": "tv", + "thumb-tack": "thumbtack", + "thumbs-o-down": { "name": "thumbs-down", "style": "regular" }, + "thumbs-o-up": { "name": "thumbs-up", "style": "regular" }, + "ticket": "ticket-simple", + "times-rectangle": "rectangle-xmark", + "times-rectangle-o": { "name": "rectangle-xmark", "style": "regular" }, + "toggle-down": { "name": "square-caret-down", "style": "regular" }, + "toggle-left": { "name": "square-caret-left", "style": "regular" }, + "toggle-right": { "name": "square-caret-right", "style": "regular" }, + "toggle-up": { "name": "square-caret-up", "style": "regular" }, + "trash": "trash", + "trash-o": { "name": "trash-can", "style": "regular" }, + "try": "turkish-lira-sign", + "turkish-lira": "turkish-lira-sign", + "university": "building-columns", + "unlink": "link-slash", + "usd": "dollar-sign", + "user-circle-o": { "name": "circle-user", "style": "regular" }, + "user-o": { "name": "user", "style": "regular" }, + "vcard": "address-card", + "vcard-o": { "name": "address-card", "style": "regular" }, + "volume-control-phone": "phone-volume", + "wheelchair-alt": "accessible-icon", + "window-close": "rectangle-xmark", + "window-close-o": { "name": "rectangle-xmark", "style": "regular" }, + "won": "won-sign", + "y-combinator-square": { "name": "hacker-news", "style": "brands" }, + "yc-square": { "name": "hacker-news", "style": "brands" }, + "yen": "yen-sign" + } + } + } +} \ No newline at end of file diff --git a/plugins/admin/themes/grav/js/scheduler-admin.js b/plugins/admin/themes/grav/js/scheduler-admin.js new file mode 100644 index 0000000..60df75f --- /dev/null +++ b/plugins/admin/themes/grav/js/scheduler-admin.js @@ -0,0 +1,144 @@ +/** + * Scheduler Admin JavaScript + * Handles dynamic loading of scheduler status in admin panel + */ + +(function() { + 'use strict'; + + // Wait for DOM to be ready + document.addEventListener('DOMContentLoaded', function() { + // Check if we're on the scheduler config page + const healthStatusEl = document.getElementById('scheduler-health-status'); + const triggersEl = document.getElementById('scheduler-triggers'); + + if (!healthStatusEl && !triggersEl) { + return; // Not on scheduler page + } + + // Load scheduler status + loadSchedulerStatus(); + + // Refresh every 30 seconds if page is visible + let refreshInterval = setInterval(function() { + if (!document.hidden) { + loadSchedulerStatus(); + } + }, 30000); + + // Clean up interval when leaving page + window.addEventListener('beforeunload', function() { + clearInterval(refreshInterval); + }); + }); + + /** + * Load scheduler status via AJAX + */ + function loadSchedulerStatus() { + const healthStatusEl = document.getElementById('scheduler-health-status'); + const triggersEl = document.getElementById('scheduler-triggers'); + + // Get the admin base URL + const adminBase = GravAdmin ? GravAdmin.config.base_url_relative : '/admin'; + const nonce = GravAdmin ? GravAdmin.config.admin_nonce : ''; + + // Make AJAX request + fetch(adminBase + '/scheduler/status', { + method: 'GET', + headers: { + 'Accept': 'application/json', + 'X-Requested-With': 'XMLHttpRequest', + 'Admin-Nonce': nonce + }, + credentials: 'same-origin' + }) + .then(response => { + if (!response.ok) { + throw new Error('Network response was not ok'); + } + return response.json(); + }) + .then(data => { + // Update health status + if (healthStatusEl && data.health) { + healthStatusEl.innerHTML = data.health; + healthStatusEl.classList.remove('text-muted'); + } + + // Update triggers + if (triggersEl && data.triggers) { + triggersEl.innerHTML = data.triggers; + triggersEl.classList.remove('text-muted'); + } + }) + .catch(error => { + console.error('Error loading scheduler status:', error); + + // Show error message + if (healthStatusEl) { + healthStatusEl.innerHTML = '

'; + } + if (triggersEl) { + triggersEl.innerHTML = '
Failed to load triggers
'; + } + }); + } + + /** + * Test scheduler webhook + */ + window.testSchedulerWebhook = function() { + const token = document.querySelector('input[name="data[scheduler][modern][webhook][token]"]')?.value; + + if (!token) { + alert('Please set a webhook token first'); + return; + } + + const siteUrl = window.location.origin; + const webhookUrl = siteUrl + '/scheduler/webhook'; + + fetch(webhookUrl, { + method: 'POST', + headers: { + 'Authorization': 'Bearer ' + token, + 'Accept': 'application/json' + } + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + alert('Webhook test successful! Jobs run: ' + (data.jobs_run || 0)); + } else { + alert('Webhook test failed: ' + (data.message || 'Unknown error')); + } + }) + .catch(error => { + alert('Webhook test error: ' + error.message); + }); + }; + + /** + * Generate secure token + */ + window.generateSchedulerToken = function() { + const tokenField = document.querySelector('input[name="data[scheduler][modern][webhook][token]"]'); + + if (!tokenField) { + return; + } + + // Generate random token (32 bytes = 64 hex chars) + const array = new Uint8Array(32); + crypto.getRandomValues(array); + const token = Array.from(array, byte => byte.toString(16).padStart(2, '0')).join(''); + + tokenField.value = token; + + // Trigger change event + const event = new Event('change', { bubbles: true }); + tokenField.dispatchEvent(event); + }; + +})(); \ No newline at end of file diff --git a/plugins/admin/themes/grav/templates/forms/fields/file/file.html.twig b/plugins/admin/themes/grav/templates/forms/fields/file/file.html.twig index 8e06edf..75d79de 100644 --- a/plugins/admin/themes/grav/templates/forms/fields/file/file.html.twig +++ b/plugins/admin/themes/grav/templates/forms/fields/file/file.html.twig @@ -1,7 +1,7 @@ {% extends "forms/field.html.twig" %} {% macro bytesToSize(bytes) -%} - {% spaceless %} +{% apply spaceless %} {% set kilobyte = 1024 %} {% set megabyte = kilobyte * 1024 %} {% set gigabyte = megabyte * 1024 %} @@ -18,7 +18,7 @@ {% else %} {{ (bytes / terabyte)|number_format(2, '.') ~ ' TB' }} {% endif %} - {% endspaceless %} + {% endapply %} {%- endmacro %} {% macro preview(path, value, global) %} diff --git a/plugins/admin/themes/grav/templates/forms/fields/webhook-status/webhook-status.html.twig b/plugins/admin/themes/grav/templates/forms/fields/webhook-status/webhook-status.html.twig new file mode 100644 index 0000000..6a9f4e7 --- /dev/null +++ b/plugins/admin/themes/grav/templates/forms/fields/webhook-status/webhook-status.html.twig @@ -0,0 +1,33 @@ +{% extends "forms/field.html.twig" %} + +{% block field %} +
+ {% set plugin_exists = config.plugins['scheduler-webhook'] is defined %} + {% set plugin_enabled = plugin_exists and config.plugins['scheduler-webhook'].enabled %} + + {% if not plugin_exists %} + {# Plugin not installed #} + + {% elseif not plugin_enabled %} + {# Plugin installed but disabled #} +
+ Webhook Plugin Installed
+ The scheduler-webhook plugin is installed but disabled. + Enable it in plugin settings to use webhook functionality. +
+ {% else %} + {# Plugin installed and enabled #} +
+ Webhook Plugin Ready!
+ The scheduler-webhook plugin is installed and active. Configure your webhook settings below. +
+ {% endif %} +
+{% endblock %} \ No newline at end of file diff --git a/plugins/admin/themes/grav/templates/partials/base-root.html.twig b/plugins/admin/themes/grav/templates/partials/base-root.html.twig index bec3c3c..9a0c7aa 100644 --- a/plugins/admin/themes/grav/templates/partials/base-root.html.twig +++ b/plugins/admin/themes/grav/templates/partials/base-root.html.twig @@ -33,13 +33,11 @@ {{ assets.js()|raw }} {% endblock %} - + {% block body %} diff --git a/plugins/admin/themes/grav/templates/partials/footer.html.twig b/plugins/admin/themes/grav/templates/partials/footer.html.twig index 468f7a8..19f5aa8 100644 --- a/plugins/admin/themes/grav/templates/partials/footer.html.twig +++ b/plugins/admin/themes/grav/templates/partials/footer.html.twig @@ -1,5 +1,5 @@ {% if custom_admin_footer %} {{ custom_admin_footer|raw }} {% else %} - Grav v{{ constant('GRAV_VERSION') }} - Admin v{{ admin_version }} - {{ "PLUGIN_ADMIN.WAS_MADE_WITH"|t|lower }} {{ "PLUGIN_ADMIN.BY"|t|lower }} Trilby Media. + Grav v{{ constant('GRAV_VERSION') }} - Admin v{{ admin_version }} - {{ "PLUGIN_ADMIN.WAS_MADE_WITH"|t|lower }} {{ "PLUGIN_ADMIN.BY"|t|lower }} Trilby Media. {% endif %} diff --git a/plugins/admin/themes/grav/templates/partials/javascript-config.html.twig b/plugins/admin/themes/grav/templates/partials/javascript-config.html.twig index 6e75b3d..c0c1542 100644 --- a/plugins/admin/themes/grav/templates/partials/javascript-config.html.twig +++ b/plugins/admin/themes/grav/templates/partials/javascript-config.html.twig @@ -1,5 +1,10 @@ {% if user.authorized and authorize(['admin.login', 'admin.super']) %} -{% set notifications = (config.plugins.admin.widgets['dashboard-notifications'] or config.plugins.admin.notifications.dashboard or config.plugins.admin.notifications.plugins or config.plugins.admin.notifications.themes) ? 1 : 0 %} +{% set feed_enabled = config.plugins.admin.notifications.feed is same as(true) or config.plugins.admin.notifications.feed == 'true' %} +{% set dashboard_enabled = config.plugins.admin.notifications.dashboard is same as(true) or config.plugins.admin.notifications.dashboard == 'true' %} +{% set plugins_enabled = config.plugins.admin.notifications.plugins is same as(true) or config.plugins.admin.notifications.plugins == 'true' %} +{% set themes_enabled = config.plugins.admin.notifications.themes is same as(true) or config.plugins.admin.notifications.themes == 'true' %} +{% set notifications = (feed_enabled or dashboard_enabled or plugins_enabled or themes_enabled) ? 1 : 0 %} + {% switch template_route %} {% case 'dashboard' %} {% set notifications_filters = "['feed', 'dashboard', 'top']" %} diff --git a/plugins/admin/themes/grav/templates/partials/stylesheets.html.twig b/plugins/admin/themes/grav/templates/partials/stylesheets.html.twig index a3153c9..c155faf 100644 --- a/plugins/admin/themes/grav/templates/partials/stylesheets.html.twig +++ b/plugins/admin/themes/grav/templates/partials/stylesheets.html.twig @@ -2,7 +2,8 @@ {% do assets.addCss(theme_url~'/css-compiled/template.css', {priority: 20}) %} {% do assets.addCss('asset://admin-preset.css', {priority: 5}) %} {% do assets.addCss(theme_url~'/css-compiled/simple-fonts.css') %} -{% do assets.addCss(theme_url~'/css/fork-awesome.min.css') %} +{% do assets.addCss(theme_url~'/css/fontawesome7.min.css') %} +{% do assets.addCss(theme_url~'/css/fork-awesome-shim.css') %} {% do assets.addCss(theme_url~'/css/chartist.min.css') %} {% do assets.addCss(theme_url~'/css/selectize.min.css') %} {% do assets.addCss(theme_url~'/css/hint.base.min.css') %} diff --git a/plugins/admin/themes/grav/templates/partials/tools-scheduler.html.twig b/plugins/admin/themes/grav/templates/partials/tools-scheduler.html.twig index 06ba1f1..0034383 100644 --- a/plugins/admin/themes/grav/templates/partials/tools-scheduler.html.twig +++ b/plugins/admin/themes/grav/templates/partials/tools-scheduler.html.twig @@ -1,14 +1,33 @@ +
{% set data = admin.data('config/scheduler') %} {% set cron_status = grav.scheduler.isCrontabSetup() %} {% set user = grav.scheduler.whoami() %} + {% set webhook_enabled = grav.scheduler.isWebhookEnabled() %} + {% set active_triggers = grav.scheduler.getActiveTriggers() %} - {% if cron_status == 1 %} -
-
{{ "PLUGIN_ADMIN.SCHEDULER_INSTALL_INSTRUCTIONS"|t }}
- {{ "PLUGIN_ADMIN.SCHEDULER_INSTALLED_READY"|t }} -
+ {% if active_triggers|length > 0 %} + {# We have at least one active trigger method #} + {% if 'webhook' in active_triggers and 'cron' not in active_triggers %} + {# Webhook only mode #} +
+
{{ "PLUGIN_ADMIN.SCHEDULER_INSTALL_INSTRUCTIONS"|t }}
+ Webhook Active - Scheduler is ready to receive webhook triggers +
+ {% elseif 'cron' in active_triggers and 'webhook' in active_triggers %} + {# Both cron and webhook #} +
+
{{ "PLUGIN_ADMIN.SCHEDULER_INSTALL_INSTRUCTIONS"|t }}
+ Cron & Webhook Active - Scheduler is running via cron and accepts webhook triggers +
+ {% elseif 'cron' in active_triggers %} + {# Cron only #} +
+
{{ "PLUGIN_ADMIN.SCHEDULER_INSTALL_INSTRUCTIONS"|t }}
+ {{ "PLUGIN_ADMIN.SCHEDULER_INSTALLED_READY"|t }} +
+ {% endif %} {% elseif cron_status == 2 %}
{{ "PLUGIN_ADMIN.SCHEDULER_CRON_NA"|t([user])|raw }}
{% else %} @@ -17,8 +36,35 @@
{{ "PLUGIN_ADMIN.SCHEDULER_WARNING"|t([user]) }}
-
-
{{- grav.scheduler.getCronCommand()|trim -}}
+
+ {% if webhook_enabled %} +

Webhook Setup

+

The scheduler is configured to use webhooks. To trigger jobs via webhook:

+ + {% set webhook_token = config.get('scheduler.modern.webhook.token') %} + {% if not webhook_token %} + {% set webhook_token = 'YOUR_TOKEN' %} + {% endif %} +
+ +
+ Copy +
+
+ +

Make sure the scheduler-webhook plugin is installed and enabled.

+ +
+

Alternative: Cron Setup

+ {% endif %} + +
+ +
+ Copy +
+

{{ "PLUGIN_ADMIN.SCHEDULER_POST_INSTRUCTIONS"|t([user])|raw }}

diff --git a/plugins/admin/themes/grav/test-icons.html b/plugins/admin/themes/grav/test-icons.html new file mode 100644 index 0000000..4f64ad4 --- /dev/null +++ b/plugins/admin/themes/grav/test-icons.html @@ -0,0 +1,40 @@ + + + + + Icon Test + + + + + +

FontAwesome 7 Icon Test

+ +
+

Testing fa-sign-out with ForkAwesome shim:

+ - Should show logout icon +
+ +
+

Testing fa-list-ol with ForkAwesome shim:

+ - Should show ordered list icon +
+ +
+

Testing native FontAwesome 7 classes:

+ - Native FA7 logout icon (solid)
+ - Native FA7 list icon (solid)
+ - Alternative logout icon +
+ +
+

Testing with different font weights:

+ - Force 900 weight
+ - Force 400 weight +
+ + \ No newline at end of file diff --git a/plugins/admin/themes/grav/webfonts/fa-brands-400.woff2 b/plugins/admin/themes/grav/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4bb9e620a6fa1da5cd951c5d0b13dfb917ee5f68 GIT binary patch literal 101088 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 z%0A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

xz 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 literal 0 HcmV?d00001 diff --git a/plugins/admin/themes/grav/webfonts/fa-regular-400.woff2 b/plugins/admin/themes/grav/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..644a834da1fe1b6fd312dd0fc455e61e85b82aeb GIT binary patch literal 18892 zcmV)2K+L~)Pew9NR8&s@07=XM2><{90J}s007-)bfB^si00000000000000000000 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 literal 0 HcmV?d00001 diff --git a/plugins/admin/themes/grav/webfonts/fa-solid-900.woff2 b/plugins/admin/themes/grav/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6b79def012c8190b8a151ec3d5321022f38a8790 GIT binary patch literal 113108 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 W)LS|r!0*7lw4g1)>1I6T_9U?@yiXa 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

vIox<)Lj#<;=Ji@4)+tBKHSDGDWcLoR7d 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 literal 0 HcmV?d00001 diff --git a/plugins/admin/themes/grav/webfonts/fa-v4compatibility.woff2 b/plugins/admin/themes/grav/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c5eb3351bdb6204b5d2a970391ae7edc19f7efce GIT binary patch literal 4132 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 literal 0 HcmV?d00001 diff --git a/plugins/admin/vendor/bin/pscss b/plugins/admin/vendor/bin/pscss index 9743992..e57bed8 100644 --- a/plugins/admin/vendor/bin/pscss +++ b/plugins/admin/vendor/bin/pscss @@ -112,9 +112,8 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/scssphp/scssphp/bin/pscss'); - exit(0); + return include("phpvfscomposer://" . __DIR__ . '/..'.'/scssphp/scssphp/bin/pscss'); } } -include __DIR__ . '/..'.'/scssphp/scssphp/bin/pscss'; +return include __DIR__ . '/..'.'/scssphp/scssphp/bin/pscss'; diff --git a/plugins/admin/vendor/composer/autoload_files.php b/plugins/admin/vendor/composer/autoload_files.php deleted file mode 100644 index c4d9d6a..0000000 --- a/plugins/admin/vendor/composer/autoload_files.php +++ /dev/null @@ -1,10 +0,0 @@ - $vendorDir . '/laminas/laminas-zendframework-bridge/src/autoload.php', -); diff --git a/plugins/admin/vendor/composer/autoload_psr4.php b/plugins/admin/vendor/composer/autoload_psr4.php index 4fc02d2..e20c171 100644 --- a/plugins/admin/vendor/composer/autoload_psr4.php +++ b/plugins/admin/vendor/composer/autoload_psr4.php @@ -7,7 +7,6 @@ $baseDir = dirname($vendorDir); return array( 'ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'), - 'Laminas\\ZendFrameworkBridge\\' => array($vendorDir . '/laminas/laminas-zendframework-bridge/src'), 'Laminas\\Xml\\' => array($vendorDir . '/laminas/laminas-xml/src'), 'Grav\\Plugin\\Admin\\' => array($baseDir . '/classes/plugin'), ); diff --git a/plugins/admin/vendor/composer/autoload_real.php b/plugins/admin/vendor/composer/autoload_real.php index 82a6a2d..cb2d2b8 100644 --- a/plugins/admin/vendor/composer/autoload_real.php +++ b/plugins/admin/vendor/composer/autoload_real.php @@ -33,18 +33,6 @@ class ComposerAutoloaderInit98c98c1c3d67f21a128f935fe4a74897 $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit98c98c1c3d67f21a128f935fe4a74897::$files; - $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - - require $file; - } - }, null, null); - foreach ($filesToLoad as $fileIdentifier => $file) { - $requireFile($fileIdentifier, $file); - } - return $loader; } } diff --git a/plugins/admin/vendor/composer/autoload_static.php b/plugins/admin/vendor/composer/autoload_static.php index c5953f5..aefc3b2 100644 --- a/plugins/admin/vendor/composer/autoload_static.php +++ b/plugins/admin/vendor/composer/autoload_static.php @@ -6,10 +6,6 @@ namespace Composer\Autoload; class ComposerStaticInit98c98c1c3d67f21a128f935fe4a74897 { - public static $files = array ( - '7e9bd612cc444b3eed788ebbe46263a0' => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src/autoload.php', - ); - public static $prefixLengthsPsr4 = array ( 'S' => array ( @@ -17,7 +13,6 @@ class ComposerStaticInit98c98c1c3d67f21a128f935fe4a74897 ), 'L' => array ( - 'Laminas\\ZendFrameworkBridge\\' => 28, 'Laminas\\Xml\\' => 12, ), 'G' => @@ -31,10 +26,6 @@ class ComposerStaticInit98c98c1c3d67f21a128f935fe4a74897 array ( 0 => __DIR__ . '/..' . '/scssphp/scssphp/src', ), - 'Laminas\\ZendFrameworkBridge\\' => - array ( - 0 => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src', - ), 'Laminas\\Xml\\' => array ( 0 => __DIR__ . '/..' . '/laminas/laminas-xml/src', diff --git a/plugins/admin/vendor/composer/installed.json b/plugins/admin/vendor/composer/installed.json index 9efad0d..f2700fa 100644 --- a/plugins/admin/vendor/composer/installed.json +++ b/plugins/admin/vendor/composer/installed.json @@ -63,71 +63,6 @@ ], "install-path": "../laminas/laminas-xml" }, - { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.4.1", - "version_normalized": "1.4.1.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "88bf037259869891afce6504cacc4f8a07b24d0f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/88bf037259869891afce6504cacc4f8a07b24d0f", - "reference": "88bf037259869891afce6504cacc4f8a07b24d0f", - "shasum": "" - }, - "require": { - "php": "^7.3 || ~8.0.0 || ~8.1.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "psalm/plugin-phpunit": "^0.15.1", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.6" - }, - "time": "2021-12-21T14:34:37+00:00", - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "support": { - "forum": "https://discourse.laminas.dev/", - "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", - "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", - "source": "https://github.com/laminas/laminas-zendframework-bridge" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "install-path": "../laminas/laminas-zendframework-bridge" - }, { "name": "p3k/picofeed", "version": "1.0.0", @@ -191,17 +126,17 @@ }, { "name": "scssphp/scssphp", - "version": "v1.11.0", - "version_normalized": "1.11.0.0", + "version": "v1.13.0", + "version_normalized": "1.13.0.0", "source": { "type": "git", "url": "https://github.com/scssphp/scssphp.git", - "reference": "33749d12c2569bb24071f94e9af828662dabb068" + "reference": "63d1157457e5554edf00b0c1fabab4c1511d2520" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scssphp/scssphp/zipball/33749d12c2569bb24071f94e9af828662dabb068", - "reference": "33749d12c2569bb24071f94e9af828662dabb068", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/63d1157457e5554edf00b0c1fabab4c1511d2520", + "reference": "63d1157457e5554edf00b0c1fabab4c1511d2520", "shasum": "" }, "require": { @@ -218,21 +153,21 @@ "thoughtbot/bourbon": "^7.0", "twbs/bootstrap": "~5.0", "twbs/bootstrap4": "4.6.1", - "zurb/foundation": "~6.5" + "zurb/foundation": "~6.7.0" }, "suggest": { "ext-iconv": "Can be used as fallback when ext-mbstring is not available", "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv" }, - "time": "2022-09-02T21:24:55+00:00", + "time": "2024-08-17T21:02:11+00:00", "bin": [ "bin/pscss" ], "type": "library", "extra": { "bamarni-bin": { - "forward-command": false, - "bin-links": false + "bin-links": false, + "forward-command": false } }, "installation-source": "dist", @@ -268,7 +203,7 @@ ], "support": { "issues": "https://github.com/scssphp/scssphp/issues", - "source": "https://github.com/scssphp/scssphp/tree/v1.11.0" + "source": "https://github.com/scssphp/scssphp/tree/v1.13.0" }, "install-path": "../scssphp/scssphp" } diff --git a/plugins/admin/vendor/composer/installed.php b/plugins/admin/vendor/composer/installed.php index 80176de..5ffa5c4 100644 --- a/plugins/admin/vendor/composer/installed.php +++ b/plugins/admin/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'getgrav/grav-plugin-admin', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '8c17ca7d75e271ee2cf4e38ae54e75d2ce8b9224', + 'reference' => '12bdb5af4bd10e30e24d191b7ea1a78602a583fb', 'type' => 'grav-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ 'getgrav/grav-plugin-admin' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '8c17ca7d75e271ee2cf4e38ae54e75d2ce8b9224', + 'reference' => '12bdb5af4bd10e30e24d191b7ea1a78602a583fb', 'type' => 'grav-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -28,15 +28,6 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'laminas/laminas-zendframework-bridge' => array( - 'pretty_version' => '1.4.1', - 'version' => '1.4.1.0', - 'reference' => '88bf037259869891afce6504cacc4f8a07b24d0f', - 'type' => 'library', - 'install_path' => __DIR__ . '/../laminas/laminas-zendframework-bridge', - 'aliases' => array(), - 'dev_requirement' => false, - ), 'miniflux/picofeed' => array( 'dev_requirement' => false, 'replaced' => array( @@ -53,20 +44,14 @@ 'dev_requirement' => false, ), 'scssphp/scssphp' => array( - 'pretty_version' => 'v1.11.0', - 'version' => '1.11.0.0', - 'reference' => '33749d12c2569bb24071f94e9af828662dabb068', + 'pretty_version' => 'v1.13.0', + 'version' => '1.13.0.0', + 'reference' => '63d1157457e5554edf00b0c1fabab4c1511d2520', 'type' => 'library', 'install_path' => __DIR__ . '/../scssphp/scssphp', 'aliases' => array(), 'dev_requirement' => false, ), - 'symfony/polyfill-php72' => array( - 'dev_requirement' => false, - 'replaced' => array( - 0 => '*', - ), - ), 'symfony/polyfill-php73' => array( 'dev_requirement' => false, 'replaced' => array( diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/FUNDING.yml b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/FUNDING.yml deleted file mode 100644 index 6674aab..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -community_bridge: laminas-project diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/workflows/continuous-integration.yml b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/workflows/continuous-integration.yml deleted file mode 100644 index ab6f8ee..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/workflows/continuous-integration.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: "Continuous Integration" - -on: - pull_request: - push: - branches: - - '[0-9]+.[0-9]+.x' - - 'refs/pull/*' - -jobs: - matrix: - name: Generate job matrix - runs-on: ubuntu-latest - outputs: - matrix: ${{ steps.matrix.outputs.matrix }} - steps: - - name: Gather CI configuration - id: matrix - uses: laminas/laminas-ci-matrix-action@v1 - - qa: - name: QA Checks - needs: [matrix] - runs-on: ${{ matrix.operatingSystem }} - strategy: - fail-fast: false - matrix: ${{ fromJSON(needs.matrix.outputs.matrix) }} - steps: - - name: ${{ matrix.name }} - uses: laminas/laminas-continuous-integration-action@v1 - with: - job: ${{ matrix.job }} diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/workflows/release-on-milestone-closed.yml b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/workflows/release-on-milestone-closed.yml deleted file mode 100644 index 2d88c94..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.github/workflows/release-on-milestone-closed.yml +++ /dev/null @@ -1,61 +0,0 @@ -# Alternate workflow example. -# This one is identical to the one in release-on-milestone.yml, with one change: -# the Release step uses the ORGANIZATION_ADMIN_TOKEN instead, to allow it to -# trigger a release workflow event. This is useful if you have other actions -# that intercept that event. - -name: "Automatic Releases" - -on: - milestone: - types: - - "closed" - -jobs: - release: - name: "GIT tag, release & create merge-up PR" - runs-on: ubuntu-latest - - steps: - - name: "Checkout" - uses: "actions/checkout@v2" - - - name: "Release" - uses: "laminas/automatic-releases@v1" - with: - command-name: "laminas:automatic-releases:release" - env: - "GITHUB_TOKEN": ${{ secrets.ORGANIZATION_ADMIN_TOKEN }} - "SIGNING_SECRET_KEY": ${{ secrets.SIGNING_SECRET_KEY }} - "GIT_AUTHOR_NAME": ${{ secrets.GIT_AUTHOR_NAME }} - "GIT_AUTHOR_EMAIL": ${{ secrets.GIT_AUTHOR_EMAIL }} - - - name: "Create Merge-Up Pull Request" - uses: "laminas/automatic-releases@v1" - with: - command-name: "laminas:automatic-releases:create-merge-up-pull-request" - env: - "GITHUB_TOKEN": ${{ secrets.GITHUB_TOKEN }} - "SIGNING_SECRET_KEY": ${{ secrets.SIGNING_SECRET_KEY }} - "GIT_AUTHOR_NAME": ${{ secrets.GIT_AUTHOR_NAME }} - "GIT_AUTHOR_EMAIL": ${{ secrets.GIT_AUTHOR_EMAIL }} - - - name: "Create and/or Switch to new Release Branch" - uses: "laminas/automatic-releases@v1" - with: - command-name: "laminas:automatic-releases:switch-default-branch-to-next-minor" - env: - "GITHUB_TOKEN": ${{ secrets.ORGANIZATION_ADMIN_TOKEN }} - "SIGNING_SECRET_KEY": ${{ secrets.SIGNING_SECRET_KEY }} - "GIT_AUTHOR_NAME": ${{ secrets.GIT_AUTHOR_NAME }} - "GIT_AUTHOR_EMAIL": ${{ secrets.GIT_AUTHOR_EMAIL }} - - - name: "Create new milestones" - uses: "laminas/automatic-releases@v1" - with: - command-name: "laminas:automatic-releases:create-milestones" - env: - "GITHUB_TOKEN": ${{ secrets.GITHUB_TOKEN }} - "SIGNING_SECRET_KEY": ${{ secrets.SIGNING_SECRET_KEY }} - "GIT_AUTHOR_NAME": ${{ secrets.GIT_AUTHOR_NAME }} - "GIT_AUTHOR_EMAIL": ${{ secrets.GIT_AUTHOR_EMAIL }} diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.laminas-ci.json b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.laminas-ci.json deleted file mode 100644 index bce3fa2..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/.laminas-ci.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ignore_php_platform_requirements": { - "8.1": true - } -} diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/COPYRIGHT.md b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/COPYRIGHT.md deleted file mode 100644 index 0a8cccc..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/COPYRIGHT.md +++ /dev/null @@ -1 +0,0 @@ -Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC. (https://getlaminas.org/) diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/LICENSE.md b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/LICENSE.md deleted file mode 100644 index 10b40f1..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/LICENSE.md +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -- Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -- Neither the name of Laminas Foundation nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/README.md b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/README.md deleted file mode 100644 index a8d8526..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# laminas-zendframework-bridge - -[![Build Status](https://github.com/laminas/laminas-zendframework-bridge/workflows/Continuous%20Integration/badge.svg)](https://github.com/laminas/laminas-zendframework-bridge/actions?query=workflow%3A"Continuous+Integration") - - -This library provides a custom autoloader that aliases legacy Zend Framework, -Apigility, and Expressive classes to their replacements under the Laminas -Project. - -This package should be installed only if you are also using the composer plugin -that installs Laminas packages to replace ZF/Apigility/Expressive packages. - -This tool supports: - -* Zend Framework MVC projects, all v2 and v3 releases -* Apigility projects, all stable versions -* Expressive versions, all stable versions - -## Installation - -Run the following to install this library: - -```bash -$ composer require laminas/laminas-zendframework-bridge -``` - -## Support - -* [Issues](https://github.com/laminas/laminas-zendframework-bridge/issues/) -* [Forum](https://discourse.laminas.dev/) diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/composer.json b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/composer.json deleted file mode 100644 index 3f7af11..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/composer.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "laminas/laminas-zendframework-bridge", - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "license": "BSD-3-Clause", - "keywords": [ - "autoloading", - "laminas", - "zf", - "zendframework" - ], - "support": { - "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", - "source": "https://github.com/laminas/laminas-zendframework-bridge", - "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", - "forum": "https://discourse.laminas.dev/" - }, - "require": { - "php": "^7.3 || ~8.0.0 || ~8.1.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "psalm/plugin-phpunit": "^0.15.1", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.6" - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "autoload-dev": { - "files": [ - "test/classes.php" - ], - "psr-4": { - "LaminasTest\\ZendFrameworkBridge\\": "test/", - "LaminasTest\\ZendFrameworkBridge\\TestAsset\\": "test/TestAsset/classes/", - "Laminas\\ApiTools\\": "test/TestAsset/LaminasApiTools/", - "Mezzio\\": "test/TestAsset/Mezzio/", - "Laminas\\": "test/TestAsset/Laminas/" - } - }, - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "config": { - "sort-packages": true - }, - "scripts": { - "cs-check": "phpcs", - "cs-fix": "phpcbf", - "static-analysis": "psalm --shepherd --stats", - "test": "phpunit --colors=always", - "test-coverage": "phpunit --colors=always --coverage-clover clover.xml" - } -} diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/composer.lock b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/composer.lock deleted file mode 100644 index 9bcac18..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/composer.lock +++ /dev/null @@ -1,3841 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "83af626bc1168baa0d5a1e19cb1b5807", - "packages": [], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "v2.6.0", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "caa95edeb1ca1bf7532e9118ede4a3c3126408cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/caa95edeb1ca1bf7532e9118ede4a3c3126408cc", - "reference": "caa95edeb1ca1bf7532e9118ede4a3c3126408cc", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^7 | ^8 | ^9", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Amp\\": "lib" - }, - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "http://amphp.org/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.0" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2021-07-16T20:06:06+00:00" - }, - { - "name": "amphp/byte-stream", - "version": "v1.8.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.4", - "friendsofphp/php-cs-fixer": "^2.3", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6 || ^7 || ^8", - "psalm/phar": "^3.11.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Amp\\ByteStream\\": "lib" - }, - "files": [ - "lib/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "http://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2021-03-30T17:13:30+00:00" - }, - { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.3", - "source": { - "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "fff576ac850c045158a250e7e27666e146e78d18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/fff576ac850c045158a250e7e27666e146e78d18", - "reference": "fff576ac850c045158a250e7e27666e146e78d18", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.3" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-08-17T13:49:14+00:00" - }, - { - "name": "composer/semver", - "version": "3.2.5", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.54", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.5" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-05-24T12:41:47+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-07-31T17:03:58+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "time": "2019-12-04T15:06:13+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^8.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2020-11-10T18:47:58+00:00" - }, - { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation", - "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" - }, - "time": "2021-06-11T22:34:44+00:00" - }, - { - "name": "felixfbecker/language-server-protocol", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "9d846d1f5cf101deee7a61c8ba7caa0a975cd730" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/9d846d1f5cf101deee7a61c8ba7caa0a975cd730", - "reference": "9d846d1f5cf101deee7a61c8ba7caa0a975cd730", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "LanguageServerProtocol\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "PHP classes for the Language Server Protocol", - "keywords": [ - "language", - "microsoft", - "php", - "server" - ], - "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/1.5.1" - }, - "time": "2021-02-22T14:02:09+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.10.2", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2020-11-13T09:40:50+00:00" - }, - { - "name": "netresearch/jsonmapper", - "version": "v4.0.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" - }, - "time": "2020-12-01T19:48:11+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.12.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6608f01670c3cc5079e18c1dab1104e002579143" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6608f01670c3cc5079e18c1dab1104e002579143", - "reference": "6608f01670c3cc5079e18c1dab1104e002579143", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.12.0" - }, - "time": "2021-07-21T10:44:31+00:00" - }, - { - "name": "openlss/lib-array2xml", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/nullivex/lib-array2xml.git", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "LSS": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Bryan Tong", - "email": "bryan@nullivex.com", - "homepage": "https://www.nullivex.com" - }, - { - "name": "Tony Butler", - "email": "spudz76@gmail.com", - "homepage": "https://www.nullivex.com" - } - ], - "description": "Array2XML conversion library credit to lalit.org", - "homepage": "https://www.nullivex.com", - "keywords": [ - "array", - "array conversion", - "xml", - "xml conversion" - ], - "support": { - "issues": "https://github.com/nullivex/lib-array2xml/issues", - "source": "https://github.com/nullivex/lib-array2xml/tree/master" - }, - "time": "2019-03-29T20:06:56+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" - }, - "time": "2021-07-20T11:28:43+00:00" - }, - { - "name": "phar-io/version", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "bae7c545bef187884426f042434e561ab1ddb182" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", - "reference": "bae7c545bef187884426f042434e561ab1ddb182", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.1.0" - }, - "time": "2021-02-23T14:00:09+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" - }, - "time": "2020-09-03T19:13:55+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" - }, - "time": "2020-09-17T18:55:26+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "1.13.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.13.0" - }, - "time": "2021-03-17T13:42:18+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f6293e1b30a2354e8428e004689671b83871edde" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", - "reference": "f6293e1b30a2354e8428e004689671b83871edde", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.10.2", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-03-28T07:26:59+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "3.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:57:25+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:58:55+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T05:33:50+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:16:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "9.5.9", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "ea8c2dfb1065eb35a79b3681eee6e6fb0a6f273b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ea8c2dfb1065eb35a79b3681eee6e6fb0a6f273b", - "reference": "ea8c2dfb1065eb35a79b3681eee6e6fb0a6f273b", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.3", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3.4", - "sebastian/version": "^3.0.2" - }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.5-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ], - "files": [ - "src/Framework/Assert/Functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.9" - }, - "funding": [ - { - "url": "https://phpunit.de/donate.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-08-31T06:47:40+00:00" - }, - { - "name": "psalm/plugin-phpunit", - "version": "0.15.2", - "source": { - "type": "git", - "url": "https://github.com/psalm/psalm-plugin-phpunit.git", - "reference": "31d15bbc0169a3c454e495e03fd8a6ccb663661b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/psalm/psalm-plugin-phpunit/zipball/31d15bbc0169a3c454e495e03fd8a6ccb663661b", - "reference": "31d15bbc0169a3c454e495e03fd8a6ccb663661b", - "shasum": "" - }, - "require": { - "composer/package-versions-deprecated": "^1.10", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "ext-simplexml": "*", - "php": "^7.1 || ^8.0", - "vimeo/psalm": "dev-master || dev-4.x || ^4.0" - }, - "conflict": { - "phpunit/phpunit": "<7.5" - }, - "require-dev": { - "codeception/codeception": "^4.0.3", - "php": "^7.3 || ^8.0", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.0", - "squizlabs/php_codesniffer": "^3.3.1", - "weirdan/codeception-psalm-module": "^0.11.0", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "type": "psalm-plugin", - "extra": { - "psalm": { - "pluginClass": "Psalm\\PhpUnitPlugin\\Plugin" - } - }, - "autoload": { - "psr-4": { - "Psalm\\PhpUnitPlugin\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Brown", - "email": "github@muglug.com" - } - ], - "description": "Psalm plugin for PHPUnit", - "support": { - "issues": "https://github.com/psalm/psalm-plugin-phpunit/issues", - "source": "https://github.com/psalm/psalm-plugin-phpunit/tree/0.15.2" - }, - "time": "2021-05-29T19:11:38+00:00" - }, - { - "name": "psr/container", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, - "time": "2021-03-05T17:36:06+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:08:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:08:54+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:30:19+00:00" - }, - { - "name": "sebastian/comparator", - "version": "4.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T15:49:45+00:00" - }, - { - "name": "sebastian/complexity", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T15:52:27+00:00" - }, - { - "name": "sebastian/diff", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:10:38+00:00" - }, - { - "name": "sebastian/environment", - "version": "5.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:52:38+00:00" - }, - { - "name": "sebastian/exporter", - "version": "4.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:24:23+00:00" - }, - { - "name": "sebastian/global-state", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-06-11T13:31:12+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-28T06:42:11+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:12:34+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:14:26+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:17:30+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:45:17+00:00" - }, - { - "name": "sebastian/type", - "version": "2.3.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-06-15T12:49:02+00:00" - }, - { - "name": "sebastian/version", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:39:44+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.6.0", - "source": { - "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards" - ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, - "time": "2021-04-09T00:54:41+00:00" - }, - { - "name": "symfony/console", - "version": "v5.3.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8b1008344647462ae6ec57559da166c2bfa5e16a", - "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-25T20:02:16+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-23T23:28:01+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T12:26:48+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T12:26:48+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.23.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-07-28T13:41:28+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-04-01T10:43:52+00:00" - }, - { - "name": "symfony/string", - "version": "v5.3.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "files": [ - "Resources/functions.php" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.3.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-26T08:00:08+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2021-07-28T10:34:58+00:00" - }, - { - "name": "vimeo/psalm", - "version": "4.9.3", - "source": { - "type": "git", - "url": "https://github.com/vimeo/psalm.git", - "reference": "4c262932602b9bbab5020863d1eb22d49de0dbf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/4c262932602b9bbab5020863d1eb22d49de0dbf4", - "reference": "4c262932602b9bbab5020863d1eb22d49de0dbf4", - "shasum": "" - }, - "require": { - "amphp/amp": "^2.4.2", - "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.8.0", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.1 || ^2.0", - "dnoegel/php-xdg-base-dir": "^0.1.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "felixfbecker/language-server-protocol": "^1.5", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.12", - "openlss/lib-array2xml": "^1.0", - "php": "^7.1|^8", - "sebastian/diff": "^3.0 || ^4.0", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0", - "webmozart/path-util": "^2.3" - }, - "provide": { - "psalm/psalm": "self.version" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "brianium/paratest": "^4.0||^6.0", - "ext-curl": "*", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpdocumentor/reflection-docblock": "^5", - "phpmyadmin/sql-parser": "5.1.0||dev-master", - "phpspec/prophecy": ">=1.9.0", - "phpunit/phpunit": "^9.0", - "psalm/plugin-phpunit": "^0.16", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5", - "symfony/process": "^4.3 || ^5.0", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "suggest": { - "ext-igbinary": "^2.0.5" - }, - "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psalm\\": "src/Psalm/" - }, - "files": [ - "src/functions.php", - "src/spl_object_id.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matthew Brown" - } - ], - "description": "A static analysis tool for finding errors in PHP applications", - "keywords": [ - "code", - "inspection", - "php" - ], - "support": { - "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.9.3" - }, - "time": "2021-08-14T16:19:38+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" - }, - { - "name": "webmozart/path-util", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/path-util.git", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "webmozart/assert": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\PathUtil\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "support": { - "issues": "https://github.com/webmozart/path-util/issues", - "source": "https://github.com/webmozart/path-util/tree/2.3.0" - }, - "time": "2015-12-17T08:42:14+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.3 || ~8.0.0 || ~8.1.0" - }, - "platform-dev": [], - "plugin-api-version": "2.0.0" -} diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/config/replacements.php b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/config/replacements.php deleted file mode 100644 index f534435..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/config/replacements.php +++ /dev/null @@ -1,372 +0,0 @@ - 'zendframework/zendframework', - 'zend-developer-tools/toolbar/bjy' => 'zend-developer-tools/toolbar/bjy', - 'zend-developer-tools/toolbar/doctrine' => 'zend-developer-tools/toolbar/doctrine', - - // NAMESPACES - // Zend Framework components - 'Zend\\AuraDi\\Config' => 'Laminas\\AuraDi\\Config', - 'Zend\\Authentication' => 'Laminas\\Authentication', - 'Zend\\Barcode' => 'Laminas\\Barcode', - 'Zend\\Cache' => 'Laminas\\Cache', - 'Zend\\Captcha' => 'Laminas\\Captcha', - 'Zend\\Code' => 'Laminas\\Code', - 'ZendCodingStandard\\Sniffs' => 'LaminasCodingStandard\\Sniffs', - 'ZendCodingStandard\\Utils' => 'LaminasCodingStandard\\Utils', - 'Zend\\ComponentInstaller' => 'Laminas\\ComponentInstaller', - 'Zend\\Config' => 'Laminas\\Config', - 'Zend\\ConfigAggregator' => 'Laminas\\ConfigAggregator', - 'Zend\\ConfigAggregatorModuleManager' => 'Laminas\\ConfigAggregatorModuleManager', - 'Zend\\ConfigAggregatorParameters' => 'Laminas\\ConfigAggregatorParameters', - 'Zend\\Console' => 'Laminas\\Console', - 'Zend\\ContainerConfigTest' => 'Laminas\\ContainerConfigTest', - 'Zend\\Crypt' => 'Laminas\\Crypt', - 'Zend\\Db' => 'Laminas\\Db', - 'ZendDeveloperTools' => 'Laminas\\DeveloperTools', - 'Zend\\Di' => 'Laminas\\Di', - 'Zend\\Diactoros' => 'Laminas\\Diactoros', - 'ZendDiagnostics\\Check' => 'Laminas\\Diagnostics\\Check', - 'ZendDiagnostics\\Result' => 'Laminas\\Diagnostics\\Result', - 'ZendDiagnostics\\Runner' => 'Laminas\\Diagnostics\\Runner', - 'Zend\\Dom' => 'Laminas\\Dom', - 'Zend\\Escaper' => 'Laminas\\Escaper', - 'Zend\\EventManager' => 'Laminas\\EventManager', - 'Zend\\Feed' => 'Laminas\\Feed', - 'Zend\\File' => 'Laminas\\File', - 'Zend\\Filter' => 'Laminas\\Filter', - 'Zend\\Form' => 'Laminas\\Form', - 'Zend\\Http' => 'Laminas\\Http', - 'Zend\\HttpHandlerRunner' => 'Laminas\\HttpHandlerRunner', - 'Zend\\Hydrator' => 'Laminas\\Hydrator', - 'Zend\\I18n' => 'Laminas\\I18n', - 'Zend\\InputFilter' => 'Laminas\\InputFilter', - 'Zend\\Json' => 'Laminas\\Json', - 'Zend\\Ldap' => 'Laminas\\Ldap', - 'Zend\\Loader' => 'Laminas\\Loader', - 'Zend\\Log' => 'Laminas\\Log', - 'Zend\\Mail' => 'Laminas\\Mail', - 'Zend\\Math' => 'Laminas\\Math', - 'Zend\\Memory' => 'Laminas\\Memory', - 'Zend\\Mime' => 'Laminas\\Mime', - 'Zend\\ModuleManager' => 'Laminas\\ModuleManager', - 'Zend\\Mvc' => 'Laminas\\Mvc', - 'Zend\\Navigation' => 'Laminas\\Navigation', - 'Zend\\Paginator' => 'Laminas\\Paginator', - 'Zend\\Permissions' => 'Laminas\\Permissions', - 'Zend\\Pimple\\Config' => 'Laminas\\Pimple\\Config', - 'Zend\\ProblemDetails' => 'Mezzio\\ProblemDetails', - 'Zend\\ProgressBar' => 'Laminas\\ProgressBar', - 'Zend\\Psr7Bridge' => 'Laminas\\Psr7Bridge', - 'Zend\\Router' => 'Laminas\\Router', - 'Zend\\Serializer' => 'Laminas\\Serializer', - 'Zend\\Server' => 'Laminas\\Server', - 'Zend\\ServiceManager' => 'Laminas\\ServiceManager', - 'ZendService\\ReCaptcha' => 'Laminas\\ReCaptcha', - 'ZendService\\Twitter' => 'Laminas\\Twitter', - 'Zend\\Session' => 'Laminas\\Session', - 'Zend\\SkeletonInstaller' => 'Laminas\\SkeletonInstaller', - 'Zend\\Soap' => 'Laminas\\Soap', - 'Zend\\Stdlib' => 'Laminas\\Stdlib', - 'Zend\\Stratigility' => 'Laminas\\Stratigility', - 'Zend\\Tag' => 'Laminas\\Tag', - 'Zend\\Test' => 'Laminas\\Test', - 'Zend\\Text' => 'Laminas\\Text', - 'Zend\\Uri' => 'Laminas\\Uri', - 'Zend\\Validator' => 'Laminas\\Validator', - 'Zend\\View' => 'Laminas\\View', - 'ZendXml' => 'Laminas\\Xml', - 'Zend\\Xml2Json' => 'Laminas\\Xml2Json', - 'Zend\\XmlRpc' => 'Laminas\\XmlRpc', - 'ZendOAuth' => 'Laminas\\OAuth', - - // class ZendAcl in zend-expressive-authorization-acl - 'ZendAcl' => 'LaminasAcl', - 'Zend\\Expressive\\Authorization\\Acl\\ZendAcl' => 'Mezzio\\Authorization\\Acl\\LaminasAcl', - // class ZendHttpClientDecorator in zend-feed - 'ZendHttp' => 'LaminasHttp', - // class ZendModuleProvider in zend-config-aggregator-modulemanager - 'ZendModule' => 'LaminasModule', - // class ZendRbac in zend-expressive-authorization-rbac - 'ZendRbac' => 'LaminasRbac', - 'Zend\\Expressive\\Authorization\\Rbac\\ZendRbac' => 'Mezzio\\Authorization\\Rbac\\LaminasRbac', - // class ZendRouter in zend-expressive-router-zendrouter - 'ZendRouter' => 'LaminasRouter', - 'Zend\\Expressive\\Router\\ZendRouter' => 'Mezzio\\Router\\LaminasRouter', - // class ZendViewRenderer in zend-expressive-zendviewrenderer - 'ZendViewRenderer' => 'LaminasViewRenderer', - 'Zend\\Expressive\\ZendView\\ZendViewRenderer' => 'Mezzio\\LaminasView\\LaminasViewRenderer', - 'a\\Zend' => 'a\\Zend', - 'b\\Zend' => 'b\\Zend', - 'c\\Zend' => 'c\\Zend', - 'd\\Zend' => 'd\\Zend', - 'e\\Zend' => 'e\\Zend', - 'f\\Zend' => 'f\\Zend', - 'g\\Zend' => 'g\\Zend', - 'h\\Zend' => 'h\\Zend', - 'i\\Zend' => 'i\\Zend', - 'j\\Zend' => 'j\\Zend', - 'k\\Zend' => 'k\\Zend', - 'l\\Zend' => 'l\\Zend', - 'm\\Zend' => 'm\\Zend', - 'n\\Zend' => 'n\\Zend', - 'o\\Zend' => 'o\\Zend', - 'p\\Zend' => 'p\\Zend', - 'q\\Zend' => 'q\\Zend', - 'r\\Zend' => 'r\\Zend', - 's\\Zend' => 's\\Zend', - 't\\Zend' => 't\\Zend', - 'u\\Zend' => 'u\\Zend', - 'v\\Zend' => 'v\\Zend', - 'w\\Zend' => 'w\\Zend', - 'x\\Zend' => 'x\\Zend', - 'y\\Zend' => 'y\\Zend', - 'z\\Zend' => 'z\\Zend', - - // Expressive - 'Zend\\Expressive' => 'Mezzio', - 'ZendAuthentication' => 'LaminasAuthentication', - 'ZendAcl' => 'LaminasAcl', - 'ZendRbac' => 'LaminasRbac', - 'ZendRouter' => 'LaminasRouter', - 'ExpressiveUrlGenerator' => 'MezzioUrlGenerator', - 'ExpressiveInstaller' => 'MezzioInstaller', - - // Apigility - 'ZF\\Apigility' => 'Laminas\\ApiTools', - 'ZF\\ApiProblem' => 'Laminas\\ApiTools\\ApiProblem', - 'ZF\\AssetManager' => 'Laminas\\ApiTools\\AssetManager', - 'ZF\\ComposerAutoloading' => 'Laminas\\ComposerAutoloading', - 'ZF\\Configuration' => 'Laminas\\ApiTools\\Configuration', - 'ZF\\ContentNegotiation' => 'Laminas\\ApiTools\\ContentNegotiation', - 'ZF\\ContentValidation' => 'Laminas\\ApiTools\\ContentValidation', - 'ZF\\DevelopmentMode' => 'Laminas\\DevelopmentMode', - 'ZF\\Doctrine\\QueryBuilder' => 'Laminas\\ApiTools\\Doctrine\\QueryBuilder', - 'ZF\\Hal' => 'Laminas\\ApiTools\\Hal', - 'ZF\\HttpCache' => 'Laminas\\ApiTools\\HttpCache', - 'ZF\\MvcAuth' => 'Laminas\\ApiTools\\MvcAuth', - 'ZF\\OAuth2' => 'Laminas\\ApiTools\\OAuth2', - 'ZF\\Rest' => 'Laminas\\ApiTools\\Rest', - 'ZF\\Rpc' => 'Laminas\\ApiTools\\Rpc', - 'ZF\\Versioning' => 'Laminas\\ApiTools\\Versioning', - 'a\\ZF' => 'a\\ZF', - 'b\\ZF' => 'b\\ZF', - 'c\\ZF' => 'c\\ZF', - 'd\\ZF' => 'd\\ZF', - 'e\\ZF' => 'e\\ZF', - 'f\\ZF' => 'f\\ZF', - 'g\\ZF' => 'g\\ZF', - 'h\\ZF' => 'h\\ZF', - 'i\\ZF' => 'i\\ZF', - 'j\\ZF' => 'j\\ZF', - 'k\\ZF' => 'k\\ZF', - 'l\\ZF' => 'l\\ZF', - 'm\\ZF' => 'm\\ZF', - 'n\\ZF' => 'n\\ZF', - 'o\\ZF' => 'o\\ZF', - 'p\\ZF' => 'p\\ZF', - 'q\\ZF' => 'q\\ZF', - 'r\\ZF' => 'r\\ZF', - 's\\ZF' => 's\\ZF', - 't\\ZF' => 't\\ZF', - 'u\\ZF' => 'u\\ZF', - 'v\\ZF' => 'v\\ZF', - 'w\\ZF' => 'w\\ZF', - 'x\\ZF' => 'x\\ZF', - 'y\\ZF' => 'y\\ZF', - 'z\\ZF' => 'z\\ZF', - - 'ApigilityModuleInterface' => 'ApiToolsModuleInterface', - 'ApigilityProviderInterface' => 'ApiToolsProviderInterface', - 'ApigilityVersionController' => 'ApiToolsVersionController', - - // PACKAGES - // ZF components, MVC - 'zendframework/skeleton-application' => 'laminas/skeleton-application', - 'zendframework/zend-auradi-config' => 'laminas/laminas-auradi-config', - 'zendframework/zend-authentication' => 'laminas/laminas-authentication', - 'zendframework/zend-barcode' => 'laminas/laminas-barcode', - 'zendframework/zend-cache' => 'laminas/laminas-cache', - 'zendframework/zend-captcha' => 'laminas/laminas-captcha', - 'zendframework/zend-code' => 'laminas/laminas-code', - 'zendframework/zend-coding-standard' => 'laminas/laminas-coding-standard', - 'zendframework/zend-component-installer' => 'laminas/laminas-component-installer', - 'zendframework/zend-composer-autoloading' => 'laminas/laminas-composer-autoloading', - 'zendframework/zend-config-aggregator' => 'laminas/laminas-config-aggregator', - 'zendframework/zend-config' => 'laminas/laminas-config', - 'zendframework/zend-console' => 'laminas/laminas-console', - 'zendframework/zend-container-config-test' => 'laminas/laminas-container-config-test', - 'zendframework/zend-crypt' => 'laminas/laminas-crypt', - 'zendframework/zend-db' => 'laminas/laminas-db', - 'zendframework/zend-developer-tools' => 'laminas/laminas-developer-tools', - 'zendframework/zend-diactoros' => 'laminas/laminas-diactoros', - 'zendframework/zenddiagnostics' => 'laminas/laminas-diagnostics', - 'zendframework/zend-di' => 'laminas/laminas-di', - 'zendframework/zend-dom' => 'laminas/laminas-dom', - 'zendframework/zend-escaper' => 'laminas/laminas-escaper', - 'zendframework/zend-eventmanager' => 'laminas/laminas-eventmanager', - 'zendframework/zend-feed' => 'laminas/laminas-feed', - 'zendframework/zend-file' => 'laminas/laminas-file', - 'zendframework/zend-filter' => 'laminas/laminas-filter', - 'zendframework/zend-form' => 'laminas/laminas-form', - 'zendframework/zend-httphandlerrunner' => 'laminas/laminas-httphandlerrunner', - 'zendframework/zend-http' => 'laminas/laminas-http', - 'zendframework/zend-hydrator' => 'laminas/laminas-hydrator', - 'zendframework/zend-i18n' => 'laminas/laminas-i18n', - 'zendframework/zend-i18n-resources' => 'laminas/laminas-i18n-resources', - 'zendframework/zend-inputfilter' => 'laminas/laminas-inputfilter', - 'zendframework/zend-json' => 'laminas/laminas-json', - 'zendframework/zend-json-server' => 'laminas/laminas-json-server', - 'zendframework/zend-ldap' => 'laminas/laminas-ldap', - 'zendframework/zend-loader' => 'laminas/laminas-loader', - 'zendframework/zend-log' => 'laminas/laminas-log', - 'zendframework/zend-mail' => 'laminas/laminas-mail', - 'zendframework/zend-math' => 'laminas/laminas-math', - 'zendframework/zend-memory' => 'laminas/laminas-memory', - 'zendframework/zend-mime' => 'laminas/laminas-mime', - 'zendframework/zend-modulemanager' => 'laminas/laminas-modulemanager', - 'zendframework/zend-mvc' => 'laminas/laminas-mvc', - 'zendframework/zend-navigation' => 'laminas/laminas-navigation', - 'zendframework/zend-oauth' => 'laminas/laminas-oauth', - 'zendframework/zend-paginator' => 'laminas/laminas-paginator', - 'zendframework/zend-permissions-acl' => 'laminas/laminas-permissions-acl', - 'zendframework/zend-permissions-rbac' => 'laminas/laminas-permissions-rbac', - 'zendframework/zend-pimple-config' => 'laminas/laminas-pimple-config', - 'zendframework/zend-progressbar' => 'laminas/laminas-progressbar', - 'zendframework/zend-psr7bridge' => 'laminas/laminas-psr7bridge', - 'zendframework/zend-recaptcha' => 'laminas/laminas-recaptcha', - 'zendframework/zend-router' => 'laminas/laminas-router', - 'zendframework/zend-serializer' => 'laminas/laminas-serializer', - 'zendframework/zend-server' => 'laminas/laminas-server', - 'zendframework/zend-servicemanager' => 'laminas/laminas-servicemanager', - 'zendframework/zendservice-recaptcha' => 'laminas/laminas-recaptcha', - 'zendframework/zendservice-twitter' => 'laminas/laminas-twitter', - 'zendframework/zend-session' => 'laminas/laminas-session', - 'zendframework/zend-skeleton-installer' => 'laminas/laminas-skeleton-installer', - 'zendframework/zend-soap' => 'laminas/laminas-soap', - 'zendframework/zend-stdlib' => 'laminas/laminas-stdlib', - 'zendframework/zend-stratigility' => 'laminas/laminas-stratigility', - 'zendframework/zend-tag' => 'laminas/laminas-tag', - 'zendframework/zend-test' => 'laminas/laminas-test', - 'zendframework/zend-text' => 'laminas/laminas-text', - 'zendframework/zend-uri' => 'laminas/laminas-uri', - 'zendframework/zend-validator' => 'laminas/laminas-validator', - 'zendframework/zend-view' => 'laminas/laminas-view', - 'zendframework/zend-xml2json' => 'laminas/laminas-xml2json', - 'zendframework/zend-xml' => 'laminas/laminas-xml', - 'zendframework/zend-xmlrpc' => 'laminas/laminas-xmlrpc', - - // Expressive packages - 'zendframework/zend-expressive' => 'mezzio/mezzio', - 'zendframework/zend-expressive-zendrouter' => 'mezzio/mezzio-laminasrouter', - 'zendframework/zend-problem-details' => 'mezzio/mezzio-problem-details', - 'zendframework/zend-expressive-zendviewrenderer' => 'mezzio/mezzio-laminasviewrenderer', - - // Apigility packages - 'zfcampus/apigility-documentation' => 'laminas-api-tools/documentation', - 'zfcampus/statuslib-example' => 'laminas-api-tools/statuslib-example', - 'zfcampus/zf-apigility' => 'laminas-api-tools/api-tools', - 'zfcampus/zf-api-problem' => 'laminas-api-tools/api-tools-api-problem', - 'zfcampus/zf-asset-manager' => 'laminas-api-tools/api-tools-asset-manager', - 'zfcampus/zf-configuration' => 'laminas-api-tools/api-tools-configuration', - 'zfcampus/zf-content-negotiation' => 'laminas-api-tools/api-tools-content-negotiation', - 'zfcampus/zf-content-validation' => 'laminas-api-tools/api-tools-content-validation', - 'zfcampus/zf-development-mode' => 'laminas/laminas-development-mode', - 'zfcampus/zf-doctrine-querybuilder' => 'laminas-api-tools/api-tools-doctrine-querybuilder', - 'zfcampus/zf-hal' => 'laminas-api-tools/api-tools-hal', - 'zfcampus/zf-http-cache' => 'laminas-api-tools/api-tools-http-cache', - 'zfcampus/zf-mvc-auth' => 'laminas-api-tools/api-tools-mvc-auth', - 'zfcampus/zf-oauth2' => 'laminas-api-tools/api-tools-oauth2', - 'zfcampus/zf-rest' => 'laminas-api-tools/api-tools-rest', - 'zfcampus/zf-rpc' => 'laminas-api-tools/api-tools-rpc', - 'zfcampus/zf-versioning' => 'laminas-api-tools/api-tools-versioning', - - // CONFIG KEYS, SCRIPT NAMES, ETC - // ZF components - '::fromZend' => '::fromLaminas', // psr7bridge - '::toZend' => '::toLaminas', // psr7bridge - 'use_zend_loader' => 'use_laminas_loader', // zend-modulemanager - 'zend-config' => 'laminas-config', - 'zend-developer-tools/' => 'laminas-developer-tools/', - 'zend-tag-cloud' => 'laminas-tag-cloud', - 'zenddevelopertools' => 'laminas-developer-tools', - 'zendbarcode' => 'laminasbarcode', - 'ZendBarcode' => 'LaminasBarcode', - 'zendcache' => 'laminascache', - 'ZendCache' => 'LaminasCache', - 'zendconfig' => 'laminasconfig', - 'ZendConfig' => 'LaminasConfig', - 'zendfeed' => 'laminasfeed', - 'ZendFeed' => 'LaminasFeed', - 'zendfilter' => 'laminasfilter', - 'ZendFilter' => 'LaminasFilter', - 'zendform' => 'laminasform', - 'ZendForm' => 'LaminasForm', - 'zendi18n' => 'laminasi18n', - 'ZendI18n' => 'LaminasI18n', - 'zendinputfilter' => 'laminasinputfilter', - 'ZendInputFilter' => 'LaminasInputFilter', - 'zendlog' => 'laminaslog', - 'ZendLog' => 'LaminasLog', - 'zendmail' => 'laminasmail', - 'ZendMail' => 'LaminasMail', - 'zendmvc' => 'laminasmvc', - 'ZendMvc' => 'LaminasMvc', - 'zendpaginator' => 'laminaspaginator', - 'ZendPaginator' => 'LaminasPaginator', - 'zendserializer' => 'laminasserializer', - 'ZendSerializer' => 'LaminasSerializer', - 'zendtag' => 'laminastag', - 'ZendTag' => 'LaminasTag', - 'zendtext' => 'laminastext', - 'ZendText' => 'LaminasText', - 'zendvalidator' => 'laminasvalidator', - 'ZendValidator' => 'LaminasValidator', - 'zendview' => 'laminasview', - 'ZendView' => 'LaminasView', - 'zend-framework.flf' => 'laminas-project.flf', - - // Expressive-related - "'zend-expressive'" => "'mezzio'", - '"zend-expressive"' => '"mezzio"', - 'zend-expressive.' => 'mezzio.', - 'zend-expressive-authorization' => 'mezzio-authorization', - 'zend-expressive-hal' => 'mezzio-hal', - 'zend-expressive-session' => 'mezzio-session', - 'zend-expressive-swoole' => 'mezzio-swoole', - 'zend-expressive-tooling' => 'mezzio-tooling', - - // Apigility-related - "'zf-apigility'" => "'api-tools'", - '"zf-apigility"' => '"api-tools"', - 'zf-apigility/' => 'api-tools/', - 'zf-apigility-admin' => 'api-tools-admin', - 'zf-content-negotiation' => 'api-tools-content-negotiation', - 'zf-hal' => 'api-tools-hal', - 'zf-rest' => 'api-tools-rest', - 'zf-rpc' => 'api-tools-rpc', - 'zf-content-validation' => 'api-tools-content-validation', - 'zf-apigility-ui' => 'api-tools-ui', - 'zf-apigility-documentation-blueprint' => 'api-tools-documentation-blueprint', - 'zf-apigility-documentation-swagger' => 'api-tools-documentation-swagger', - 'zf-apigility-welcome' => 'api-tools-welcome', - 'zf-api-problem' => 'api-tools-api-problem', - 'zf-configuration' => 'api-tools-configuration', - 'zf-http-cache' => 'api-tools-http-cache', - 'zf-mvc-auth' => 'api-tools-mvc-auth', - 'zf-oauth2' => 'api-tools-oauth2', - 'zf-versioning' => 'api-tools-versioning', - 'ZfApigilityDoctrineQueryProviderManager' => 'LaminasApiToolsDoctrineQueryProviderManager', - 'ZfApigilityDoctrineQueryCreateFilterManager' => 'LaminasApiToolsDoctrineQueryCreateFilterManager', - 'zf-apigility-doctrine' => 'api-tools-doctrine', - 'zf-development-mode' => 'laminas-development-mode', - 'zf-doctrine-querybuilder' => 'api-tools-doctrine-querybuilder', - - // 3rd party Apigility packages - 'api-skeletons/zf-' => 'api-skeletons/zf-', // api-skeletons packages - 'zf-oauth2-' => 'zf-oauth2-', // api-skeletons OAuth2-related packages - 'ZF\\OAuth2\\Client' => 'ZF\\OAuth2\\Client', // api-skeletons/zf-oauth2-client - 'ZF\\OAuth2\\Doctrine' => 'ZF\\OAuth2\\Doctrine', // api-skeletons/zf-oauth2-doctrine -]; diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/psalm-baseline.xml b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/psalm-baseline.xml deleted file mode 100644 index 76d61cd..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/psalm-baseline.xml +++ /dev/null @@ -1,345 +0,0 @@ - - - - - 'ZendAcl' => 'LaminasAcl' - 'ZendRbac' => 'LaminasRbac' - 'ZendRouter' => 'LaminasRouter' - - - - - $class - $class - - - load - - - $class - $class - $class - $class - $class - $class - $class - - - - $loaded[$class] - - - $namespaces[$check] - $namespaces[$check] - - - - - $keys - - - $value - $value - $value - $value - - - function ($value) { - function ($value) { - function ($value, array $keys) { - function ($value, array $keys) { - - - replaceDependencyConfiguration - replaceDependencyFactories - replaceDependencyServices - - - $config - $newKey - $newKey - $newKey - $target - - - [$key] - - - $config[$key] - $config['aliases'][$alias] - $config['aliases'][$service] - $config['aliases'][$service] - - - $aliases[$name] - $config[$key] - $keys[$key] - $rewritten[$newKey] - $rewritten[$newKey] - $rewritten[$newKey] - $this->exactReplacements[$value] - - - $aliases[$name] - - - $a[$key] - $a[$key] - $a[] - $config - $config - $config[$key] - $config['factories'][$replacedService] - $config['services'][$replacedService] - $data - $factory - $factory - $key - $key - $name - $newKey - $newValue - $notIn[] - $result - $rewritten[$key] - $rewritten[$newKey] - $rewritten[$newKey][] - $serviceInstance - $serviceInstance - $target - $value - $value - - - - - init - onMergeConfig - - - ModuleEvent - ModuleManager - - - - - $replacement - $replacement - - - $original - $original - $original - - - $replacement - - - $this->replacements - $this->replacements - - - - - new $legacy() - - - testLegacyClassIsAliasToLaminas - testReverseAliasCreated - testTypeHint - - - testLegacyClassIsAliasToLaminas - - - - - invalidServiceManagerConfiguration - testRewritesNestedKeys - testServiceManagerServiceInstancesCanBeHandled - testWillSkipInvalidConfigurations - - - $config - - - $config - $expected - - - iterable - - - require $configLocation - require $expectedResultLocation - - - - - $event - $moduleManager - - - testInitRegistersListenerWithEventManager - testOnMergeConfigProcessesAndReplacesConfigurationPulledFromListener - - - $config - - - $config - $expected - - - iterable - - - require $configFile - require $expectationsFile - - - - - testEdgeCases - - - iterable - - - - - ConfigAbstractFactory - ConfigAbstractFactory - InvokableFactory - InvokableFactory - - - - - 'Zend\Db\Adapter\Adapter' => 'ZF\Apigility\DbConnectedAdapter' - - - - - Factory\SlimRouterFactory - RouterInterface - - - - - LazyServiceFactory - - - - - CacheItemPoolInterface - ConfigFactory - ConfigFactory - ConfigFactory - ConfigFactory - ConfigFactory - ConfigFactory - Csp - DisplayPostHandler - Engine - EventDispatcherInterface - Factory\CachePoolFactory - Factory\EventDispatcherFactory - Factory\MailTransport - Factory\PlatesFunctionsDelegator - FeedReaderHttpClientInterface - Feed\HttpPlugClientFactory - Handler\ComicsPageHandler - Handler\ComicsPageHandlerFactory - Handler\HomePageHandler - Handler\HomePageHandlerFactory - Handler\PageHandlerFactory - Handler\PageHandlerFactory - Handler\ResumePageHandler - Handler\ResumePageHandler - Middleware\ContentSecurityPolicyMiddlewareFactory - Middleware\DisplayBlogPostHandlerDelegator - Middleware\RedirectAmpPagesMiddleware - Middleware\RedirectAmpPagesMiddlewareFactory - Middleware\RedirectsMiddleware - Middleware\RedirectsMiddleware - Middleware\XClacksOverheadMiddleware - Middleware\XClacksOverheadMiddleware - Middleware\XPoweredByMiddleware - Middleware\XPoweredByMiddleware - RequestFactory - RequestFactoryInterface - ResponseFactory - ResponseFactoryInterface - SessionCachePool - SessionCachePool - SessionCachePoolFactory - - - - - \Zend\Expressive\Router - - - - - OAuth2Client - - - - - setMergedConfig - - - - - $listener - - - $listeners - - - attach - - - $this->listeners[$eventName] - - - $this->listeners[$eventName] - - - $this->listeners[$eventName] - - - array - - - $this->listeners - - - - - $listener - - - ConfigListener - - - $this->listener - - - - - EventManager - - - $this->eventManager - - - $this->eventManager - - - $this->eventManager - - - diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/psalm.xml.dist b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/psalm.xml.dist deleted file mode 100644 index 788bbc0..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/psalm.xml.dist +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Autoloader.php b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Autoloader.php deleted file mode 100644 index 84f9406..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Autoloader.php +++ /dev/null @@ -1,181 +0,0 @@ -loadClass($class)) { - $legacy = $namespaces[$check] - . strtr(substr($class, strlen($check)), [ - 'ApiTools' => 'Apigility', - 'Mezzio' => 'Expressive', - 'Laminas' => 'Zend', - ]); - class_alias($class, $legacy); - } - }; - } - - /** - * @return callable - */ - private static function createAppendAutoloader(array $namespaces, ArrayObject $loaded) - { - /** - * @param string $class Class name to autoload - * @return void - */ - return static function ($class) use ($namespaces, $loaded) { - $segments = explode('\\', $class); - - if ($segments[0] === 'ZendService' && isset($segments[1])) { - $segments[0] .= '\\' . $segments[1]; - unset($segments[1]); - $segments = array_values($segments); - } - - $i = 0; - $check = ''; - - // We are checking segments of the namespace to match quicker - while (isset($segments[$i + 1], $namespaces[$check . $segments[$i] . '\\'])) { - $check .= $segments[$i] . '\\'; - ++$i; - } - - if ($check === '') { - return; - } - - $alias = $namespaces[$check] - . strtr(substr($class, strlen($check)), [ - 'Apigility' => 'ApiTools', - 'Expressive' => 'Mezzio', - 'Zend' => 'Laminas', - 'AbstractZendServer' => 'AbstractZendServer', - 'ZendServerDisk' => 'ZendServerDisk', - 'ZendServerShm' => 'ZendServerShm', - 'ZendMonitor' => 'ZendMonitor', - ]); - - $loaded[$alias] = true; - if (class_exists($alias) || interface_exists($alias) || trait_exists($alias)) { - class_alias($alias, $class); - } - }; - } - - private static function getClassLoaderFromVendorDirectory(string $composerVendorDirectory): ?ClassLoader - { - $filename = rtrim($composerVendorDirectory, '/') . '/autoload.php'; - if (!file_exists($filename)) { - return null; - } - - /** @psalm-suppress MixedAssignment */ - $loader = include $filename; - if (!$loader instanceof ClassLoader) { - return null; - } - - return $loader; - } -} diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/ConfigPostProcessor.php b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/ConfigPostProcessor.php deleted file mode 100644 index c3b601a..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/ConfigPostProcessor.php +++ /dev/null @@ -1,426 +0,0 @@ - true, - 'factories' => true, - 'invokables' => true, - 'services' => true, - ]; - - /** @var array String keys => string values */ - private $exactReplacements = [ - 'zend-expressive' => 'mezzio', - 'zf-apigility' => 'api-tools', - ]; - - /** @var Replacements */ - private $replacements; - - /** @var callable[] */ - private $rulesets; - - public function __construct() - { - $this->replacements = new Replacements(); - - /* Define the rulesets for replacements. - * - * Each ruleset has the following signature: - * - * @param mixed $value - * @param string[] $keys Full nested key hierarchy leading to the value - * @return null|callable - * - * If no match is made, a null is returned, allowing it to fallback to - * the next ruleset in the list. If a match is made, a callback is returned, - * and that will be used to perform the replacement on the value. - * - * The callback should have the following signature: - * - * @param mixed $value - * @param string[] $keys - * @return mixed The transformed value - */ - $this->rulesets = [ - // Exact values - function ($value) { - return is_string($value) && isset($this->exactReplacements[$value]) - ? [$this, 'replaceExactValue'] - : null; - }, - - // Router (MVC applications) - // We do not want to rewrite these. - function ($value, array $keys) { - $key = array_pop($keys); - // Only worried about a top-level "router" key. - return $key === 'router' && $keys === [] && is_array($value) - ? [$this, 'noopReplacement'] - : null; - }, - - // service- and pluginmanager handling - function ($value) { - return is_array($value) && array_intersect_key(self::SERVICE_MANAGER_KEYS_OF_INTEREST, $value) !== [] - ? [$this, 'replaceDependencyConfiguration'] - : null; - }, - - // Array values - function ($value, array $keys) { - return $keys !== [] && is_array($value) - ? [$this, '__invoke'] - : null; - }, - ]; - } - - /** - * @param string[] $keys Hierarchy of keys, for determining location in - * nested configuration. - * @return array - */ - public function __invoke(array $config, array $keys = []) - { - $rewritten = []; - - foreach ($config as $key => $value) { - // Determine new key from replacements - $newKey = is_string($key) ? $this->replace($key, $keys) : $key; - - // Keep original values with original key, if the key has changed, but only at the top-level. - if (empty($keys) && $newKey !== $key) { - $rewritten[$key] = $value; - } - - // Perform value replacements, if any - $newValue = $this->replace($value, $keys, $newKey); - - // Key does not already exist and/or is not an array value - if (! array_key_exists($newKey, $rewritten) || ! is_array($rewritten[$newKey])) { - // Do not overwrite existing values with null values - $rewritten[$newKey] = array_key_exists($newKey, $rewritten) && null === $newValue - ? $rewritten[$newKey] - : $newValue; - continue; - } - - // New value is null; nothing to do. - if (null === $newValue) { - continue; - } - - // Key already exists as an array value, but $value is not an array - if (! is_array($newValue)) { - $rewritten[$newKey][] = $newValue; - continue; - } - - // Key already exists as an array value, and $value is also an array - $rewritten[$newKey] = static::merge($rewritten[$newKey], $newValue); - } - - return $rewritten; - } - - /** - * Perform substitutions as needed on an individual value. - * - * The $key is provided to allow fine-grained selection of rewrite rules. - * - * @param mixed $value - * @param string[] $keys Key hierarchy - * @param null|int|string $key - * @return mixed - */ - private function replace($value, array $keys, $key = null) - { - // Add new key to the list of keys. - // We do not need to remove it later, as we are working on a copy of the array. - $keys[] = $key; - - // Identify rewrite strategy and perform replacements - $rewriteRule = $this->replacementRuleMatch($value, $keys); - return $rewriteRule($value, $keys); - } - - /** - * Merge two arrays together. - * - * If an integer key exists in both arrays, the value from the second array - * will be appended to the first array. If both values are arrays, they are - * merged together, else the value of the second array overwrites the one - * of the first array. - * - * Based on zend-stdlib Zend\Stdlib\ArrayUtils::merge - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * - * @return array - */ - public static function merge(array $a, array $b) - { - foreach ($b as $key => $value) { - if (! isset($a[$key]) && ! array_key_exists($key, $a)) { - $a[$key] = $value; - continue; - } - - if (null === $value && array_key_exists($key, $a)) { - // Leave as-is if value from $b is null - continue; - } - - if (is_int($key)) { - $a[] = $value; - continue; - } - - if (is_array($value) && is_array($a[$key])) { - $a[$key] = static::merge($a[$key], $value); - continue; - } - - $a[$key] = $value; - } - - return $a; - } - - /** - * @param mixed $value - * @param null|int|string $key - * @return callable Callable to invoke with value - */ - private function replacementRuleMatch($value, $key = null) - { - foreach ($this->rulesets as $ruleset) { - $result = $ruleset($value, $key); - if (is_callable($result)) { - return $result; - } - } - return [$this, 'fallbackReplacement']; - } - - /** - * Replace a value using the translation table, if the value is a string. - * - * @param mixed $value - * @return mixed - */ - private function fallbackReplacement($value) - { - return is_string($value) - ? $this->replacements->replace($value) - : $value; - } - - /** - * Replace a value matched exactly. - * - * @param mixed $value - * @return mixed - */ - private function replaceExactValue($value) - { - return $this->exactReplacements[$value]; - } - - private function replaceDependencyConfiguration(array $config) - { - $aliases = isset($config['aliases']) && is_array($config['aliases']) - ? $this->replaceDependencyAliases($config['aliases']) - : []; - - if ($aliases) { - $config['aliases'] = $aliases; - } - - $config = $this->replaceDependencyInvokables($config); - $config = $this->replaceDependencyFactories($config); - $config = $this->replaceDependencyServices($config); - - $keys = self::SERVICE_MANAGER_KEYS_OF_INTEREST; - foreach ($config as $key => $data) { - if (isset($keys[$key])) { - continue; - } - - $config[$key] = is_array($data) ? $this->__invoke($data, [$key]) : $data; - } - - return $config; - } - - /** - * Rewrite dependency aliases array - * - * In this case, we want to keep the alias as-is, but rewrite the target. - * - * We need also provide an additional alias if the alias key is a legacy class. - * - * @return array - */ - private function replaceDependencyAliases(array $aliases) - { - foreach ($aliases as $alias => $target) { - if (! is_string($alias) || ! is_string($target)) { - continue; - } - - $newTarget = $this->replacements->replace($target); - $newAlias = $this->replacements->replace($alias); - - $notIn = [$newTarget]; - $name = $newTarget; - while (isset($aliases[$name])) { - $notIn[] = $aliases[$name]; - $name = $aliases[$name]; - } - - if ($newAlias === $alias && ! in_array($alias, $notIn, true)) { - $aliases[$alias] = $newTarget; - continue; - } - - if (isset($aliases[$newAlias])) { - continue; - } - - if (! in_array($newAlias, $notIn, true)) { - $aliases[$alias] = $newAlias; - $aliases[$newAlias] = $newTarget; - } - } - - return $aliases; - } - - /** - * Rewrite dependency invokables array - * - * In this case, we want to keep the alias as-is, but rewrite the target. - * - * We need also provide an additional alias if invokable is defined with - * an alias which is a legacy class. - * - * @return array - */ - private function replaceDependencyInvokables(array $config) - { - if (empty($config['invokables']) || ! is_array($config['invokables'])) { - return $config; - } - - foreach ($config['invokables'] as $alias => $target) { - if (! is_string($alias)) { - continue; - } - - $newTarget = $this->replacements->replace($target); - $newAlias = $this->replacements->replace($alias); - - if ($alias === $target || isset($config['aliases'][$newAlias])) { - $config['invokables'][$alias] = $newTarget; - continue; - } - - $config['invokables'][$newAlias] = $newTarget; - - if ($newAlias === $alias) { - continue; - } - - $config['aliases'][$alias] = $newAlias; - - unset($config['invokables'][$alias]); - } - - return $config; - } - - /** - * @param mixed $value - * @return mixed Returns $value verbatim. - */ - private function noopReplacement($value) - { - return $value; - } - - private function replaceDependencyFactories(array $config) - { - if (empty($config['factories']) || ! is_array($config['factories'])) { - return $config; - } - - foreach ($config['factories'] as $service => $factory) { - if (! is_string($service)) { - continue; - } - - $replacedService = $this->replacements->replace($service); - $factory = is_string($factory) ? $this->replacements->replace($factory) : $factory; - $config['factories'][$replacedService] = $factory; - - if ($replacedService === $service) { - continue; - } - - unset($config['factories'][$service]); - if (isset($config['aliases'][$service])) { - continue; - } - - $config['aliases'][$service] = $replacedService; - } - - return $config; - } - - private function replaceDependencyServices(array $config) - { - if (empty($config['services']) || ! is_array($config['services'])) { - return $config; - } - - foreach ($config['services'] as $service => $serviceInstance) { - if (! is_string($service)) { - continue; - } - - $replacedService = $this->replacements->replace($service); - $serviceInstance = is_array($serviceInstance) ? $this->__invoke($serviceInstance) : $serviceInstance; - - $config['services'][$replacedService] = $serviceInstance; - - if ($service === $replacedService) { - continue; - } - - unset($config['services'][$service]); - - if (isset($config['aliases'][$service])) { - continue; - } - - $config['aliases'][$service] = $replacedService; - } - - return $config; - } -} diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Module.php b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Module.php deleted file mode 100644 index 9bb1298..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Module.php +++ /dev/null @@ -1,48 +0,0 @@ -getEventManager() - ->attach('mergeConfig', [$this, 'onMergeConfig']); - } - - /** - * Perform substitutions in the merged configuration. - * - * Rewrites keys and values matching known ZF classes, namespaces, and - * configuration keys to their Laminas equivalents. - * - * Type-hinting deliberately omitted to allow unit testing - * without dependencies on packages that do not exist yet. - * - * @param ModuleEvent $event - */ - public function onMergeConfig($event) - { - /** @var ConfigMergerInterface */ - $configMerger = $event->getConfigListener(); - $processor = new ConfigPostProcessor(); - $configMerger->setMergedConfig( - $processor( - $configMerger->getMergedConfig($returnAsObject = false) - ) - ); - } -} diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Replacements.php b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Replacements.php deleted file mode 100644 index 5a09ef1..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/Replacements.php +++ /dev/null @@ -1,40 +0,0 @@ -replacements = array_merge( - require __DIR__ . '/../config/replacements.php', - $additionalReplacements - ); - - // Provide multiple variants of strings containing namespace separators - foreach ($this->replacements as $original => $replacement) { - if (false === strpos($original, '\\')) { - continue; - } - $this->replacements[str_replace('\\', '\\\\', $original)] = str_replace('\\', '\\\\', $replacement); - $this->replacements[str_replace('\\', '\\\\\\\\', $original)] = str_replace('\\', '\\\\\\\\', $replacement); - } - } - - /** - * @param string $value - * @return string - */ - public function replace($value) - { - return strtr($value, $this->replacements); - } -} diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/RewriteRules.php b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/RewriteRules.php deleted file mode 100644 index 61aa56d..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/RewriteRules.php +++ /dev/null @@ -1,73 +0,0 @@ - 'Mezzio\\ProblemDetails\\', - 'Zend\\Expressive\\' => 'Mezzio\\', - - // Laminas - 'Zend\\' => 'Laminas\\', - 'ZF\\ComposerAutoloading\\' => 'Laminas\\ComposerAutoloading\\', - 'ZF\\DevelopmentMode\\' => 'Laminas\\DevelopmentMode\\', - - // Apigility - 'ZF\\Apigility\\' => 'Laminas\\ApiTools\\', - 'ZF\\' => 'Laminas\\ApiTools\\', - - // ZendXml, API wrappers, zend-http OAuth support, zend-diagnostics, ZendDeveloperTools - 'ZendXml\\' => 'Laminas\\Xml\\', - 'ZendOAuth\\' => 'Laminas\\OAuth\\', - 'ZendDiagnostics\\' => 'Laminas\\Diagnostics\\', - 'ZendService\\ReCaptcha\\' => 'Laminas\\ReCaptcha\\', - 'ZendService\\Twitter\\' => 'Laminas\\Twitter\\', - 'ZendDeveloperTools\\' => 'Laminas\\DeveloperTools\\', - ]; - } - - /** - * @return array - */ - public static function namespaceReverse() - { - return [ - // ZendXml, ZendOAuth, ZendDiagnostics, ZendDeveloperTools - 'Laminas\\Xml\\' => 'ZendXml\\', - 'Laminas\\OAuth\\' => 'ZendOAuth\\', - 'Laminas\\Diagnostics\\' => 'ZendDiagnostics\\', - 'Laminas\\DeveloperTools\\' => 'ZendDeveloperTools\\', - - // Zend Service - 'Laminas\\ReCaptcha\\' => 'ZendService\\ReCaptcha\\', - 'Laminas\\Twitter\\' => 'ZendService\\Twitter\\', - - // Zend - 'Laminas\\' => 'Zend\\', - - // Expressive - 'Mezzio\\ProblemDetails\\' => 'Zend\\ProblemDetails\\', - 'Mezzio\\' => 'Zend\\Expressive\\', - - // Laminas to ZfCampus - 'Laminas\\ComposerAutoloading\\' => 'ZF\\ComposerAutoloading\\', - 'Laminas\\DevelopmentMode\\' => 'ZF\\DevelopmentMode\\', - - // Apigility - 'Laminas\\ApiTools\\Admin\\' => 'ZF\\Apigility\\Admin\\', - 'Laminas\\ApiTools\\Doctrine\\' => 'ZF\\Apigility\\Doctrine\\', - 'Laminas\\ApiTools\\Documentation\\' => 'ZF\\Apigility\\Documentation\\', - 'Laminas\\ApiTools\\Example\\' => 'ZF\\Apigility\\Example\\', - 'Laminas\\ApiTools\\Provider\\' => 'ZF\\Apigility\\Provider\\', - 'Laminas\\ApiTools\\Welcome\\' => 'ZF\\Apiglity\\Welcome\\', - 'Laminas\\ApiTools\\' => 'ZF\\', - ]; - } -} diff --git a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/autoload.php b/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/autoload.php deleted file mode 100644 index e92ff58..0000000 --- a/plugins/admin/vendor/laminas/laminas-zendframework-bridge/src/autoload.php +++ /dev/null @@ -1,3 +0,0 @@ -|null */ public $args; diff --git a/plugins/admin/vendor/scssphp/scssphp/src/Block/DirectiveBlock.php b/plugins/admin/vendor/scssphp/scssphp/src/Block/DirectiveBlock.php index b1d3d1a..22b346e 100644 --- a/plugins/admin/vendor/scssphp/scssphp/src/Block/DirectiveBlock.php +++ b/plugins/admin/vendor/scssphp/scssphp/src/Block/DirectiveBlock.php @@ -13,6 +13,7 @@ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; +use ScssPhp\ScssPhp\Node\Number; use ScssPhp\ScssPhp\Type; /** @@ -26,7 +27,7 @@ class DirectiveBlock extends Block public $name; /** - * @var string|array|null + * @var array|Number|null */ public $value; diff --git a/plugins/admin/vendor/scssphp/scssphp/src/Block/EachBlock.php b/plugins/admin/vendor/scssphp/scssphp/src/Block/EachBlock.php index b328957..1217994 100644 --- a/plugins/admin/vendor/scssphp/scssphp/src/Block/EachBlock.php +++ b/plugins/admin/vendor/scssphp/scssphp/src/Block/EachBlock.php @@ -13,6 +13,7 @@ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; +use ScssPhp\ScssPhp\Node\Number; use ScssPhp\ScssPhp\Type; /** @@ -26,7 +27,7 @@ class EachBlock extends Block public $vars = []; /** - * @var array + * @var array|Number */ public $list; diff --git a/plugins/admin/vendor/scssphp/scssphp/src/Block/ElseifBlock.php b/plugins/admin/vendor/scssphp/scssphp/src/Block/ElseifBlock.php index 4622bca..f732c2d 100644 --- a/plugins/admin/vendor/scssphp/scssphp/src/Block/ElseifBlock.php +++ b/plugins/admin/vendor/scssphp/scssphp/src/Block/ElseifBlock.php @@ -13,6 +13,7 @@ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; +use ScssPhp\ScssPhp\Node\Number; use ScssPhp\ScssPhp\Type; /** @@ -21,7 +22,7 @@ use ScssPhp\ScssPhp\Type; class ElseifBlock extends Block { /** - * @var array + * @var array|Number */ public $cond; diff --git a/plugins/admin/vendor/scssphp/scssphp/src/Block/ForBlock.php b/plugins/admin/vendor/scssphp/scssphp/src/Block/ForBlock.php index a9cf673..9629441 100644 --- a/plugins/admin/vendor/scssphp/scssphp/src/Block/ForBlock.php +++ b/plugins/admin/vendor/scssphp/scssphp/src/Block/ForBlock.php @@ -13,6 +13,7 @@ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; +use ScssPhp\ScssPhp\Node\Number; use ScssPhp\ScssPhp\Type; /** @@ -26,12 +27,12 @@ class ForBlock extends Block public $var; /** - * @var array + * @var array|Number */ public $start; /** - * @var array + * @var array|Number */ public $end; diff --git a/plugins/admin/vendor/scssphp/scssphp/src/Block/IfBlock.php b/plugins/admin/vendor/scssphp/scssphp/src/Block/IfBlock.php index 9f21bf8..659c7c2 100644 --- a/plugins/admin/vendor/scssphp/scssphp/src/Block/IfBlock.php +++ b/plugins/admin/vendor/scssphp/scssphp/src/Block/IfBlock.php @@ -13,6 +13,7 @@ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; +use ScssPhp\ScssPhp\Node\Number; use ScssPhp\ScssPhp\Type; /** @@ -21,7 +22,7 @@ use ScssPhp\ScssPhp\Type; class IfBlock extends Block { /** - * @var array + * @var array|Number */ public $cond; diff --git a/plugins/admin/vendor/scssphp/scssphp/src/Block/MediaBlock.php b/plugins/admin/vendor/scssphp/scssphp/src/Block/MediaBlock.php index c49ee1b..ab975c7 100644 --- a/plugins/admin/vendor/scssphp/scssphp/src/Block/MediaBlock.php +++ b/plugins/admin/vendor/scssphp/scssphp/src/Block/MediaBlock.php @@ -13,6 +13,7 @@ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; +use ScssPhp\ScssPhp\Node\Number; use ScssPhp\ScssPhp\Type; /** @@ -21,7 +22,7 @@ use ScssPhp\ScssPhp\Type; class MediaBlock extends Block { /** - * @var string|array|null + * @var string|array|Number|null */ public $value; diff --git a/plugins/admin/vendor/scssphp/scssphp/src/Compiler.php b/plugins/admin/vendor/scssphp/scssphp/src/Compiler.php index ecafc8c..d654ee6 100644 --- a/plugins/admin/vendor/scssphp/scssphp/src/Compiler.php +++ b/plugins/admin/vendor/scssphp/scssphp/src/Compiler.php @@ -140,13 +140,28 @@ class Compiler /** @deprecated */ public static $Infinity = [Type::T_KEYWORD, 'Infinity']; public static $null = [Type::T_NULL]; + /** + * @internal + */ public static $nullString = [Type::T_STRING, '', []]; + /** + * @internal + */ public static $defaultValue = [Type::T_KEYWORD, '']; + /** + * @internal + */ public static $selfSelector = [Type::T_SELF]; public static $emptyList = [Type::T_LIST, '', []]; public static $emptyMap = [Type::T_MAP, [], []]; public static $emptyString = [Type::T_STRING, '"', []]; + /** + * @internal + */ public static $with = [Type::T_KEYWORD, 'with']; + /** + * @internal + */ public static $without = [Type::T_KEYWORD, 'without']; private static $emptyArgumentList = [Type::T_LIST, '', [], []]; @@ -458,10 +473,33 @@ class Compiler } /** - * Compile scss + * Compiles the provided scss file into CSS. + * + * @param string $path + * + * @return CompilationResult + * + * @throws SassException when the source fails to compile + */ + public function compileFile($path) + { + $source = file_get_contents($path); + + if ($source === false) { + throw new \RuntimeException('Could not read the file content'); + } + + return $this->compileString($source, $path); + } + + /** + * Compiles the provided scss source code into CSS. + * + * If provided, the path is considered to be the path from which the source code comes + * from, which will be used to resolve relative imports. * * @param string $source - * @param string|null $path + * @param string|null $path The path for the source, used to resolve relative imports * * @return CompilationResult * @@ -548,7 +586,7 @@ class Compiler $sourceMap = null; - if (! empty($out) && $this->sourceMap && $this->sourceMap !== self::SOURCE_MAP_NONE) { + if (! empty($out) && $this->sourceMap !== self::SOURCE_MAP_NONE && $this->sourceMap) { assert($sourceMapGenerator !== null); $sourceMap = $sourceMapGenerator->generateJson($prefix); $sourceMapUrl = null; @@ -1508,6 +1546,7 @@ class Compiler // start from the root while ($scope->parent && $scope->parent->type !== Type::T_ROOT) { array_unshift($childStash, $scope); + \assert($scope->parent !== null); $scope = $scope->parent; } @@ -1632,6 +1671,7 @@ class Compiler $parser = $this->parserFactory(__METHOD__); if ($parser->parseValue($buffer, $reParsedWith)) { + \assert(\is_array($reParsedWith)); $withCondition = $reParsedWith; } } @@ -2090,6 +2130,11 @@ class Compiler foreach ($selector as $node) { $compound = ''; + if (!is_array($node)) { + $output[] = $node; + continue; + } + array_walk_recursive( $node, function ($value, $key) use (&$compound) { @@ -2124,12 +2169,16 @@ class Compiler foreach ($selector as $node) { $compound = ''; - array_walk_recursive( - $node, - function ($value, $key) use (&$compound) { - $compound .= $value; - } - ); + if (!is_array($node)) { + $compound .= $node; + } else { + array_walk_recursive( + $node, + function ($value, $key) use (&$compound) { + $compound .= $value; + } + ); + } if ($this->isImmediateRelationshipCombinator($compound)) { if (\count($output)) { @@ -2885,7 +2934,7 @@ class Compiler { if (isset($child[Parser::SOURCE_LINE])) { $this->sourceIndex = isset($child[Parser::SOURCE_INDEX]) ? $child[Parser::SOURCE_INDEX] : null; - $this->sourceLine = isset($child[Parser::SOURCE_LINE]) ? $child[Parser::SOURCE_LINE] : -1; + $this->sourceLine = $child[Parser::SOURCE_LINE]; $this->sourceColumn = isset($child[Parser::SOURCE_COLUMN]) ? $child[Parser::SOURCE_COLUMN] : -1; } elseif (\is_array($child) && isset($child[1]->sourceLine) && $child[1] instanceof Block) { $this->sourceIndex = $child[1]->sourceIndex; @@ -4529,8 +4578,10 @@ EOL; return $colorName; } - if (is_numeric($alpha)) { + if (\is_int($alpha) || \is_float($alpha)) { $a = new Number($alpha, ''); + } elseif (is_numeric($alpha)) { + $a = new Number((float) $alpha, ''); } else { $a = $alpha; } @@ -5667,9 +5718,35 @@ EOL; @trigger_error('Omitting the argument declaration when registering custom function is deprecated and won\'t be supported in ScssPhp 2.0 anymore.', E_USER_DEPRECATED); } + if ($this->reflectCallable($callback)->getNumberOfRequiredParameters() > 1) { + @trigger_error('The second argument passed to the callback of custom functions is deprecated and won\'t be supported in ScssPhp 2.0 anymore. Register a callback accepting only 1 parameter instead.', E_USER_DEPRECATED); + } + $this->userFunctions[$this->normalizeName($name)] = [$callback, $argumentDeclaration]; } + /** + * @return \ReflectionFunctionAbstract + */ + private function reflectCallable(callable $c) + { + if (\is_object($c) && !$c instanceof \Closure) { + $c = [$c, '__invoke']; + } + + if (\is_string($c) && false !== strpos($c, '::')) { + $c = explode('::', $c, 2); + } + + if (\is_array($c)) { + return new \ReflectionMethod($c[0], $c[1]); + } + + \assert(\is_string($c) || $c instanceof \Closure); + + return new \ReflectionFunction($c); + } + /** * Unregister function * @@ -5806,13 +5883,13 @@ EOL; if (! \is_null($file)) { if (\is_array($dir)) { - $callableDescription = (\is_object($dir[0]) ? \get_class($dir[0]) : $dir[0]).'::'.$dir[1]; + $callableDescription = (\is_object($dir[0]) ? \get_class($dir[0]) : $dir[0]) . '::' . $dir[1]; } elseif ($dir instanceof \Closure) { $r = new \ReflectionFunction($dir); if (false !== strpos($r->name, '{closure}')) { $callableDescription = sprintf('closure{%s:%s}', $r->getFileName(), $r->getStartLine()); } elseif ($class = $r->getClosureScopeClass()) { - $callableDescription = $class->name.'::'.$r->name; + $callableDescription = $class->name . '::' . $r->name; } else { $callableDescription = $r->name; } @@ -5925,15 +6002,15 @@ EOL; private function tryImportPathWithExtensions($path) { $result = array_merge( - $this->tryImportPath($path.'.sass'), - $this->tryImportPath($path.'.scss') + $this->tryImportPath($path . '.sass'), + $this->tryImportPath($path . '.scss') ); if ($result) { return $result; } - return $this->tryImportPath($path.'.css'); + return $this->tryImportPath($path . '.css'); } /** @@ -5943,7 +6020,7 @@ EOL; */ private function tryImportPath($path) { - $partial = dirname($path).'/_'.basename($path); + $partial = dirname($path) . '/_' . basename($path); $candidates = []; @@ -5969,7 +6046,7 @@ EOL; return null; } - return $this->checkImportPathConflicts($this->tryImportPathWithExtensions($path.'/index')); + return $this->checkImportPathConflicts($this->tryImportPathWithExtensions($path . '/index')); } /** @@ -5984,7 +6061,7 @@ EOL; } $normalizedPath = $path; - $normalizedRootDirectory = $this->rootDirectory.'/'; + $normalizedRootDirectory = $this->rootDirectory . '/'; if (\DIRECTORY_SEPARATOR === '\\') { $normalizedRootDirectory = str_replace('\\', '/', $normalizedRootDirectory); @@ -6371,8 +6448,6 @@ EOL; */ protected function sortNativeFunctionArgs($functionName, $prototypes, $args) { - static $parser = null; - if (! isset($prototypes)) { $keyArgs = []; $posArgs = []; @@ -6526,7 +6601,7 @@ EOL; * * @return array * - * @phpstan-param non-empty-list, rest_argument: string|null}> $prototypes + * @phpstan-param non-empty-array, rest_argument: string|null}> $prototypes * @phpstan-return array{arguments: list, rest_argument: string|null} */ private function selectFunctionPrototype(array $prototypes, $positional, array $names) @@ -6984,10 +7059,14 @@ EOL; return static::$null; } - if (is_numeric($value)) { + if (\is_int($value) || \is_float($value)) { return new Number($value, ''); } + if (is_numeric($value)) { + return new Number((float) $value, ''); + } + if ($value === '') { return static::$emptyString; } @@ -7675,9 +7754,9 @@ EOL; $b = min(1.0 - $w, $b); $rgb = $this->toRGB($hue, 100, 50); - for($i = 1; $i < 4; $i++) { - $rgb[$i] *= (1.0 - $w - $b); - $rgb[$i] = round($rgb[$i] + 255 * $w + 0.0001); + for ($i = 1; $i < 4; $i++) { + $rgb[$i] *= (1.0 - $w - $b); + $rgb[$i] = round($rgb[$i] + 255 * $w + 0.0001); } return $rgb; @@ -7704,7 +7783,6 @@ EOL; if ((int) $d === 0) { $h = 0; } else { - if ($red == $max) { $h = 60 * ($green - $blue) / $d; } elseif ($green == $max) { @@ -7714,7 +7792,7 @@ EOL; } } - return [Type::T_HWB, fmod($h, 360), $min / 255 * 100, 100 - $max / 255 *100]; + return [Type::T_HWB, fmod($h, 360), $min / 255 * 100, 100 - $max / 255 * 100]; } @@ -7923,7 +8001,13 @@ EOL; $scale = $operation === 'scale'; $change = $operation === 'change'; - /** @phpstan-var callable(string, float|int, bool=, bool=): (float|int|null) $getParam */ + /** + * @param string $name + * @param float|int $max + * @param bool $checkPercent + * @param bool $assertPercent + * @return float|int|null + */ $getParam = function ($name, $max, $checkPercent = false, $assertPercent = false) use (&$kwargs, $scale, $change) { if (!isset($kwargs[$name])) { return null; @@ -8065,7 +8149,7 @@ EOL; protected static $libChangeColor = ['color', 'kwargs...']; protected function libChangeColor($args) { - return $this->alterColor($args,'change', function ($base, $alter, $max) { + return $this->alterColor($args, 'change', function ($base, $alter, $max) { if ($alter === null) { return $base; } diff --git a/plugins/admin/vendor/scssphp/scssphp/src/Node/Number.php b/plugins/admin/vendor/scssphp/scssphp/src/Node/Number.php index 48e711f..6c04458 100644 --- a/plugins/admin/vendor/scssphp/scssphp/src/Node/Number.php +++ b/plugins/admin/vendor/scssphp/scssphp/src/Node/Number.php @@ -33,7 +33,7 @@ use ScssPhp\ScssPhp\Util; * * @template-implements \ArrayAccess */ -class Number extends Node implements \ArrayAccess +class Number extends Node implements \ArrayAccess, \JsonSerializable { const PRECISION = 10; @@ -131,7 +131,7 @@ class Number extends Node implements \ArrayAccess } /** - * @return string[] + * @return list */ public function getNumeratorUnits() { @@ -139,13 +139,23 @@ class Number extends Node implements \ArrayAccess } /** - * @return string[] + * @return list */ public function getDenominatorUnits() { return $this->denominatorUnits; } + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function jsonSerialize() + { + // Passing a compiler instance makes the method output a Sass representation instead of a CSS one, supporting full units. + return $this->output(new Compiler()); + } + /** * @return bool */ @@ -554,7 +564,7 @@ class Number extends Node implements \ArrayAccess try { return $this->coerceUnits($other, function ($num1, $num2) { - return round($num1,self::PRECISION) == round($num2, self::PRECISION); + return round($num1, self::PRECISION) == round($num2, self::PRECISION); }); } catch (SassScriptException $e) { return false; diff --git a/plugins/admin/vendor/scssphp/scssphp/src/OutputStyle.php b/plugins/admin/vendor/scssphp/scssphp/src/OutputStyle.php index c284639..a1d8b42 100644 --- a/plugins/admin/vendor/scssphp/scssphp/src/OutputStyle.php +++ b/plugins/admin/vendor/scssphp/scssphp/src/OutputStyle.php @@ -1,9 +1,62 @@ saveEncoding(); $this->extractLineNumbers($buffer); + if ($this->utf8 && !preg_match('//u', $buffer)) { + $message = $this->sourceName ? 'Invalid UTF-8 file: ' . $this->sourceName : 'Invalid UTF-8 file'; + throw new ParserException($message); + } + $this->pushBlock(null); // root block $this->whitespace(); $this->pushBlock(null); @@ -305,8 +310,9 @@ class Parser * * @api * - * @param string $buffer - * @param string|array $out + * @param string $buffer + * @param mixed $out + * @param-out array|Number $out * * @return bool */ @@ -323,6 +329,13 @@ class Parser $list = $this->valueList($out); + if ($this->count !== \strlen($this->buffer)) { + $error = $this->parseError('Expected end of value'); + $message = 'Passing trailing content after the expression when parsing a value is deprecated since Scssphp 1.12.0 and will be an error in 2.0. ' . $error->getMessage(); + + @trigger_error($message, E_USER_DEPRECATED); + } + $this->restoreEncoding(); return $list; @@ -333,9 +346,9 @@ class Parser * * @api * - * @param string $buffer - * @param string|array $out - * @param bool $shouldValidate + * @param string $buffer + * @param array $out + * @param bool $shouldValidate * * @return bool */ @@ -383,10 +396,13 @@ class Parser $this->inParens = false; $this->eatWhiteDefault = true; $this->buffer = (string) $buffer; + $this->discardComments = true; $this->saveEncoding(); $this->extractLineNumbers($this->buffer); + $this->whitespace(); + $isMediaQuery = $this->mediaQueryList($out); $this->restoreEncoding(); @@ -1240,10 +1256,10 @@ class Parser /** * Assert a parsed part is plain CSS Valid * - * @param array|false $parsed + * @param array|Number|false $parsed * @param int $startPos * - * @return array + * @return array|Number * * @throws ParserException */ @@ -1273,10 +1289,10 @@ class Parser /** * Check a parsed element is plain CSS Valid * - * @param array $parsed + * @param array|Number|string $parsed * @param bool $allowExpression * - * @return array|false + * @return ($parsed is string ? string : ($parsed is Number ? Number : array|false)) */ protected function isPlainCssValidElement($parsed, $allowExpression = false) { @@ -1285,6 +1301,10 @@ class Parser return $parsed; } + if ($parsed instanceof Number) { + return $parsed; + } + if ( \in_array($parsed[0], [Type::T_FUNCTION, Type::T_FUNCTION_CALL]) && !\in_array($parsed[1], [ @@ -1678,9 +1698,9 @@ class Parser */ protected function appendComment($comment) { - assert($this->env !== null); - if (! $this->discardComments) { + assert($this->env !== null); + $this->env->comments[] = $comment; } } @@ -2079,8 +2099,9 @@ class Parser /** * Parse directive value list that considers $vars as keyword * - * @param array $out + * @param mixed $out * @param string|false $endChar + * @param-out array|Number $out * * @return bool * @@ -2143,7 +2164,8 @@ class Parser /** * Parse comma separated value list * - * @param array $out + * @param mixed $out + * @param-out array|Number $out * * @return bool */ @@ -2161,10 +2183,11 @@ class Parser * Parse a function call, where externals () are part of the call * and not of the value list * - * @param array $out + * @param mixed $out * @param bool $mandatoryEnclos * @param null|string $charAfter * @param null|bool $eatWhiteSp + * @param-out array|Number $out * * @return bool */ @@ -2200,7 +2223,8 @@ class Parser /** * Parse space separated value list * - * @param array $out + * @param mixed $out + * @param-out array|Number $out * * @return bool */ @@ -2212,10 +2236,11 @@ class Parser /** * Parse generic list * - * @param array $out + * @param mixed $out * @param string $parseItem The name of the method used to parse items * @param string $delim * @param bool $flatten + * @param-out ($flatten is false ? array : array|Number) $out * * @return bool */ @@ -2319,9 +2344,10 @@ class Parser /** * Parse expression * - * @param array $out + * @param mixed $out * @param bool $listOnly * @param bool $lookForExp + * @param-out array|Number $out * * @return bool * @@ -2386,10 +2412,11 @@ class Parser /** * Parse expression specifically checking for lists in parenthesis or brackets * - * @param array $out + * @param mixed $out * @param int $s * @param string $closingParen * @param string[] $allowedTypes + * @param-out array|Number $out * * @return bool * @@ -2448,10 +2475,10 @@ class Parser /** * Parse left-hand side of subexpression * - * @param array $lhs - * @param int $minP + * @param array|Number $lhs + * @param int $minP * - * @return array + * @return array|Number */ protected function expHelper($lhs, $minP) { @@ -2502,7 +2529,8 @@ class Parser /** * Parse value * - * @param array $out + * @param mixed $out + * @param-out array|Number $out * * @return bool */ @@ -2710,7 +2738,8 @@ class Parser /** * Parse parenthesized value * - * @param array $out + * @param mixed $out + * @param-out array|Number $out * * @return bool */ @@ -2782,7 +2811,8 @@ class Parser * Parse function call * * @param string $name - * @param array $func + * @param mixed $func + * @param-out array $func * * @return bool */ @@ -2885,7 +2915,8 @@ class Parser /** * Parse mixin/function definition argument list * - * @param array $out + * @param mixed $out + * @param-out list $out * * @return bool */ @@ -2947,7 +2978,8 @@ class Parser /** * Parse map * - * @param array $out + * @param mixed $out + * @param-out array $out * * @return bool */ @@ -2989,7 +3021,8 @@ class Parser /** * Parse color * - * @param array $out + * @param mixed $out + * @param-out array $out * * @return bool */ @@ -3015,7 +3048,8 @@ class Parser /** * Parse number with unit * - * @param array $unit + * @param mixed $unit + * @param-out Number $unit * * @return bool */ @@ -3221,11 +3255,12 @@ class Parser * Parse an unbounded string stopped by $end * * @param string $end - * @param array $out + * @param mixed $out * @param string $nestOpen * @param string $nestClose * @param bool $rtrim * @param string $disallow + * @param-out array $out * * @return bool */ @@ -3302,8 +3337,9 @@ class Parser /** * Parser interpolation * - * @param string|array $out - * @param bool $lookWhite save information about whitespace before and after + * @param mixed $out + * @param bool $lookWhite save information about whitespace before and after + * @param-out array $out * * @return bool */ @@ -3837,7 +3873,8 @@ class Parser /** * Parse a variable * - * @param array $out + * @param mixed $out + * @param-out array{Type::*, string} $out * * @return bool */ @@ -3866,9 +3903,10 @@ class Parser /** * Parse a keyword * - * @param string $word - * @param bool $eatWhitespace - * @param bool $inSelector + * @param mixed $word + * @param bool $eatWhitespace + * @param bool $inSelector + * @param-out string $word * * @return bool */ @@ -3984,7 +4022,8 @@ class Parser /** * Parse a url * - * @param array $out + * @param mixed $out + * @param-out array $out * * @return bool */ @@ -3994,10 +4033,10 @@ class Parser $s = $this->count; if ( - ($this->string($out) || $this->spaceList($out)) && + ($this->string($inner) || $this->spaceList($inner)) && $this->matchChar(')') ) { - $out = [Type::T_STRING, '', ['url(', $out, ')']]; + $out = [Type::T_STRING, '', ['url(', $inner, ')']]; return true; } @@ -4040,7 +4079,7 @@ class Parser /** * Strip assignment flag from the list * - * @param array $value + * @param array|Number $value * * @return string[] */ diff --git a/plugins/admin/vendor/scssphp/scssphp/src/Type.php b/plugins/admin/vendor/scssphp/scssphp/src/Type.php index d430887..2f8ab65 100644 --- a/plugins/admin/vendor/scssphp/scssphp/src/Type.php +++ b/plugins/admin/vendor/scssphp/scssphp/src/Type.php @@ -95,6 +95,9 @@ class Type * @internal */ const T_FOR = 'for'; + /** + * @internal + */ const T_FUNCTION = 'function'; /** * @internal diff --git a/plugins/admin/vendor/scssphp/scssphp/src/Version.php b/plugins/admin/vendor/scssphp/scssphp/src/Version.php index d604a50..45fc983 100644 --- a/plugins/admin/vendor/scssphp/scssphp/src/Version.php +++ b/plugins/admin/vendor/scssphp/scssphp/src/Version.php @@ -19,5 +19,5 @@ namespace ScssPhp\ScssPhp; */ class Version { - const VERSION = '1.11.0'; + const VERSION = '1.13.0'; } diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index 21f7dfc..09de55f 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,3 +1,12 @@ +# v1.8.0 +## 04/21/2025 + +1. [](#improved) + * Added "version:" to composer.json as it now requires it + * Updated to `Tailwind 3` version `3.3.3` + * Better autoload instructions + * Fixed some `https` links in `README.md` to `https` + # v1.7.1 ## 06/14/2023 diff --git a/plugins/devtools/README.md b/plugins/devtools/README.md index c785a2b..23d01ff 100644 --- a/plugins/devtools/README.md +++ b/plugins/devtools/README.md @@ -1,12 +1,12 @@ # Grav Devtools Plugin -The `devtools` is a [Grav](http://github.com/getgrav/grav) Plugin that lets you quickly create a scaffolding for your new plugins and themes. The plugin provides CLI commands that allow for the quick and easy deployment of a sample scaffolding for your new plugin. +The `devtools` is a [Grav](https://github.com/getgrav/grav) Plugin that lets you quickly create a scaffolding for your new plugins and themes. The plugin provides CLI commands that allow for the quick and easy deployment of a sample scaffolding for your new plugin. # Installation ## GPM Installation (Preferred) -The simplest way to install this plugin is via the [Grav Package Manager (GPM)](http://learn.getgrav.org/advanced/grav-gpm). From the root of your Grav install type: +The simplest way to install this plugin is via the [Grav Package Manager (GPM)](https://learn.getgrav.org/advanced/grav-gpm). From the root of your Grav install type: bin/gpm install devtools @@ -65,7 +65,7 @@ Path: /home/johnnyr/webroot/grav-installation/user/themes/mytheme There are **three template creation options** -1. `pure-blank` - This is a very basic blank theme that uses the [Pure CSS framework](http://purecss.io/) +1. `pure-blank` - This is a very basic blank theme that uses the [Pure CSS framework](https://purecss.io/) 2. `inheritance` - This creates a very basic template with minimal files that inherits a base theme. To find out more about theme inheritance, [check out the subject in more details on the Grav Learn site](https://learn.getgrav.org/themes/customization#theme-inheritance). 3. `copy` - This allows you to create a new theme based on an existing theme. This is the simplest way to get started with a new theme by using another theme as the basis. diff --git a/plugins/devtools/blueprints.yaml b/plugins/devtools/blueprints.yaml index 98eda91..c1f8bd9 100644 --- a/plugins/devtools/blueprints.yaml +++ b/plugins/devtools/blueprints.yaml @@ -1,13 +1,13 @@ name: DevTools slug: devtools type: plugin -version: 1.7.1 +version: 1.8.0 description: Plugin and Theme scaffolding utilities icon: cogs author: name: Team Grav email: devs@getgrav.org - url: http://getgrav.org + url: https://getgrav.org homepage: https://github.com/getgrav/grav-plugin-devtools keywords: devtools, plugin, theme bugs: https://github.com/getgrav/grav-plugin-devtools/issues diff --git a/plugins/devtools/classes/DevToolsCommand.php b/plugins/devtools/classes/DevToolsCommand.php index ea036f9..30f8d95 100644 --- a/plugins/devtools/classes/DevToolsCommand.php +++ b/plugins/devtools/classes/DevToolsCommand.php @@ -280,7 +280,8 @@ class DevToolsCommand extends ConsoleCommand $this->output->writeln('Path: ' . $component_folder . ''); $this->output->writeln(''); if ($type === 'plugin') { - $this->output->writeln('Please run `cd ' . $component_folder . '` and `composer update` to initialize the autoloader'); + $this->output->writeln('!!! IMPORTANT: To initialize the autoloader, please run this now:'); + $this->output->writeln('cd ' . $component_folder . ' && composer update '); $this->output->writeln(''); } diff --git a/plugins/devtools/components/plugin/blank/composer.json.twig b/plugins/devtools/components/plugin/blank/composer.json.twig index 28d8691..baf0d78 100644 --- a/plugins/devtools/components/plugin/blank/composer.json.twig +++ b/plugins/devtools/components/plugin/blank/composer.json.twig @@ -3,6 +3,7 @@ "name": "{{ githubid|lower }}/{{ component.name|hyphenize }}", "type": "grav-plugin", "description": "{{ component.description }}", + "version": "1.0.0", "keywords": ["plugin"], "homepage": "https://github.com/{{ githubid }}/grav-plugin-{{ component.name|hyphenize }}", "license": "MIT", diff --git a/plugins/devtools/components/plugin/flex/composer.json.twig b/plugins/devtools/components/plugin/flex/composer.json.twig index 28d8691..baf0d78 100644 --- a/plugins/devtools/components/plugin/flex/composer.json.twig +++ b/plugins/devtools/components/plugin/flex/composer.json.twig @@ -3,6 +3,7 @@ "name": "{{ githubid|lower }}/{{ component.name|hyphenize }}", "type": "grav-plugin", "description": "{{ component.description }}", + "version": "1.0.0", "keywords": ["plugin"], "homepage": "https://github.com/{{ githubid }}/grav-plugin-{{ component.name|hyphenize }}", "license": "MIT", diff --git a/plugins/devtools/components/theme/inheritance/README.md.twig b/plugins/devtools/components/theme/inheritance/README.md.twig index ee5c0b7..49896e4 100644 --- a/plugins/devtools/components/theme/inheritance/README.md.twig +++ b/plugins/devtools/components/theme/inheritance/README.md.twig @@ -1,6 +1,6 @@ # {{ component.name|titleize }} Theme -The **{{ component.name|titleize }}** Theme is for [Grav CMS](http://github.com/getgrav/grav). This README.md file should be modified to describe the features, installation, configuration, and general usage of this theme. +The **{{ component.name|titleize }}** Theme is for [Grav CMS](https://github.com/getgrav/grav). This README.md file should be modified to describe the features, installation, configuration, and general usage of this theme. ## Description diff --git a/plugins/devtools/components/theme/pure-blank/README.md.twig b/plugins/devtools/components/theme/pure-blank/README.md.twig index ee5c0b7..49896e4 100644 --- a/plugins/devtools/components/theme/pure-blank/README.md.twig +++ b/plugins/devtools/components/theme/pure-blank/README.md.twig @@ -1,6 +1,6 @@ # {{ component.name|titleize }} Theme -The **{{ component.name|titleize }}** Theme is for [Grav CMS](http://github.com/getgrav/grav). This README.md file should be modified to describe the features, installation, configuration, and general usage of this theme. +The **{{ component.name|titleize }}** Theme is for [Grav CMS](https://github.com/getgrav/grav). This README.md file should be modified to describe the features, installation, configuration, and general usage of this theme. ## Description diff --git a/plugins/devtools/components/theme/tailwind-mix/README.md.twig b/plugins/devtools/components/theme/tailwind-mix/README.md.twig index c6d05fd..1eef09a 100644 --- a/plugins/devtools/components/theme/tailwind-mix/README.md.twig +++ b/plugins/devtools/components/theme/tailwind-mix/README.md.twig @@ -1,6 +1,6 @@ # {{ component.name|titleize }} Theme -The **{{ component.name|titleize }}** Theme is for [Grav CMS](http://github.com/getgrav/grav). This README.md file should be modified to describe the features, installation, configuration, and general usage of this theme. +The **{{ component.name|titleize }}** Theme is for [Grav CMS](https://github.com/getgrav/grav). This README.md file should be modified to describe the features, installation, configuration, and general usage of this theme. ## Description diff --git a/plugins/devtools/components/theme/tailwind-mix/package.json.twig b/plugins/devtools/components/theme/tailwind-mix/package.json.twig index 09c8658..8f53909 100644 --- a/plugins/devtools/components/theme/tailwind-mix/package.json.twig +++ b/plugins/devtools/components/theme/tailwind-mix/package.json.twig @@ -12,14 +12,14 @@ }, "dependencies": {}, "devDependencies": { - "@tailwindcss/forms": "^0.5.0", - "@tailwindcss/typography": "^0.5.2", - "alpinejs": "^2.8.2", - "browser-sync": "^2.27.7", + "@tailwindcss/forms": "^0.5.4", + "@tailwindcss/typography": "^0.5.9", + "alpinejs": "^3.12.3", + "browser-sync": "^2.29.3", "browser-sync-webpack-plugin": "^2.3.0", "laravel-mix": "^6.0.43", "mix-tailwindcss": "^1.3.0", - "tailwindcss": "^3.0.18", + "tailwindcss": "^3.3.3", "tailwindcss-debug-screens": "^2.2.1" } } diff --git a/plugins/devtools/components/theme/tailwind-mix/templates/partials/base.html.twig b/plugins/devtools/components/theme/tailwind-mix/templates/partials/base.html.twig index 4ec88dd..832592d 100644 --- a/plugins/devtools/components/theme/tailwind-mix/templates/partials/base.html.twig +++ b/plugins/devtools/components/theme/tailwind-mix/templates/partials/base.html.twig @@ -19,7 +19,7 @@ {% endblock %} {% block javascripts %} - {% do assets.addJs('theme://dist/js/main' ~ extension ~ '.js', 98) %} + {% do assets.addJs('theme://dist/js/main' ~ extension ~ '.js', { loading: 'defer' }) %} {% endblock %} {% block assets deferred %} @@ -55,7 +55,7 @@ {% block footer %}

{% endblock %} diff --git a/plugins/devtools/components/theme/tailwind/README.md.twig b/plugins/devtools/components/theme/tailwind/README.md.twig index c6d05fd..1eef09a 100644 --- a/plugins/devtools/components/theme/tailwind/README.md.twig +++ b/plugins/devtools/components/theme/tailwind/README.md.twig @@ -1,6 +1,6 @@ # {{ component.name|titleize }} Theme -The **{{ component.name|titleize }}** Theme is for [Grav CMS](http://github.com/getgrav/grav). This README.md file should be modified to describe the features, installation, configuration, and general usage of this theme. +The **{{ component.name|titleize }}** Theme is for [Grav CMS](https://github.com/getgrav/grav). This README.md file should be modified to describe the features, installation, configuration, and general usage of this theme. ## Description diff --git a/plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig b/plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig index ae825a0..b385b5f 100644 --- a/plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig +++ b/plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig @@ -55,7 +55,7 @@ {% block footer %} {% endblock %} diff --git a/plugins/email/CHANGELOG.md b/plugins/email/CHANGELOG.md index 49e0e6e..0abdab4 100644 --- a/plugins/email/CHANGELOG.md +++ b/plugins/email/CHANGELOG.md @@ -1,3 +1,11 @@ +# v4.2.0 +## 08/25/2025 + +1. [](#new) + * PHP 8.4 compatibility +1. [](#improved) + * Vendor library updates + # v4.1.2 ## 01/06/2025 diff --git a/plugins/email/blueprints.yaml b/plugins/email/blueprints.yaml index b0e8730..7e6ec6c 100644 --- a/plugins/email/blueprints.yaml +++ b/plugins/email/blueprints.yaml @@ -1,7 +1,7 @@ name: Email slug: email type: plugin -version: 4.1.2 +version: 4.2.0 testing: false description: Enables the emailing system for Grav icon: envelope diff --git a/plugins/email/classes/Email.php b/plugins/email/classes/Email.php index 213ef2c..0b4c929 100644 --- a/plugins/email/classes/Email.php +++ b/plugins/email/classes/Email.php @@ -69,7 +69,7 @@ class Email * @param string|null $charset @deprecated * @return Message */ - public function message(string $subject = null, string $body = null, string $contentType = null, string $charset = null): Message + public function message(?string $subject = null, ?string $body = null, ?string $contentType = null, ?string $charset = null): Message { $message = new Message(); $message->subject($subject); @@ -89,7 +89,7 @@ class Email * @param Envelope|null $envelope * @return int */ - public function send(Message $message, Envelope $envelope = null): int + public function send(Message $message, ?Envelope $envelope = null): int { try { $sent_msg = $this->transport->send($message->getEmail(), $envelope); diff --git a/plugins/email/composer.lock b/plugins/email/composer.lock index 5e1f85d..7119b47 100644 --- a/plugins/email/composer.lock +++ b/plugins/email/composer.lock @@ -8,26 +8,29 @@ "packages": [ { "name": "doctrine/deprecations", - "version": "1.1.4", + "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "1.4.10 || 2.0.3", + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -47,9 +50,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" }, - "time": "2024-12-07T21:18:45+00:00" + "time": "2025-04-07T20:06:18+00:00" }, { "name": "doctrine/lexer", @@ -970,16 +973,16 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", "shasum": "" }, "require": { @@ -1033,7 +1036,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" }, "funding": [ { @@ -1044,16 +1047,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-10T14:38:51+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -1114,7 +1121,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -1125,6 +1132,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -1134,16 +1145,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { @@ -1194,7 +1205,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -1205,12 +1216,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/redis-messenger", diff --git a/plugins/email/vendor/autoload.php b/plugins/email/vendor/autoload.php index 14152f1..2357fa6 100644 --- a/plugins/email/vendor/autoload.php +++ b/plugins/email/vendor/autoload.php @@ -14,10 +14,7 @@ if (PHP_VERSION_ID < 50600) { echo $err; } } - trigger_error( - $err, - E_USER_ERROR - ); + throw new RuntimeException($err); } require_once __DIR__ . '/composer/autoload_real.php'; diff --git a/plugins/email/vendor/composer/InstalledVersions.php b/plugins/email/vendor/composer/InstalledVersions.php index 07b32ed..2052022 100644 --- a/plugins/email/vendor/composer/InstalledVersions.php +++ b/plugins/email/vendor/composer/InstalledVersions.php @@ -26,12 +26,23 @@ use Composer\Semver\VersionParser; */ class InstalledVersions { + /** + * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to + * @internal + */ + private static $selfDir = null; + /** * @var mixed[]|null * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null */ private static $installed; + /** + * @var bool + */ + private static $installedIsLocalDir; + /** * @var bool|null */ @@ -309,6 +320,24 @@ class InstalledVersions { self::$installed = $data; self::$installedByVendor = array(); + + // when using reload, we disable the duplicate protection to ensure that self::$installed data is + // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, + // so we have to assume it does not, and that may result in duplicate data being returned when listing + // all installed packages for example + self::$installedIsLocalDir = false; + } + + /** + * @return string + */ + private static function getSelfDir() + { + if (self::$selfDir === null) { + self::$selfDir = strtr(__DIR__, '\\', '/'); + } + + return self::$selfDir; } /** @@ -325,7 +354,9 @@ class InstalledVersions $copiedLocalDir = false; if (self::$canGetVendors) { + $selfDir = self::getSelfDir(); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + $vendorDir = strtr($vendorDir, '\\', '/'); if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { @@ -333,11 +364,14 @@ class InstalledVersions $required = require $vendorDir.'/composer/installed.php'; self::$installedByVendor[$vendorDir] = $required; $installed[] = $required; - if (strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { self::$installed = $required; - $copiedLocalDir = true; + self::$installedIsLocalDir = true; } } + if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { + $copiedLocalDir = true; + } } } diff --git a/plugins/email/vendor/composer/installed.json b/plugins/email/vendor/composer/installed.json index 8c641b2..43fc8df 100644 --- a/plugins/email/vendor/composer/installed.json +++ b/plugins/email/vendor/composer/installed.json @@ -2,33 +2,36 @@ "packages": [ { "name": "doctrine/deprecations", - "version": "1.1.4", - "version_normalized": "1.1.4.0", + "version": "1.1.5", + "version_normalized": "1.1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "1.4.10 || 2.0.3", + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", "psr/log": "^1 || ^2 || ^3" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, - "time": "2024-12-07T21:18:45+00:00", + "time": "2025-04-07T20:06:18+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -44,7 +47,7 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" }, "install-path": "../doctrine/deprecations" }, @@ -1006,17 +1009,17 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", "shasum": "" }, "require": { @@ -1026,7 +1029,7 @@ "suggest": { "ext-intl": "For best performance" }, - "time": "2024-09-09T11:45:10+00:00", + "time": "2024-09-10T14:38:51+00:00", "type": "library", "extra": { "thanks": { @@ -1072,7 +1075,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" }, "funding": [ { @@ -1083,6 +1086,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -1092,8 +1099,8 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -1156,7 +1163,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -1167,6 +1174,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -1176,23 +1187,23 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { "php": ">=7.2" }, - "time": "2024-09-09T11:45:10+00:00", + "time": "2025-01-02T08:10:11+00:00", "type": "library", "extra": { "thanks": { @@ -1239,7 +1250,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -1250,6 +1261,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" diff --git a/plugins/email/vendor/composer/installed.php b/plugins/email/vendor/composer/installed.php index 2436272..0d9cf35 100644 --- a/plugins/email/vendor/composer/installed.php +++ b/plugins/email/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'getgrav/grav-plugin-email', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '831784509ec3bbc822c873000d4672112f8f9557', + 'reference' => 'ae1a8e9e23373a3fd9d6f6b8c05021cde6ad44e4', 'type' => 'grav-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -11,9 +11,9 @@ ), 'versions' => array( 'doctrine/deprecations' => array( - 'pretty_version' => '1.1.4', - 'version' => '1.1.4.0', - 'reference' => '31610dbb31faa98e6b5447b62340826f54fbc4e9', + 'pretty_version' => '1.1.5', + 'version' => '1.1.5.0', + 'reference' => '459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/deprecations', 'aliases' => array(), @@ -40,7 +40,7 @@ 'getgrav/grav-plugin-email' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '831784509ec3bbc822c873000d4672112f8f9557', + 'reference' => 'ae1a8e9e23373a3fd9d6f6b8c05021cde6ad44e4', 'type' => 'grav-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -164,17 +164,17 @@ ), ), 'symfony/polyfill-intl-idn' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', - 'reference' => 'c36586dcf89a12315939e00ec9b4474adcb1d773', + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => '9614ac4d8061dc257ecc64cba1b140873dce8ad3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-intl-normalizer' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', 'reference' => '3833d7255cc303546435cb650316bff708a1c75c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', @@ -194,9 +194,9 @@ ), ), 'symfony/polyfill-php80' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', - 'reference' => '60328e362d4c2c802a54fcbf04f9d3fb892b4cf8', + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => '0cc9dd0f17f61d8131e7df6b84bd344899fe2608', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), diff --git a/plugins/email/vendor/composer/platform_check.php b/plugins/email/vendor/composer/platform_check.php index 0109125..c051a36 100644 --- a/plugins/email/vendor/composer/platform_check.php +++ b/plugins/email/vendor/composer/platform_check.php @@ -19,8 +19,7 @@ if ($issues) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR + throw new \RuntimeException( + 'Composer detected issues in your platform: ' . implode(' ', $issues) ); } diff --git a/plugins/email/vendor/doctrine/deprecations/composer.json b/plugins/email/vendor/doctrine/deprecations/composer.json index a7a51e3..91ba9e6 100644 --- a/plugins/email/vendor/doctrine/deprecations/composer.json +++ b/plugins/email/vendor/doctrine/deprecations/composer.json @@ -8,12 +8,15 @@ "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "1.4.10 || 2.0.3", + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", "psr/log": "^1 || ^2 || ^3" }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, diff --git a/plugins/email/vendor/doctrine/deprecations/src/PHPUnit/VerifyDeprecations.php b/plugins/email/vendor/doctrine/deprecations/src/PHPUnit/VerifyDeprecations.php index 8b322b7..a6c7ad6 100644 --- a/plugins/email/vendor/doctrine/deprecations/src/PHPUnit/VerifyDeprecations.php +++ b/plugins/email/vendor/doctrine/deprecations/src/PHPUnit/VerifyDeprecations.php @@ -5,6 +5,8 @@ declare(strict_types=1); namespace Doctrine\Deprecations\PHPUnit; use Doctrine\Deprecations\Deprecation; +use PHPUnit\Framework\Attributes\After; +use PHPUnit\Framework\Attributes\Before; use function sprintf; @@ -27,12 +29,14 @@ trait VerifyDeprecations } /** @before */ + #[Before] public function enableDeprecationTracking(): void { Deprecation::enableTrackingDeprecations(); } /** @after */ + #[After] public function verifyDeprecationsAreTriggered(): void { foreach ($this->doctrineDeprecationsExpectations as $identifier => $expectation) { diff --git a/plugins/email/vendor/symfony/polyfill-intl-idn/Idn.php b/plugins/email/vendor/symfony/polyfill-intl-idn/Idn.php index 334f8ee..448f74c 100644 --- a/plugins/email/vendor/symfony/polyfill-intl-idn/Idn.php +++ b/plugins/email/vendor/symfony/polyfill-intl-idn/Idn.php @@ -145,6 +145,10 @@ final class Idn */ public static function idn_to_ascii($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = []) { + if (\PHP_VERSION_ID > 80400 && '' === $domainName) { + throw new \ValueError('idn_to_ascii(): Argument #1 ($domain) cannot be empty'); + } + if (self::INTL_IDNA_VARIANT_2003 === $variant) { @trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED); } @@ -198,6 +202,10 @@ final class Idn */ public static function idn_to_utf8($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = []) { + if (\PHP_VERSION_ID > 80400 && '' === $domainName) { + throw new \ValueError('idn_to_utf8(): Argument #1 ($domain) cannot be empty'); + } + if (self::INTL_IDNA_VARIANT_2003 === $variant) { @trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED); } diff --git a/plugins/email/vendor/symfony/polyfill-php80/PhpToken.php b/plugins/email/vendor/symfony/polyfill-php80/PhpToken.php index fe6e691..cd78c4c 100644 --- a/plugins/email/vendor/symfony/polyfill-php80/PhpToken.php +++ b/plugins/email/vendor/symfony/polyfill-php80/PhpToken.php @@ -29,7 +29,7 @@ class PhpToken implements \Stringable public $text; /** - * @var int + * @var -1|positive-int */ public $line; @@ -38,6 +38,9 @@ class PhpToken implements \Stringable */ public $pos; + /** + * @param -1|positive-int $line + */ public function __construct(int $id, string $text, int $line = -1, int $position = -1) { $this->id = $id; @@ -80,7 +83,7 @@ class PhpToken implements \Stringable } /** - * @return static[] + * @return list */ public static function tokenize(string $code, int $flags = 0): array { diff --git a/plugins/error/.gitignore b/plugins/error/.gitignore new file mode 100644 index 0000000..5ce2fa3 --- /dev/null +++ b/plugins/error/.gitignore @@ -0,0 +1,9 @@ +# OS Generated +.DS_Store* +ehthumbs.db +Icon? +Thumbs.db +*.swp + +# phpstorm +.idea/* diff --git a/plugins/error/CHANGELOG.md b/plugins/error/CHANGELOG.md index eec5161..80cd6cb 100644 --- a/plugins/error/CHANGELOG.md +++ b/plugins/error/CHANGELOG.md @@ -1,3 +1,10 @@ +# v1.8.1 +## 08/28/2025 + +1. [](#bugfix) + * Fixed an issue with error thrown during `bin/plugin error log` commands [#46](https://github.com/getgrav/grav-plugin-error/issues/46) + * Fixed output issue not showing all messages with log CLI command + # v1.8.0 ## 09/07/2021 diff --git a/plugins/error/blueprints.yaml b/plugins/error/blueprints.yaml index b642158..9525760 100644 --- a/plugins/error/blueprints.yaml +++ b/plugins/error/blueprints.yaml @@ -1,5 +1,5 @@ name: Error -version: 1.8.0 +version: 1.8.1 description: Displays the error page. type: plugin slug: error diff --git a/plugins/error/cli/LogCommand.php b/plugins/error/cli/LogCommand.php index d29354a..583d231 100644 --- a/plugins/error/cli/LogCommand.php +++ b/plugins/error/cli/LogCommand.php @@ -85,7 +85,10 @@ class LogCommand extends ConsoleCommand $lines = array_slice($lines, -($this->options['limit'] + 1)); foreach ($lines as $line) { - $this->output->writeln($this->parseLine($line)); + $parsed = $this->parseLine($line); + if ($parsed !== null) { + $this->output->writeln($parsed); + } } } @@ -96,19 +99,52 @@ class LogCommand extends ConsoleCommand */ protected function parseLine($line) { - $bit = explode(': ', $line); - $line1 = explode('] ', $bit[0]); - - if (!$line1[0]) { + // Skip empty lines + if (empty(trim($line))) { return null; } + $bit = explode(': ', $line); + + // Check if we have at least the basic structure + if (count($bit) < 2) { + return null; + } + + $line1 = explode('] ', $bit[0]); + + if (!isset($line1[0]) || !$line1[0]) { + return null; + } + + // Check if we have the log type + if (!isset($line1[1])) { + return null; + } + + // Handle both formats: "Message - Trace" and just "Message" $line2 = explode(' - ', $bit[1]); $date = $line1[0] . ']'; $type = str_replace('grav.', '', $line1[1]); - $color = $this->colors[$type]; - $error = $line2[0]; + + // Check if the log type has a color defined + if (!isset($this->colors[$type])) { + $color = 'white'; // Default color for unknown types + } else { + $color = $this->colors[$type]; + } + + // Get the full message (everything after the log level) + // Join back with ': ' in case the message itself contains colons + $fullMessage = implode(': ', array_slice($bit, 1)); + + // If there's a dash separator, use the part before it, otherwise use the full message + if (count($line2) > 1) { + $error = $line2[0]; + } else { + $error = $fullMessage; + } $trace = implode(': ', array_slice($bit, 2)); $output = []; diff --git a/plugins/error/hebe.json b/plugins/error/hebe.json new file mode 100644 index 0000000..3ca6ad8 --- /dev/null +++ b/plugins/error/hebe.json @@ -0,0 +1,15 @@ +{ + "project":"grav-plugin-error", + "platforms":{ + "grav":{ + "nodes":{ + "plugin":[ + { + "source":"/", + "destination":"/user/plugins/error" + } + ] + } + } + } +} diff --git a/plugins/form/.gitignore b/plugins/form/.gitignore index 1df656a..f6e6f4f 100644 --- a/plugins/form/.gitignore +++ b/plugins/form/.gitignore @@ -3,3 +3,7 @@ /.idea node_modules *.js.map +/repomix-output.md +/repomix.config.json +/.repomixignore +/grav-form-plugin.md diff --git a/plugins/form/CHANGELOG.md b/plugins/form/CHANGELOG.md index 923e487..bd04e22 100644 --- a/plugins/form/CHANGELOG.md +++ b/plugins/form/CHANGELOG.md @@ -1,1317 +1,1379 @@ +# v8.1.0 +## 11/03/2025 + +1. [](#bugfix) + - Fixed an issue with DropZone file field with `js_pipeline` enabled [#621](https://github.com/getgrav/grav-plugin-form/issues/621) + - Fixed general pipeline issues with form javascript +1. [](#improved) + - Added a field-based configuration of basic-captcha [#622](https://github.com/getgrav/grav-plugin-form/issues/622) + - Improved filesize min/max error handling + +# v8.0.6 +## 10/07/2025 + +1. [](#bugfix) + - Fixes recaptcha v2 regression issue [#617](https://github.com/getgrav/grav-plugin-form/issues/617) + +# v8.0.5 +## 09/23/2025 + +1. [](#bugfix) + - Fixes captcha when form name contains hyphens [#618](https://github.com/getgrav/grav-plugin-form/issues/618) + +# v8.0.4 +## 08/28/2025 + +1. [](#bugfix) + - Fixes `CaptchaManager::validateCaptcha()` not working with PHP 7.4 + +# v8.0.3 +## 08/25/2025 + +1. [](#bugfix) + - Fixes for basic captcha default size + blueprints + +# v8.0.2 +## 08/25/2025 + +1. [](#bugfix) + - Case sensitivity issues with `ReCaptchaProvider` class + +# v8.0.1 +## 08/25/2025 + +1. [](#bugfix) + - Fixed error: Default value of params with a class can only be null + +# v8.0.0 +## 08/25/2025 + +1. [](#new) + - Rewrote XHR support to be more robust and easier to use + - Added `hCpatcha` field support + - Added `Turnstile` XHR support + - Added ability to support 3rd party captcha mechanisms + - Added `Filepond` field support for alternate upload type + - Dropzone XHR support + - PHP 8.4 compatibility +1. [](#improved) + - Added support for `data_label:` in fields for use with data twig templates to override the displayed label + - Matched formatting of minus operator in BasicCaptcha to plus operator [#596](https://github.com/getgrav/grav-plugin-form/pull/596) + - Dynamic field proxying + # v7.4.2 ## 10/28/2024 1. [](#improved) - * Enhanced the `input` tag to include a disabled attribute [$601](https://github.com/getgrav/grav-plugin-form/pull/601) - * Updated logging methods to support Monolog2+ + +- Enhanced the `input` tag to include a disabled attribute [$601](https://github.com/getgrav/grav-plugin-form/pull/601) +- Updated logging methods to support Monolog2+ # v7.4.1 ## 10/22/2024 1. [](#improved) - * `honeypot` field tweaks + +- `honeypot` field tweaks # v7.4.0 ## 03/29/2024 1. [](#improved) - * Better modular form support - * Support for multiple Ajax/XHR forms on a single page either modular-based or manually injected - * Yarn libraries updated + - Better modular form support + - Support for multiple Ajax/XHR forms on a single page either modular-based or manually injected + - Yarn libraries updated 1. [](#bugfix) - * Fixed an issue with cache being tied to `core` cache_id rather than the more appropriate `pages` cache_id, which could lead to form properties being cached even when modified. + - Fixed an issue with cache being tied to `core` cache_id rather than the more appropriate `pages` cache_id, which could lead to form properties being cached even when modified. # v7.3.0 ## 12/14/2023 1. [](#new) - * Added XHR/Ajax form submission as an option in the form blueprint. See [Learn Forms](https://learn.getgrav.org/17/forms/forms/how-to-ajax-submission) for details. + - Added XHR/Ajax form submission as an option in the form blueprint. See [Learn Forms](https://learn.getgrav.org/17/forms/forms/how-to-ajax-submission) for details. # v7.2.2 ## 12/13/2023 1. [](#improved) - * Add _inline errors_ for `file` field. Useful in combination with `form: no-validate: true` form setting. - * Validate filename against `uploads_dangerous_extensions` when using the `save:` action + - Add _inline errors_ for `file` field. Useful in combination with `form: no-validate: true` form setting. + - Validate filename against `uploads_dangerous_extensions` when using the `save:` action 1. [](#bugfix) - * Cleared 'basic captcha' value when invalid + - Cleared 'basic captcha' value when invalid # v7.2.1 ## 06/27/2023 1. [](#improved) - * Added some optional debug output to help isolate form loading problems + - Added some optional debug output to help isolate form loading problems 1. [](#bugfix) - * More robust fix for multi-language form caching + - More robust fix for multi-language form caching # v7.2.0 ## 06/21/2023 1. [](#bugfix) - * Fixed a long-standing bug with cached forms not working properly in multi-language scenarios + - Fixed a long-standing bug with cached forms not working properly in multi-language scenarios # v7.1.3 ## 05/09/2023 1. [](#improved) - * Removed `FILTER_SANITIZE_STRING` input filter in favor of `htmlspecialchars(strip_tags())` - * Fixed a deprecated message when using `Route::_toString()` - * Require Grav `v1.7.41` as it contains `GRAV_SANITIZE_STRING` constant + - Removed `FILTER_SANITIZE_STRING` input filter in favor of `htmlspecialchars(strip_tags())` + - Fixed a deprecated message when using `Route::_toString()` + - Require Grav `v1.7.41` as it contains `GRAV_SANITIZE_STRING` constant # v7.1.2 ## 01/08/2023 1. [](#bugfix) - * Fixes issue with multiplication type BasicCaptcha Math Captcha [#587](https://github.com/getgrav/grav-plugin-form/issues/587) + - Fixes issue with multiplication type BasicCaptcha Math Captcha [#587](https://github.com/getgrav/grav-plugin-form/issues/587) # v7.1.1 ## 11/29/2022 1. [](#bugfix) - * Fix missing blueprint entries for Turnstile configuration [#583](https://github.com/getgrav/grav-plugin-form/issues/583) + - Fix missing blueprint entries for Turnstile configuration [#583](https://github.com/getgrav/grav-plugin-form/issues/583) # v7.1.0 ## 11/16/2022 1. [](#new) - * Added Cloudflare's `turnstile` captcha integration [documentation](https://learn.getgrav.org/17/forms/forms/fields-available#turnstile-field-cloudflare) + - Added Cloudflare's `turnstile` captcha integration [documentation](https://learn.getgrav.org/17/forms/forms/fields-available#turnstile-field-cloudflare) # v7.0.2 ## 10/05/2022 1. [](#bugfix) - * Fix for modular form definitions at root-level (useful for storing shared forms) + - Fix for modular form definitions at root-level (useful for storing shared forms) # v7.0.1 ## 09/20/2022 1. [](#improved) - * Provided some basic CSS styling for new captcha field + - Provided some basic CSS styling for new captcha field # v7.0.0 ## 09/20/2022 1. [](#new) - * Added a new custom `basic-captcha` option with **character** and **math** puzzles. No 3rd-part service required. + - Added a new custom `basic-captcha` option with **character** and **math** puzzles. No 3rd-part service required. # v6.0.4 ## 08/08/2022 1. [](#improved) - * Added `attributes` to field [#573](https://github.com/getgrav/grav-plugin-form/pull/573) + - Added `attributes` to field [#573](https://github.com/getgrav/grav-plugin-form/pull/573) # v6.0.3 ## 05/05/2022 1. [](#bugfix) - * Regression: Fixed broken `addForm()` method + - Regression: Fixed broken `addForm()` method # v6.0.2 ## 05/02/2022 1. [](#bugfix) - * Fixed `forms({ route: '/forms/_myform' })` not finding form from non-routable pages (second try) + - Fixed `forms({ route: '/forms/_myform' })` not finding form from non-routable pages (second try) # v6.0.1 ## 04/25/2022 1. [](#improved) - * Improved `prepare_form_field()` twig method to include `plain_name` + - Improved `prepare_form_field()` twig method to include `plain_name` 1. [](#bugfix) - * Fixed `columns` and `column` fields with `.dotted` variables inside to ignore columns and column names - * Fixed `forms({ route: '/forms/_myform' })` not finding forms from non-routable pages + - Fixed `columns` and `column` fields with `.dotted` variables inside to ignore columns and column names + - Fixed `forms({ route: '/forms/_myform' })` not finding forms from non-routable pages # v6.0.0 ## 03/28/2022 1. [](#improved) - * Added log warning when trying to access form by non-unique name - * Optimized form caching by not initializing the forms in `onPageProcessed` event anymore - * **BACKWARD COMPATIBILITY**: As form initialization has been delayed, logic relaying on `onPageProcessed` with forms may not work anymore + - Added log warning when trying to access form by non-unique name + - Optimized form caching by not initializing the forms in `onPageProcessed` event anymore + - **BACKWARD COMPATIBILITY**: As form initialization has been delayed, logic relaying on `onPageProcessed` with forms may not work anymore 1. [](#bugfix) - * Fixed select field where option is iterable (#558) - * Fixed `FormPlugin::getForm()` to properly search the current page first - * Fixed `FormPlugin::getForm()` to ignore fallback if the page was given as parameter - * Fixed dynamic forms to work with cache turned on - * Fix nested `toggleable`: originalValue now checks with `??` instead of `is defined` + - Fixed select field where option is iterable (#558) + - Fixed `FormPlugin::getForm()` to properly search the current page first + - Fixed `FormPlugin::getForm()` to ignore fallback if the page was given as parameter + - Fixed dynamic forms to work with cache turned on + - Fix nested `toggleable`: originalValue now checks with `??` instead of `is defined` # v5.1.7 ## 03/14/2022 1. [](#new) - * Added `access` support for buttons + - Added `access` support for buttons 2. [](#bugfix) - * Fixed tabs in the frontend to ensure JS is loaded - + - Fixed tabs in the frontend to ensure JS is loaded + # v5.1.6 ## 02/07/2022 1. [](#bugfix) - * Fixed Select field when using OptGroups, not allowing key/values [#541](https://github.com/getgrav/grav-plugin-form/issues/541) - * Support for translatable OptGroup labels in Select field [#540](https://github.com/getgrav/grav-plugin-form/issues/540) + - Fixed Select field when using OptGroups, not allowing key/values [#541](https://github.com/getgrav/grav-plugin-form/issues/541) + - Support for translatable OptGroup labels in Select field [#540](https://github.com/getgrav/grav-plugin-form/issues/540) # v5.1.5 ## 01/24/2022 1. [](#bugfix) - * Fixed case in selectize field where custom new entries would not be stored in non `multiple` lists + - Fixed case in selectize field where custom new entries would not be stored in non `multiple` lists # v5.1.4 ## 11/16/2021 1. [](#bugfix) - * Fixed buttons no longer rendered [#537](https://github.com/getgrav/grav-plugin-form/issues/537) - * Allow `select` field to customize `autocomplete` attribute + - Fixed buttons no longer rendered [#537](https://github.com/getgrav/grav-plugin-form/issues/537) + - Allow `select` field to customize `autocomplete` attribute # v5.1.3 ## 10/26/2021 1. [](#new) - * Require **Grav 1.7.24** - * Added support to disable a form, making it readonly - * Added `|value_and_label` Twig filter to convert options to value/label pairs + - Require **Grav 1.7.24** + - Added support to disable a form, making it readonly + - Added `|value_and_label` Twig filter to convert options to value/label pairs 1. [](#improved) - * Improved Twig function `include_form_field()` to allow the second parameter to be an array of layouts + - Improved Twig function `include_form_field()` to allow the second parameter to be an array of layouts # v5.1.2 ## 09/29/2021 1. [](#improved) - * Improved support for Twig 2/3 + - Improved support for Twig 2/3 # v5.1.1 ## 09/14/2021 1. [](#new) - * Require **Grav 1.7.21** + - Require **Grav 1.7.21** 1. [](#bugfix) - * Fixed accidental admin plugin requirement for YAML filter in the form - * Fixed `GravForm.config` JS to have correct `current_url` and `current_params` settings - * Fixed custom file upload and remove routes - * Fixed bug where uploading file has no effect [#349](https://github.com/getgrav/grav-plugin-form/issues/349) - * Fixed field with numeric field name in `prepare_form_fields()` [#530](https://github.com/getgrav/grav-plugin-form/issues/530) + - Fixed accidental admin plugin requirement for YAML filter in the form + - Fixed `GravForm.config` JS to have correct `current_url` and `current_params` settings + - Fixed custom file upload and remove routes + - Fixed bug where uploading file has no effect [#349](https://github.com/getgrav/grav-plugin-form/issues/349) + - Fixed field with numeric field name in `prepare_form_fields()` [#530](https://github.com/getgrav/grav-plugin-form/issues/530) # v5.1.0 ## 08/31/2021 1. [](#new) - * Require **Grav 1.7.19** - * Added support for custom form layouts - * Added Twig function `prepare_form_fields()` and `prepare_form_field()` to prepare form fields and field array - * Added Twig function `include_form_field()` to get all include paths for the field type - * Make `nonce` to a customizable field + - Require **Grav 1.7.19** + - Added support for custom form layouts + - Added Twig function `prepare_form_fields()` and `prepare_form_field()` to prepare form fields and field array + - Added Twig function `include_form_field()` to get all include paths for the field type + - Make `nonce` to a customizable field 1. [](#bugfix) - * Fixed bad cookie value for remembering the position of nested tabs + - Fixed bad cookie value for remembering the position of nested tabs # v5.0.3 ## 06/15/2021 1. [](#improved) - * Removed the windows `\r\n` line breaks + extraneous escaping in `data.txt.twig` - * Use `base64_encode` filter rather than function + - Removed the windows `\r\n` line breaks + extraneous escaping in `data.txt.twig` + - Use `base64_encode` filter rather than function # v5.0.2 ## 04/23/2021 1. [](#improved) - * Better message for invalid nonce [#513](https://github.com/getgrav/grav-plugin-form/issues/513) - * Better error if `Form::getPage()` gets called too early [#518](https://github.com/getgrav/grav-plugin-form/issues/518) - * Added support for custom Toggle id + - Better message for invalid nonce [#513](https://github.com/getgrav/grav-plugin-form/issues/513) + - Better error if `Form::getPage()` gets called too early [#518](https://github.com/getgrav/grav-plugin-form/issues/518) + - Added support for custom Toggle id # v5.0.1 ## 03/17/2021 1. [](#improved) - * Updated `de` language [#510](https://github.com/getgrav/grav-plugin-form/pull/510) - * Better field type definitions for avatar and file fields + - Updated `de` language [#510](https://github.com/getgrav/grav-plugin-form/pull/510) + - Better field type definitions for avatar and file fields 1. [](#bugfix) - * Fixed toggle highlight when there's no value - * Fixed wrong selected values in `select` field with integer and boolean values - * Fixed changelog display [#502](https://github.com/getgrav/grav-plugin-form/pull/502) + - Fixed toggle highlight when there's no value + - Fixed wrong selected values in `select` field with integer and boolean values + - Fixed changelog display [#502](https://github.com/getgrav/grav-plugin-form/pull/502) # v5.0.0 ## 02/17/2021 1. [](#new) - * Requires **Grav 1.7.0** - * Allow admins to temporarily disable form process actions by setting the value to `false` [#481](https://github.com/getgrav/grav-plugin-form/pull/481) + - Requires **Grav 1.7.0** + - Allow admins to temporarily disable form process actions by setting the value to `false` [#481](https://github.com/getgrav/grav-plugin-form/pull/481) 1. [](#improved) - * Add `id` attribute to hidden field [#495](https://github.com/getgrav/grav-plugin-form/pull/495) - * Escape text as YAML in multi-line textarea [#464](https://github.com/getgrav/grav-plugin-form/pull/464) + - Add `id` attribute to hidden field [#495](https://github.com/getgrav/grav-plugin-form/pull/495) + - Escape text as YAML in multi-line textarea [#464](https://github.com/getgrav/grav-plugin-form/pull/464) 1. [](#bugfix) - * Fixed reCaptcha v3 incompatibility with multiple forms on the same page sharing different actions [#416](https://github.com/getgrav/grav-plugin-form/issues/416) - * Toggle fields do not save `false` if they are `toggleable` [#497](https://github.com/getgrav/grav-plugin-form/issues/497) - * Data template fixes [#494](https://github.com/getgrav/grav-plugin-form/pull/494) - * Fix deprecated Twig method + - Fixed reCaptcha v3 incompatibility with multiple forms on the same page sharing different actions [#416](https://github.com/getgrav/grav-plugin-form/issues/416) + - Toggle fields do not save `false` if they are `toggleable` [#497](https://github.com/getgrav/grav-plugin-form/issues/497) + - Data template fixes [#494](https://github.com/getgrav/grav-plugin-form/pull/494) + - Fix deprecated Twig method # v4.3.1 ## 01/31/2021 1. [](#improved) - * Updated deprecated `Twig_SimpleFunction` code - * Added Lithuanian translation [#485](https://github.com/getgrav/grav-plugin-form/pull/485) + - Updated deprecated `Twig_SimpleFunction` code + - Added Lithuanian translation [#485](https://github.com/getgrav/grav-plugin-form/pull/485) 1. [](#bugfix) - * Fixed state of the checkbox if no value is provided - * Fixed evaluating default value in `hidden` field (thanks @NicoHood) - * Fixed default value to come from the `Form` in overridable field (thanks @NicoHood) - * Fix for disabling `client_side_validation` [#482](https://github.com/getgrav/grav-plugin-form/pull/482) - * Fix for translations in `select` field in data template [#475](https://github.com/getgrav/grav-plugin-form/pull/475) - * PHPDoc fixes + - Fixed state of the checkbox if no value is provided + - Fixed evaluating default value in `hidden` field (thanks @NicoHood) + - Fixed default value to come from the `Form` in overridable field (thanks @NicoHood) + - Fix for disabling `client_side_validation` [#482](https://github.com/getgrav/grav-plugin-form/pull/482) + - Fix for translations in `select` field in data template [#475](https://github.com/getgrav/grav-plugin-form/pull/475) + - PHPDoc fixes # v4.3.0 ## 12/14/2020 1. [](#new) - * Added a new ‘condition’ attribute for tab for logic to process if it should display or not + - Added a new ‘condition’ attribute for tab for logic to process if it should display or not 1. [](#improved) - * Added priority to form translations/config + - Added priority to form translations/config 1. [](#bugfix) - * Fix admin access check [#463](https://github.com/getgrav/grav-plugin-form/pull/463) + - Fix admin access check [#463](https://github.com/getgrav/grav-plugin-form/pull/463) # v4.2.0 ## 12/02/2020 1. [](#improved) - * Added support for arbitrary `attributes` on `form`, `textarea` and `checkbox` and `buttons`. [#447](https://github.com/getgrav/grav-plugin-form/issues/447) [#448](https://github.com/getgrav/grav-plugin-form/issues/448) - * Better support for array field key/value when either key or value are left empty - * Allow data-* form parameters to be used as
attributes. [#336](https://github.com/getgrav/grav-plugin-form/pull/336) - * Allow action param when including form partial [#410](https://github.com/getgrav/grav-plugin-form/pull/410) - * Also support validate min/max for textarea [#455](https://github.com/getgrav/grav-plugin-form/pull/455) - * Translate form labels also in text file [#444](https://github.com/getgrav/grav-plugin-form/pull/448) + - Added support for arbitrary `attributes` on `form`, `textarea` and `checkbox` and `buttons`. [#447](https://github.com/getgrav/grav-plugin-form/issues/447) [#448](https://github.com/getgrav/grav-plugin-form/issues/448) + - Better support for array field key/value when either key or value are left empty + - Allow data-\* form parameters to be used as attributes. [#336](https://github.com/getgrav/grav-plugin-form/pull/336) + - Allow action param when including form partial [#410](https://github.com/getgrav/grav-plugin-form/pull/410) + - Also support validate min/max for textarea [#455](https://github.com/getgrav/grav-plugin-form/pull/455) + - Translate form labels also in text file [#444](https://github.com/getgrav/grav-plugin-form/pull/448) 1. [](#bugfix) - * Fixed KeepAlive issue where too large of a session value would fire the keep alive immediately - * Fixed stringable objects breaking the inputs - * Remove unused route variable from `file` field - * Fix condition for required attribute in toggle field [#451](https://github.com/getgrav/grav-plugin-form/pull/451) - * Fix form data template when select field is set to multiple [#452](https://github.com/getgrav/grav-plugin-form/pull/452) - * Fix has-errors for select and other fields [#454](https://github.com/getgrav/grav-plugin-form/pull/454) - * Fix #453 section title level [#459](https://github.com/getgrav/grav-plugin-form/pull/459) + - Fixed KeepAlive issue where too large of a session value would fire the keep alive immediately + - Fixed stringable objects breaking the inputs + - Remove unused route variable from `file` field + - Fix condition for required attribute in toggle field [#451](https://github.com/getgrav/grav-plugin-form/pull/451) + - Fix form data template when select field is set to multiple [#452](https://github.com/getgrav/grav-plugin-form/pull/452) + - Fix has-errors for select and other fields [#454](https://github.com/getgrav/grav-plugin-form/pull/454) + - Fix #453 section title level [#459](https://github.com/getgrav/grav-plugin-form/pull/459) # v4.1.2 ## 10/07/2020 1. [](#bugfix) - * Added some missing class attributes + - Added some missing class attributes # v4.1.1 ## 09/01/2020 1. [](#bugfix) - * Key field should not escape the value + - Key field should not escape the value # v4.1.0 ## 07/29/2020 1. [](#new) - * Support JSON based form submissions + - Support JSON based form submissions 1. [](#improved) - * Improved handling of error messages with more details + translation [#428](https://github.com/getgrav/grav-plugin-form/pull/428) [#429](https://github.com/getgrav/grav-plugin-form/pull/429) - * Various improvements for nested form data in `data.html.twig` and `data.txt.twig` - * Use `|length` rather than `|count` twig filter - * Various language updates + - Improved handling of error messages with more details + translation [#428](https://github.com/getgrav/grav-plugin-form/pull/428) [#429](https://github.com/getgrav/grav-plugin-form/pull/429) + - Various improvements for nested form data in `data.html.twig` and `data.txt.twig` + - Use `|length` rather than `|count` twig filter + - Various language updates 1. [](#bugfix) - * Disabled the EXIF library for Dropzone for fixing the orientation as it was getting applied twice [#1923](https://github.com/getgrav/grav-plugin-admin/issues/1923) - * Forked Dropzone fo fix issue with Resize + EXIF orientation [#1923](https://github.com/getgrav/grav-plugin-admin/issues/1923) + - Disabled the EXIF library for Dropzone for fixing the orientation as it was getting applied twice [#1923](https://github.com/getgrav/grav-plugin-admin/issues/1923) + - Forked Dropzone fo fix issue with Resize + EXIF orientation [#1923](https://github.com/getgrav/grav-plugin-admin/issues/1923) # v4.0.10 ## 06/08/2020 1. [](#improved) - * Updated languages + - Updated languages 1. [](#bugfix) - * Fixed redirect causing empty form on homepage forms with no action set + - Fixed redirect causing empty form on homepage forms with no action set # v4.0.9 ## 06/03/2020 1. [](#bugfix) - * Fixed bad `id` attribute on `checkbox` field [#421](https://github.com/getgrav/grav-plugin-form/issues/421) - * Show the `description` span even for an empty description [#313](https://github.com/getgrav/grav-plugin-form/pull/313) + - Fixed bad `id` attribute on `checkbox` field [#421](https://github.com/getgrav/grav-plugin-form/issues/421) + - Show the `description` span even for an empty description [#313](https://github.com/getgrav/grav-plugin-form/pull/313) # v4.0.8 ## 04/30/2020 1. [](#bugfix) - * Fixed issue with `force_bool` in `toggle` field to be more robust + - Fixed issue with `force_bool` in `toggle` field to be more robust # v4.0.7 ## 04/27/2020 1. [](#new) - * Added ability to hide form fields in `data.html.twig` and `data.txt.twig` with `field.store: false` + - Added ability to hide form fields in `data.html.twig` and `data.txt.twig` with `field.store: false` 1. [](#improved) - * Updated node dependencies - * Added new `force_bool: true|false` option to `toggle` field to cast strings for use in BC situations + - Updated node dependencies + - Added new `force_bool: true|false` option to `toggle` field to cast strings for use in BC situations 1. [](#bugfix) - * Fix markdown links in changelog [#415](https://github.com/getgrav/grav-plugin-form/pull/415) + - Fix markdown links in changelog [#415](https://github.com/getgrav/grav-plugin-form/pull/415) # v4.0.6 ## 03/19/2020 1. [](#new) - * CHANGE: Form labels are now displayed in `raw` format so you can use HTML in them - * Added support for `name` attribute on buttons [#411](https://github.com/getgrav/grav-plugin-form/issues/411) + - CHANGE: Form labels are now displayed in `raw` format so you can use HTML in them + - Added support for `name` attribute on buttons [#411](https://github.com/getgrav/grav-plugin-form/issues/411) 1. [](#improved) - * Added support for `classes` option in `avatar` field - * Recompiled JS with latest NPM libraries + - Added support for `classes` option in `avatar` field + - Recompiled JS with latest NPM libraries 1. [](#bugfix) - * Fixed password field outputting the contents to HTML (will now always be empty when loading the page) - * Escape default output in `formdata.html.twig` [#384](https://github.com/getgrav/grav-plugin-form/issues/384) - * Better JS rendering of captcha field scripts for VueJS template compatibility + - Fixed password field outputting the contents to HTML (will now always be empty when loading the page) + - Escape default output in `formdata.html.twig` [#384](https://github.com/getgrav/grav-plugin-form/issues/384) + - Better JS rendering of captcha field scripts for VueJS template compatibility # v4.0.5 ## 03/05/2020 1. [](#bugfix) - * Fixed form actions that post to page anchors should not have current base_url added (e.g. `#contact-us`) - * Fixed toggleable buttons no longer holding false state [#406](https://github.com/getgrav/grav-plugin-form/issues/406) + - Fixed form actions that post to page anchors should not have current base_url added (e.g. `#contact-us`) + - Fixed toggleable buttons no longer holding false state [#406](https://github.com/getgrav/grav-plugin-form/issues/406) # v4.0.4 ## 02/25/2020 1. [](#bugfix) - * Fix for `enctype` in multipart forms [#408](https://github.com/getgrav/grav-plugin-form/issues/408) + - Fix for `enctype` in multipart forms [#408](https://github.com/getgrav/grav-plugin-form/issues/408) # v4.0.3 ## 02/11/2020 1. [](#new) - * Pass phpstan level 1 tests + - Pass phpstan level 1 tests # v4.0.2 ## 02/03/2020 1. [](#improved) - * Allow checkbox field to have custom value, default to 1 + - Allow checkbox field to have custom value, default to 1 1. [](#bugfix) - * Fixed `toggle` field not working with `toggleable: true` - * Fixed fatal error when form type is disabled + - Fixed `toggle` field not working with `toggleable: true` + - Fixed fatal error when form type is disabled # v4.0.1 ## 01/02/2020 1. [](#improved) - * Improve Grav 1.7 support by not using deprecated `$page->modular()` call - * Use form scope if it is defined + - Improve Grav 1.7 support by not using deprecated `$page->modular()` call + - Use form scope if it is defined 1. [](#bugfix) - * Fixed bad HTML in select, radio, key, toggle, checkbox ad textarea when using tabindex attribute - * Fixed bad looking `tabs` field with a single tab in admin + - Fixed bad HTML in select, radio, key, toggle, checkbox ad textarea when using tabindex attribute + - Fixed bad looking `tabs` field with a single tab in admin # v4.0.0 ## 11/06/2019 1. [](#new) - * Added `tabindex` to global attributes of default field - * Add ability to Sanitize SVGs on upload (Grav 1.7+ required) + - Added `tabindex` to global attributes of default field + - Add ability to Sanitize SVGs on upload (Grav 1.7+ required) 1. [](#improved) - * Deprecate `select_optgroup` as `select` can handle optgroups now - * Added missing tabindex checks - * Refactored field inheritance to make things more reliable - * Removed jQuery dependency for the reCaptcha field and VanillaJS-ified it instead - * Removed a stray `dump()` command - * Refactored the base `templates/forms/default` twig templates to make things more extensible - * Added a new `templates/forms/layouts` set of twit templates to allow for easier customization + - Deprecate `select_optgroup` as `select` can handle optgroups now + - Added missing tabindex checks + - Refactored field inheritance to make things more reliable + - Removed jQuery dependency for the reCaptcha field and VanillaJS-ified it instead + - Removed a stray `dump()` command + - Refactored the base `templates/forms/default` twig templates to make things more extensible + - Added a new `templates/forms/layouts` set of twit templates to allow for easier customization 1. [](#bugfix) - * Fixed `Badly encoded JSON data` warning when uploading files [grav#2663](https://github.com/getgrav/grav/issues/2663) - * Fixed a number of escaping issues [#368](https://github.com/getgrav/grav-plugin-form/issues/368) + - Fixed `Badly encoded JSON data` warning when uploading files [grav#2663](https://github.com/getgrav/grav/issues/2663) + - Fixed a number of escaping issues [#368](https://github.com/getgrav/grav-plugin-form/issues/368) # v3.0.9 ## 09/19/2019 1. [](#improved) - * Removed jQuery dependency for the reCaptcha field and VanillaJS-ified it instead - * Updated to ReCaptcha library version `1.2.3` + - Removed jQuery dependency for the reCaptcha field and VanillaJS-ified it instead + - Updated to ReCaptcha library version `1.2.3` 1. [](#bugfix) - * Fixed `Badly encoded JSON data` warning when uploading files [grav#2663](https://github.com/getgrav/grav/issues/2663) + - Fixed `Badly encoded JSON data` warning when uploading files [grav#2663](https://github.com/getgrav/grav/issues/2663) # v3.0.8 ## 08/14/2019 1. [](#improved) - * Change form save action location to `user-data://` stream [#353](https://github.com/getgrav/grav-plugin-form/issues/353) - * Updated `eu`, `fr` and `pl` language - * Make `Form::initialize()` chainable - * Added `folder` option to `save:` action with fallback + - Change form save action location to `user-data://` stream [#353](https://github.com/getgrav/grav-plugin-form/issues/353) + - Updated `eu`, `fr` and `pl` language + - Make `Form::initialize()` chainable + - Added `folder` option to `save:` action with fallback 1. [](#bugfix) - * Fixed Submit & Redirect not working as expected [#355](https://github.com/getgrav/grav-plugin-form/issues/355) - * Fixed oversensitive refresh prevention [#354](https://github.com/getgrav/grav-plugin-form/issues/354) - * Fixed issue with Form JS when pipeline is enabled [grav#2592](https://github.com/getgrav/grav/issues/2592) - * Fixed `accept` for SVG in file field [#364](https://github.com/getgrav/grav-plugin-form/pull/364) - * Fixed issue with plugin not returning expected form [#309](https://github.com/getgrav/grav-plugin-form/pull/309) - * Fixed form message not showing up after reset process - * Fixed form fields inside a single tab not using value from the form object if it is available - * Fixed file form field failing resolution checks in certain circumstances + - Fixed Submit & Redirect not working as expected [#355](https://github.com/getgrav/grav-plugin-form/issues/355) + - Fixed oversensitive refresh prevention [#354](https://github.com/getgrav/grav-plugin-form/issues/354) + - Fixed issue with Form JS when pipeline is enabled [grav#2592](https://github.com/getgrav/grav/issues/2592) + - Fixed `accept` for SVG in file field [#364](https://github.com/getgrav/grav-plugin-form/pull/364) + - Fixed issue with plugin not returning expected form [#309](https://github.com/getgrav/grav-plugin-form/pull/309) + - Fixed form message not showing up after reset process + - Fixed form fields inside a single tab not using value from the form object if it is available + - Fixed file form field failing resolution checks in certain circumstances # v3.0.7 ## 07/01/2019 1. [](#bugfix) - * Fixed file upload when `$grav['user']` is not set [#352](https://github.com/getgrav/grav-plugin-form/issues/352) - * Fixed label markdown being escaped [#356](https://github.com/getgrav/grav-plugin-form/pull/356) + - Fixed file upload when `$grav['user']` is not set [#352](https://github.com/getgrav/grav-plugin-form/issues/352) + - Fixed label markdown being escaped [#356](https://github.com/getgrav/grav-plugin-form/pull/356) # v3.0.6 ## 06/24/2019 1. [](#bugfix) - * Fixed regression breaking forms external to the page in some sites - * Fixed regression with form action in sub-path folders + - Fixed regression breaking forms external to the page in some sites + - Fixed regression with form action in sub-path folders # v3.0.5 ## 06/21/2019 1. [](#new) - * Added support for form state saving with dynamic unique id appended to the URL + - Added support for form state saving with dynamic unique id appended to the URL 1. [](#improved) - * Avoid creating form state if there is no data to be saved + - Avoid creating form state if there is no data to be saved 1. [](#bugfix) - * Fixed missing check for maximum allowed files in `files` field - * Fixed unique form ids getting cached, they should change on every page reload + - Fixed missing check for maximum allowed files in `files` field + - Fixed unique form ids getting cached, they should change on every page reload # v3.0.4 ## 06/14/2019 1. [](#improved) - * Captcha field: fail silently and display error in console if site_key was not defined - * Support inline-errors, prepend, append in `textarea` + - Captcha field: fail silently and display error in console if site_key was not defined + - Support inline-errors, prepend, append in `textarea` 1. [](#bugfix) - * Use less-strict comparison when checking version 3 [#344](https://github.com/getgrav/grav-plugin-form/issues/344) + - Use less-strict comparison when checking version 3 [#344](https://github.com/getgrav/grav-plugin-form/issues/344) # v3.0.3 ## 05/09/2019 1. [](#new) - * Added Text `field.copy-to-clipboard` which can be used by admin plugin + - Added Text `field.copy-to-clipboard` which can be used by admin plugin 1. [](#bugfix) - * Fixed Flex route issue in list page - * Fix flex-height of signature field - * Fix for broken `field.recaptcha_site_key` [#344](https://github.com/getgrav/grav-plugin-form/issues/344) - * Fix for checkbox data lang string [#343](https://github.com/getgrav/grav-plugin-form/issues/343) - * Fix for duplicate inline error messages [#337](https://github.com/getgrav/grav-plugin-form/issues/337) - * Fixed bad folder permissions when creating folder for file uploads + - Fixed Flex route issue in list page + - Fix flex-height of signature field + - Fix for broken `field.recaptcha_site_key` [#344](https://github.com/getgrav/grav-plugin-form/issues/344) + - Fix for checkbox data lang string [#343](https://github.com/getgrav/grav-plugin-form/issues/343) + - Fix for duplicate inline error messages [#337](https://github.com/getgrav/grav-plugin-form/issues/337) + - Fixed bad folder permissions when creating folder for file uploads # v3.0.2 ## 04/22/2019 1. [](#new) - * Support for Google Recaptcha theme (light/dark) doesn't work in v3 yet. + - Support for Google Recaptcha theme (light/dark) doesn't work in v3 yet. 1. [](#improved) - * Visual upgrade for form field descriptions [#335](https://github.com/getgrav/grav-plugin-form/pull/335) + - Visual upgrade for form field descriptions [#335](https://github.com/getgrav/grav-plugin-form/pull/335) 1. [](#bugfix) - * Fixed issue with `recaptcha_not_validated` property not being used + - Fixed issue with `recaptcha_not_validated` property not being used # v3.0.1 ## 04/15/2019 1. [](#new) - * Added support for form task in blueprint + - Added support for form task in blueprint 1. [](#bugfix) - * Fix url field output in list view + - Fix url field output in list view # v3.0.0 ## 04/11/2019 1. [](#new) - * Allow streams in `file` field widget [#119](https://github.com/getgrav/grav-plugin-form/issues/119) - * Use new unified `|t` translate filter in all fields - * Google reCAPTCHA v3 support added - * Google reCAPTCHA v2 Invisible support added - * Added mutliple forms with reCAPTCHA support - * Form no longer extends `Grav\Common\Iterator` (may have some backward compatibility issues with plugins, likely not) - * Form now uses `NestedArrayAccessWithGetters` (with '/' separator) and `FormTrait` traits - * Added `view`, `key`, `ignore`, `section`, `toggle`, `tabs` and `tab` form fields - * Added support for `toggleable` inputs, which can be disabled/enabled by user - * Added `$grav['forms']` to allow plugins to better use forms [#307](https://github.com/getgrav/grav-plugin-form/pull/307) - * Added support for custom form types - * Forms can now remember their state after page reload with YAML `datasets: store-state: true` set in the fields - * Added `clear-state` AJAX task - * Added task to clear form flash - * Added support for file-upload and file-remove tasks - * Added ability to set a custom `clear_redirect_url` on a form - * Added `Form::setMessage()` method - * Added new form field templates for edit list table - * Requires Grav 1.6.0-beta.7 (and optionally Admin 1.9.0-beta.7) - * Backwards incompatibility: Do not allow static `Form::getNonce()` call, only `$form->getNonce()` works now - * Backwards incompatibility: All form field twig files are required to extend `field.html.twig` to work properly - * Allow using custom nonce field/action by setting `nonce.name` and `nonce.action` inside the form YAML - * Added `html: true` support for form buttons (will not escape the button value) - * Added `toggle`, `tabs` and `tab` form fields - * Added support for toggleable inputs, which can be disabled/enabled by user - * Added proper support for hiding form fields in blueprints by using dynamic property like `security@: admin.foobar` to any field + - Allow streams in `file` field widget [#119](https://github.com/getgrav/grav-plugin-form/issues/119) + - Use new unified `|t` translate filter in all fields + - Google reCAPTCHA v3 support added + - Google reCAPTCHA v2 Invisible support added + - Added mutliple forms with reCAPTCHA support + - Form no longer extends `Grav\Common\Iterator` (may have some backward compatibility issues with plugins, likely not) + - Form now uses `NestedArrayAccessWithGetters` (with '/' separator) and `FormTrait` traits + - Added `view`, `key`, `ignore`, `section`, `toggle`, `tabs` and `tab` form fields + - Added support for `toggleable` inputs, which can be disabled/enabled by user + - Added `$grav['forms']` to allow plugins to better use forms [#307](https://github.com/getgrav/grav-plugin-form/pull/307) + - Added support for custom form types + - Forms can now remember their state after page reload with YAML `datasets: store-state: true` set in the fields + - Added `clear-state` AJAX task + - Added task to clear form flash + - Added support for file-upload and file-remove tasks + - Added ability to set a custom `clear_redirect_url` on a form + - Added `Form::setMessage()` method + - Added new form field templates for edit list table + - Requires Grav 1.6.0-beta.7 (and optionally Admin 1.9.0-beta.7) + - Backwards incompatibility: Do not allow static `Form::getNonce()` call, only `$form->getNonce()` works now + - Backwards incompatibility: All form field twig files are required to extend `field.html.twig` to work properly + - Allow using custom nonce field/action by setting `nonce.name` and `nonce.action` inside the form YAML + - Added `html: true` support for form buttons (will not escape the button value) + - Added `toggle`, `tabs` and `tab` form fields + - Added support for toggleable inputs, which can be disabled/enabled by user + - Added proper support for hiding form fields in blueprints by using dynamic property like `security@: admin.foobar` to any field 1. [](#improved) - * Make fields `formname`, `uniqueid` and `honeypot` non-inputs in form validation - * Update all Form classes to rely on `PageInterface` instead of `Page` class - * Removed `media.upload_limit` references - * Added field type `hidden` to `ip` and `timestamp` actions - * Improved the `hidden` field logic to support `value` or `default` set - * Set the message globally on `messages` object when using a redirect in form - * Improved logic for finding the current form - * Added support for data-sets in `textarea` and `select` fields - * Simplify `shouldProcessForm()` logic - * Do not cache flat forms list, regenerate it instead - * Fixed some inconsistencies on how blueprints are handled - * Improved uploads handling, added new `upload: true|false` process - * Make `Form` implement `FormInterface` - * Added `field.size` in `array`, `select`, and `textarea` - * Enable forms in admin plugin - * Removed submit of unchecked fields in frontend - * Make sure that the images in the file field are not cached in browser - * Updated code to use PHP 7.1 features - * Added some extra blocks to `file` field to make it more extensible - * Added `field.classes` to form field to allow customization - * Used Google reCAPTCHA API all token validation - * Better filename and mime type handling - * Now using the new core Grav language prefix - * Make all form fields to extend `field.html.twig` + - Make fields `formname`, `uniqueid` and `honeypot` non-inputs in form validation + - Update all Form classes to rely on `PageInterface` instead of `Page` class + - Removed `media.upload_limit` references + - Added field type `hidden` to `ip` and `timestamp` actions + - Improved the `hidden` field logic to support `value` or `default` set + - Set the message globally on `messages` object when using a redirect in form + - Improved logic for finding the current form + - Added support for data-sets in `textarea` and `select` fields + - Simplify `shouldProcessForm()` logic + - Do not cache flat forms list, regenerate it instead + - Fixed some inconsistencies on how blueprints are handled + - Improved uploads handling, added new `upload: true|false` process + - Make `Form` implement `FormInterface` + - Added `field.size` in `array`, `select`, and `textarea` + - Enable forms in admin plugin + - Removed submit of unchecked fields in frontend + - Make sure that the images in the file field are not cached in browser + - Updated code to use PHP 7.1 features + - Added some extra blocks to `file` field to make it more extensible + - Added `field.classes` to form field to allow customization + - Used Google reCAPTCHA API all token validation + - Better filename and mime type handling + - Now using the new core Grav language prefix + - Make all form fields to extend `field.html.twig` 1. [](#bugfix) - * Fixed old way to access form name - * Fixed minor bugs - * Fixed null date/time in list view - * Fixed forms not being cached properly - * Fixed issue with `selectize`, automatically selecting an unintended value - * Throw exception if you try to `add` to a file and don't provide `filename` [#324](https://github.com/getgrav/grav-plugin-form/issues/324) - * Fixed file field saving with nested name - * Fixed file saving if destination folder does not exist - * Fixed FormFlash object not getting deleted on form post - * Regression: Fixed ignored form action [#318](https://github.com/getgrav/grav-plugin-form/issues/318) - * Regression: Fixed modular form submit not triggering the action sometimes - * Fixed modular form submits without defined `action: /path` inside the form - * Fixed form processing in nested modular pages - * Fixed container fields breaking values from the child fields - * Fixed form fields not accepting object values - * Fixed some form fields having no value for nested field sets - * Fixed double escaping of `file` type input JSON value - * Fixed double locking of file when calling processor save - * Fixed some missing backwards compatibility - * Fixed some issues with flashed form - * Fixed Twig 2 compatibility issue - * Fixed files uploading before captcha check - * Fixed files uploading before data has been stored - * Fixed some issues with reCAPTCHA v3 - * Fixed error responses when file actions fail in the form - * Pass unique_id when uploading files if available + - Fixed old way to access form name + - Fixed minor bugs + - Fixed null date/time in list view + - Fixed forms not being cached properly + - Fixed issue with `selectize`, automatically selecting an unintended value + - Throw exception if you try to `add` to a file and don't provide `filename` [#324](https://github.com/getgrav/grav-plugin-form/issues/324) + - Fixed file field saving with nested name + - Fixed file saving if destination folder does not exist + - Fixed FormFlash object not getting deleted on form post + - Regression: Fixed ignored form action [#318](https://github.com/getgrav/grav-plugin-form/issues/318) + - Regression: Fixed modular form submit not triggering the action sometimes + - Fixed modular form submits without defined `action: /path` inside the form + - Fixed form processing in nested modular pages + - Fixed container fields breaking values from the child fields + - Fixed form fields not accepting object values + - Fixed some form fields having no value for nested field sets + - Fixed double escaping of `file` type input JSON value + - Fixed double locking of file when calling processor save + - Fixed some missing backwards compatibility + - Fixed some issues with flashed form + - Fixed Twig 2 compatibility issue + - Fixed files uploading before captcha check + - Fixed files uploading before data has been stored + - Fixed some issues with reCAPTCHA v3 + - Fixed error responses when file actions fail in the form + - Pass unique_id when uploading files if available # v2.16.4 ## 12/14/2018 1. [](#improved) - * Better handling of invalid file names during upload - * Better MIME type checking of files during file upload - * Do not rely on jQuery for merging languages from form fields [#290](https://github.com/getgrav/grav-plugin-form/issues/290) [#291](https://github.com/getgrav/grav-plugin-form/issues/291) + - Better handling of invalid file names during upload + - Better MIME type checking of files during file upload + - Do not rely on jQuery for merging languages from form fields [#290](https://github.com/getgrav/grav-plugin-form/issues/290) [#291](https://github.com/getgrav/grav-plugin-form/issues/291) 2. [](#bugfix) - * Remove jQuery dependency in form.html.twig (#290) + - Remove jQuery dependency in form.html.twig (#290) 3. [](#new) - * Added Object.assign-polyfill (#291) + - Added Object.assign-polyfill (#291) # v2.16.3 ## 09/21/2018 1. [](#improved) - * Use `Url:post()` to get the `$_POST` variable (allows common security checks/filtering for the POST data) - * Various JS tweaks and enhancements + - Use `Url:post()` to get the `$_POST` variable (allows common security checks/filtering for the POST data) + - Various JS tweaks and enhancements 1. [](#bugfix) - * Fixed issue where `select` set up as `multiple` and with `selectize: create: true` would not properly merge newly created values on rendering. + - Fixed issue where `select` set up as `multiple` and with `selectize: create: true` would not properly merge newly created values on rendering. # v2.16.2 ## 08/23/2018 1. [](#improved) - * Switched to new Grav `Yaml` class to support Native + Fallback YAML libraries - * Simple styling fixes for `array` field + - Switched to new Grav `Yaml` class to support Native + Fallback YAML libraries + - Simple styling fixes for `array` field 1. [](#bugfix) - * Fixed issue with translations of placeholder text in `array` field + - Fixed issue with translations of placeholder text in `array` field # v2.16.1 ## 08/20/2018 1. [](#new) - * Fixed a regression issue with `file` & `array` field + - Fixed a regression issue with `file` & `array` field # v2.16.0 ## 08/20/2018 1. [](#new) - * Added new `form.keep_alive` option to keep session alive [#275](https://github.com/getgrav/grav-plugin-form/issues/275) - * Added `array` field for frontend use + - Added new `form.keep_alive` option to keep session alive [#275](https://github.com/getgrav/grav-plugin-form/issues/275) + - Added `array` field for frontend use 1. [](#improved) - * Improving compatibility `autocomplete` spec [#274](https://github.com/getgrav/grav-plugin-form/pull/274) + - Improving compatibility `autocomplete` spec [#274](https://github.com/getgrav/grav-plugin-form/pull/274) # v2.15.1 ## 06/20/2018 1. [](#improved) - * Including EXIF JS library in the modules dependencies to fix orientation when uploading images + - Including EXIF JS library in the modules dependencies to fix orientation when uploading images 1. [](#bugfix) - * Fix HTML data template for checkboxes fields where 'use' property is "keys" [#258](https://github.com/getgrav/grav-plugin-form/pull/258) + - Fix HTML data template for checkboxes fields where 'use' property is "keys" [#258](https://github.com/getgrav/grav-plugin-form/pull/258) # v2.15.0 ## 05/31/2018 1. [](#new) - * Added support for `Uri::post()` - * Added support for `autocapitalize`, `inputmode`, and `spellcheck` options in field definitions + - Added support for `Uri::post()` + - Added support for `autocapitalize`, `inputmode`, and `spellcheck` options in field definitions # v2.14.1 ## 05/15/2018 1. [](#bugfix) - * Fixed regression with select field, causing issues with filepicker field [grav-plugin-admin#1441](https://github.com/getgrav/grav-plugin-admin/issues/1441) + - Fixed regression with select field, causing issues with filepicker field [grav-plugin-admin#1441](https://github.com/getgrav/grav-plugin-admin/issues/1441) # v2.14.0 ## 05/11/2018 1. [](#new) - * Make `pagemedia` field available outside of pages context - * Added option on fields to disable displaying of label (`display_label: false`) - * Moved Dropzone HTML into an overridable Twig template - * Added support for image upload delete in Dropzone `file` field + - Make `pagemedia` field available outside of pages context + - Added option on fields to disable displaying of label (`display_label: false`) + - Moved Dropzone HTML into an overridable Twig template + - Added support for image upload delete in Dropzone `file` field 1. [](#improved) - * Added support for `optgroup` within select field - * Save forms only once (stops extra work being done) - * Allow file field to pass dropzone options - * Added datasets support to fields - * Added `field.classes` support to display field + - Added support for `optgroup` within select field + - Save forms only once (stops extra work being done) + - Allow file field to pass dropzone options + - Added datasets support to fields + - Added `field.classes` support to display field 1. [](#bugfix) - * Removed overridden class in `password` field - * Worked around forms being lost if form cache expired before page cache, see [#240](https://github.com/getgrav/grav-plugin-form/pull/240) - * Fixed default form in dynamically created page if header uses `forms` instead of old `form` field - * Escape placeholder text in default field + - Removed overridden class in `password` field + - Worked around forms being lost if form cache expired before page cache, see [#240](https://github.com/getgrav/grav-plugin-form/pull/240) + - Fixed default form in dynamically created page if header uses `forms` instead of old `form` field + - Escape placeholder text in default field # v2.13.3 ## 04/13/2018 1. [](#new) - * Added support to save form data in raw format (yaml or json) - * Added new `timestamp` action to add a timestamp field + - Added support to save form data in raw format (yaml or json) + - Added new `timestamp` action to add a timestamp field # v2.13.2 ## 04/12/2018 1. [](#new) - * Added event `onFormPrepareValidation` to allow some pre-processing before form validation - * Added new `postfix` and `dateraw` options to "Save" action + - Added event `onFormPrepareValidation` to allow some pre-processing before form validation + - Added new `postfix` and `dateraw` options to "Save" action 1. [](#improved) - * Added support for `nest_id` boolean flag to `fieldset` field to nest sub-fields with name of fieldset - * Added classes attribute to `spacer` field + - Added support for `nest_id` boolean flag to `fieldset` field to nest sub-fields with name of fieldset + - Added classes attribute to `spacer` field 1. [](#bugfix) - * Fixed `Form::setFields()` causing validation to fail on added and removed fields + - Fixed `Form::setFields()` causing validation to fail on added and removed fields # v2.13.1 ## 03/21/2018 1. [](#improved) - * CAPTCHA fallback to `cURL` if `Fopen` is not allowed [#224](https://github.com/getgrav/grav-plugin-form/pull/244) - * Use `visibility:hidden` rather than `display:none` for honeypot field [#235](https://github.com/getgrav/grav-plugin-form/pull/235) - * Added support for markdown in checkbox field [#233](https://github.com/getgrav/grav-plugin-form/pull/233) - * Added option to control `inline_css: true|false` for fields such as honeypot - * Added class and CSS for honeypot field + - CAPTCHA fallback to `cURL` if `Fopen` is not allowed [#224](https://github.com/getgrav/grav-plugin-form/pull/244) + - Use `visibility:hidden` rather than `display:none` for honeypot field [#235](https://github.com/getgrav/grav-plugin-form/pull/235) + - Added support for markdown in checkbox field [#233](https://github.com/getgrav/grav-plugin-form/pull/233) + - Added option to control `inline_css: true|false` for fields such as honeypot + - Added class and CSS for honeypot field # v2.13.0 ## 03/09/2018 1. [](#new) - * Forced registration of `Form` page template for admin - * Implemented support for `resolution` setting for images in file field - * Implemented support for `resizeWidth`, `resizeHeight`, `resizeQuality` and updated Dropzone to latest version - * Added a new `signature` field + - Forced registration of `Form` page template for admin + - Implemented support for `resolution` setting for images in file field + - Implemented support for `resizeWidth`, `resizeHeight`, `resizeQuality` and updated Dropzone to latest version + - Added a new `signature` field 1. [](#improved) - * Force an `onPageProcessed()` event if page cache expires before form cache [#240](https://github.com/getgrav/grav-plugin-form/pull/240) + - Force an `onPageProcessed()` event if page cache expires before form cache [#240](https://github.com/getgrav/grav-plugin-form/pull/240) 1. [](#bugfix) - * Fixed an issue where unlimited size `0` was not being set properly in File field - * `field.description` now translated and displays properly + - Fixed an issue where unlimited size `0` was not being set properly in File field + - `field.description` now translated and displays properly # v2.12.0 ## 02/22/2018 1. [](#new) - * Added toggle to enable/disable client-side HTML5 validation - * Added toggle to enable/disable inline-error messages + - Added toggle to enable/disable client-side HTML5 validation + - Added toggle to enable/disable inline-error messages 1. [](#improved) - * Reformatted `form.php` plugin class for better readability + - Reformatted `form.php` plugin class for better readability 1. [](#bugfix) - * Fixed an issue with in-content Twig forms not working because forms were not initialized yet - + - Fixed an issue with in-content Twig forms not working because forms were not initialized yet # v2.11.5 ## 02/16/2018 1. [](#new) - * Added support for `form: process: - call: ['Class', 'method']` for custom form handling + - Added support for `form: process: - call: ['Class', 'method']` for custom form handling 1. [](#bugfix) - * Fixed regression in v2.11.4: Call to a member function post() on null [grav#1720](https://github.com/getgrav/grav/issues/1720) + - Fixed regression in v2.11.4: Call to a member function post() on null [grav#1720](https://github.com/getgrav/grav/issues/1720) # v2.11.4 ## 02/15/2018 1. [](#improved) - * Stopped Chrome from auto-completing admin user profile form [grav#1847](https://github.com/getgrav/grav/issues/1847) - * Start using composer to autoload classes - * Added support for `switch` to be treated as checkbox + - Stopped Chrome from auto-completing admin user profile form [grav#1847](https://github.com/getgrav/grav/issues/1847) + - Start using composer to autoload classes + - Added support for `switch` to be treated as checkbox 1. [](#bugfix) - * Fixed missing form submit in dynamically created pages + - Fixed missing form submit in dynamically created pages # v2.11.3 ## 01/31/2018 1. [](#new) - * Added support for `file` in **Display** field. Allows the ability to read a file and output it, works in combination with `|markdown` filter - * Added `minlength` and `maxlength` to **Textarea** field [#231](https://github.com/getgrav/grav-plugin-form/pull/231) + - Added support for `file` in **Display** field. Allows the ability to read a file and output it, works in combination with `|markdown` filter + - Added `minlength` and `maxlength` to **Textarea** field [#231](https://github.com/getgrav/grav-plugin-form/pull/231) # v2.11.2 ## 01/22/2018 1. [](#new) - * Added support for markdown in all form fields for `label`, `help`, and `description` when `markdown: true` is set on field + - Added support for markdown in all form fields for `label`, `help`, and `description` when `markdown: true` is set on field # v2.11.1 ## 12/18/2017 1. [](#improved) - * Updated default fields to make them more consistent with class names + - Updated default fields to make them more consistent with class names # v2.11.0 ## 12/05/2017 1. [](#new) - * Added ability to set `novalidate: true` on form definition to turn off all HTML5 form validation + - Added ability to set `novalidate: true` on form definition to turn off all HTML5 form validation 1. [](#improved) - * Improved logic to handle dynamically added forms to be more reliable - * Added Dutch Translation [#207](https://github.com/getgrav/grav-plugin-form/pull/207) - * Improved both HTML and JSON error output by utilizing `form.status` - * Code Cleanup + - Improved logic to handle dynamically added forms to be more reliable + - Added Dutch Translation [#207](https://github.com/getgrav/grav-plugin-form/pull/207) + - Improved both HTML and JSON error output by utilizing `form.status` + - Code Cleanup 1. [](#bugfix) - * Fix AJAX response message and wrong status [#211](https://github.com/getgrav/grav-plugin-form/pull/211) - * Escaped YAML to form save action to prevent parsing errors [#206](https://github.com/getgrav/grav-plugin-form/pull/206) - * Fixed RU translations [#204](https://github.com/getgrav/grav-plugin-form/pull/204) - * Fixed nonce check fail not setting status to `error` [#213](https://github.com/getgrav/grav-plugin-form/issues/213) - * Fixed validation fail not setting status to `error` [#209](https://github.com/getgrav/grav-plugin-form/issues/209) - * Catch ValidationException to avoid potential fatal error - * Fixed regression issue on reset fields - * Removed `required` attribute in individual checkboxes as it forces all to be checked - * Security fix to ensure file uploads are not manipulated mid-post - thnx @FLH! + - Fix AJAX response message and wrong status [#211](https://github.com/getgrav/grav-plugin-form/pull/211) + - Escaped YAML to form save action to prevent parsing errors [#206](https://github.com/getgrav/grav-plugin-form/pull/206) + - Fixed RU translations [#204](https://github.com/getgrav/grav-plugin-form/pull/204) + - Fixed nonce check fail not setting status to `error` [#213](https://github.com/getgrav/grav-plugin-form/issues/213) + - Fixed validation fail not setting status to `error` [#209](https://github.com/getgrav/grav-plugin-form/issues/209) + - Catch ValidationException to avoid potential fatal error + - Fixed regression issue on reset fields + - Removed `required` attribute in individual checkboxes as it forces all to be checked + - Security fix to ensure file uploads are not manipulated mid-post - thnx @FLH! # v2.10.0 ## 10/26/2017 1. [](#new) - * Added ability to 'remember' field values in cookie between submissions [#200](https://github.com/getgrav/grav-plugin-form/pull/200) + - Added ability to 'remember' field values in cookie between submissions [#200](https://github.com/getgrav/grav-plugin-form/pull/200) 1. [](#improved) - * Added back improved `filesize` option that falls back to PHP file upload limits by default [#202](https://github.com/getgrav/grav-plugin-form/issues/202) - * Added missing file upload options into blueprints and language files - * Added the ability for a form to have an `http_response_code` and use it for `form-messages.html.twig` (requires Grav v1.3.6+) + - Added back improved `filesize` option that falls back to PHP file upload limits by default [#202](https://github.com/getgrav/grav-plugin-form/issues/202) + - Added missing file upload options into blueprints and language files + - Added the ability for a form to have an `http_response_code` and use it for `form-messages.html.twig` (requires Grav v1.3.6+) # v2.9.3 ## 10/11/2017 1. [](#improved) - * Removed `filesize` plugin configuration in favor of `system.media.upload_limit` - * Consolidated `field.classes` and `field.wrapper_classes` in radio/checkbox/checkboxes [#193](https://github.com/getgrav/grav-plugin-form/issues/) - * Remove trailing slash from form action [#195](https://github.com/getgrav/grav-plugin-form/issues/195) - * Improved `honeypot` validation check [#198](https://github.com/getgrav/grav-plugin-form/issues/198) + - Removed `filesize` plugin configuration in favor of `system.media.upload_limit` + - Consolidated `field.classes` and `field.wrapper_classes` in radio/checkbox/checkboxes [#193](https://github.com/getgrav/grav-plugin-form/issues/) + - Remove trailing slash from form action [#195](https://github.com/getgrav/grav-plugin-form/issues/195) + - Improved `honeypot` validation check [#198](https://github.com/getgrav/grav-plugin-form/issues/198) # v2.9.2 ## 09/30/2017 1. [](#improved) - * Improved Polish translation + - Improved Polish translation 1. [](#bugfix) - * Added missing `@input: false` attributes to some non-display fields [#189](https://github.com/getgrav/grav-plugin-form/issues/189) + - Added missing `@input: false` attributes to some non-display fields [#189](https://github.com/getgrav/grav-plugin-form/issues/189) # v2.9.1 ## 09/14/2017 1. [](#bugfix) - * Fixed backwards compatibility issue with conditional field [#188](https://github.com/getgrav/grav-plugin-form/pull/188) + - Fixed backwards compatibility issue with conditional field [#188](https://github.com/getgrav/grav-plugin-form/pull/188) # v2.9.0 ## 09/07/2017 1. [](#new) - * Added **Refresh Prevention** capabilities (Not enabled by default) [#184](https://github.com/getgrav/grav-plugin-form/issues/184) - * Added support for field `attributes` [#176](https://github.com/getgrav/grav-plugin-form/pull/176) - * Added global variables for setting form classes - * Added support for new `select_optgroup` form field [#165](https://github.com/getgrav/grav-plugin-form/issues/165) + - Added **Refresh Prevention** capabilities (Not enabled by default) [#184](https://github.com/getgrav/grav-plugin-form/issues/184) + - Added support for field `attributes` [#176](https://github.com/getgrav/grav-plugin-form/pull/176) + - Added global variables for setting form classes + - Added support for new `select_optgroup` form field [#165](https://github.com/getgrav/grav-plugin-form/issues/165) 1. [](#improved) - * Moved messages output into partial to allow style overriding - * Logic cleanup - * Updated Italian and Russian translations + - Moved messages output into partial to allow style overriding + - Logic cleanup + - Updated Italian and Russian translations 1. [](#bugfix) - * Fixed an issue with conditional field not always displaying properly - * Only add Twig form variable if not already set - * Fixed issue with multiple forms on a page failing on Captcha client-side validation [#182](https://github.com/getgrav/grav-plugin-form/issues/182) - * Fixed issue with Ajax forms return full form HTML on error [#163](https://github.com/getgrav/grav-plugin-form/issues/163) + - Fixed an issue with conditional field not always displaying properly + - Only add Twig form variable if not already set + - Fixed issue with multiple forms on a page failing on Captcha client-side validation [#182](https://github.com/getgrav/grav-plugin-form/issues/182) + - Fixed issue with Ajax forms return full form HTML on error [#163](https://github.com/getgrav/grav-plugin-form/issues/163) # v2.8.2 ## 08/18/2017 1. [](#new) - * Added new `columns` and `column` fields for controlled form layout + - Added new `columns` and `column` fields for controlled form layout # v2.8.1 ## 08/15/2017 1. [](#improved) - * Added extra class support to the default field for more flexible styling + - Added extra class support to the default field for more flexible styling # v2.8.0 ## 07/16/2017 1. [](#bugfix) - * Fixed a typo in the spanish translation [#167](https://github.com/getgrav/grav-plugin-form/pull/167) + - Fixed a typo in the spanish translation [#167](https://github.com/getgrav/grav-plugin-form/pull/167) # v2.8.0-rc.2 ## 06/22/2017 1. [](#improved) - * Add default client-side validation for captcha, with error popup [#139](https://github.com/getgrav/grav-plugin-form/issues/139) - * Added key observe for select - * Added Czech translation + - Add default client-side validation for captcha, with error popup [#139](https://github.com/getgrav/grav-plugin-form/issues/139) + - Added key observe for select + - Added Czech translation 1. [](#bugfix) - * Bug fix for radio type form field [#154](https://github.com/getgrav/grav-plugin-form/pull/154) - * Remove double escaping [#155](https://github.com/getgrav/grav-plugin-form/issues/154) + - Bug fix for radio type form field [#154](https://github.com/getgrav/grav-plugin-form/pull/154) + - Remove double escaping [#155](https://github.com/getgrav/grav-plugin-form/issues/154) # v2.8.0-rc.1 ## 05/22/2017 1. [](#new) - * Bundled as RC release for Grav/Admin RC releases + - Bundled as RC release for Grav/Admin RC releases # v2.7.1 ## 05/22/2017 1. [](#improved) - * Force modular sub-pages with forms to set `$never_cache_twig = true` to improve form processing reliability [#153](https://github.com/getgrav/grav-plugin-form/issues/153) - * Use new `Utils::getPagePathFromToken()` method + - Force modular sub-pages with forms to set `$never_cache_twig = true` to improve form processing reliability [#153](https://github.com/getgrav/grav-plugin-form/issues/153) + - Use new `Utils::getPagePathFromToken()` method # v2.7.0 ## 05/16/2017 1. [](#bugfix) - * Fix issue with dynamically added forms (Registration, Profile, Comments, etc) not processed [#149](https://github.com/getgrav/grav-plugin-form/issues/149) - * Fixed issue with nested values not being repopulated on form error [#140](https://github.com/getgrav/grav-plugin-form/issues/140) + - Fix issue with dynamically added forms (Registration, Profile, Comments, etc) not processed [#149](https://github.com/getgrav/grav-plugin-form/issues/149) + - Fixed issue with nested values not being repopulated on form error [#140](https://github.com/getgrav/grav-plugin-form/issues/140) # v2.6.0 ## 05/04/2017 1. [](#new) - * Allow form item replacement in redirect location [#144](https://github.com/getgrav/grav-plugin-form/issues/144) + - Allow form item replacement in redirect location [#144](https://github.com/getgrav/grav-plugin-form/issues/144) 1. [](#bugfix) - * Fix regression with file uploads introduced in 2.5.0 + - Fix regression with file uploads introduced in 2.5.0 # v2.5.0 ## 04/24/2017 1. [](#new) - * Support proper form handling with nested fields [#141](https://github.com/getgrav/grav-plugin-form/issues/141) + - Support proper form handling with nested fields [#141](https://github.com/getgrav/grav-plugin-form/issues/141) 1. [](#bugfix) - * Added check for valid Grav forms before trying to create a form object + - Added check for valid Grav forms before trying to create a form object # v2.4.0 ## 04/19/2017 1. [](#new) - * Added the ability for front-end forms to use advanced blueprint features such as `data-*@` and `config-*@` - * Added support for dynamically added pages to process forms properly - * Added a new avatar field for displaying account avatar - * Added method to get all `data` from a form - * Support `task` in button types + - Added the ability for front-end forms to use advanced blueprint features such as `data-*@` and `config-*@` + - Added support for dynamically added pages to process forms properly + - Added a new avatar field for displaying account avatar + - Added method to get all `data` from a form + - Support `task` in button types 1. [](#improved) - * Added `step` to range field [#136](https://github.com/getgrav/grav-plugin-form/issues/136) - * Added a new default ajax handler twig template - * Moved twig events to always process even if forms are not defined - * Some code cleanup - * Handle `null` with session-based form - * Added support for append/prepend to number field + - Added `step` to range field [#136](https://github.com/getgrav/grav-plugin-form/issues/136) + - Added a new default ajax handler twig template + - Moved twig events to always process even if forms are not defined + - Some code cleanup + - Handle `null` with session-based form + - Added support for append/prepend to number field 1. [](#bugfix) - * Always process form events as long as a `$_POST` exists [login #101](https://github.com/getgrav/grav-plugin-login/issues/101) - * Various fixes for `file` field - * Allow manually added pages to process forms and upload files - * Fixed issue with nested fileds not showing up in `data.*.twig` templates + - Always process form events as long as a `$_POST` exists [login #101](https://github.com/getgrav/grav-plugin-login/issues/101) + - Various fixes for `file` field + - Allow manually added pages to process forms and upload files + - Fixed issue with nested fileds not showing up in `data.*.twig` templates # v2.3.1 ## 03/23/2017 1. [](#bugfix) - * Only include `outerclasses` DIV if defined [#135](https://github.com/getgrav/grav-plugin-form/issues/135) + - Only include `outerclasses` DIV if defined [#135](https://github.com/getgrav/grav-plugin-form/issues/135) # v2.3.0 ## 03/17/2017 1. [](#new) - * Ability to process any form on any page via `action:`. Super useful if you want to handle form processing on some other non-form page (or Ajax) - * Added the ability for the form to set the `template:` to use to render the form processing response. + - Ability to process any form on any page via `action:`. Super useful if you want to handle form processing on some other non-form page (or Ajax) + - Added the ability for the form to set the `template:` to use to render the form processing response. 1. [](#bugfix) - * Fix `number` field so it works with min value `0` [#130](https://github.com/getgrav/grav-plugin-form/issues/130) + - Fix `number` field so it works with min value `0` [#130](https://github.com/getgrav/grav-plugin-form/issues/130) # v2.2.0 ## 03/13/2017 1. [](#new) - * Added new `fieldset` form field [#125](https://github.com/getgrav/grav-plugin-form/issues/125) - * Added new `conditional form field` to show fields only if some `condition` is set + - Added new `fieldset` form field [#125](https://github.com/getgrav/grav-plugin-form/issues/125) + - Added new `conditional form field` to show fields only if some `condition` is set 1. [](#improved) - * Added the option to have outer-classes on buttons [#124](https://github.com/getgrav/grav-plugin-form/issues/124) - * Added the option to disable fields label if not defined [#126](https://github.com/getgrav/grav-plugin-form/issues/126) + - Added the option to have outer-classes on buttons [#124](https://github.com/getgrav/grav-plugin-form/issues/124) + - Added the option to disable fields label if not defined [#126](https://github.com/getgrav/grav-plugin-form/issues/126) # v2.1.1 ## 02/17/2017 1. [](#improved) - * Better default output for select, checkbox and checkboxes fields in the form destination page and in the emails sent via form submit [#121](https://github.com/getgrav/grav-plugin-form/issues/121) - + - Better default output for select, checkbox and checkboxes fields in the form destination page and in the emails sent via form submit [#121](https://github.com/getgrav/grav-plugin-form/issues/121) # v2.1.0 ## 02/10/2017 1. [](#improved) - * Reworked logic so form caching is based on `Pages::getPagesCacheId()` - * Added `url` option for button field + - Reworked logic so form caching is based on `Pages::getPagesCacheId()` + - Added `url` option for button field 1. [](#bugfix) - * Fixed issue with `honeypot` field not throwing exception properly + - Fixed issue with `honeypot` field not throwing exception properly # v2.0.10 ## 02/08/2017 1. [](#improved) - * Optimistically set 'status' to `success` when requesting a form via Ajax. Form processing listeners should take care of setting status to something else + - Optimistically set 'status' to `success` when requesting a form via Ajax. Form processing listeners should take care of setting status to something else 1. [](#bugfix) - * File uploads are now adding a `__form-file-uploader__` POST field to better allow identifying them with Ajax - * Require jQuery when using the File field, as it's needed by the form.min.js file required in the file upload functionality + - File uploads are now adding a `__form-file-uploader__` POST field to better allow identifying them with Ajax + - Require jQuery when using the File field, as it's needed by the form.min.js file required in the file upload functionality # v2.0.9 ## 01/24/2017 1. [](#bugfix) - * Translate the labels in data.html.twig [https://github.com/getgrav/grav-plugin-comments/issues/38](https://github.com/getgrav/grav-plugin-comments/issues/38) - * Fixed file input when `System` > `Twig` > `Autoescape` is set to `Yes` + - Translate the labels in data.html.twig [https://github.com/getgrav/grav-plugin-comments/issues/38](https://github.com/getgrav/grav-plugin-comments/issues/38) + - Fixed file input when `System` > `Twig` > `Autoescape` is set to `Yes` # v2.0.8 ## 12/13/2016 1. [](#new) - * RC released as stable - * Added a new `honeypot` field for form anti-spam protection + - RC released as stable + - Added a new `honeypot` field for form anti-spam protection # v2.0.8-rc.1 ## 11/26/2016 1. [](#bugfix) - * Fixed Forms 2.0 changes for registration form [#101](https://github.com/getgrav/grav-plugin-form/issues/101) - * Fixed errant reference to Grav DI container in Form#getPagePathFromToken [#105](https://github.com/getgrav/grav-plugin-form/issues/105) - * Fixed issue with spacer fields being displayed first, not in order [#104](https://github.com/getgrav/grav-plugin-form/issues/104) + - Fixed Forms 2.0 changes for registration form [#101](https://github.com/getgrav/grav-plugin-form/issues/101) + - Fixed errant reference to Grav DI container in Form#getPagePathFromToken [#105](https://github.com/getgrav/grav-plugin-form/issues/105) + - Fixed issue with spacer fields being displayed first, not in order [#104](https://github.com/getgrav/grav-plugin-form/issues/104) # v2.0.7 ## 11/17/2016 1. [](#improved) - * Added method to set all data in a form - * Added params to form action URL - * Added ability to add ids to buttons and to set them disabled + - Added method to set all data in a form + - Added params to form action URL + - Added ability to add ids to buttons and to set them disabled 1. [](#bugfix) - * Moved Files Upload GC logic to function in front-end only + - Moved Files Upload GC logic to function in front-end only # v2.0.6 ## 10/19/2016 1. [](#bugfix) - * Fixed translations for `display` field - * Fixed [#95](https://github.com/getgrav/grav-plugin-form/issues/95) multilanguage forms submission - * Fixed duplicate textarea class tag [#98](https://github.com/getgrav/grav-plugin-form/issues/98) + - Fixed translations for `display` field + - Fixed [#95](https://github.com/getgrav/grav-plugin-form/issues/95) multilanguage forms submission + - Fixed duplicate textarea class tag [#98](https://github.com/getgrav/grav-plugin-form/issues/98) # v2.0.5 ## 09/15/2016 1. [](#bugfix) - * Fix passing updating the header through event, no need for return value + - Fix passing updating the header through event, no need for return value # v2.0.4 ## 09/15/2016 1. [](#improved) - * Allow filling the page header form dynamically (e.g. use case: Comments plugin) + - Allow filling the page header form dynamically (e.g. use case: Comments plugin) # v2.0.3 ## 09/12/2016 1. [](#improved) - * Use `Page::slug()` for form name if not set in the form itself (better backwards compatibility) + - Use `Page::slug()` for form name if not set in the form itself (better backwards compatibility) # v2.0.2 ## 09/08/2016 1. [](#improved) - * Added support for Grav's autoescape twig setting - * Allow to add additional markup fields in form and field twig overrides - * Updated the french language translation + - Added support for Grav's autoescape twig setting + - Allow to add additional markup fields in form and field twig overrides + - Updated the french language translation # v2.0.1 ## 09/07/2016 1. [](#bugfix) - * Fixed a backwards compatibility issue with Admin forms + - Fixed a backwards compatibility issue with Admin forms # v2.0.0 ## 09/07/2016 1. [](#new) - * Forms now supports multiple forms per page! - * Access forms from any other page within the current page - * Instantiate forms directly in page content with Twig processing enabled - * New Twig function to get forms data from any other page - * Ability to use Twig in saved filename - * Reworked the `file` field. All files get uploaded via Ajax and are stored upon Submit. Fully backward compatible, `file` field now includes also a `limit` and `filesize` option. The former determines how many files are allowed to be uploaded when in combination with `multiple: true` (default: 10), the latter determines the file size limit (in MB) allowed for each file (default: 5MB) + - Forms now supports multiple forms per page! + - Access forms from any other page within the current page + - Instantiate forms directly in page content with Twig processing enabled + - New Twig function to get forms data from any other page + - Ability to use Twig in saved filename + - Reworked the `file` field. All files get uploaded via Ajax and are stored upon Submit. Fully backward compatible, `file` field now includes also a `limit` and `filesize` option. The former determines how many files are allowed to be uploaded when in combination with `multiple: true` (default: 10), the latter determines the file size limit (in MB) allowed for each file (default: 5MB) 1. [](#improved) - * Added several missing HTML5 form input field types [#87](https://github.com/getgrav/grav-plugin-form/issues/87) - * Added Support for CSS id in form definition + - Added several missing HTML5 form input field types [#87](https://github.com/getgrav/grav-plugin-form/issues/87) + - Added Support for CSS id in form definition # v1.3.2 ## 08/10/2016 1. [](#improved) - * Added Romanian translation + - Added Romanian translation 1. [](#bugfix) - * Fixed an issue with Recaptcha secret throwing errors [#84](https://github.com/getgrav/grav-plugin-form/pull/84) + - Fixed an issue with Recaptcha secret throwing errors [#84](https://github.com/getgrav/grav-plugin-form/pull/84) # v1.3.1 ## 07/27/2016 1. [](#improved) - * Added support for multiple emails in `email` field (add `multiple: true` to enable) + - Added support for multiple emails in `email` field (add `multiple: true` to enable) 1. [](#bugfix) - * Fixed backward incompatibility with forms submission and data retrieval [getgrav/grav#933](https://github.com/getgrav/grav/issues/933) + - Fixed backward incompatibility with forms submission and data retrieval [getgrav/grav#933](https://github.com/getgrav/grav/issues/933) # v1.3.0 ## 07/14/2016 1. [](#improved) - * When uploading a file through a form, if the file is already existing prepend the current day and time to the filename instead of overwriting it. + - When uploading a file through a form, if the file is already existing prepend the current day and time to the filename instead of overwriting it. # v1.3.0-rc.4 ## 06/21/2016 1. [](#bugfix) - * Fixed running on Grav 1.0.x + - Fixed running on Grav 1.0.x # v1.3.0-rc.3 ## 06/17/2016 1. [](#new) - * Set hints for checkboxes options and allow field descriptions + - Set hints for checkboxes options and allow field descriptions # v1.3.0-rc.2 ## 06/08/2016 1. [](#new) - * Allow to process Twig in a hidden field, by setting `evaluate: true` + - Allow to process Twig in a hidden field, by setting `evaluate: true` # v1.3.0-rc.1 ## 06/01/2016 1. [](#improved) - * French updated + - French updated # v1.3.0-beta.6 ## 05/23/2016 1. [](#new) - * Added support for advanced blueprint functionality in forms - * Added site-wide form options to set Google Captcha site + secret keys [#34](https://github.com/getgrav/grav-plugin-form/pull/34) - * Session-based 'flash' storage of form for redirects [#48](https://github.com/getgrav/grav-plugin-form/issues/48) - * Added ability to **append** to file if you include a `process: save: body:` template attribute [#65](https://github.com/getgrav/grav-plugin-form/issues/65) + - Added support for advanced blueprint functionality in forms + - Added site-wide form options to set Google Captcha site + secret keys [#34](https://github.com/getgrav/grav-plugin-form/pull/34) + - Session-based 'flash' storage of form for redirects [#48](https://github.com/getgrav/grav-plugin-form/issues/48) + - Added ability to **append** to file if you include a `process: save: body:` template attribute [#65](https://github.com/getgrav/grav-plugin-form/issues/65) 1. [](#improved) - * Support `keyname` form format like admin forms - * Added backwards compatibility for Captcha field - * Added 'markdown-notices' style output for better errors - * Added `Forms::getValue()` method to retrieve values programatically - * Changed `datetime` form field to simply extend `text` until implemented - * Updated french language + - Support `keyname` form format like admin forms + - Added backwards compatibility for Captcha field + - Added 'markdown-notices' style output for better errors + - Added `Forms::getValue()` method to retrieve values programatically + - Changed `datetime` form field to simply extend `text` until implemented + - Updated french language 1. [](#bugfix) - * Refactored the files upload logic - * Missing Language string - * Fixed errors not getting output + - Refactored the files upload logic + - Missing Language string + - Fixed errors not getting output # v1.3.0-beta.5 ## 05/12/2016 1. [](#improved) - * Moved form/field.html.twig file to the default folder, to be more easily extended in themes + - Moved form/field.html.twig file to the default folder, to be more easily extended in themes # v1.3.0-beta.4 ## 05/04/2016 1. [](#new) - * Added support for `prepend` and `append` field attributes for Text input + - Added support for `prepend` and `append` field attributes for Text input # v1.3.0-beta.3 ## 05/03/2016 1. [](#bugfix) - * Fix for select field admin translation + - Fix for select field admin translation # v1.3.0-beta.2 ## 04/27/2016 1. [](#bugfix) - * Fix for autoescape in spacer and display form fields - * Fix issue with form reset action [#66](https://github.com/getgrav/grav-plugin-form/pull/66) + - Fix for autoescape in spacer and display form fields + - Fix issue with form reset action [#66](https://github.com/getgrav/grav-plugin-form/pull/66) # v1.3.0-beta.1 ## 04/20/2016 1. [](#new) - * Added the HTML5 `range` input field with `min` and `max` parameters + - Added the HTML5 `range` input field with `min` and `max` parameters 1. [](#improved) - * Allow to override classes in Form definition for the form element - * Add more blocks in the Form twig template, so classes can be overridden more easily in themes - * Reworked some fields to fit the new Admin - * Use `scope` for form fields to allow fields to be excluded from the data by adding `input@: false` to their definition - * Added german translation - * Allow to add inline Twig to the form message definition + - Allow to override classes in Form definition for the form element + - Add more blocks in the Form twig template, so classes can be overridden more easily in themes + - Reworked some fields to fit the new Admin + - Use `scope` for form fields to allow fields to be excluded from the data by adding `input@: false` to their definition + - Added german translation + - Allow to add inline Twig to the form message definition 1. [](#bugfix) - * Fixed the form action URL for home page forms - * Fix stopping form events propagation, correctly stop when one event is stopped - * Allow to translate the fields placeholders and the form message - * Fix captcha javascript function ordering. Also, render it in the site active language - * Support attribute `for="id"` on label for checkbox - * Fix select fields with the multiple option enabled - * Fixed select options escaping with autoescape on - [#502](https://github.com/getgrav/grav-plugin-admin/issues/502) + - Fixed the form action URL for home page forms + - Fix stopping form events propagation, correctly stop when one event is stopped + - Allow to translate the fields placeholders and the form message + - Fix captcha javascript function ordering. Also, render it in the site active language + - Support attribute `for="id"` on label for checkbox + - Fix select fields with the multiple option enabled + - Fixed select options escaping with autoescape on - [#502](https://github.com/getgrav/grav-plugin-admin/issues/502) # v1.2.2 ## 02/11/2016 1. [](#bugfix) - * Fixed case issue when including form file. + - Fixed case issue when including form file. # v1.2.1 ## 02/11/2016 1. [](#new) - * Allow placeholder for **select** field + - Allow placeholder for **select** field 1. [](#improved) - * Use common language strings in blueprints - * Use `for` attribute in labels - * Improved `README.md` - * Code lint + - Use common language strings in blueprints + - Use `for` attribute in labels + - Improved `README.md` + - Code lint 1. [](#bugfix) - * Moved `nl2br` to correct place or will break for arrays + - Moved `nl2br` to correct place or will break for arrays # v1.2.0 ## 01/06/2016 1. [](#bugfix) - * Correctly merge the file field configuration - * restore full file information save + - Correctly merge the file field configuration + - restore full file information save # v1.1.0 ## 12/18/2015 1. [](#new) - * Croatian translation - * Added id, style, and disabled options to select fields + - Croatian translation + - Added id, style, and disabled options to select fields 1. [](#improved) - * Allow adding form labels and help text as lang strings - * Allow translating field content - * Allow translating button and checkbox labels - * Allow adding classes to the form field container with `field.outerclasses` - * Updated French translation + - Allow adding form labels and help text as lang strings + - Allow translating field content + - Allow translating button and checkbox labels + - Allow adding classes to the form field container with `field.outerclasses` + - Updated French translation 1. [](#bugfix) - * Fixed error message on file upload - * Fixed overriding defaults for the file type in forms + - Fixed error message on file upload + - Fixed overriding defaults for the file type in forms # v1.0.3 ## 12/11/2015 1. [](#improved) - * Updated languages - * Allow an action to stop processing + - Updated languages + - Allow an action to stop processing 1. [](#bugfix) - * Fix captcha validation - * Fix issue where Form was unsetting valid page + - Fix captcha validation + - Fix issue where Form was unsetting valid page # v1.0.2 ## 12/01/2015 1. [](#bugfix) - * Fixed merge of defaults settings - * Support for arrays in `data.txt.twig` - * Fixed blueprint for admin + - Fixed merge of defaults settings + - Support for arrays in `data.txt.twig` + - Fixed blueprint for admin # v1.0.1 ## 12/01/2015 1. [](#new) - * New **file upload** field - * Added modular form template - * Spanish translation - * Hungarian translation - * Italian translation + - New **file upload** field + - Added modular form template + - Spanish translation + - Hungarian translation + - Italian translation # v1.0.0 ## 11/21/2015 1. [](#new) - * Server-side validation of forms #11 - * Added french translation - * Added **nonce** form security + - Server-side validation of forms #11 + - Added french translation + - Added **nonce** form security 1. [](#improved) - * Show a more meaningful error when the display page is not found - * Added links to learn site for form examples - * Label can be omitted - * Allow user to set the CSS class for buttons + - Show a more meaningful error when the display page is not found + - Added links to learn site for form examples + - Label can be omitted + - Allow user to set the CSS class for buttons 1. [](#bugfix) - * Fixed multi-language forms - * Checkbox is translatable - * Minor fixes + - Fixed multi-language forms + - Checkbox is translatable + - Minor fixes # v0.6.0 ## 10/21/2015 1. [](#bugfix) - * Fixed for missing attributes in textarea field - * Fixed checkbox inputs + - Fixed for missing attributes in textarea field + - Fixed checkbox inputs # v0.5.0 ## 10/15/2015 1. [](#new) - * New `operation` param to allow different file saving strategies - * Ability to add new file saving strategies - * Now calls a `process()` method during form processing + - New `operation` param to allow different file saving strategies + - Ability to add new file saving strategies + - Now calls a `process()` method during form processing 1. [](#improved) - * Added server-side captcha validation and removed front-end validation - * Allow `filename` instead of `prefix`, `format` + `extension` + - Added server-side captcha validation and removed front-end validation + - Allow `filename` instead of `prefix`, `format` + `extension` 1. [](#bugfix) - * Fixed radio inputs + - Fixed radio inputs # v0.4.0 ## 9/16/2015 1. [](#new) - * PHP server-side form validation - * Added new Google Catpcha field with front-end validation + - PHP server-side form validation + - Added new Google Catpcha field with front-end validation 1. [](#improved) - * Add defaults for forms, moved from the themes to the Form plugin - * Store multi-line fields with line endings converted to HTML + - Add defaults for forms, moved from the themes to the Form plugin + - Store multi-line fields with line endings converted to HTML # v0.3.0 ## 9/11/2015 1. [](#improved) - * Refactored all the forms fields + - Refactored all the forms fields # v0.2.1 ## 08/24/2015 1. [](#improved) - * Translated tooltips + - Translated tooltips # v0.2.0 ## 08/11/2015 1. [](#improved) - * Disable `enable` in admin + - Disable `enable` in admin # v0.1.0 ## 08/04/2015 1. [](#new) - * ChangeLog started... + - ChangeLog started... diff --git a/plugins/form/app/fields/file.js b/plugins/form/app/fields/file.js index cd8e34c..7b1d364 100644 --- a/plugins/form/app/fields/file.js +++ b/plugins/form/app/fields/file.js @@ -106,8 +106,18 @@ export default class FilesField { global.location.reload(); } + if (response && response.status === 'error') { + return this.handleError({ + file, + data: response, + mode: 'removeFile', + msg: `

${translations.PLUGIN_FORM.FILE_ERROR_UPLOAD} ${file.name}

+
${response.message}
` + }); + } + // store params for removing file from session before it gets saved - if (response.session) { + if (response && response.session) { file.sessionParams = response.session; file.removeUrl = this.options.url; @@ -117,13 +127,7 @@ export default class FilesField { input.val(value + ' '); } - return this.handleError({ - file, - data: response, - mode: 'removeFile', - msg: `

${translations.PLUGIN_FORM.FILE_ERROR_UPLOAD} ${file.name}

-
${response.message}
` - }); + return true; } onDropzoneComplete(file) { @@ -204,34 +208,49 @@ export default class FilesField { } handleError(options) { - return true; - /* let { file, data, mode, msg } = options; - if (data.status !== 'error' && data.status !== 'unauthorized') { return; } + const { file, data, msg } = options; + const status = data && data.status; - switch (mode) { - case 'addBack': - if (file instanceof File) { - this.dropzone.addFile.call(this.dropzone, file); - } else { - this.dropzone.files.push(file); - this.dropzone.options.addedfile.call(this.dropzone, file); - this.dropzone.options.thumbnail.call(this.dropzone, file, file.extras.url); - } - - break; - case 'removeFile': - default: - if (~this.dropzone.files.indexOf(file)) { - file.rejected = true; - this.dropzone.removeFile.call(this.dropzone, file, { silent: true }); - } - - break; + if (status !== 'error' && status !== 'unauthorized') { + return false; } - let modal = $('[data-remodal-id="generic"]'); - modal.find('.error-content').html(msg); - $.remodal.lookup[modal.data('remodal')].open(); */ + const message = data && data.message ? data.message : (msg || translations.PLUGIN_FORM.FILEPOND_ERROR_FILESIZE); + + if (file && this.dropzone) { + file.accepted = false; + file.status = Dropzone.ERROR; + file.rejected = true; + + const preview = $(file.previewElement); + if (preview.length) { + preview.addClass('dz-error'); + preview.find('[data-dz-errormessage]').html(message); + } + + // Remove the errored file so the user can try again. + if (~this.dropzone.files.indexOf(file)) { + setTimeout(() => { + this.dropzone.removeFile.call(this.dropzone, file, { silent: true }); + this.dropzone._updateMaxFilesReachedClass(); + }, 100); + } + } + + const field = this.container.closest('.form-field'); + if (field.length) { + let errorBox = field.find('.form-errors'); + if (!errorBox.length) { + errorBox = $('
').appendTo(field); + } + + errorBox.html(`

${message}

`); + } else if (typeof global.alert === 'function') { + // Fall back to alert if no inline container is present. + global.alert(message); + } + + return true; } } @@ -338,3 +357,12 @@ export let Instances = (() => { return instances; })(); + +// Expose addNode function to global scope for XHR reinitialization and pipeline compatibility +if (typeof window.GravForm === 'undefined') { + window.GravForm = {}; +} +window.GravForm.FilesField = { + addNode, + instances: Instances +}; diff --git a/plugins/form/assets/captcha/basic-captcha-refresh.js b/plugins/form/assets/captcha/basic-captcha-refresh.js new file mode 100644 index 0000000..ef63e69 --- /dev/null +++ b/plugins/form/assets/captcha/basic-captcha-refresh.js @@ -0,0 +1,128 @@ +(function() { + 'use strict'; + + // Function to refresh a captcha image + const refreshCaptchaImage = function(container) { + const img = container.querySelector('img'); + if (!img) { + console.warn('Cannot find captcha image in container'); + return; + } + + // Get the base URL and field ID + const baseUrl = img.dataset.baseUrl || img.src.split('?')[0]; + const fieldId = img.dataset.fieldId || container.dataset.fieldId; + + // Force reload by adding/updating timestamp and field ID + const timestamp = new Date().getTime(); + let newUrl = baseUrl + '?t=' + timestamp; + if (fieldId) { + newUrl += '&field=' + fieldId; + } + img.src = newUrl; + + // Also clear the input field if we can find it + const formField = container.closest('.form-field'); + if (formField) { + const input = formField.querySelector('input[type="text"]'); + if (input) { + input.value = ''; + // Try to focus the input + try { input.focus(); } catch(e) {} + } + } + }; + + // Function to set up click handlers for refresh buttons + const setupRefreshButtons = function() { + // Find all captcha containers + const containers = document.querySelectorAll('[data-captcha-provider="basic-captcha"]'); + + containers.forEach(function(container) { + // Find the refresh button within this container + const button = container.querySelector('button'); + if (!button) { + return; + } + + // Remove any existing listeners (just in case) + button.removeEventListener('click', handleRefreshClick); + + // Add the click handler + button.addEventListener('click', handleRefreshClick); + }); + }; + + // Click handler function + const handleRefreshClick = function(event) { + // Prevent default behavior and stop propagation + event.preventDefault(); + event.stopPropagation(); + + // Find the container + const container = this.closest('[data-captcha-provider="basic-captcha"]'); + if (!container) { + return false; + } + + // Refresh the image + refreshCaptchaImage(container); + + return false; + }; + + // Set up a mutation observer to handle dynamically added captchas + const setupMutationObserver = function() { + // Check if MutationObserver is available + if (typeof MutationObserver === 'undefined') return; + + // Create a mutation observer to watch for new captcha elements + const observer = new MutationObserver(function(mutations) { + let needsSetup = false; + + mutations.forEach(function(mutation) { + if (mutation.type === 'childList' && mutation.addedNodes.length) { + // Check if any of the added nodes contain our captcha containers + for (let i = 0; i < mutation.addedNodes.length; i++) { + const node = mutation.addedNodes[i]; + if (node.nodeType === Node.ELEMENT_NODE) { + // Check if this element has or contains captcha containers + if (node.querySelector && ( + node.matches('[data-captcha-provider="basic-captcha"]') || + node.querySelector('[data-captcha-provider="basic-captcha"]') + )) { + needsSetup = true; + break; + } + } + } + } + }); + + if (needsSetup) { + setupRefreshButtons(); + } + }); + + // Start observing the document + observer.observe(document.body, { + childList: true, + subtree: true + }); + }; + + // Initialize on DOM ready + document.addEventListener('DOMContentLoaded', function() { + setupRefreshButtons(); + setupMutationObserver(); + + // Also connect to XHR system if available (for best of both worlds) + if (window.GravFormXHR && window.GravFormXHR.captcha) { + window.GravFormXHR.captcha.register('basic-captcha', { + reset: function(container, form) { + refreshCaptchaImage(container); + } + }); + } + }); +})(); \ No newline at end of file diff --git a/plugins/form/assets/captcha/recaptcha-handler.js b/plugins/form/assets/captcha/recaptcha-handler.js new file mode 100644 index 0000000..d4018b9 --- /dev/null +++ b/plugins/form/assets/captcha/recaptcha-handler.js @@ -0,0 +1,166 @@ +(function() { + 'use strict'; + + // Register the handler with the form system when it's ready + const registerRecaptchaHandler = function() { + if (window.GravFormXHR && window.GravFormXHR.captcha) { + window.GravFormXHR.captcha.register('recaptcha', { + reset: function(container, form) { + if (!form || !form.id) { + console.warn('Cannot reset reCAPTCHA: form is invalid or missing ID'); + return; + } + + const formId = form.id; + console.log(`Attempting to reset reCAPTCHA for form: ${formId}`); + + // First try the expected ID pattern from the Twig template + const recaptchaId = `g-recaptcha-${formId}`; + // We need to look more flexibly for the container + let widgetContainer = document.getElementById(recaptchaId); + + // If not found by ID, look for the div inside the captcha provider container + if (!widgetContainer) { + // Try to find it inside the captcha provider container + widgetContainer = container.querySelector('.g-recaptcha'); + + if (!widgetContainer) { + // If that fails, look more broadly in the form + widgetContainer = form.querySelector('.g-recaptcha'); + + if (!widgetContainer) { + // Last resort - create a new container if needed + console.warn(`reCAPTCHA container #${recaptchaId} not found. Creating a new one.`); + widgetContainer = document.createElement('div'); + widgetContainer.id = recaptchaId; + widgetContainer.className = 'g-recaptcha'; + container.appendChild(widgetContainer); + } + } + } + + console.log(`Found reCAPTCHA container for form: ${formId}`); + + // Get configuration from data attributes + const parentContainer = container.closest('[data-captcha-provider="recaptcha"]'); + if (!parentContainer) { + console.warn('Cannot find reCAPTCHA parent container with data-captcha-provider attribute.'); + return; + } + + const sitekey = parentContainer.dataset.sitekey; + const version = parentContainer.dataset.version || '2-checkbox'; + const isV3 = version.startsWith('3'); + const isInvisible = version === '2-invisible'; + + if (!sitekey) { + console.warn('Cannot reinitialize reCAPTCHA - missing sitekey attribute'); + return; + } + + console.log(`Re-rendering reCAPTCHA widget for form: ${formId}, version: ${version}`); + + // Handle V3 reCAPTCHA differently + if (isV3) { + try { + // For v3, we don't need to reset anything visible, just make sure we have the API + if (typeof grecaptcha !== 'undefined' && typeof grecaptcha.execute === 'function') { + // Create a new execution context for the form + const actionName = `form_${formId}`; + const tokenInput = form.querySelector('input[name="token"]') || + form.querySelector('input[name="data[token]"]'); + const actionInput = form.querySelector('input[name="action"]') || + form.querySelector('input[name="data[action]"]'); + + if (tokenInput && actionInput) { + // Clear previous token + tokenInput.value = ''; + + // Set the action name + actionInput.value = actionName; + + console.log(`reCAPTCHA v3 ready for execution on form: ${formId}`); + } else { + console.warn(`Cannot find token or action inputs for reCAPTCHA v3 in form: ${formId}`); + } + } else { + console.warn('reCAPTCHA v3 API not properly loaded.'); + } + } catch (e) { + console.error(`Error setting up reCAPTCHA v3: ${e.message}`); + } + return; + } + + // For v2, handle visible widget reset + // Clear the container to ensure fresh rendering + widgetContainer.innerHTML = ''; + + // Check if reCAPTCHA API is available + if (typeof grecaptcha !== 'undefined' && typeof grecaptcha.render === 'function') { + try { + // Render with a slight delay to ensure DOM is settled + setTimeout(() => { + grecaptcha.render(widgetContainer.id || widgetContainer, { + 'sitekey': sitekey, + 'theme': parentContainer.dataset.theme || 'light', + 'size': isInvisible ? 'invisible' : 'normal', + 'callback': function(token) { + console.log(`reCAPTCHA verification completed for form: ${formId}`); + + // If it's invisible reCAPTCHA, submit the form automatically + if (isInvisible && window.GravFormXHR && typeof window.GravFormXHR.submit === 'function') { + window.GravFormXHR.submit(form); + } + } + }); + console.log(`Successfully rendered reCAPTCHA for form: ${formId}`); + }, 100); + } catch (e) { + console.error(`Error rendering reCAPTCHA widget: ${e.message}`); + widgetContainer.innerHTML = '

Error initializing reCAPTCHA.

'; + } + } else { + console.warn('reCAPTCHA API not available. Attempting to reload...'); + + // Remove existing script if any + const existingScript = document.querySelector('script[src*="google.com/recaptcha/api.js"]'); + if (existingScript) { + existingScript.parentNode.removeChild(existingScript); + } + + // Create new script element + const script = document.createElement('script'); + script.src = `https://www.google.com/recaptcha/api.js${isV3 ? '?render=' + sitekey : ''}`; + script.async = true; + script.defer = true; + script.onload = function() { + console.log('reCAPTCHA API loaded, retrying widget render...'); + setTimeout(() => { + const retryContainer = document.querySelector(`[data-captcha-provider="recaptcha"]`); + if (retryContainer && form) { + window.GravFormXHR.captcha.getProvider('recaptcha').reset(retryContainer, form); + } + }, 200); + }; + document.head.appendChild(script); + } + } + }); + console.log('reCAPTCHA XHR handler registered successfully'); + } else { + console.error('GravFormXHR.captcha not found. Make sure the Form plugin is loaded correctly.'); + } + }; + + // Try to register the handler immediately if GravFormXHR is already available + if (window.GravFormXHR && window.GravFormXHR.captcha) { + registerRecaptchaHandler(); + } else { + // Otherwise, wait for the DOM to be fully loaded + document.addEventListener('DOMContentLoaded', function() { + // Give a small delay to ensure GravFormXHR is initialized + setTimeout(registerRecaptchaHandler, 100); + }); + } +})(); diff --git a/plugins/form/assets/captcha/turnstile-handler.js b/plugins/form/assets/captcha/turnstile-handler.js new file mode 100644 index 0000000..e1be1d0 --- /dev/null +++ b/plugins/form/assets/captcha/turnstile-handler.js @@ -0,0 +1,121 @@ +(function() { + 'use strict'; + + // Register the handler with the form system when it's ready + const registerTurnstileHandler = function() { + if (window.GravFormXHR && window.GravFormXHR.captcha) { + window.GravFormXHR.captcha.register('turnstile', { + reset: function(container, form) { + const formId = form.id; + const containerId = `cf-turnstile-${formId}`; + const widgetContainer = document.getElementById(containerId); + + if (!widgetContainer) { + console.warn(`Turnstile container #${containerId} not found.`); + return; + } + + // Get configuration from data attributes + const parentContainer = container.closest('[data-captcha-provider="turnstile"]'); + const sitekey = parentContainer ? parentContainer.dataset.sitekey : null; + + if (!sitekey) { + console.warn('Cannot reinitialize Turnstile - missing sitekey attribute'); + return; + } + + // Clear the container to ensure fresh rendering + widgetContainer.innerHTML = ''; + + console.log(`Re-rendering Turnstile widget for form: ${formId}`); + + // Check if Turnstile API is available + if (typeof window.turnstile !== 'undefined') { + try { + // Reset any existing widgets + try { + window.turnstile.reset(containerId); + } catch (e) { + // Ignore reset errors, we'll re-render anyway + } + + // Render with a slight delay to ensure DOM is settled + setTimeout(() => { + window.turnstile.render(`#${containerId}`, { + sitekey: sitekey, + theme: parentContainer ? (parentContainer.dataset.theme || 'light') : 'light', + callback: function(token) { + console.log(`Turnstile verification completed for form: ${formId} with token:`, token.substring(0, 10) + '...'); + + // Create or update hidden input for token + let tokenInput = form.querySelector('input[name="cf-turnstile-response"]'); + if (!tokenInput) { + console.log('Creating new hidden input for Turnstile token'); + tokenInput = document.createElement('input'); + tokenInput.type = 'hidden'; + tokenInput.name = 'cf-turnstile-response'; + form.appendChild(tokenInput); + } else { + console.log('Updating existing hidden input for Turnstile token'); + } + tokenInput.value = token; + + // Also add a debug attribute + form.setAttribute('data-turnstile-verified', 'true'); + }, + 'expired-callback': function() { + console.log(`Turnstile token expired for form: ${formId}`); + }, + 'error-callback': function(error) { + console.error(`Turnstile error for form ${formId}: ${error}`); + } + }); + }, 100); + } catch (e) { + console.error(`Error rendering Turnstile widget: ${e.message}`); + widgetContainer.innerHTML = '

Error initializing Turnstile.

'; + } + } else { + console.warn('Turnstile API not available. Attempting to reload...'); + + // Remove existing script if any + const existingScript = document.querySelector('script[src*="challenges.cloudflare.com/turnstile/v0/api.js"]'); + if (existingScript) { + existingScript.parentNode.removeChild(existingScript); + } + + // Create new script element + const script = document.createElement('script'); + script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit'; + script.async = true; + script.defer = true; + script.onload = function() { + console.log('Turnstile API loaded, retrying widget render...'); + setTimeout(() => { + const retryContainer = document.querySelector('[data-captcha-provider="turnstile"]'); + if (retryContainer && form) { + window.GravFormXHR.captcha.getProvider('turnstile').reset(retryContainer, form); + } + }, 200); + }; + document.head.appendChild(script); + } + } + }); + console.log('Turnstile XHR handler registered successfully'); + } else { + console.error('GravFormXHR.captcha not found. Make sure the Form plugin is loaded correctly.'); + } + }; + + // Try to register the handler immediately if GravFormXHR is already available + if (window.GravFormXHR && window.GravFormXHR.captcha) { + registerTurnstileHandler(); + } else { + // Otherwise, wait for the DOM to be fully loaded + document.addEventListener('DOMContentLoaded', function() { + // Give a small delay to ensure GravFormXHR is initialized + setTimeout(registerTurnstileHandler, 100); + }); + } +})(); diff --git a/plugins/form/assets/dropzone-reinit.js b/plugins/form/assets/dropzone-reinit.js new file mode 100644 index 0000000..1739084 --- /dev/null +++ b/plugins/form/assets/dropzone-reinit.js @@ -0,0 +1,311 @@ +/** + * Direct Dropzone Initialization for XHR Forms + * + * This script directly targets Form plugin's Dropzone initialization mechanisms + */ +(function() { + 'use strict'; + + // Enable debugging logs + const DEBUG = false; + + // Helper function for logging + function log(message, type = 'log') { + if (!DEBUG) return; + + const prefix = '[Dropzone Direct Init]'; + + if (type === 'error') { + console.error(prefix, message); + } else if (type === 'warn') { + console.warn(prefix, message); + } else { + console.log(prefix, message); + } + } + + // Flag to prevent multiple initializations + let isInitializing = false; + + // Function to directly initialize Dropzone + function initializeDropzone(element) { + if (isInitializing) { + log('Initialization already in progress, skipping'); + return false; + } + + if (!element || element.classList.contains('dz-clickable')) { + return false; + } + + log('Starting direct Dropzone initialization for element:', element); + isInitializing = true; + + // First, let's try to find the FilesField constructor in the global scope + if (typeof FilesField === 'function') { + log('Found FilesField constructor, trying direct instantiation'); + + try { + new FilesField({ + container: element, + options: {} + }); + + log('Successfully initialized Dropzone using FilesField constructor'); + isInitializing = false; + return true; + } catch (e) { + log(`Error using FilesField constructor: ${e.message}`, 'error'); + // Continue with other methods + } + } + + // Second approach: Look for the Form plugin's initialization code in the page + const dropzoneInit = findFunctionOnWindow('addNode') || + window.addNode || + findFunctionOnWindow('initDropzone'); + + if (dropzoneInit) { + log('Found Form plugin initialization function, calling it directly'); + + try { + dropzoneInit(element); + log('Successfully called Form plugin initialization function'); + isInitializing = false; + return true; + } catch (e) { + log(`Error calling Form plugin initialization function: ${e.message}`, 'error'); + // Continue with other methods + } + } + + // Third approach: Try to invoke Dropzone directly if it's globally available + if (typeof Dropzone === 'function') { + log('Found global Dropzone constructor, trying direct instantiation'); + + try { + // Extract settings from the element + const settingsAttr = element.getAttribute('data-grav-file-settings'); + if (!settingsAttr) { + log('No settings found for element', 'warn'); + isInitializing = false; + return false; + } + + const settings = JSON.parse(settingsAttr); + const optionsAttr = element.getAttribute('data-dropzone-options'); + const options = optionsAttr ? JSON.parse(optionsAttr) : {}; + + // Configure Dropzone options + const dropzoneOptions = { + url: element.getAttribute('data-file-url-add') || window.location.href, + maxFiles: settings.limit || null, + maxFilesize: settings.filesize || 10, + acceptedFiles: settings.accept ? settings.accept.join(',') : null + }; + + // Merge with any provided options + Object.assign(dropzoneOptions, options); + + // Create new Dropzone instance + new Dropzone(element, dropzoneOptions); + + log('Successfully initialized Dropzone using global constructor'); + isInitializing = false; + return true; + } catch (e) { + log(`Error using global Dropzone constructor: ${e.message}`, 'error'); + // Continue to final approach + } + } + + // Final approach: Force reloading of Form plugin's JavaScript + log('Attempting to force reload Form plugin JavaScript'); + + // Look for Form plugin's JS files + const formVendorScript = document.querySelector('script[src*="form.vendor.js"]'); + const formScript = document.querySelector('script[src*="form.min.js"]'); + + if (formVendorScript || formScript) { + log('Found Form plugin scripts, attempting to reload them'); + + // Create new script elements + if (formVendorScript) { + const newVendorScript = document.createElement('script'); + newVendorScript.src = formVendorScript.src.split('?')[0] + '?t=' + new Date().getTime(); + newVendorScript.async = true; + newVendorScript.onload = function() { + log('Reloaded Form vendor script'); + + // Trigger event after script loads + setTimeout(function() { + const event = new CustomEvent('mutation._grav', { + detail: { target: element } + }); + document.body.dispatchEvent(event); + }, 100); + }; + document.head.appendChild(newVendorScript); + } + + if (formScript) { + const newFormScript = document.createElement('script'); + newFormScript.src = formScript.src.split('?')[0] + '?t=' + new Date().getTime(); + newFormScript.async = true; + newFormScript.onload = function() { + log('Reloaded Form script'); + + // Trigger event after script loads + setTimeout(function() { + const event = new CustomEvent('mutation._grav', { + detail: { target: element } + }); + document.body.dispatchEvent(event); + }, 100); + }; + document.head.appendChild(newFormScript); + } + } + + // As a final resort, trigger the mutation event + log('Triggering mutation._grav event as final resort'); + const event = new CustomEvent('mutation._grav', { + detail: { target: element } + }); + document.body.dispatchEvent(event); + + isInitializing = false; + return false; + } + + // Helper function to find a function on the window object by name pattern + function findFunctionOnWindow(pattern) { + for (const key in window) { + if (typeof window[key] === 'function' && key.includes(pattern)) { + return window[key]; + } + } + return null; + } + + // Function to check all Dropzone elements + function checkAllDropzones() { + const dropzones = document.querySelectorAll('.dropzone.files-upload:not(.dz-clickable)'); + + if (dropzones.length === 0) { + log('No uninitialized Dropzone elements found'); + return; + } + + log(`Found ${dropzones.length} uninitialized Dropzone elements`); + + // Try to initialize each one + dropzones.forEach(function(element) { + initializeDropzone(element); + }); + } + + // Hook into form submission to reinitialize after XHR updates + function setupFormSubmissionHook() { + // First check if the XHR submit function is available + if (window.GravFormXHR && typeof window.GravFormXHR.submit === 'function') { + log('Found GravFormXHR.submit, attaching hook'); + + // Store the original function + const originalSubmit = window.GravFormXHR.submit; + + // Override it with our version + window.GravFormXHR.submit = function(form) { + log(`XHR form submission detected for form: ${form?.id || 'unknown'}`); + + // Call the original function + const result = originalSubmit.apply(this, arguments); + + // Set up checks for after the submission completes + [500, 1000, 2000, 3000].forEach(function(delay) { + setTimeout(checkAllDropzones, delay); + }); + + return result; + }; + + log('Successfully hooked into GravFormXHR.submit'); + } + + // Also add a direct event listener for standard form submissions + document.addEventListener('submit', function(event) { + if (event.target.tagName === 'FORM') { + log(`Standard form submission detected for form: ${event.target.id || 'unknown'}`); + + // Schedule checks after submission + [1000, 2000, 3000].forEach(function(delay) { + setTimeout(checkAllDropzones, delay); + }); + } + }); + + log('Form submission hooks set up'); + } + + // Monitor for AJAX responses + function setupAjaxMonitoring() { + if (window.jQuery) { + log('Setting up jQuery AJAX response monitoring'); + + jQuery(document).ajaxComplete(function(event, xhr, settings) { + log('AJAX request completed, checking if form-related'); + + // Check if this looks like a form request + const url = settings.url || ''; + if (url.includes('form') || + url.includes('task=') || + url.includes('file-upload') || + url.includes('file-uploader')) { + + log('Form-related AJAX request detected, will check for Dropzones'); + + // Schedule checks with delays + [300, 800, 1500].forEach(function(delay) { + setTimeout(checkAllDropzones, delay); + }); + } + }); + + log('jQuery AJAX monitoring set up'); + } + } + + // Create global function for manual reinitialization + window.reinitializeDropzones = function() { + log('Manual reinitialization triggered'); + checkAllDropzones(); + return 'Reinitialization check triggered. See console for details.'; + }; + + // Main initialization function + function initialize() { + log('Initializing Dropzone direct initialization system'); + + // Set up submission hook + setupFormSubmissionHook(); + + // Set up AJAX monitoring + setupAjaxMonitoring(); + + // Do an initial check for any uninitialized Dropzones + setTimeout(checkAllDropzones, 500); + + log('Initialization complete. Use window.reinitializeDropzones() for manual reinitialization.'); + } + + // Start when the DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', function() { + // Delay to allow other scripts to load + setTimeout(initialize, 100); + }); + } else { + // DOM already loaded, delay slightly + setTimeout(initialize, 100); + } +})(); \ No newline at end of file diff --git a/plugins/form/assets/filepond-handler.js b/plugins/form/assets/filepond-handler.js new file mode 100644 index 0000000..5252d0a --- /dev/null +++ b/plugins/form/assets/filepond-handler.js @@ -0,0 +1,662 @@ +/** + * Unified Grav Form FilePond Handler + * + * This script initializes and configures FilePond instances for file uploads + * within Grav forms. It works with both normal and XHR form submissions. + * It also handles reinitializing FilePond instances after XHR form submissions. + */ + +// Immediately-Invoked Function Expression for scoping +(function () { + // Check if script already loaded + if (window.gravFilepondHandlerLoaded) { + console.log('FilePond unified handler already loaded, skipping.'); + return; + } + window.gravFilepondHandlerLoaded = true; + + // Debugging - set to false for production + const debug = true; + + // Helper function for logging + function log(message, type = 'log') { + if (!debug && type !== 'error') return; + + const prefix = '[FilePond Handler]'; + if (type === 'error') { + console.error(prefix, message); + } else if (type === 'warn') { + console.warn(prefix, message); + } else { + console.log(prefix, message); + } + } + + // Track FilePond instances with their configuration + const pondInstances = new Map(); + + // Get translations from global object if available + const translations = window.GravForm?.translations?.PLUGIN_FORM || { + FILEPOND_REMOVE_FILE: 'Remove file', + FILEPOND_REMOVE_FILE_CONFIRMATION: 'Are you sure you want to remove this file?', + FILEPOND_CANCEL_UPLOAD: 'Cancel upload', + FILEPOND_ERROR_FILESIZE: 'File is too large', + FILEPOND_ERROR_FILETYPE: 'Invalid file type' + }; + + // Track initialization state + let initialized = false; + + /** + * Get standard FilePond configuration for an element + * This is used for both initial setup and reinit after XHR + * @param {HTMLElement} element - The file input element + * @param {HTMLElement} container - The container element + * @returns {Object} Configuration object for FilePond + */ + function getFilepondConfig(element, container) { + if (!container) { + log('Container not provided for config extraction', 'error'); + return null; + } + + // Check if the field is required - this is correct location + const isRequired = element.hasAttribute('required') || + container.hasAttribute('required') || + container.getAttribute('data-required') === 'true'; + + // Then, add this code to remove the required attribute from the actual input + // to prevent browser validation errors, but keep track of the requirement + if (isRequired) { + // Store the required state on the container for our custom validation + container.setAttribute('data-required', 'true'); + // Remove the required attribute from the input to avoid browser validation errors + element.removeAttribute('required'); + } + + try { + // Get settings from data attributes + const settingsAttr = container.getAttribute('data-grav-file-settings'); + if (!settingsAttr) { + log('No file settings found for FilePond element', 'warn'); + return null; + } + + // Parse settings + let settings; + try { + settings = JSON.parse(settingsAttr); + log('Parsed settings:', settings); + } catch (e) { + log(`Error parsing file settings: ${e.message}`, 'error'); + return null; + } + + // Parse FilePond options + const filepondOptionsAttr = container.getAttribute('data-filepond-options') || '{}'; + let filepondOptions; + try { + filepondOptions = JSON.parse(filepondOptionsAttr); + log('Parsed FilePond options:', filepondOptions); + } catch (e) { + log(`Error parsing FilePond options: ${e.message}`, 'error'); + filepondOptions = {}; + } + + // Get URLs for upload and remove + const uploadUrl = container.getAttribute('data-file-url-add'); + const removeUrl = container.getAttribute('data-file-url-remove'); + + if (!uploadUrl) { + log('Upload URL not found for FilePond element', 'warn'); + return null; + } + + // Parse previously uploaded files + const existingFiles = []; + const fileDataElements = container.querySelectorAll('[data-file]'); + log(`Found ${fileDataElements.length} existing file data elements`); + + fileDataElements.forEach(fileData => { + try { + const fileAttr = fileData.getAttribute('data-file'); + log('File data attribute:', fileAttr); + + const fileJson = JSON.parse(fileAttr); + + if (fileJson && fileJson.name) { + existingFiles.push({ + source: fileJson.name, + options: { + type: 'local', + file: { + name: fileJson.name, + size: fileJson.size, + type: fileJson.type + }, + metadata: { + poster: fileJson.thumb_url || fileJson.path + } + } + }); + } + } catch (e) { + log(`Error parsing file data: ${e.message}`, 'error'); + } + }); + + log('Existing files:', existingFiles); + + // Get form elements for Grav integration + const fieldName = container.getAttribute('data-file-field-name'); + const form = element.closest('form'); + const formNameInput = form ? form.querySelector('[name="__form-name__"]') : document.querySelector('[name="__form-name__"]'); + const formIdInput = form ? form.querySelector('[name="__unique_form_id__"]') : document.querySelector('[name="__unique_form_id__"]'); + const formNonceInput = form ? form.querySelector('[name="form-nonce"]') : document.querySelector('[name="form-nonce"]'); + + if (!formNameInput || !formIdInput || !formNonceInput) { + log('Missing required form inputs for proper Grav integration', 'warn'); + } + + // Configure FilePond + const options = { + // Core settings + name: settings.paramName, + maxFiles: settings.limit || null, + maxFileSize: `${settings.filesize}MB`, + acceptedFileTypes: settings.accept, + files: existingFiles, + + // Server configuration - modified for Grav + server: { + process: { + url: uploadUrl, + method: 'POST', + headers: { + 'X-Requested-With': 'XMLHttpRequest' + }, + ondata: (formData) => { + // Safety check - ensure formData is valid + if (!formData) { + console.error('FormData is undefined in ondata'); + return new FormData(); // Return empty FormData as fallback + } + + // Add all required Grav form fields + if (formNameInput) formData.append('__form-name__', formNameInput.value); + if (formIdInput) formData.append('__unique_form_id__', formIdInput.value); + formData.append('__form-file-uploader__', '1'); + if (formNonceInput) formData.append('form-nonce', formNonceInput.value); + formData.append('task', 'filesupload'); + + // Use fieldName from the outer scope + if (fieldName) { + formData.append('name', fieldName); + } else { + console.error('Field name is undefined, falling back to default'); + formData.append('name', 'files'); + } + + // Add URI if needed + const uriInput = document.querySelector('[name="uri"]'); + if (uriInput) { + formData.append('uri', uriInput.value); + } + + // Note: Don't try to append file here, FilePond will do that based on the name parameter + // Just return the modified formData + log('Prepared form data for Grav upload'); + return formData; + } + }, + revert: removeUrl ? { + url: removeUrl, + method: 'POST', + headers: { + 'X-Requested-With': 'XMLHttpRequest' + }, + ondata: (formData, file) => { + // Add all required Grav form fields + if (formNameInput) formData.append('__form-name__', formNameInput.value); + if (formIdInput) formData.append('__unique_form_id__', formIdInput.value); + formData.append('__form-file-remover__', '1'); + if (formNonceInput) formData.append('form-nonce', formNonceInput.value); + formData.append('name', fieldName); + + // Add filename + formData.append('filename', file.filename); + + log('Prepared form data for file removal'); + return formData; + } + } : null + }, + + // Image Transform settings - both FilePond native settings and our custom ones + // Native settings + allowImagePreview: true, + allowImageResize: true, + allowImageTransform: true, + imagePreviewHeight: filepondOptions.imagePreviewHeight || 256, + + // Transform settings + imageTransformOutputMimeType: filepondOptions.imageTransformOutputMimeType || 'image/jpeg', + imageTransformOutputQuality: filepondOptions.imageTransformOutputQuality || settings.resizeQuality || 90, + imageTransformOutputStripImageHead: filepondOptions.imageTransformOutputStripImageHead !== false, + + // Resize settings + imageResizeTargetWidth: filepondOptions.imageResizeTargetWidth || settings.resizeWidth || null, + imageResizeTargetHeight: filepondOptions.imageResizeTargetHeight || settings.resizeHeight || null, + imageResizeMode: filepondOptions.imageResizeMode || 'cover', + imageResizeUpscale: filepondOptions.imageResizeUpscale || false, + + // Crop settings + allowImageCrop: filepondOptions.allowImageCrop || false, + imageCropAspectRatio: filepondOptions.imageCropAspectRatio || null, + + // Labels and translations + labelIdle: filepondOptions.labelIdle || 'Browse or drop files', + labelFileTypeNotAllowed: translations.FILEPOND_ERROR_FILETYPE || 'Invalid file type', + labelFileSizeNotAllowed: translations.FILEPOND_ERROR_FILESIZE || 'File is too large', + labelFileLoading: 'Loading', + labelFileProcessing: 'Uploading', + labelFileProcessingComplete: 'Upload complete', + labelFileProcessingAborted: 'Upload cancelled', + labelTapToCancel: translations.FILEPOND_CANCEL_UPLOAD || 'Cancel upload', + labelTapToRetry: 'Retry', + labelTapToUndo: 'Undo', + labelButtonRemoveItem: translations.FILEPOND_REMOVE_FILE || 'Remove', + + // Style settings + stylePanelLayout: filepondOptions.stylePanelLayout || 'compact', + styleLoadIndicatorPosition: filepondOptions.styleLoadIndicatorPosition || 'center bottom', + styleProgressIndicatorPosition: filepondOptions.styleProgressIndicatorPosition || 'center bottom', + styleButtonRemoveItemPosition: filepondOptions.styleButtonRemoveItemPosition || 'right', + + // Override with any remaining user-provided options + ...filepondOptions + }; + + log('Prepared FilePond configuration:', options); + + return options; + } catch (e) { + log(`Error creating FilePond configuration: ${e.message}`, 'error'); + console.error(e); // Full error in console + return null; + } + } + + /** + * Initialize a single FilePond instance + * @param {HTMLElement} element - The file input element to initialize + * @returns {FilePond|null} The created FilePond instance, or null if creation failed + */ + function initializeSingleFilePond(element) { + const container = element.closest('.filepond-root'); + + if (!container) { + log('FilePond container not found for input element', 'error'); + return null; + } + + // Don't initialize twice + if (container.classList.contains('filepond--hopper') || container.querySelector('.filepond--hopper')) { + log('FilePond already initialized for this element, skipping'); + return null; + } + + // Get the element ID or create a unique one for tracking + const elementId = element.id || `filepond-${Math.random().toString(36).substring(2, 15)}`; + + // Get configuration + const config = getFilepondConfig(element, container); + if (!config) { + log('Failed to get configuration, cannot initialize FilePond', 'error'); + return null; + } + + log(`Initializing FilePond element ${elementId} with config`, config); + + try { + // Create FilePond instance + const pond = FilePond.create(element, config); + log(`FilePond instance created successfully for element ${elementId}`); + + // Store the instance and its configuration for potential reinit + pondInstances.set(elementId, { + instance: pond, + config: config, + container: container + }); + + // Add a reference to the element for easier lookup + element.filepondId = elementId; + container.filepondId = elementId; + + // Handle form submission to ensure files are processed before submit + const form = element.closest('form'); + if (form && !form._filepond_handler_attached) { + form._filepond_handler_attached = true; + + form.addEventListener('submit', function (e) { + // Check for all FilePond instances in this form + const formPonds = Array.from(pondInstances.values()) + .filter(info => info.instance && info.container.closest('form') === form); + + const processingFiles = formPonds.reduce((total, info) => { + return total + info.instance.getFiles().filter(file => + file.status === FilePond.FileStatus.PROCESSING_QUEUED || + file.status === FilePond.FileStatus.PROCESSING + ).length; + }, 0); + + if (processingFiles > 0) { + e.preventDefault(); + alert('Please wait for all files to finish uploading before submitting the form.'); + return false; + } + }); + } + + return pond; + } catch (e) { + log(`Error creating FilePond instance: ${e.message}`, 'error'); + console.error(e); // Full error in console + return null; + } + } + + /** + * Main FilePond initialization function + * This will find and initialize all uninitialized FilePond elements + */ + function initializeFilePond() { + log('Starting FilePond initialization'); + + // Make sure we have the libraries loaded + if (typeof window.FilePond === 'undefined') { + log('FilePond library not found. Will retry in 500ms...', 'warn'); + setTimeout(initializeFilePond, 500); + return; + } + + log('FilePond library found, continuing initialization'); + + // Register plugins if available + try { + if (window.FilePondPluginFileValidateSize) { + FilePond.registerPlugin(FilePondPluginFileValidateSize); + log('Registered FileValidateSize plugin'); + } + + if (window.FilePondPluginFileValidateType) { + FilePond.registerPlugin(FilePondPluginFileValidateType); + log('Registered FileValidateType plugin'); + } + + if (window.FilePondPluginImagePreview) { + FilePond.registerPlugin(FilePondPluginImagePreview); + log('Registered ImagePreview plugin'); + } + + if (window.FilePondPluginImageResize) { + FilePond.registerPlugin(FilePondPluginImageResize); + log('Registered ImageResize plugin'); + } + + if (window.FilePondPluginImageTransform) { + FilePond.registerPlugin(FilePondPluginImageTransform); + log('Registered ImageTransform plugin'); + } + } catch (e) { + log(`Error registering plugins: ${e.message}`, 'error'); + } + + // Find all FilePond elements + const elements = document.querySelectorAll('.filepond-root input[type="file"]:not(.filepond--browser)'); + + if (elements.length === 0) { + log('No FilePond form elements found on the page'); + return; + } + + log(`Found ${elements.length} FilePond element(s)`); + + // Process each FilePond element + elements.forEach((element, index) => { + log(`Initializing FilePond element #${index + 1}`); + initializeSingleFilePond(element); + }); + + initialized = true; + log('FilePond initialization complete'); + } + + /** + * Reinitialize a specific FilePond instance + * @param {HTMLElement} container - The FilePond container element + * @returns {FilePond|null} The reinitialized FilePond instance, or null if reinitialization failed + */ + function reinitializeSingleFilePond(container) { + if (!container) { + log('No container provided for reinitialization', 'error'); + return null; + } + + // Check if this is a FilePond container + if (!container.classList.contains('filepond-root')) { + log('Container is not a FilePond container', 'warn'); + return null; + } + + log(`Reinitializing FilePond container: ${container.id || 'unnamed'}`); + + // If already initialized, destroy first + if (container.classList.contains('filepond--hopper') || container.querySelector('.filepond--hopper')) { + log('Container already has an active FilePond instance, destroying it first'); + + // Try to find and destroy through our internal tracking + const elementId = container.filepondId; + if (elementId && pondInstances.has(elementId)) { + const info = pondInstances.get(elementId); + if (info.instance) { + log(`Destroying tracked FilePond instance for element ${elementId}`); + info.instance.destroy(); + pondInstances.delete(elementId); + } + } else { + // Fallback: Try to find via child element with class + const pondElement = container.querySelector('.filepond--root'); + if (pondElement && pondElement._pond) { + log('Destroying FilePond instance via DOM reference'); + pondElement._pond.destroy(); + } + } + } + + // Look for the file input + const input = container.querySelector('input[type="file"]:not(.filepond--browser)'); + if (!input) { + log('No file input found in container for reinitialization', 'error'); + return null; + } + + // Create a new instance + return initializeSingleFilePond(input); + } + + /** + * Reinitialize all FilePond instances + * This is used after XHR form submissions + */ + function reinitializeFilePond() { + log('Reinitializing all FilePond instances'); + + // Find all FilePond containers + const containers = document.querySelectorAll('.filepond-root'); + if (containers.length === 0) { + log('No FilePond containers found for reinitialization'); + return; + } + + log(`Found ${containers.length} FilePond container(s) for reinitialization`); + + // Process each container + containers.forEach((container, index) => { + log(`Reinitializing FilePond container #${index + 1}`); + reinitializeSingleFilePond(container); + }); + + log('FilePond reinitialization complete'); + } + + /** + * Helper function to support XHR form interaction + * This hooks into the GravFormXHR system if available + */ + function setupXHRIntegration() { + // Only run if GravFormXHR is available + if (window.GravFormXHR) { + log('Setting up XHR integration for FilePond'); + + // Store original submit function + const originalSubmit = window.GravFormXHR.submit; + + // Override to handle FilePond files + window.GravFormXHR.submit = function (form) { + if (!form) { + return originalSubmit.apply(this, arguments); + } + + // Check for any FilePond instances in the form + let hasPendingUploads = false; + + // First check via our tracking + Array.from(pondInstances.values()).forEach(info => { + if (info.container.closest('form') === form) { + const processingFiles = info.instance.getFiles().filter(file => + file.status === FilePond.FileStatus.PROCESSING_QUEUED || + file.status === FilePond.FileStatus.PROCESSING); + + if (processingFiles.length > 0) { + hasPendingUploads = true; + } + } + }); + + // Fallback check for any untracked instances + if (!hasPendingUploads) { + const filepondContainers = form.querySelectorAll('.filepond-root'); + filepondContainers.forEach(container => { + const pondElement = container.querySelector('.filepond--root'); + if (pondElement && pondElement._pond) { + const pond = pondElement._pond; + const processingFiles = pond.getFiles().filter(file => + file.status === FilePond.FileStatus.PROCESSING_QUEUED || + file.status === FilePond.FileStatus.PROCESSING); + + if (processingFiles.length > 0) { + hasPendingUploads = true; + } + } + }); + } + + if (hasPendingUploads) { + alert('Please wait for all files to finish uploading before submitting the form.'); + return false; + } + + // Call the original submit function + return originalSubmit.apply(this, arguments); + }; + + // Set up listeners for form updates + document.addEventListener('grav-form-updated', function (e) { + log('Detected form update event, reinitializing FilePond instances'); + setTimeout(reinitializeFilePond, 100); + }); + } + } + + /** + * Setup mutation observer to detect dynamically added FilePond elements + */ + function setupMutationObserver() { + if (window.MutationObserver) { + const observer = new MutationObserver((mutations) => { + let shouldCheck = false; + + for (const mutation of mutations) { + if (mutation.type === 'childList' && mutation.addedNodes.length) { + for (const node of mutation.addedNodes) { + if (node.nodeType === 1) { + if (node.classList && node.classList.contains('filepond-root') || + node.querySelector && node.querySelector('.filepond-root')) { + shouldCheck = true; + break; + } + } + } + } + + if (shouldCheck) break; + } + + if (shouldCheck) { + log('DOM changes detected that might include FilePond elements'); + // Delay to ensure DOM is fully updated + setTimeout(initializeFilePond, 50); + } + }); + + // Start observing + observer.observe(document.body, { + childList: true, + subtree: true + }); + + log('MutationObserver set up for FilePond elements'); + } + } + + /** + * Initialize when DOM is ready + */ + function domReadyInit() { + log('DOM ready, initializing FilePond'); + initializeFilePond(); + setupXHRIntegration(); + setupMutationObserver(); + } + + // Handle different document ready states + if (document.readyState === 'loading') { + log('Document still loading, adding DOMContentLoaded listener'); + document.addEventListener('DOMContentLoaded', domReadyInit); + } else { + log('Document already loaded, initializing now'); + setTimeout(domReadyInit, 0); + } + + // Also support initialization via window load event as a fallback + window.addEventListener('load', function () { + log('Window load event fired'); + if (!initialized) { + log('FilePond not yet initialized, initializing now'); + initializeFilePond(); + } + }); + + // Expose functions to global scope for external usage + window.GravFilePond = { + initialize: initializeFilePond, + reinitialize: reinitializeFilePond, + reinitializeContainer: reinitializeSingleFilePond, + getInstances: () => Array.from(pondInstances.values()).map(info => info.instance) + }; + + // Log initialization start + log('FilePond unified handler script loaded and ready'); +})(); \ No newline at end of file diff --git a/plugins/form/assets/filepond-reinit.js b/plugins/form/assets/filepond-reinit.js new file mode 100644 index 0000000..a73fc91 --- /dev/null +++ b/plugins/form/assets/filepond-reinit.js @@ -0,0 +1,141 @@ +/** + * FilePond Direct Fix - Emergency fix for XHR forms + */ +(function() { + // Directly attempt to initialize uninitialized FilePond elements + // without relying on any existing logic + + console.log('FilePond Direct Fix loaded'); + + // Function to directly create FilePond instances + function initializeFilePondElements() { + console.log('Direct FilePond initialization attempt'); + + // Find uninitialized FilePond elements + const elements = document.querySelectorAll('.filepond-root:not(.filepond--hopper)'); + if (elements.length === 0) { + return; + } + + console.log(`Found ${elements.length} uninitialized FilePond elements`); + + // Process each element + elements.forEach((element, index) => { + const input = element.querySelector('input[type="file"]:not(.filepond--browser)'); + if (!input) { + console.log(`Element #${index + 1}: No suitable file input found`); + return; + } + + console.log(`Element #${index + 1}: Found file input:`, input); + + // Get settings + let settings = {}; + try { + const settingsAttr = element.getAttribute('data-grav-file-settings'); + if (settingsAttr) { + settings = JSON.parse(settingsAttr); + console.log('Parsed settings:', settings); + } + } catch (e) { + console.error('Failed to parse settings:', e); + } + + // Get URLS + const uploadUrl = element.getAttribute('data-file-url-add'); + const removeUrl = element.getAttribute('data-file-url-remove'); + + console.log('Upload URL:', uploadUrl); + console.log('Remove URL:', removeUrl); + + try { + // Create FilePond instance directly + const pond = FilePond.create(input); + + // Apply minimal configuration to make uploads work + if (pond) { + console.log(`Successfully created FilePond on element #${index + 1}`); + + // Basic configuration to make it functional + pond.setOptions({ + name: settings.paramName || input.name || 'files', + server: { + process: uploadUrl, + revert: removeUrl + }, + // Transform options + imageTransformOutputMimeType: 'image/jpeg', + imageTransformOutputQuality: settings.resizeQuality || 90, + imageTransformOutputStripImageHead: true, + // Resize options + imageResizeTargetWidth: settings.resizeWidth || null, + imageResizeTargetHeight: settings.resizeHeight || null, + imageResizeMode: 'cover', + imageResizeUpscale: false + }); + } + } catch (e) { + console.error(`Failed to create FilePond on element #${index + 1}:`, e); + } + }); + } + + // Monitor form submissions and DOM changes + function setupMonitoring() { + // Create MutationObserver to watch for DOM changes + if (window.MutationObserver) { + const observer = new MutationObserver((mutations) => { + let shouldCheck = false; + + for (const mutation of mutations) { + if (mutation.type === 'childList' && mutation.addedNodes.length) { + for (const node of mutation.addedNodes) { + if (node.nodeType === 1) { + if (node.classList && node.classList.contains('filepond-root') || + node.querySelector && node.querySelector('.filepond-root')) { + shouldCheck = true; + break; + } + } + } + } + + if (shouldCheck) break; + } + + if (shouldCheck) { + console.log('DOM changes detected that might include FilePond elements'); + // Delay to ensure DOM is fully updated + setTimeout(initializeFilePondElements, 50); + } + }); + + // Start observing + observer.observe(document.body, { + childList: true, + subtree: true + }); + + console.log('MutationObserver set up for FilePond elements'); + } + } + + // Set up the emergency fix + function init() { + // Set up monitoring + setupMonitoring(); + + // Expose global function for manual reinit + window.directFilePondInit = initializeFilePondElements; + + // Initial check + setTimeout(initializeFilePondElements, 500); + } + + // Start when DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + setTimeout(init, 0); + } +})(); diff --git a/plugins/form/assets/filepond/filepond-plugin-file-validate-size.min.js b/plugins/form/assets/filepond/filepond-plugin-file-validate-size.min.js new file mode 100644 index 0000000..17fcb9d --- /dev/null +++ b/plugins/form/assets/filepond/filepond-plugin-file-validate-size.min.js @@ -0,0 +1,9 @@ +/*! + * FilePondPluginFileValidateSize 2.2.8 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ + +/* eslint-disable */ + +!function(e,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):(e=e||self).FilePondPluginFileValidateSize=i()}(this,function(){"use strict";var e=function(e){var i=e.addFilter,E=e.utils,l=E.Type,_=E.replaceInString,n=E.toNaturalFileSize;return i("ALLOW_HOPPER_ITEM",function(e,i){var E=i.query;if(!E("GET_ALLOW_FILE_SIZE_VALIDATION"))return!0;var l=E("GET_MAX_FILE_SIZE");if(null!==l&&e.size>l)return!1;var _=E("GET_MIN_FILE_SIZE");return!(null!==_&&e.size<_)}),i("LOAD_FILE",function(e,i){var E=i.query;return new Promise(function(i,l){if(!E("GET_ALLOW_FILE_SIZE_VALIDATION"))return i(e);var I=E("GET_FILE_VALIDATE_SIZE_FILTER");if(I&&!I(e))return i(e);var t=E("GET_MAX_FILE_SIZE");if(null!==t&&e.size>t)l({status:{main:E("GET_LABEL_MAX_FILE_SIZE_EXCEEDED"),sub:_(E("GET_LABEL_MAX_FILE_SIZE"),{filesize:n(t,".",E("GET_FILE_SIZE_BASE"),E("GET_FILE_SIZE_LABELS",E))})}});else{var L=E("GET_MIN_FILE_SIZE");if(null!==L&&e.sizea)return void l({status:{main:E("GET_LABEL_MAX_TOTAL_FILE_SIZE_EXCEEDED"),sub:_(E("GET_LABEL_MAX_TOTAL_FILE_SIZE"),{filesize:n(a,".",E("GET_FILE_SIZE_BASE"),E("GET_FILE_SIZE_LABELS",E))})}});i(e)}}})}),{options:{allowFileSizeValidation:[!0,l.BOOLEAN],maxFileSize:[null,l.INT],minFileSize:[null,l.INT],maxTotalFileSize:[null,l.INT],fileValidateSizeFilter:[null,l.FUNCTION],labelMinFileSizeExceeded:["File is too small",l.STRING],labelMinFileSize:["Minimum file size is {filesize}",l.STRING],labelMaxFileSizeExceeded:["File is too large",l.STRING],labelMaxFileSize:["Maximum file size is {filesize}",l.STRING],labelMaxTotalFileSizeExceeded:["Maximum total size exceeded",l.STRING],labelMaxTotalFileSize:["Maximum total file size is {filesize}",l.STRING]}}};return"undefined"!=typeof window&&void 0!==window.document&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:e})),e}); diff --git a/plugins/form/assets/filepond/filepond-plugin-file-validate-type.min.js b/plugins/form/assets/filepond/filepond-plugin-file-validate-type.min.js new file mode 100644 index 0000000..f2cb360 --- /dev/null +++ b/plugins/form/assets/filepond/filepond-plugin-file-validate-type.min.js @@ -0,0 +1,9 @@ +/*! + * FilePondPluginFileValidateType 1.2.9 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ + +/* eslint-disable */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).FilePondPluginFileValidateType=t()}(this,function(){"use strict";var e=function(e){var t=e.addFilter,n=e.utils,i=n.Type,T=n.isString,E=n.replaceInString,l=n.guesstimateMimeType,o=n.getExtensionFromFilename,r=n.getFilenameFromURL,u=function(e,t){return e.some(function(e){return/\*$/.test(e)?(n=e,(/^[^/]+/.exec(t)||[]).pop()===n.slice(0,-2)):e===t;var n})},a=function(e,t,n){if(0===t.length)return!0;var i=function(e){var t="";if(T(e)){var n=r(e),i=o(n);i&&(t=l(i))}else t=e.type;return t}(e);return n?new Promise(function(T,E){n(e,i).then(function(e){u(t,e)?T():E()}).catch(E)}):u(t,i)};return t("SET_ATTRIBUTE_TO_OPTION_MAP",function(e){return Object.assign(e,{accept:"acceptedFileTypes"})}),t("ALLOW_HOPPER_ITEM",function(e,t){var n=t.query;return!n("GET_ALLOW_FILE_TYPE_VALIDATION")||a(e,n("GET_ACCEPTED_FILE_TYPES"))}),t("LOAD_FILE",function(e,t){var n=t.query;return new Promise(function(t,i){if(n("GET_ALLOW_FILE_TYPE_VALIDATION")){var T=n("GET_ACCEPTED_FILE_TYPES"),l=n("GET_FILE_VALIDATE_TYPE_DETECT_TYPE"),o=a(e,T,l),r=function(){var e,t=T.map((e=n("GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES_MAP"),function(t){return null!==e[t]&&(e[t]||t)})).filter(function(e){return!1!==e}),l=t.filter(function(e,n){return t.indexOf(e)===n});i({status:{main:n("GET_LABEL_FILE_TYPE_NOT_ALLOWED"),sub:E(n("GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES"),{allTypes:l.join(", "),allButLastType:l.slice(0,-1).join(", "),lastType:l[l.length-1]})}})};if("boolean"==typeof o)return o?t(e):r();o.then(function(){t(e)}).catch(r)}else t(e)})}),{options:{allowFileTypeValidation:[!0,i.BOOLEAN],acceptedFileTypes:[[],i.ARRAY],labelFileTypeNotAllowed:["File is of invalid type",i.STRING],fileValidateTypeLabelExpectedTypes:["Expects {allButLastType} or {lastType}",i.STRING],fileValidateTypeLabelExpectedTypesMap:[{},i.OBJECT],fileValidateTypeDetectType:[null,i.FUNCTION]}}};return"undefined"!=typeof window&&void 0!==window.document&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:e})),e}); diff --git a/plugins/form/assets/filepond/filepond-plugin-image-preview.min.css b/plugins/form/assets/filepond/filepond-plugin-image-preview.min.css new file mode 100644 index 0000000..3255db6 --- /dev/null +++ b/plugins/form/assets/filepond/filepond-plugin-image-preview.min.css @@ -0,0 +1,8 @@ +/*! + * FilePondPluginImagePreview 4.6.12 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ + +/* eslint-disable */ +.filepond--image-preview-markup{position:absolute;left:0;top:0}.filepond--image-preview-wrapper{z-index:2}.filepond--image-preview-overlay{display:block;position:absolute;left:0;top:0;width:100%;min-height:5rem;max-height:7rem;margin:0;opacity:0;z-index:2;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.filepond--image-preview-overlay svg{width:100%;height:auto;color:inherit;max-height:inherit}.filepond--image-preview-overlay-idle{mix-blend-mode:multiply;color:rgba(40,40,40,.85)}.filepond--image-preview-overlay-success{mix-blend-mode:normal;color:#369763}.filepond--image-preview-overlay-failure{mix-blend-mode:normal;color:#c44e47}@supports (-webkit-marquee-repetition:infinite) and ((-o-object-fit:fill) or (object-fit:fill)){.filepond--image-preview-overlay-idle{mix-blend-mode:normal}}.filepond--image-preview-wrapper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;left:0;top:0;right:0;height:100%;margin:0;border-radius:.45em;overflow:hidden;background:rgba(0,0,0,.01)}.filepond--image-preview{position:absolute;left:0;top:0;z-index:1;display:flex;align-items:center;height:100%;width:100%;pointer-events:none;background:#222;will-change:transform,opacity}.filepond--image-clip{position:relative;overflow:hidden;margin:0 auto}.filepond--image-clip[data-transparency-indicator=grid] canvas,.filepond--image-clip[data-transparency-indicator=grid] img{background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill='%23eee'%3E%3Cpath d='M0 0h50v50H0M50 50h50v50H50'/%3E%3C/svg%3E");background-size:1.25em 1.25em}.filepond--image-bitmap,.filepond--image-vector{position:absolute;left:0;top:0;will-change:transform}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper{border-radius:0}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview{height:100%;display:flex;justify-content:center;align-items:center}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper{border-radius:99999rem}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay{top:auto;bottom:0;-webkit-transform:scaleY(-1);transform:scaleY(-1)}.filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*=center]){margin-bottom:.325em}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left]{left:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right]{right:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left],.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right]{margin-bottom:.5125em}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center]{margin-top:0;margin-bottom:.1875em;margin-left:.1875em} \ No newline at end of file diff --git a/plugins/form/assets/filepond/filepond-plugin-image-preview.min.js b/plugins/form/assets/filepond/filepond-plugin-image-preview.min.js new file mode 100644 index 0000000..0cb958a --- /dev/null +++ b/plugins/form/assets/filepond/filepond-plugin-image-preview.min.js @@ -0,0 +1,9 @@ +/*! + * FilePondPluginImagePreview 4.6.12 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ + +/* eslint-disable */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).FilePondPluginImagePreview=t()}(this,function(){"use strict";function e(e){this.wrapped=e}function t(t){var i,r;function a(i,r){try{var o=t[i](r),c=o.value,s=c instanceof e;Promise.resolve(s?c.wrapped:c).then(function(e){s?a("next",e):n(o.done?"return":"normal",e)},function(e){a("throw",e)})}catch(e){n("throw",e)}}function n(e,t){switch(e){case"return":i.resolve({value:t,done:!0});break;case"throw":i.reject(t);break;default:i.resolve({value:t,done:!1})}(i=i.next)?a(i.key,i.arg):r=null}this._invoke=function(e,t){return new Promise(function(n,o){var c={key:e,arg:t,resolve:n,reject:o,next:null};r?r=r.next=c:(i=r=c,a(e,t))})},"function"!=typeof t.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(t.prototype[Symbol.asyncIterator]=function(){return this}),t.prototype.next=function(e){return this._invoke("next",e)},t.prototype.throw=function(e){return this._invoke("throw",e)},t.prototype.return=function(e){return this._invoke("return",e)};function i(e,t){return r(e)||function(e,t){var i=[],r=!0,a=!1,n=void 0;try{for(var o,c=e[Symbol.iterator]();!(r=(o=c.next()).done)&&(i.push(o.value),!t||i.length!==t);r=!0);}catch(e){a=!0,n=e}finally{try{r||null==c.return||c.return()}finally{if(a)throw n}}return i}(e,t)||a()}function r(e){if(Array.isArray(e))return e}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}var n=function(e,t){return s(e.x*t,e.y*t)},o=function(e,t){return s(e.x+t.x,e.y+t.y)},c=function(e,t,i){var r=Math.cos(t),a=Math.sin(t),n=s(e.x-i.x,e.y-i.y);return s(i.x+r*n.x-a*n.y,i.y+a*n.x+r*n.y)},s=function(){return{x:arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,y:arguments.length>1&&void 0!==arguments[1]?arguments[1]:0}},h=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3?arguments[3]:void 0;return"string"==typeof e?parseFloat(e)*i:"number"==typeof e?e*(r?t[r]:Math.min(t.width,t.height)):void 0},u=function(e){return null!=e},l=function(e,t){return Object.keys(t).forEach(function(i){return e.setAttribute(i,t[i])})},d=function(e,t){var i=document.createElementNS("http://www.w3.org/2000/svg",e);return t&&l(i,t),i},f={contain:"xMidYMid meet",cover:"xMidYMid slice"},p={left:"start",center:"middle",right:"end"},g=function(e){return function(t){return d(e,{id:t.id})}},m={image:function(e){var t=d("image",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round",opacity:"0"});return t.onload=function(){t.setAttribute("opacity",e.opacity||1)},t.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",e.src),t},rect:g("rect"),ellipse:g("ellipse"),text:g("text"),path:g("path"),line:function(e){var t=d("g",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round"}),i=d("line");t.appendChild(i);var r=d("path");t.appendChild(r);var a=d("path");return t.appendChild(a),t}},y={rect:function(e){return l(e,Object.assign({},e.rect,e.styles))},ellipse:function(e){var t=e.rect.x+.5*e.rect.width,i=e.rect.y+.5*e.rect.height,r=.5*e.rect.width,a=.5*e.rect.height;return l(e,Object.assign({cx:t,cy:i,rx:r,ry:a},e.styles))},image:function(e,t){l(e,Object.assign({},e.rect,e.styles,{preserveAspectRatio:f[t.fit]||"none"}))},text:function(e,t,i,r){var a=h(t.fontSize,i,r),n=t.fontFamily||"sans-serif",o=t.fontWeight||"normal",c=p[t.textAlign]||"start";l(e,Object.assign({},e.rect,e.styles,{"stroke-width":0,"font-weight":o,"font-size":a,"font-family":n,"text-anchor":c})),e.text!==t.text&&(e.text=t.text,e.textContent=t.text.length?t.text:" ")},path:function(e,t,i,r){var a;l(e,Object.assign({},e.styles,{fill:"none",d:(a=t.points.map(function(e){return{x:h(e.x,i,r,"width"),y:h(e.y,i,r,"height")}}),a.map(function(e,t){return"".concat(0===t?"M":"L"," ").concat(e.x," ").concat(e.y)}).join(" "))}))},line:function(e,t,i,r){l(e,Object.assign({},e.rect,e.styles,{fill:"none"}));var a=e.childNodes[0],u=e.childNodes[1],d=e.childNodes[2],f=e.rect,p={x:e.rect.x+e.rect.width,y:e.rect.y+e.rect.height};if(l(a,{x1:f.x,y1:f.y,x2:p.x,y2:p.y}),t.lineDecoration){u.style.display="none",d.style.display="none";var g=function(e){var t=Math.sqrt(e.x*e.x+e.y*e.y);return 0===t?{x:0,y:0}:s(e.x/t,e.y/t)}({x:p.x-f.x,y:p.y-f.y}),m=h(.05,i,r);if(-1!==t.lineDecoration.indexOf("arrow-begin")){var y=n(g,m),E=o(f,y),v=c(f,2,E),w=c(f,-2,E);l(u,{style:"display:block;",d:"M".concat(v.x,",").concat(v.y," L").concat(f.x,",").concat(f.y," L").concat(w.x,",").concat(w.y)})}if(-1!==t.lineDecoration.indexOf("arrow-end")){var _=n(g,-m),I=o(p,_),M=c(p,2,I),x=c(p,-2,I);l(d,{style:"display:block;",d:"M".concat(M.x,",").concat(M.y," L").concat(p.x,",").concat(p.y," L").concat(x.x,",").concat(x.y)})}}}},E=function(e,t,i,r,a){"path"!==t&&(e.rect=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=h(e.x,t,i,"width")||h(e.left,t,i,"width"),a=h(e.y,t,i,"height")||h(e.top,t,i,"height"),n=h(e.width,t,i,"width"),o=h(e.height,t,i,"height"),c=h(e.right,t,i,"width"),s=h(e.bottom,t,i,"height");return u(a)||(a=u(o)&&u(s)?t.height-o-s:s),u(r)||(r=u(n)&&u(c)?t.width-n-c:c),u(n)||(n=u(r)&&u(c)?t.width-r-c:0),u(o)||(o=u(a)&&u(s)?t.height-a-s:0),{x:r||0,y:a||0,width:n||0,height:o||0}}(i,r,a)),e.styles=function(e,t,i){var r=e.borderStyle||e.lineStyle||"solid",a=e.backgroundColor||e.fontColor||"transparent",n=e.borderColor||e.lineColor||"transparent",o=h(e.borderWidth||e.lineWidth,t,i);return{"stroke-linecap":e.lineCap||"round","stroke-linejoin":e.lineJoin||"round","stroke-width":o||0,"stroke-dasharray":"string"==typeof r?"":r.map(function(e){return h(e,t,i)}).join(","),stroke:n,fill:a,opacity:e.opacity||1}}(i,r,a),y[t](e,i,r,a)},v=["x","y","left","top","right","bottom","width","height"],w=function(e){var t=i(e,2),r=t[0],a=t[1],n=a.points?{}:v.reduce(function(e,t){var i;return e[t]="string"==typeof(i=a[t])&&/%/.test(i)?parseFloat(i)/100:i,e},{});return[r,Object.assign({zIndex:0},a,n)]},_=function(e,t){return e[1].zIndex>t[1].zIndex?1:e[1].zIndex.5?1-r.x:r.x,n=r.y>.5?1-r.y:r.y,o=2*a*e.width,c=2*n*e.height,s=function(e,t){var i=e.width,r=e.height,a=A(i,t),n=A(r,t),o=M(e.x+Math.abs(a.x),e.y-Math.abs(a.y)),c=M(e.x+e.width+Math.abs(n.y),e.y+Math.abs(n.x)),s=M(e.x-Math.abs(n.y),e.y+e.height-Math.abs(n.x));return{width:T(o,c),height:T(o,s)}}(t,i);return Math.max(s.width/o,s.height/c)},P=function(e,t){var i=e.width,r=i*t;return r>e.height&&(i=(r=e.height)/t),{x:.5*(e.width-i),y:.5*(e.height-r),width:i,height:r}},C=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.zoom,r=t.rotation,a=t.center,n=t.aspectRatio;n||(n=e.height/e.width);var o=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=e.height/e.width,a=t,n=1,o=r;o>a&&(n=(o=a)/r);var c=Math.max(1/n,a/o),s=e.width/(i*c*n);return{width:s,height:s*t}}(e,n,i),c={x:.5*o.width,y:.5*o.height},s={x:0,y:0,width:o.width,height:o.height,center:c},h=void 0===t.scaleToFit||t.scaleToFit,u=i*R(e,P(s,n),r,h?a:{x:.5,y:.5});return{widthFloat:o.width/u,heightFloat:o.height/u,width:Math.round(o.width/u),height:Math.round(o.height/u)}},k={type:"spring",stiffness:.5,damping:.45,mass:10},D=function(e){return e.utils.createView({name:"image-clip",tag:"div",ignoreRect:!0,mixins:{apis:["crop","markup","resize","width","height","dirty","background"],styles:["width","height","opacity"],animations:{opacity:{type:"tween",duration:250}}},didWriteView:function(e){var t=e.root,i=e.props;i.background&&(t.element.style.backgroundColor=i.background)},create:function(t){var i=t.root,r=t.props;i.ref.image=i.appendChildView(i.createChildView(function(e){return e.utils.createView({name:"image-canvas-wrapper",tag:"div",ignoreRect:!0,mixins:{apis:["crop","width","height"],styles:["originX","originY","translateX","translateY","scaleX","scaleY","rotateZ"],animations:{originX:k,originY:k,scaleX:k,scaleY:k,translateX:k,translateY:k,rotateZ:k}},create:function(t){var i=t.root,r=t.props;r.width=r.image.width,r.height=r.image.height,i.ref.bitmap=i.appendChildView(i.createChildView(function(e){return e.utils.createView({name:"image-bitmap",ignoreRect:!0,mixins:{styles:["scaleX","scaleY"]},create:function(e){var t=e.root,i=e.props;t.appendChild(i.image)}})}(e),{image:r.image}))},write:function(e){var t=e.root,i=e.props.crop.flip,r=t.ref.bitmap;r.scaleX=i.horizontal?-1:1,r.scaleY=i.vertical?-1:1}})}(e),Object.assign({},r))),i.ref.createMarkup=function(){i.ref.markup||(i.ref.markup=i.appendChildView(i.createChildView(I(e),Object.assign({},r))))},i.ref.destroyMarkup=function(){i.ref.markup&&(i.removeChildView(i.ref.markup),i.ref.markup=null)};var a=i.query("GET_IMAGE_PREVIEW_TRANSPARENCY_INDICATOR");null!==a&&(i.element.dataset.transparencyIndicator="grid"===a?a:"color")},write:function(e){var t=e.root,i=e.props,r=e.shouldOptimize,a=i.crop,n=i.markup,o=i.resize,c=i.dirty,s=i.width,h=i.height;t.ref.image.crop=a;var u={x:0,y:0,width:s,height:h,center:{x:.5*s,y:.5*h}},l={width:t.ref.image.width,height:t.ref.image.height},d={x:a.center.x*l.width,y:a.center.y*l.height},f={x:u.center.x-l.width*a.center.x,y:u.center.y-l.height*a.center.y},p=2*Math.PI+a.rotation%(2*Math.PI),g=a.aspectRatio||l.height/l.width,m=void 0===a.scaleToFit||a.scaleToFit,y=R(l,P(u,g),p,m?a.center:{x:.5,y:.5}),E=a.zoom*y;n&&n.length?(t.ref.createMarkup(),t.ref.markup.width=s,t.ref.markup.height=h,t.ref.markup.resize=o,t.ref.markup.dirty=c,t.ref.markup.markup=n,t.ref.markup.crop=C(l,a)):t.ref.markup&&t.ref.destroyMarkup();var v=t.ref.image;if(r)return v.originX=null,v.originY=null,v.translateX=null,v.translateY=null,v.rotateZ=null,v.scaleX=null,void(v.scaleY=null);v.originX=d.x,v.originY=d.y,v.translateX=f.x,v.translateY=f.y,v.rotateZ=p,v.scaleX=E,v.scaleY=E}})},G=0,V=function(){self.onmessage=function(e){createImageBitmap(e.data.message.file).then(function(t){self.postMessage({id:e.data.id,message:t},[t])})}},O=function(){self.onmessage=function(e){for(var t=e.data.message.imageData,i=e.data.message.colorMatrix,r=t.data,a=r.length,n=i[0],o=i[1],c=i[2],s=i[3],h=i[4],u=i[5],l=i[6],d=i[7],f=i[8],p=i[9],g=i[10],m=i[11],y=i[12],E=i[13],v=i[14],w=i[15],_=i[16],I=i[17],M=i[18],x=i[19],T=0,A=0,R=0,P=0,C=0;T=5&&r<=8){var o=[i,t];t=o[0],i=o[1]}return function(e,t,i,r){-1!==r&&e.transform.apply(e,b[r](t,i))}(n,t,i,r),n.drawImage(e,0,0,t,i),a},L=function(e){return/^image/.test(e.type)&&!/svg/.test(e.type)},N=function(e){var t=Math.min(10/e.width,10/e.height),i=document.createElement("canvas"),r=i.getContext("2d"),a=i.width=Math.ceil(e.width*t),n=i.height=Math.ceil(e.height*t);r.drawImage(e,0,0,a,n);var o=null;try{o=r.getImageData(0,0,a,n).data}catch(e){return null}for(var c=o.length,s=0,h=0,u=0,l=0;l\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n';if(document.querySelector("base")){var a=new URL(window.location.href.replace(window.location.hash,"")).href;r=r.replace(/url\(\#/g,"url("+a+"#")}G++,t.element.classList.add("filepond--image-preview-overlay-".concat(i.status)),t.element.innerHTML=r.replace(/__UID__/g,G)},mixins:{styles:["opacity"],animations:{opacity:{type:"spring",mass:25}}}}),i=function(e){return e.utils.createView({name:"image-preview",tag:"div",ignoreRect:!0,mixins:{apis:["image","crop","markup","resize","dirty","background"],styles:["translateY","scaleX","scaleY","opacity"],animations:{scaleX:k,scaleY:k,translateY:k,opacity:{type:"tween",duration:400}}},create:function(t){var i=t.root,r=t.props;i.ref.clip=i.appendChildView(i.createChildView(D(e),{id:r.id,image:r.image,crop:r.crop,markup:r.markup,resize:r.resize,dirty:r.dirty,background:r.background}))},write:function(e){var t=e.root,i=e.props,r=e.shouldOptimize,a=t.ref.clip,n=i.image,o=i.crop,c=i.markup,s=i.resize,h=i.dirty;if(a.crop=o,a.markup=c,a.resize=s,a.dirty=h,a.opacity=r?0:1,!r&&!t.rect.element.hidden){var u=n.height/n.width,l=o.aspectRatio||u,d=t.rect.inner.width,f=t.rect.inner.height,p=t.query("GET_IMAGE_PREVIEW_HEIGHT"),g=t.query("GET_IMAGE_PREVIEW_MIN_HEIGHT"),m=t.query("GET_IMAGE_PREVIEW_MAX_HEIGHT"),y=t.query("GET_PANEL_ASPECT_RATIO"),E=t.query("GET_ALLOW_MULTIPLE");y&&!E&&(p=d*y,l=y);var v=null!==p?p:Math.max(g,Math.min(d*l,m)),w=v/l;w>d&&(v=(w=d)*l),v>f&&(v=f,w=f/l),a.width=w,a.height=v}}})}(e),r=e.utils.createWorker,a=function(e,t,i){return new Promise(function(a){e.ref.imageData||(e.ref.imageData=i.getContext("2d").getImageData(0,0,i.width,i.height));var n=function(e){var t;try{t=new ImageData(e.width,e.height)}catch(i){t=document.createElement("canvas").getContext("2d").createImageData(e.width,e.height)}return t.data.set(new Uint8ClampedArray(e.data)),t}(e.ref.imageData);if(!t||20!==t.length)return i.getContext("2d").putImageData(n,0,0),a();var o=r(O);o.post({imageData:n,colorMatrix:t},function(e){i.getContext("2d").putImageData(e,0,0),o.terminate(),a()},[n.data.buffer])})},n=function(e){var t=e.root,r=e.props,a=e.image,n=r.id,o=t.query("GET_ITEM",{id:n});if(o){var c,s,h=o.getMetadata("crop")||{center:{x:.5,y:.5},flip:{horizontal:!1,vertical:!1},zoom:1,rotation:0,aspectRatio:null},u=t.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR"),l=!1;t.query("GET_IMAGE_PREVIEW_MARKUP_SHOW")&&(c=o.getMetadata("markup")||[],s=o.getMetadata("resize"),l=!0);var d=t.appendChildView(t.createChildView(i,{id:n,image:a,crop:h,resize:s,markup:c,dirty:l,background:u,opacity:0,scaleX:1.15,scaleY:1.15,translateY:15}),t.childViews.length);t.ref.images.push(d),d.opacity=1,d.scaleX=1,d.scaleY=1,d.translateY=0,setTimeout(function(){t.dispatch("DID_IMAGE_PREVIEW_SHOW",{id:n})},250)}},o=function(e){var t=e.root;t.ref.overlayShadow.opacity=1,t.ref.overlayError.opacity=0,t.ref.overlaySuccess.opacity=0},c=function(e){var t=e.root;t.ref.overlayShadow.opacity=.25,t.ref.overlayError.opacity=1};return e.utils.createView({name:"image-preview-wrapper",create:function(e){var i=e.root;i.ref.images=[],i.ref.imageData=null,i.ref.imageViewBin=[],i.ref.overlayShadow=i.appendChildView(i.createChildView(t,{opacity:0,status:"idle"})),i.ref.overlaySuccess=i.appendChildView(i.createChildView(t,{opacity:0,status:"success"})),i.ref.overlayError=i.appendChildView(i.createChildView(t,{opacity:0,status:"failure"}))},styles:["height"],apis:["height"],destroy:function(e){e.root.ref.images.forEach(function(e){e.image.width=1,e.image.height=1})},didWriteView:function(e){e.root.ref.images.forEach(function(e){e.dirty=!1})},write:e.utils.createRoute({DID_IMAGE_PREVIEW_DRAW:function(e){var t=e.root,i=t.ref.images[t.ref.images.length-1];i.translateY=0,i.scaleX=1,i.scaleY=1,i.opacity=1},DID_IMAGE_PREVIEW_CONTAINER_CREATE:function(e){var t=e.root,i=e.props.id,r=t.query("GET_ITEM",i);if(r){var a,n,o,c=URL.createObjectURL(r.file);a=c,n=function(e,r){t.dispatch("DID_IMAGE_PREVIEW_CALCULATE_SIZE",{id:i,width:e,height:r})},(o=new Image).onload=function(){var e=o.naturalWidth,t=o.naturalHeight;o=null,n(e,t)},o.src=a}},DID_FINISH_CALCULATE_PREVIEWSIZE:function(e){var t=e.root,i=e.props,o=i.id,c=t.query("GET_ITEM",o);if(c){var s,h,u,l=URL.createObjectURL(c.file),d=function(){var e;(e=l,new Promise(function(t,i){var r=new Image;r.crossOrigin="Anonymous",r.onload=function(){t(r)},r.onerror=function(e){i(e)},r.src=e})).then(f)},f=function(e){URL.revokeObjectURL(l);var r=(c.getMetadata("exif")||{}).orientation||-1,o=e.width,s=e.height;if(o&&s){if(r>=5&&r<=8){var h=[s,o];o=h[0],s=h[1]}var u=Math.max(1,.75*window.devicePixelRatio),d=t.query("GET_IMAGE_PREVIEW_ZOOM_FACTOR")*u,f=s/o,p=t.rect.element.width,g=t.rect.element.height,m=p,y=m*f;f>1?y=(m=Math.min(o,p*d))*f:m=(y=Math.min(s,g*d))/f;var E=S(e,m,y,r),v=function(){var r=t.query("GET_IMAGE_PREVIEW_CALCULATE_AVERAGE_IMAGE_COLOR")?N(data):null;c.setMetadata("color",r,!0),"close"in e&&e.close(),t.ref.overlayShadow.opacity=1,n({root:t,props:i,image:E})},w=c.getMetadata("filter");w?a(t,w,E).then(v):v()}};if(s=c.file,h=window.navigator.userAgent.match(/Firefox\/([0-9]+)\./),!(null!==(u=h?parseInt(h[1]):null)&&u<=58)&&"createImageBitmap"in window&&L(s)){var p=r(V);p.post({file:c.file},function(e){p.terminate(),e?f(e):d()})}else d()}},DID_UPDATE_ITEM_METADATA:function(e){var t=e.root,i=e.props,r=e.action;if(/crop|filter|markup|resize/.test(r.change.key)&&t.ref.images.length){var o=t.query("GET_ITEM",{id:i.id});if(o)if(/filter/.test(r.change.key)){var c=t.ref.images[t.ref.images.length-1];a(t,r.change.value,c.image)}else{if(/crop|markup|resize/.test(r.change.key)){var s=o.getMetadata("crop"),h=t.ref.images[t.ref.images.length-1];if(s&&s.aspectRatio&&h.crop&&h.crop.aspectRatio&&Math.abs(s.aspectRatio-h.crop.aspectRatio)>1e-5){var u=function(e){var t=e.root,i=t.ref.images.shift();return i.opacity=0,i.translateY=-15,t.ref.imageViewBin.push(i),i}({root:t});n({root:t,props:i,image:(l=u.image,(d=d||document.createElement("canvas")).width=l.width,d.height=l.height,d.getContext("2d").drawImage(l,0,0),d)})}else!function(e){var t=e.root,i=e.props,r=t.query("GET_ITEM",{id:i.id});if(r){var a=t.ref.images[t.ref.images.length-1];a.crop=r.getMetadata("crop"),a.background=t.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR"),t.query("GET_IMAGE_PREVIEW_MARKUP_SHOW")&&(a.dirty=!0,a.resize=r.getMetadata("resize"),a.markup=r.getMetadata("markup"))}}({root:t,props:i})}var l,d}}},DID_THROW_ITEM_LOAD_ERROR:c,DID_THROW_ITEM_PROCESSING_ERROR:c,DID_THROW_ITEM_INVALID:c,DID_COMPLETE_ITEM_PROCESSING:function(e){var t=e.root;t.ref.overlayShadow.opacity=.25,t.ref.overlaySuccess.opacity=1},DID_START_ITEM_PROCESSING:o,DID_REVERT_ITEM_PROCESSING:o},function(e){var t=e.root,i=t.ref.imageViewBin.filter(function(e){return 0===e.opacity});t.ref.imageViewBin=t.ref.imageViewBin.filter(function(e){return e.opacity>0}),i.forEach(function(e){return function(e,t){e.removeChildView(t),t.image.width=1,t.image.height=1,t._destroy()}(t,e)}),i.length=0})})},H=function(e){var t=e.addFilter,i=e.utils,r=i.Type,a=i.createRoute,n=i.isFile,o=z(e);return t("CREATE_VIEW",function(e){var t=e.is,i=e.view,r=e.query;if(t("file")&&r("GET_ALLOW_IMAGE_PREVIEW")){var c=function(e){e.root.ref.shouldRescale=!0};i.registerWriter(a({DID_RESIZE_ROOT:c,DID_STOP_RESIZE:c,DID_LOAD_ITEM:function(e){var t=e.root,a=e.props.id,c=r("GET_ITEM",a);if(c&&n(c.file)&&!c.archived){var s=c.file;if(function(e){return/^image/.test(e.type)}(s)&&r("GET_IMAGE_PREVIEW_FILTER_ITEM")(c)){var h="createImageBitmap"in(window||{}),u=r("GET_IMAGE_PREVIEW_MAX_FILE_SIZE");if(!(!h&&u&&s.size>u)){t.ref.imagePreview=i.appendChildView(i.createChildView(o,{id:a}));var l=t.query("GET_IMAGE_PREVIEW_HEIGHT");l&&t.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:c.id,height:l});var d=!h&&s.size>r("GET_IMAGE_PREVIEW_MAX_INSTANT_PREVIEW_FILE_SIZE");t.dispatch("DID_IMAGE_PREVIEW_CONTAINER_CREATE",{id:a},d)}}}},DID_IMAGE_PREVIEW_CALCULATE_SIZE:function(e){var t=e.root,i=e.action;t.ref.imageWidth=i.width,t.ref.imageHeight=i.height,t.ref.shouldRescale=!0,t.ref.shouldDrawPreview=!0,t.dispatch("KICK")},DID_UPDATE_ITEM_METADATA:function(e){var t=e.root;"crop"===e.action.change.key&&(t.ref.shouldRescale=!0)}},function(e){var t=e.root,i=e.props;t.ref.imagePreview&&(t.rect.element.hidden||(t.ref.shouldRescale&&(!function(e,t){if(e.ref.imagePreview){var i=t.id,r=e.query("GET_ITEM",{id:i});if(r){var a=e.query("GET_PANEL_ASPECT_RATIO"),n=e.query("GET_ITEM_PANEL_ASPECT_RATIO"),o=e.query("GET_IMAGE_PREVIEW_HEIGHT");if(!(a||n||o)){var c=e.ref,s=c.imageWidth,h=c.imageHeight;if(s&&h){var u=e.query("GET_IMAGE_PREVIEW_MIN_HEIGHT"),l=e.query("GET_IMAGE_PREVIEW_MAX_HEIGHT"),d=(r.getMetadata("exif")||{}).orientation||-1;if(d>=5&&d<=8){var f=[h,s];s=f[0],h=f[1]}if(!L(r.file)||e.query("GET_IMAGE_PREVIEW_UPSCALE")){var p=2048/s;s*=p,h*=p}var g=h/s,m=(r.getMetadata("crop")||{}).aspectRatio||g,y=Math.max(u,Math.min(h,l)),E=e.rect.element.width,v=Math.min(E*m,y);e.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:r.id,height:v})}}}}}(t,i),t.ref.shouldRescale=!1),t.ref.shouldDrawPreview&&(requestAnimationFrame(function(){requestAnimationFrame(function(){t.dispatch("DID_FINISH_CALCULATE_PREVIEWSIZE",{id:i.id})})}),t.ref.shouldDrawPreview=!1)))}))}}),{options:{allowImagePreview:[!0,r.BOOLEAN],imagePreviewFilterItem:[function(){return!0},r.FUNCTION],imagePreviewHeight:[null,r.INT],imagePreviewMinHeight:[44,r.INT],imagePreviewMaxHeight:[256,r.INT],imagePreviewMaxFileSize:[null,r.INT],imagePreviewZoomFactor:[2,r.INT],imagePreviewUpscale:[!1,r.BOOLEAN],imagePreviewMaxInstantPreviewFileSize:[1e6,r.INT],imagePreviewTransparencyIndicator:[null,r.STRING],imagePreviewCalculateAverageImageColor:[!1,r.BOOLEAN],imagePreviewMarkupShow:[!0,r.BOOLEAN],imagePreviewMarkupFilter:[function(){return!0},r.FUNCTION]}}};return"undefined"!=typeof window&&void 0!==window.document&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:H})),H}); diff --git a/plugins/form/assets/filepond/filepond-plugin-image-resize.min.js b/plugins/form/assets/filepond/filepond-plugin-image-resize.min.js new file mode 100644 index 0000000..c446c00 --- /dev/null +++ b/plugins/form/assets/filepond/filepond-plugin-image-resize.min.js @@ -0,0 +1,9 @@ +/*! + * FilePondPluginImageResize 2.0.10 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ + +/* eslint-disable */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).FilePondPluginImageResize=t()}(this,function(){"use strict";var e=function(e){var t=e.addFilter,i=e.utils.Type;return t("DID_LOAD_ITEM",function(e,t){var i=t.query;return new Promise(function(t,n){var r=e.file;if(!function(e){return/^image/.test(e.type)}(r)||!i("GET_ALLOW_IMAGE_RESIZE"))return t(e);var u=i("GET_IMAGE_RESIZE_MODE"),o=i("GET_IMAGE_RESIZE_TARGET_WIDTH"),a=i("GET_IMAGE_RESIZE_TARGET_HEIGHT"),l=i("GET_IMAGE_RESIZE_UPSCALE");if(null===o&&null===a)return t(e);var d,f,E,s=null===o?a:o,c=null===a?s:a,I=URL.createObjectURL(r);d=I,f=function(i){if(URL.revokeObjectURL(I),!i)return t(e);var n=i.width,r=i.height,o=(e.getMetadata("exif")||{}).orientation||-1;if(o>=5&&o<=8){var a=[r,n];n=a[0],r=a[1]}if(n===s&&r===c)return t(e);if(!l)if("cover"===u){if(n<=s||r<=c)return t(e)}else if(n<=s&&r<=s)return t(e);e.setMetadata("resize",{mode:u,upscale:l,size:{width:s,height:c}}),t(e)},(E=new Image).onload=function(){var e=E.naturalWidth,t=E.naturalHeight;E=null,f({width:e,height:t})},E.onerror=function(){return f(null)},E.src=d})}),{options:{allowImageResize:[!0,i.BOOLEAN],imageResizeMode:["cover",i.STRING],imageResizeUpscale:[!0,i.BOOLEAN],imageResizeTargetWidth:[null,i.INT],imageResizeTargetHeight:[null,i.INT]}}};return"undefined"!=typeof window&&void 0!==window.document&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:e})),e}); diff --git a/plugins/form/assets/filepond/filepond-plugin-image-transform.min.js b/plugins/form/assets/filepond/filepond-plugin-image-transform.min.js new file mode 100644 index 0000000..758c171 --- /dev/null +++ b/plugins/form/assets/filepond/filepond-plugin-image-transform.min.js @@ -0,0 +1,9 @@ +/*! + * FilePondPluginImageTransform 3.8.7 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ + +/* eslint-disable */ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).FilePondPluginImageTransform=e()}(this,function(){"use strict";var t={jpeg:"jpg","svg+xml":"svg"},e={1:function(){return[1,0,0,1,0,0]},2:function(t){return[-1,0,0,1,t,0]},3:function(t,e){return[-1,0,0,-1,t,e]},4:function(t,e){return[1,0,0,-1,0,e]},5:function(){return[0,1,1,0,0,0]},6:function(t,e){return[0,1,-1,0,e,0]},7:function(t,e){return[0,-1,-1,0,e,t]},8:function(t){return[0,-1,1,0,0,t]}},n=function(t,e){return{x:t,y:e}},r=function(t,e){return n(t.x-e.x,t.y-e.y)},i=function(t,e){return Math.sqrt(function(t,e){return function(t,e){return t.x*e.x+t.y*e.y}(r(t,e),r(t,e))}(t,e))},a=function(t,e){var r=t,i=e,a=1.5707963267948966-e,o=Math.sin(1.5707963267948966),u=Math.sin(i),c=Math.sin(a),l=Math.cos(a),h=r/o;return n(l*(h*u),l*(h*c))},o=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{x:.5,y:.5},u=o.x>.5?1-o.x:o.x,c=o.y>.5?1-o.y:o.y,l=2*u*t.width,h=2*c*t.height,f=function(t,e){var r=t.width,o=t.height,u=a(r,e),c=a(o,e),l=n(t.x+Math.abs(u.x),t.y-Math.abs(u.y)),h=n(t.x+t.width+Math.abs(c.y),t.y+Math.abs(c.x)),f=n(t.x-Math.abs(c.y),t.y+t.height-Math.abs(c.x));return{width:i(l,h),height:i(l,f)}}(e,r);return Math.max(f.width/l,f.height/h)},u=function(t,e){var n=t.width,r=n*e;return r>t.height&&(n=(r=t.height)/e),{x:.5*(t.width-n),y:.5*(t.height-r),width:n,height:r}},c=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=t.height/t.width,i=e,a=1,o=r;o>i&&(a=(o=i)/r);var u=Math.max(1/a,i/o),c=t.width/(n*u*a);return{width:c,height:c*e}},l=function(t){t.width=1,t.height=1,t.getContext("2d").clearRect(0,0,1,1)},h=function(t){return t&&(t.horizontal||t.vertical)},f=function(t,n,r){if(n<=1&&!h(r))return t.width=t.naturalWidth,t.height=t.naturalHeight,t;var i=document.createElement("canvas"),a=t.naturalWidth,o=t.naturalHeight,u=n>=5&&n<=8;u?(i.width=o,i.height=a):(i.width=a,i.height=o);var c=i.getContext("2d");if(n&&c.transform.apply(c,function(t,n,r){return-1===r&&(r=1),e[r](t,n)}(a,o,n)),h(r)){var l=[1,0,0,1,0,0];(!u&&r.horizontal||u&r.vertical)&&(l[0]=-1,l[4]=a),(!u&&r.vertical||u&&r.horizontal)&&(l[3]=-1,l[5]=o),c.transform.apply(c,l)}return c.drawImage(t,0,0,a,o),i};"undefined"!=typeof window&&void 0!==window.document&&(HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(t,e,n){var r=this.toDataURL(e,n).split(",")[1];setTimeout(function(){for(var n=atob(r),i=n.length,a=new Uint8Array(i),o=0;o0&&void 0!==arguments[0]?arguments[0]:0,y:arguments.length>1&&void 0!==arguments[1]?arguments[1]:0}},m=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3?arguments[3]:void 0;return"string"==typeof t?parseFloat(t)*n:"number"==typeof t?t*(r?e[r]:Math.min(e.width,e.height)):void 0},p=function(t,e,n){var r=t.borderStyle||t.lineStyle||"solid",i=t.backgroundColor||t.fontColor||"transparent",a=t.borderColor||t.lineColor||"transparent",o=m(t.borderWidth||t.lineWidth,e,n);return{"stroke-linecap":t.lineCap||"round","stroke-linejoin":t.lineJoin||"round","stroke-width":o||0,"stroke-dasharray":"string"==typeof r?"":r.map(function(t){return m(t,e,n)}).join(","),stroke:a,fill:i,opacity:t.opacity||1}},w=function(t){return null!=t},x=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=m(t.x,e,n,"width")||m(t.left,e,n,"width"),i=m(t.y,e,n,"height")||m(t.top,e,n,"height"),a=m(t.width,e,n,"width"),o=m(t.height,e,n,"height"),u=m(t.right,e,n,"width"),c=m(t.bottom,e,n,"height");return w(i)||(i=w(o)&&w(c)?e.height-o-c:c),w(r)||(r=w(a)&&w(u)?e.width-a-u:u),w(a)||(a=w(r)&&w(u)?e.width-r-u:0),w(o)||(o=w(i)&&w(c)?e.height-i-c:0),{x:r||0,y:i||0,width:a||0,height:o||0}},M=function(t,e){return Object.keys(e).forEach(function(n){return t.setAttribute(n,e[n])})},T=function(t,e){var n=document.createElementNS("http://www.w3.org/2000/svg",t);return e&&M(n,e),n},b={contain:"xMidYMid meet",cover:"xMidYMid slice"},A={left:"start",center:"middle",right:"end"},R=function(t){return function(e){return T(t,{id:e.id})}},E={image:function(t){var e=T("image",{id:t.id,"stroke-linecap":"round","stroke-linejoin":"round",opacity:"0"});return e.onload=function(){e.setAttribute("opacity",t.opacity||1)},e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",t.src),e},rect:R("rect"),ellipse:R("ellipse"),text:R("text"),path:R("path"),line:function(t){var e=T("g",{id:t.id,"stroke-linecap":"round","stroke-linejoin":"round"}),n=T("line");e.appendChild(n);var r=T("path");e.appendChild(r);var i=T("path");return e.appendChild(i),e}},_={rect:function(t){return M(t,Object.assign({},t.rect,t.styles))},ellipse:function(t){var e=t.rect.x+.5*t.rect.width,n=t.rect.y+.5*t.rect.height,r=.5*t.rect.width,i=.5*t.rect.height;return M(t,Object.assign({cx:e,cy:n,rx:r,ry:i},t.styles))},image:function(t,e){M(t,Object.assign({},t.rect,t.styles,{preserveAspectRatio:b[e.fit]||"none"}))},text:function(t,e,n,r){var i=m(e.fontSize,n,r),a=e.fontFamily||"sans-serif",o=e.fontWeight||"normal",u=A[e.textAlign]||"start";M(t,Object.assign({},t.rect,t.styles,{"stroke-width":0,"font-weight":o,"font-size":i,"font-family":a,"text-anchor":u})),t.text!==e.text&&(t.text=e.text,t.textContent=e.text.length?e.text:" ")},path:function(t,e,n,r){var i;M(t,Object.assign({},t.styles,{fill:"none",d:(i=e.points.map(function(t){return{x:m(t.x,n,r,"width"),y:m(t.y,n,r,"height")}}),i.map(function(t,e){return"".concat(0===e?"M":"L"," ").concat(t.x," ").concat(t.y)}).join(" "))}))},line:function(t,e,n,r){M(t,Object.assign({},t.rect,t.styles,{fill:"none"}));var i=t.childNodes[0],a=t.childNodes[1],o=t.childNodes[2],u=t.rect,c={x:t.rect.x+t.rect.width,y:t.rect.y+t.rect.height};if(M(i,{x1:u.x,y1:u.y,x2:c.x,y2:c.y}),e.lineDecoration){a.style.display="none",o.style.display="none";var l=g({x:c.x-u.x,y:c.y-u.y}),h=m(.05,n,r);if(-1!==e.lineDecoration.indexOf("arrow-begin")){var f=s(l,h),y=d(u,f),p=v(u,2,y),w=v(u,-2,y);M(a,{style:"display:block;",d:"M".concat(p.x,",").concat(p.y," L").concat(u.x,",").concat(u.y," L").concat(w.x,",").concat(w.y)})}if(-1!==e.lineDecoration.indexOf("arrow-end")){var x=s(l,-h),T=d(c,x),b=v(c,2,T),A=v(c,-2,T);M(o,{style:"display:block;",d:"M".concat(b.x,",").concat(b.y," L").concat(c.x,",").concat(c.y," L").concat(A.x,",").concat(A.y)})}}}},O=function(t,e){return t[1].zIndex>e[1].zIndex?1:t[1].zIndex1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=arguments.length>3?arguments[3]:void 0;return new Promise(function(i){var a=r.background,c=void 0===a?null:a,l=new FileReader;l.onloadend=function(){var t=l.result,r=document.createElement("div");r.style.cssText="position:absolute;pointer-events:none;width:0;height:0;visibility:hidden;",r.innerHTML=t;var a=r.querySelector("svg");document.body.appendChild(r);var h=a.getBBox();r.parentNode.removeChild(r);var f=r.querySelector("title"),s=a.getAttribute("viewBox")||"",d=a.getAttribute("width")||"",g=a.getAttribute("height")||"",v=parseFloat(d)||null,y=parseFloat(g)||null,m=(d.match(/[a-z]+/)||[])[0]||"",w=(g.match(/[a-z]+/)||[])[0]||"",M=s.split(" ").map(parseFloat),T=M.length?{x:M[0],y:M[1],width:M[2],height:M[3]}:h,b=null!=v?v:T.width,A=null!=y?y:T.height;a.style.overflow="visible",a.setAttribute("width",b),a.setAttribute("height",A);var R="";if(n&&n.length){var I={width:b,height:A};R=n.sort(O).reduce(function(t,e){var n,r,i=(n=e[0],r=e[1],E[n](r));return function(t,e,n,r,i){"path"!==e&&(t.rect=x(n,r,i)),t.styles=p(n,r,i),_[e](t,n,r,i)}(i,e[0],e[1],I),i.removeAttribute("id"),1===i.getAttribute("opacity")&&i.removeAttribute("opacity"),t+"\n"+i.outerHTML+"\n"},""),R="\n\n".concat(R.replace(/ /g," "),"\n\n")}var N=e.aspectRatio||A/b,L=b,S=L*N,C=void 0===e.scaleToFit||e.scaleToFit,U=e.center?e.center.x:.5,k=e.center?e.center.y:.5,P=o({width:b,height:A},u({width:L,height:S},N),e.rotation,C?{x:U,y:k}:{x:.5,y:.5}),F=e.zoom*P,B=e.rotation*(180/Math.PI),G={x:.5*L,y:.5*S},j={x:G.x-b*U,y:G.y-A*k},z=["rotate(".concat(B," ").concat(G.x," ").concat(G.y,")"),"translate(".concat(G.x," ").concat(G.y,")"),"scale(".concat(F,")"),"translate(".concat(-G.x," ").concat(-G.y,")"),"translate(".concat(j.x," ").concat(j.y,")")],D=e.flip&&e.flip.horizontal,q=e.flip&&e.flip.vertical,H=["scale(".concat(D?-1:1," ").concat(q?-1:1,")"),"translate(".concat(D?-b:0," ").concat(q?-A:0,")")],V='\n\n\x3c!-- Generated by PQINA - https://pqina.nl/ --\x3e\n').concat(f?f.textContent:"",'\n\n\n').concat(a.outerHTML).concat(R,"\n\n\n");i(V)},l.readAsText(t)})},N=function(){var t={resize:function(t,e){var n=e.mode,r=void 0===n?"contain":n,i=e.upscale,o=void 0!==i&&i,l=e.width,h=e.height,f=e.matrix;if(f=!f||u(f)?null:f,!l&&!h)return c(t,f);null===l?l=h:null===h&&(h=l);if("force"!==r){var s=l/t.width,d=h/t.height,g=1;if("cover"===r?g=Math.max(s,d):"contain"===r&&(g=Math.min(s,d)),g>1&&!1===o)return c(t,f);l=t.width*g,h=t.height*g}for(var v=t.width,y=t.height,m=Math.round(l),p=Math.round(h),w=t.data,x=new Uint8ClampedArray(m*p*4),M=v/m,T=y/p,b=Math.ceil(.5*M),A=Math.ceil(.5*T),R=0;R=-1&&D<=1&&(O=2*D*D*D-3*D*D+1)>0){var q=w[(z=4*(j+P*v))+3];U+=O*q,N+=O,q<255&&(O=O*q/250),L+=O*w[z],S+=O*w[z+1],C+=O*w[z+2],I+=O}}x[_]=L/I,x[_+1]=S/I,x[_+2]=C/I,x[_+3]=U/N,f&&a(_,x,f)}return{data:x,width:m,height:p}},filter:c},e=function(e,n){var r=e.transforms,i=null;if(r.forEach(function(t){"filter"===t.type&&(i=t)}),i){var a=null;r.forEach(function(t){"resize"===t.type&&(a=t)}),a&&(a.data.matrix=i.data,r=r.filter(function(t){return"filter"!==t.type}))}n(function(e,n){return e.forEach(function(e){n=t[e.type](n,e.data)}),n}(r,e.imageData))};self.onmessage=function(t){e(t.data.message,function(e){self.postMessage({id:t.data.id,message:e},[e.data.buffer])})};var n=1,r=1,i=1;function a(t,e,a){var o=e[t]/255,u=e[t+1]/255,c=e[t+2]/255,l=e[t+3]/255,h=o*a[0]+u*a[1]+c*a[2]+l*a[3]+a[4],f=o*a[5]+u*a[6]+c*a[7]+l*a[8]+a[9],s=o*a[10]+u*a[11]+c*a[12]+l*a[13]+a[14],d=o*a[15]+u*a[16]+c*a[17]+l*a[18]+a[19],g=Math.max(0,h*d)+n*(1-d),v=Math.max(0,f*d)+r*(1-d),y=Math.max(0,s*d)+i*(1-d);e[t]=255*Math.max(0,Math.min(1,g)),e[t+1]=255*Math.max(0,Math.min(1,v)),e[t+2]=255*Math.max(0,Math.min(1,y))}var o=self.JSON.stringify([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0]);function u(t){return self.JSON.stringify(t||[])===o}function c(t,e){if(!e||u(e))return t;for(var a=t.data,o=a.length,c=e[0],l=e[1],h=e[2],f=e[3],s=e[4],d=e[5],g=e[6],v=e[7],y=e[8],m=e[9],p=e[10],w=e[11],x=e[12],M=e[13],T=e[14],b=e[15],A=e[16],R=e[17],E=e[18],_=e[19],O=0,I=0,N=0,L=0,S=0,C=0,U=0,k=0,P=0,F=0,B=0,G=0;O=65504&&n<=65519||65534===n)&&(a||(a=L(e,i)),!(i+r>e.byteLength));)i+=r;return t.slice(0,i)}(n.result)||null)},n.readAsArrayBuffer(t.slice(0,262144))})},C=function(t,e){var n=window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder;if(n){var r=new n;return r.append(t),r.getBlob(e)}return new Blob([t],{type:e})},U=function(t){var e=new Blob(["(",t.toString(),")()"],{type:"application/javascript"}),n=URL.createObjectURL(e),r=new Worker(n),i=[];return{transfer:function(){},post:function(t,e,n){var a=Math.random().toString(36).substr(2,9);i[a]=e,r.onmessage=function(t){var e=i[t.data.id];e&&(e(t.data.message),delete i[t.data.id])},r.postMessage({id:a,message:t},n)},terminate:function(){r.terminate(),URL.revokeObjectURL(n)}}},k=function(t,e){return new Promise(function(n){var r,i={width:t.width,height:t.height},a=t.getContext("2d"),o=e.sort(O).map(function(t){return function(){return new Promise(function(e){B[t[0]](a,i,t[1],e)&&e()})}});(r=o,r.reduce(function(t,e){return t.then(function(t){return e().then(Array.prototype.concat.bind(t))})},Promise.resolve([]))).then(function(){return n(t)})})},P=function(t,e){t.beginPath(),t.lineCap=e["stroke-linecap"],t.lineJoin=e["stroke-linejoin"],t.lineWidth=e["stroke-width"],e["stroke-dasharray"].length&&t.setLineDash(e["stroke-dasharray"].split(",")),t.fillStyle=e.fill,t.strokeStyle=e.stroke,t.globalAlpha=e.opacity||1},F=function(t){t.fill(),t.stroke(),t.globalAlpha=1},B={rect:function(t,e,n){var r=x(n,e),i=p(n,e);return P(t,i),t.rect(r.x,r.y,r.width,r.height),F(t),!0},ellipse:function(t,e,n){var r=x(n,e),i=p(n,e);P(t,i);var a=r.x,o=r.y,u=r.width,c=r.height,l=u/2*.5522848,h=c/2*.5522848,f=a+u,s=o+c,d=a+u/2,g=o+c/2;return t.moveTo(a,g),t.bezierCurveTo(a,g-h,d-l,o,d,o),t.bezierCurveTo(d+l,o,f,g-h,f,g),t.bezierCurveTo(f,g+h,d+l,s,d,s),t.bezierCurveTo(d-l,s,a,g+h,a,g),F(t),!0},image:function(t,e,n,r){var i=x(n,e),a=p(n,e);P(t,a);var o=new Image;new URL(n.src,window.location.href).origin!==window.location.origin&&(o.crossOrigin=""),o.onload=function(){if("cover"===n.fit){var e=i.width/i.height,a=e>1?o.width:o.height*e,u=e>1?o.width/e:o.height,c=.5*o.width-.5*a,l=.5*o.height-.5*u;t.drawImage(o,c,l,a,u,i.x,i.y,i.width,i.height)}else if("contain"===n.fit){var h=Math.min(i.width/o.width,i.height/o.height),f=h*o.width,s=h*o.height,d=i.x+.5*i.width-.5*f,g=i.y+.5*i.height-.5*s;t.drawImage(o,0,0,o.width,o.height,d,g,f,s)}else t.drawImage(o,0,0,o.width,o.height,i.x,i.y,i.width,i.height);F(t),r()},o.src=n.src},text:function(t,e,n){var r=x(n,e),i=p(n,e);P(t,i);var a=m(n.fontSize,e),o=n.fontFamily||"sans-serif",u=n.fontWeight||"normal",c=n.textAlign||"left";return t.font="".concat(u," ").concat(a,"px ").concat(o),t.textAlign=c,t.fillText(n.text,r.x,r.y),F(t),!0},line:function(t,e,n){var r=x(n,e),i=p(n,e);P(t,i),t.beginPath();var a={x:r.x,y:r.y},o={x:r.x+r.width,y:r.y+r.height};t.moveTo(a.x,a.y),t.lineTo(o.x,o.y);var u=g({x:o.x-a.x,y:o.y-a.y}),c=.04*Math.min(e.width,e.height);if(-1!==n.lineDecoration.indexOf("arrow-begin")){var l=s(u,c),h=d(a,l),f=v(a,2,h),y=v(a,-2,h);t.moveTo(f.x,f.y),t.lineTo(a.x,a.y),t.lineTo(y.x,y.y)}if(-1!==n.lineDecoration.indexOf("arrow-end")){var m=s(u,-c),w=d(o,m),M=v(o,2,w),T=v(o,-2,w);t.moveTo(M.x,M.y),t.lineTo(o.x,o.y),t.lineTo(T.x,T.y)}return F(t),!0},path:function(t,e,n){var r=p(n,e);P(t,r),t.beginPath();var i=n.points.map(function(t){return{x:m(t.x,e,1,"width"),y:m(t.y,e,1,"height")}});t.moveTo(i[0].x,i[0].y);for(var a=i.length,o=1;o2&&void 0!==arguments[2]?arguments[2]:{};return new Promise(function(r,i){if(!t||!function(t){return/^image/.test(t.type)}(t))return i({status:"not an image file",file:t});var a=n.stripImageHead,h=n.beforeCreateBlob,s=n.afterCreateBlob,d=n.canvasMemoryLimit,g=e.crop,v=e.size,y=e.filter,m=e.markup,p=e.output,w=e.image&&e.image.orientation?Math.max(1,Math.min(8,e.image.orientation)):null,x=p&&p.quality,M=null===x?null:x/100,T=p&&p.type||null,b=p&&p.background||null,A=[];!v||"number"!=typeof v.width&&"number"!=typeof v.height||A.push({type:"resize",data:v}),y&&20===y.length&&A.push({type:"filter",data:y});var R=function(t){var e=s?s(t):t;Promise.resolve(e).then(r)},E=function(e,n){var r=function(t){var e=document.createElement("canvas");return e.width=t.width,e.height=t.height,e.getContext("2d").putImageData(t,0,0),e}(e),o=m.length?k(r,m):r;Promise.resolve(o).then(function(e){(function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return new Promise(function(r){var i=n?n(t):t;Promise.resolve(i).then(function(t){t.toBlob(r,e.type,e.quality)})})})(e,n,h).then(function(n){if(l(e),a)return R(n);S(t).then(function(t){null!==t&&(n=new Blob([t,n.slice(20)],{type:n.type})),R(n)})}).catch(i)})};if(/svg/.test(t.type)&&null===T)return I(t,g,m,{background:b}).then(function(t){r(C(t,"image/svg+xml"))});var _=URL.createObjectURL(t);(function(t){return new Promise(function(e,n){var r=new Image;r.onload=function(){e(r)},r.onerror=function(t){n(t)},r.src=t})})(_).then(function(e){URL.revokeObjectURL(_);var n=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.canvasMemoryLimit,a=r.background,h=void 0===a?null:a,s=n.zoom||1,d=f(t,e,n.flip),g={width:d.width,height:d.height},v=n.aspectRatio||g.height/g.width,y=c(g,v,s);if(i){var m=y.width*y.height;if(m>i){var p=Math.sqrt(i)/Math.sqrt(m);g.width=Math.floor(g.width*p),g.height=Math.floor(g.height*p),y=c(g,v,s)}}var w=document.createElement("canvas"),x={x:.5*y.width,y:.5*y.height},M={x:0,y:0,width:y.width,height:y.height,center:x},T=void 0===n.scaleToFit||n.scaleToFit,b=s*o(g,u(M,v),n.rotation,T?n.center:{x:.5,y:.5});w.width=Math.round(y.width/b),w.height=Math.round(y.height/b),x.x/=b,x.y/=b;var A=x.x-g.width*(n.center?n.center.x:.5),R=x.y-g.height*(n.center?n.center.y:.5),E=w.getContext("2d");h&&(E.fillStyle=h,E.fillRect(0,0,w.width,w.height)),E.translate(x.x,x.y),E.rotate(n.rotation||0),E.drawImage(d,A-x.x,R-x.y,g.width,g.height);var _=E.getImageData(0,0,w.width,w.height);return l(w),_}(e,w,g,{canvasMemoryLimit:d,background:b}),r={quality:M,type:T||t.type};if(!A.length)return E(n,r);var i=U(N);i.post({transforms:A,imageData:n},function(t){E(function(t){var e;try{e=new ImageData(t.width,t.height)}catch(n){e=document.createElement("canvas").getContext("2d").createImageData(t.width,t.height)}return e.data.set(t.data),e}(t),r),i.terminate()},[n.data.buffer])}).catch(i)})};function j(t){this.wrapped=t}function z(t){var e,n;function r(e,n){try{var a=t[e](n),o=a.value,u=o instanceof j;Promise.resolve(u?o.wrapped:o).then(function(t){u?r("next",t):i(a.done?"return":"normal",t)},function(t){r("throw",t)})}catch(t){i("throw",t)}}function i(t,i){switch(t){case"return":e.resolve({value:i,done:!0});break;case"throw":e.reject(i);break;default:e.resolve({value:i,done:!1})}(e=e.next)?r(e.key,e.arg):n=null}this._invoke=function(t,i){return new Promise(function(a,o){var u={key:t,arg:i,resolve:a,reject:o,next:null};n?n=n.next=u:(e=n=u,r(t,i))})},"function"!=typeof t.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(z.prototype[Symbol.asyncIterator]=function(){return this}),z.prototype.next=function(t){return this._invoke("next",t)},z.prototype.throw=function(t){return this._invoke("throw",t)},z.prototype.return=function(t){return this._invoke("return",t)};function D(t,e){return q(t)||function(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,u=t[Symbol.iterator]();!(r=(o=u.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(t){i=!0,a=t}finally{try{r||null==u.return||u.return()}finally{if(i)throw a}}return n}(t,e)||H()}function q(t){if(Array.isArray(t))return t}function H(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}var V=["x","y","left","top","right","bottom","width","height"],W=function(t){var e=D(t,2),n=e[0],r=e[1],i=r.points?{}:V.reduce(function(t,e){var n;return t[e]="string"==typeof(n=r[e])&&/%/.test(n)?parseFloat(n)/100:n,t},{});return[n,Object.assign({zIndex:0},r,i)]};"undefined"!=typeof window&&void 0!==window.document&&(HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(t,e,n){var r=this;setTimeout(function(){for(var i=r.toDataURL(e,n).split(",")[1],a=atob(i),o=a.length,u=new Uint8Array(o);o--;)u[o]=a.charCodeAt(o);t(new Blob([u],{type:e||"image/png"}))})}}));var Y="undefined"!=typeof window&&void 0!==window.document,Q=Y&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,J=function(e){var n=e.addFilter,r=e.utils,i=r.Type,a=r.forin,o=r.getFileFromBlob,u=r.isFile,c=["crop","resize","filter","markup","output"],l=function(t){return null===t.aspectRatio&&0===t.rotation&&1===t.zoom&&t.center&&.5===t.center.x&&.5===t.center.y&&t.flip&&!1===t.flip.horizontal&&!1===t.flip.vertical};n("SHOULD_PREPARE_OUTPUT",function(t,e){var n=e.query;return new Promise(function(t){t(!n("IS_ASYNC"))})});var h=function(t,e,n){return new Promise(function(r){if(!t("GET_ALLOW_IMAGE_TRANSFORM")||n.archived||!u(e)||!function(t){return/^image/.test(t.type)}(e))return r(!1);(function(t){return new Promise(function(e,n){var r=new Image;r.src=URL.createObjectURL(t);var i=function(){var t=r.naturalWidth,n=r.naturalHeight;t&&n&&(URL.revokeObjectURL(r.src),clearInterval(a),e({width:t,height:n}))};r.onerror=function(t){URL.revokeObjectURL(r.src),clearInterval(a),n(t)};var a=setInterval(i,1);i()})})(e).then(function(){var n=t("GET_IMAGE_TRANSFORM_IMAGE_FILTER");if(n){var i=n(e);if(null==i)return handleRevert(!0);if("boolean"==typeof i)return r(i);if("function"==typeof i.then)return i.then(r)}r(!0)}).catch(function(t){r(!1)})})};return n("DID_CREATE_ITEM",function(t,e){var n=e.query,r=e.dispatch;n("GET_ALLOW_IMAGE_TRANSFORM")&&t.extend("requestPrepare",function(){return new Promise(function(e,n){r("REQUEST_PREPARE_OUTPUT",{query:t.id,item:t,success:e,failure:n},!0)})})}),n("PREPARE_OUTPUT",function(e,n){var r=n.query,i=n.item;return new Promise(function(n){h(r,e,i).then(function(u){if(!u)return n(e);var h=[];r("GET_IMAGE_TRANSFORM_VARIANTS_INCLUDE_ORIGINAL")&&h.push(function(){return new Promise(function(t){t({name:r("GET_IMAGE_TRANSFORM_VARIANTS_ORIGINAL_NAME"),file:e})})}),r("GET_IMAGE_TRANSFORM_VARIANTS_INCLUDE_DEFAULT")&&h.push(function(t,e,n){return new Promise(function(i){t(e,n).then(function(t){return i({name:r("GET_IMAGE_TRANSFORM_VARIANTS_DEFAULT_NAME"),file:t})})})});var f=r("GET_IMAGE_TRANSFORM_VARIANTS")||{};a(f,function(t,e){var n,r=(n=e,function(t,e,r){return t(e,n?n(r):r)});h.push(function(e,n,i){return new Promise(function(a){r(e,n,i).then(function(e){return a({name:t,file:e})})})})});var s=r("GET_IMAGE_TRANSFORM_OUTPUT_QUALITY"),d=r("GET_IMAGE_TRANSFORM_OUTPUT_QUALITY_MODE"),g=null===s?null:s/100,v=r("GET_IMAGE_TRANSFORM_OUTPUT_MIME_TYPE"),y=r("GET_IMAGE_TRANSFORM_CLIENT_TRANSFORMS")||c;i.setMetadata("output",{type:v,quality:g,client:y},!0);var m=function(e,n){return new Promise(function(i,a){var u=Object.assign({},n);Object.keys(u).filter(function(t){return"exif"!==t}).forEach(function(t){-1===y.indexOf(t)&&delete u[t]});var c=u.resize,h=u.exif,f=u.output,s=u.crop,g=u.filter,v=u.markup,m={image:{orientation:h?h.orientation:null},output:f&&(f.type||"number"==typeof f.quality||f.background)?{type:f.type,quality:"number"==typeof f.quality?100*f.quality:null,background:f.background||r("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR")||null}:void 0,size:c&&(c.size.width||c.size.height)?Object.assign({mode:c.mode,upscale:c.upscale},c.size):void 0,crop:s&&!l(s)?Object.assign({},s):void 0,markup:v&&v.length?v.map(W):[],filter:g};if(m.output){var p=!!f.type&&f.type!==e.type,w=/\/jpe?g$/.test(e.type),x=null!==f.quality&&(w&&"always"===d);if(!!!(m.size||m.crop||m.filter||p||x))return i(e)}var M={beforeCreateBlob:r("GET_IMAGE_TRANSFORM_BEFORE_CREATE_BLOB"),afterCreateBlob:r("GET_IMAGE_TRANSFORM_AFTER_CREATE_BLOB"),canvasMemoryLimit:r("GET_IMAGE_TRANSFORM_CANVAS_MEMORY_LIMIT"),stripImageHead:r("GET_IMAGE_TRANSFORM_OUTPUT_STRIP_IMAGE_HEAD")};G(e,m,M).then(function(n){var r,a=o(n,function(e,n){var r=function(t){return t.substr(0,t.lastIndexOf("."))||t}(e),i=n.split("/")[1],a=t[i]||i;return"".concat(r,".").concat(a)}(e.name,(r=n.type,/jpeg|png|svg\+xml/.test(r)?r:"image/jpeg")));i(a)}).catch(a)})},p=h.map(function(t){return t(m,e,i.getMetadata())});Promise.all(p).then(function(t){n(1===t.length&&null===t[0].name?t[0].file:t)})})})}),{options:{allowImageTransform:[!0,i.BOOLEAN],imageTransformImageFilter:[null,i.FUNCTION],imageTransformOutputMimeType:[null,i.STRING],imageTransformOutputQuality:[null,i.INT],imageTransformOutputStripImageHead:[!0,i.BOOLEAN],imageTransformClientTransforms:[null,i.ARRAY],imageTransformOutputQualityMode:["always",i.STRING],imageTransformVariants:[null,i.OBJECT],imageTransformVariantsIncludeDefault:[!0,i.BOOLEAN],imageTransformVariantsDefaultName:[null,i.STRING],imageTransformVariantsIncludeOriginal:[!1,i.BOOLEAN],imageTransformVariantsOriginalName:["original_",i.STRING],imageTransformBeforeCreateBlob:[null,i.FUNCTION],imageTransformAfterCreateBlob:[null,i.FUNCTION],imageTransformCanvasMemoryLimit:[Y&&Q?16777216:null,i.INT],imageTransformCanvasBackgroundColor:[null,i.STRING]}}};return Y&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:J})),J}); diff --git a/plugins/form/assets/filepond/filepond.min.css b/plugins/form/assets/filepond/filepond.min.css new file mode 100644 index 0000000..4843b37 --- /dev/null +++ b/plugins/form/assets/filepond/filepond.min.css @@ -0,0 +1,8 @@ +/*! + * FilePond 4.32.7 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ + +/* eslint-disable */ +.filepond--assistant{position:absolute;overflow:hidden;height:1px;width:1px;padding:0;border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.filepond--browser.filepond--browser{position:absolute;margin:0;padding:0;left:1em;top:1.75em;width:calc(100% - 2em);opacity:0;font-size:0}.filepond--data{position:absolute;width:0;height:0;padding:0;margin:0;border:none;visibility:hidden;pointer-events:none;contain:strict}.filepond--drip{position:absolute;top:0;left:0;right:0;bottom:0;overflow:hidden;opacity:.1;pointer-events:none;border-radius:.5em;background:rgba(0,0,0,.01)}.filepond--drip-blob{-webkit-transform-origin:center center;transform-origin:center center;width:8em;height:8em;margin-left:-4em;margin-top:-4em;background:#292625;border-radius:50%}.filepond--drip-blob,.filepond--drop-label{position:absolute;top:0;left:0;will-change:transform,opacity}.filepond--drop-label{right:0;margin:0;color:#4f4f4f;display:flex;justify-content:center;align-items:center;height:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.filepond--drop-label.filepond--drop-label label{display:block;margin:0;padding:.5em}.filepond--drop-label label{cursor:default;font-size:.875em;font-weight:400;text-align:center;line-height:1.5}.filepond--label-action{text-decoration:underline;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;-webkit-text-decoration-color:#a7a4a4;text-decoration-color:#a7a4a4;cursor:pointer}.filepond--root[data-disabled] .filepond--drop-label label{opacity:.5}.filepond--file-action-button.filepond--file-action-button{font-size:1em;width:1.625em;height:1.625em;font-family:inherit;line-height:inherit;margin:0;padding:0;border:none;outline:none;will-change:transform,opacity}.filepond--file-action-button.filepond--file-action-button span{position:absolute;overflow:hidden;height:1px;width:1px;padding:0;border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.filepond--file-action-button.filepond--file-action-button svg{width:100%;height:100%}.filepond--file-action-button.filepond--file-action-button:after{position:absolute;left:-.75em;right:-.75em;top:-.75em;bottom:-.75em;content:""}.filepond--file-action-button{cursor:auto;color:#fff;border-radius:50%;background-color:rgba(0,0,0,.5);background-image:none;box-shadow:0 0 0 0 hsla(0,0%,100%,0);transition:box-shadow .25s ease-in}.filepond--file-action-button:focus,.filepond--file-action-button:hover{box-shadow:0 0 0 .125em hsla(0,0%,100%,.9)}.filepond--file-action-button[disabled]{color:hsla(0,0%,100%,.5);background-color:rgba(0,0,0,.25)}.filepond--file-action-button[hidden]{display:none}.filepond--action-edit-item.filepond--action-edit-item{width:2em;height:2em;padding:.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=center]{margin-left:-.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom]{margin-bottom:-.1875em}.filepond--action-edit-item-alt{border:none;line-height:inherit;background:transparent;font-family:inherit;color:inherit;outline:none;padding:0;margin:0 0 0 .25em;pointer-events:all;position:absolute}.filepond--action-edit-item-alt svg{width:1.3125em;height:1.3125em}.filepond--action-edit-item-alt span{font-size:0;opacity:0}.filepond--file-info{position:static;display:flex;flex-direction:column;align-items:flex-start;flex:1;margin:0 .5em 0 0;min-width:0;will-change:transform,opacity;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.filepond--file-info *{margin:0}.filepond--file-info .filepond--file-info-main{font-size:.75em;line-height:1.2;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;width:100%}.filepond--file-info .filepond--file-info-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out;white-space:nowrap}.filepond--file-info .filepond--file-info-sub:empty{display:none}.filepond--file-status{position:static;display:flex;flex-direction:column;align-items:flex-end;flex-grow:0;flex-shrink:0;margin:0;min-width:2.25em;text-align:right;will-change:transform,opacity;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.filepond--file-status *{margin:0;white-space:nowrap}.filepond--file-status .filepond--file-status-main{font-size:.75em;line-height:1.2}.filepond--file-status .filepond--file-status-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out}.filepond--file-wrapper.filepond--file-wrapper{border:none;margin:0;padding:0;min-width:0;height:100%}.filepond--file-wrapper.filepond--file-wrapper>legend{position:absolute;overflow:hidden;height:1px;width:1px;padding:0;border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.filepond--file{position:static;display:flex;height:100%;align-items:flex-start;padding:.5625em;color:#fff;border-radius:.5em}.filepond--file .filepond--file-status{margin-left:auto;margin-right:2.25em}.filepond--file .filepond--processing-complete-indicator{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.filepond--file .filepond--file-action-button,.filepond--file .filepond--processing-complete-indicator,.filepond--file .filepond--progress-indicator{position:absolute}.filepond--file [data-align*=left]{left:.5625em}.filepond--file [data-align*=right]{right:.5625em}.filepond--file [data-align*=center]{left:calc(50% - .8125em)}.filepond--file [data-align*=bottom]{bottom:1.125em}.filepond--file [data-align=center]{top:calc(50% - .8125em)}.filepond--file .filepond--progress-indicator{margin-top:.1875em}.filepond--file .filepond--progress-indicator[data-align*=right]{margin-right:.1875em}.filepond--file .filepond--progress-indicator[data-align*=left]{margin-left:.1875em}[data-filepond-item-state*=error] .filepond--file-info,[data-filepond-item-state*=invalid] .filepond--file-info,[data-filepond-item-state=cancelled] .filepond--file-info{margin-right:2.25em}[data-filepond-item-state~=processing] .filepond--file-status-sub{opacity:0}[data-filepond-item-state~=processing] .filepond--action-abort-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-error] .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-error] .filepond--action-retry-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg{-webkit-animation:fall .5s linear .125s both;animation:fall .5s linear .125s both}[data-filepond-item-state=processing-complete] .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--file-info-sub,[data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden])~.filepond--file-status .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing~.filepond--file-info .filepond--file-info-sub{opacity:.5}[data-filepond-item-state*=error] .filepond--file-wrapper,[data-filepond-item-state*=error] .filepond--panel,[data-filepond-item-state*=invalid] .filepond--file-wrapper,[data-filepond-item-state*=invalid] .filepond--panel{-webkit-animation:shake .65s linear both;animation:shake .65s linear both}[data-filepond-item-state*=busy] .filepond--progress-indicator svg{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes shake{10%,90%{-webkit-transform:translateX(-.0625em);transform:translateX(-.0625em)}20%,80%{-webkit-transform:translateX(.125em);transform:translateX(.125em)}30%,50%,70%{-webkit-transform:translateX(-.25em);transform:translateX(-.25em)}40%,60%{-webkit-transform:translateX(.25em);transform:translateX(.25em)}}@keyframes shake{10%,90%{-webkit-transform:translateX(-.0625em);transform:translateX(-.0625em)}20%,80%{-webkit-transform:translateX(.125em);transform:translateX(.125em)}30%,50%,70%{-webkit-transform:translateX(-.25em);transform:translateX(-.25em)}40%,60%{-webkit-transform:translateX(.25em);transform:translateX(.25em)}}@-webkit-keyframes fall{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}70%{opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}to{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes fall{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}70%{opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}to{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.filepond--hopper[data-hopper-state=drag-over]>*{pointer-events:none}.filepond--hopper[data-hopper-state=drag-over]:after{content:"";position:absolute;left:0;top:0;right:0;bottom:0;z-index:100}.filepond--progress-indicator{z-index:103}.filepond--file-action-button{z-index:102}.filepond--file-status{z-index:101}.filepond--file-info{z-index:100}.filepond--item{position:absolute;top:0;left:0;right:0;z-index:1;padding:0;margin:.25em;will-change:transform,opacity;touch-action:auto}.filepond--item>.filepond--panel{z-index:-1}.filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:0 .0625em .125em -.0625em rgba(0,0,0,.25)}.filepond--item>.filepond--file-wrapper,.filepond--item>.filepond--panel{transition:opacity .15s ease-out}.filepond--item[data-drag-state]{cursor:-webkit-grab;cursor:grab}.filepond--item[data-drag-state]>.filepond--panel{transition:box-shadow .125s ease-in-out;box-shadow:0 0 0 transparent}.filepond--item[data-drag-state=drag]{cursor:-webkit-grabbing;cursor:grabbing}.filepond--item[data-drag-state=drag]>.filepond--panel{box-shadow:0 .125em .3125em rgba(0,0,0,.325)}.filepond--item[data-drag-state]:not([data-drag-state=idle]){z-index:2}.filepond--item-panel{background-color:#64605e}[data-filepond-item-state=processing-complete] .filepond--item-panel{background-color:#369763}[data-filepond-item-state*=error] .filepond--item-panel,[data-filepond-item-state*=invalid] .filepond--item-panel{background-color:#c44e47}.filepond--item-panel{border-radius:.5em;transition:background-color .25s}.filepond--list-scroller{position:absolute;top:0;left:0;right:0;margin:0;will-change:transform}.filepond--list-scroller[data-state=overflow] .filepond--list{bottom:0;right:0}.filepond--list-scroller[data-state=overflow]{overflow-y:scroll;overflow-x:hidden;-webkit-overflow-scrolling:touch;-webkit-mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent)}.filepond--list-scroller::-webkit-scrollbar{background:transparent}.filepond--list-scroller::-webkit-scrollbar:vertical{width:1em}.filepond--list-scroller::-webkit-scrollbar:horizontal{height:0}.filepond--list-scroller::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.3);border-radius:99999px;border:.3125em solid transparent;background-clip:content-box}.filepond--list.filepond--list{position:absolute;top:0;margin:0;padding:0;list-style-type:none;will-change:transform}.filepond--list{left:.75em;right:.75em}.filepond--root[data-style-panel-layout~=integrated]{width:100%;height:100%;max-width:none;margin:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root{border-radius:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root>*,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root>*{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{bottom:0;height:auto;display:flex;justify-content:center;align-items:center;z-index:7}.filepond--root[data-style-panel-layout~=circle] .filepond--item-panel,.filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel{display:none}.filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller,.filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller{overflow:hidden;height:100%;margin-top:0;margin-bottom:0}.filepond--root[data-style-panel-layout~=compact] .filepond--list,.filepond--root[data-style-panel-layout~=integrated] .filepond--list{left:0;right:0;height:100%}.filepond--root[data-style-panel-layout~=compact] .filepond--item,.filepond--root[data-style-panel-layout~=integrated] .filepond--item{margin:0}.filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper,.filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper{height:100%}.filepond--root[data-style-panel-layout~=compact] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7}.filepond--root[data-style-panel-layout~=circle]{border-radius:99999rem;overflow:hidden}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel{border-radius:inherit}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel>*{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--file-info,.filepond--root[data-style-panel-layout~=circle] .filepond--file-status{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item{opacity:1!important;visibility:visible!important}@media not all and (min-resolution:0.001dpcm){@supports (-webkit-appearance:none) and (stroke-color:transparent){.filepond--root[data-style-panel-layout~=circle]{will-change:transform}}}.filepond--panel-root{border-radius:.5em;background-color:#f1f0ef}.filepond--panel{position:absolute;left:0;top:0;right:0;margin:0;height:100%!important;pointer-events:none}.filepond-panel:not([data-scalable=false]){height:auto!important}.filepond--panel[data-scalable=false]>div{display:none}.filepond--panel[data-scalable=true]{-webkit-transform-style:preserve-3d;transform-style:preserve-3d;background-color:transparent!important;border:none!important}.filepond--panel-bottom,.filepond--panel-center,.filepond--panel-top{position:absolute;left:0;top:0;right:0;margin:0;padding:0}.filepond--panel-bottom,.filepond--panel-top{height:.5em}.filepond--panel-top{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important;border-bottom:none!important}.filepond--panel-top:after{content:"";position:absolute;height:2px;left:0;right:0;bottom:-1px;background-color:inherit}.filepond--panel-bottom,.filepond--panel-center{will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:left top;transform-origin:left top;-webkit-transform:translate3d(0,.5em,0);transform:translate3d(0,.5em,0)}.filepond--panel-bottom{border-top-left-radius:0!important;border-top-right-radius:0!important;border-top:none!important}.filepond--panel-bottom:before{content:"";position:absolute;height:2px;left:0;right:0;top:-1px;background-color:inherit}.filepond--panel-center{height:100px!important;border-top:none!important;border-bottom:none!important;border-radius:0!important}.filepond--panel-center:not([style]){visibility:hidden}.filepond--progress-indicator{position:static;width:1.25em;height:1.25em;color:#fff;margin:0;pointer-events:none;will-change:transform,opacity}.filepond--progress-indicator svg{width:100%;height:100%;vertical-align:top;transform-box:fill-box}.filepond--progress-indicator path{fill:none;stroke:currentColor}.filepond--list-scroller{z-index:6}.filepond--drop-label{z-index:5}.filepond--drip{z-index:3}.filepond--root>.filepond--panel{z-index:2}.filepond--browser{z-index:1}.filepond--root{box-sizing:border-box;position:relative;margin-bottom:1em;font-size:1rem;line-height:normal;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-weight:450;text-align:left;text-rendering:optimizeLegibility;direction:ltr;contain:layout style size}.filepond--root *{box-sizing:inherit;line-height:inherit}.filepond--root :not(text){font-size:inherit}.filepond--root[data-disabled]{pointer-events:none}.filepond--root[data-disabled] .filepond--list-scroller{pointer-events:all}.filepond--root[data-disabled] .filepond--list{pointer-events:none}.filepond--root .filepond--drop-label{min-height:4.75em}.filepond--root .filepond--list-scroller{margin-top:1em;margin-bottom:1em}.filepond--root .filepond--credits{position:absolute;right:0;opacity:.4;line-height:.85;font-size:11px;color:inherit;text-decoration:none;z-index:3;bottom:-14px}.filepond--root .filepond--credits[style]{top:0;bottom:auto;margin-top:14px} \ No newline at end of file diff --git a/plugins/form/assets/filepond/filepond.min.js b/plugins/form/assets/filepond/filepond.min.js new file mode 100644 index 0000000..496cc6c --- /dev/null +++ b/plugins/form/assets/filepond/filepond.min.js @@ -0,0 +1,9 @@ +/*! + * FilePond 4.32.7 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ + +/* eslint-disable */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).FilePond={})}(this,function(e){"use strict";var t=function(e,t){for(var n in e)e.hasOwnProperty(n)&&t(n,e[n])},n=function(e){var n={};return t(e,function(t){!function(e,t,n){"function"!=typeof n?Object.defineProperty(e,t,Object.assign({},n)):e[t]=n}(n,t,e[t])}),n},r=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(null===n)return e.getAttribute(t)||e.hasAttribute(t);e.setAttribute(t,n)},o=["svg","path"],i=function(e){return o.includes(e)},a=function(e,n){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};"object"==typeof n&&(o=n,n=null);var a=i(e)?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e);return n&&(i(e)?r(a,"class",n):a.className=n),t(o,function(e,t){r(a,e,t)}),a},s=function(e,t){return function(e,n){return void 0!==n?t.splice(n,0,e):t.push(e),e}},u=function(e,t){return function(n){return t.splice(t.indexOf(n),1),n.element.parentNode&&e.removeChild(n.element),n}},l="undefined"!=typeof window&&void 0!==window.document,c=function(){return l},f="children"in(c()?a("svg"):{})?function(e){return e.children.length}:function(e){return e.childNodes.length},d=function(e,t,n,r){var o=n[0]||e.left,i=n[1]||e.top,a=o+e.width,s=i+e.height*(r[1]||1),u={element:Object.assign({},e),inner:{left:e.left,top:e.top,right:e.right,bottom:e.bottom},outer:{left:o,top:i,right:a,bottom:s}};return t.filter(function(e){return!e.isRectIgnored()}).map(function(e){return e.rect}).forEach(function(e){p(u.inner,Object.assign({},e.inner)),p(u.outer,Object.assign({},e.outer))}),E(u.inner),u.outer.bottom+=u.element.marginBottom,u.outer.right+=u.element.marginRight,E(u.outer),u},p=function(e,t){t.top+=e.top,t.right+=e.left,t.bottom+=e.top,t.left+=e.left,t.bottom>e.bottom&&(e.bottom=t.bottom),t.right>e.right&&(e.right=t.right)},E=function(e){e.width=e.right-e.left,e.height=e.bottom-e.top},_=function(e){return"number"==typeof e},T=function(e){return e<.5?2*e*e:(4-2*e)*e-1},I={spring:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.stiffness,r=void 0===t?.5:t,o=e.damping,i=void 0===o?.75:o,a=e.mass,s=void 0===a?10:a,u=null,l=null,c=0,f=!1,d=n({interpolate:function(e,t){if(!f){if(!_(u)||!_(l))return f=!0,void(c=0);(function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:.001;return Math.abs(e-t)0&&void 0!==arguments[0]?arguments[0]:{},o=r.duration,i=void 0===o?500:o,a=r.easing,s=void 0===a?T:a,u=r.delay,l=void 0===u?0:u,c=null,f=!0,d=!1,p=null,E=n({interpolate:function(n,r){f||null===p||(null===c&&(c=n),n-c=i||r?(e=1,t=d?0:1,E.onupdate(t*p),E.oncomplete(t*p),f=!0):(t=e/i,E.onupdate((e>=0?s(d?1-t:t):0)*p))))},target:{get:function(){return d?0:p},set:function(e){if(null===p)return p=e,E.onupdate(e),void E.oncomplete(e);e3&&void 0!==arguments[3]&&arguments[3];(t=Array.isArray(t)?t:[t]).forEach(function(t){e.forEach(function(e){var o=e,i=function(){return n[e]},a=function(t){return n[e]=t};"object"==typeof e&&(o=e.key,i=e.getter||i,a=e.setter||a),t[o]&&!r||(t[o]={get:i,set:a})})})},h=function(e){return null!=e},g={opacity:1,scaleX:1,scaleY:1,translateX:0,translateY:0,rotateX:0,rotateY:0,rotateZ:0,originX:0,originY:0},R=function(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!0;for(var n in t)if(t[n]!==e[n])return!0;return!1},O=function(e,t){var n=t.opacity,r=t.perspective,o=t.translateX,i=t.translateY,a=t.scaleX,s=t.scaleY,u=t.rotateX,l=t.rotateY,c=t.rotateZ,f=t.originX,d=t.originY,p=t.width,E=t.height,_="",T="";(h(f)||h(d))&&(T+="transform-origin: "+(f||0)+"px "+(d||0)+"px;"),h(r)&&(_+="perspective("+r+"px) "),(h(o)||h(i))&&(_+="translate3d("+(o||0)+"px, "+(i||0)+"px, 0) "),(h(a)||h(s))&&(_+="scale3d("+(h(a)?a:1)+", "+(h(s)?s:1)+", 1) "),h(c)&&(_+="rotateZ("+c+"rad) "),h(u)&&(_+="rotateX("+u+"rad) "),h(l)&&(_+="rotateY("+l+"rad) "),_.length&&(T+="transform:"+_+";"),h(n)&&(T+="opacity:"+n+";",0===n&&(T+="visibility:hidden;"),n<1&&(T+="pointer-events:none;")),h(E)&&(T+="height:"+E+"px;"),h(p)&&(T+="width:"+p+"px;");var I=e.elementCurrentStyle||"";T.length===I.length&&T===I||(e.style.cssText=T,e.elementCurrentStyle=T)},y={styles:function(e){var t=e.mixinConfig,n=e.viewProps,r=e.viewInternalAPI,o=e.viewExternalAPI,i=e.view,a=Object.assign({},n),s={};m(t,[r,o],n);var u=function(){return i.rect?d(i.rect,i.childViews,[n.translateX||0,n.translateY||0],[n.scaleX||0,n.scaleY||0]):null};return r.rect={get:u},o.rect={get:u},t.forEach(function(e){n[e]=void 0===a[e]?g[e]:a[e]}),{write:function(){if(R(s,n))return O(i.element,n),Object.assign(s,Object.assign({},n)),!0},destroy:function(){}}},listeners:function(e){e.mixinConfig,e.viewProps,e.viewInternalAPI;var t,n=e.viewExternalAPI,r=(e.viewState,e.view),o=[],i=(t=r.element,function(e,n){t.addEventListener(e,n)}),a=function(e){return function(t,n){e.removeEventListener(t,n)}}(r.element);return n.on=function(e,t){o.push({type:e,fn:t}),i(e,t)},n.off=function(e,t){o.splice(o.findIndex(function(n){return n.type===e&&n.fn===t}),1),a(e,t)},{write:function(){return!0},destroy:function(){o.forEach(function(e){a(e.type,e.fn)})}}},animations:function(e){var n=e.mixinConfig,r=e.viewProps,o=e.viewInternalAPI,i=e.viewExternalAPI,a=Object.assign({},r),s=[];return t(n,function(e,t){var n=v(t);n&&(n.onupdate=function(t){r[e]=t},n.target=a[e],m([{key:e,setter:function(e){n.target!==e&&(n.target=e)},getter:function(){return r[e]}}],[o,i],r,!0),s.push(n))}),{write:function(e){var t=document.hidden,n=!0;return s.forEach(function(r){r.resting||(n=!1),r.interpolate(e,t)}),n},destroy:function(){}}},apis:function(e){var t=e.mixinConfig,n=e.viewProps,r=e.viewExternalAPI;m(t,r,n)}},D=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.layoutCalculated||(e.paddingTop=parseInt(n.paddingTop,10)||0,e.marginTop=parseInt(n.marginTop,10)||0,e.marginRight=parseInt(n.marginRight,10)||0,e.marginBottom=parseInt(n.marginBottom,10)||0,e.marginLeft=parseInt(n.marginLeft,10)||0,t.layoutCalculated=!0),e.left=t.offsetLeft||0,e.top=t.offsetTop||0,e.width=t.offsetWidth||0,e.height=t.offsetHeight||0,e.right=e.left+e.width,e.bottom=e.top+e.height,e.scrollTop=t.scrollTop,e.hidden=null===t.offsetParent,e},S=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.tag,r=void 0===t?"div":t,o=e.name,i=void 0===o?null:o,l=e.attributes,c=void 0===l?{}:l,p=e.read,E=void 0===p?function(){}:p,_=e.write,T=void 0===_?function(){}:_,I=e.create,v=void 0===I?function(){}:I,m=e.destroy,h=void 0===m?function(){}:m,g=e.filterFrameActionsForChild,R=void 0===g?function(e,t){return t}:g,O=e.didCreateView,S=void 0===O?function(){}:O,A=e.didWriteView,L=void 0===A?function(){}:A,b=e.ignoreRect,P=void 0!==b&&b,M=e.ignoreRectUpdate,w=void 0!==M&&M,C=e.mixins,N=void 0===C?[]:C;return function(e){var t,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},l=a(r,"filepond--"+i,c),p=window.getComputedStyle(l,null),_=D(),I=null,m=!1,g=[],O=[],A={},b={},M=[T],C=[E],G=[h],U=function(){return l},B=function(){return g.concat()},F=function(){return I||(I=d(_,g,[0,0],[1,1]))},q={element:{get:U},style:{get:function(){return p}},childViews:{get:B}},V=Object.assign({},q,{rect:{get:F},ref:{get:function(){return A}},is:function(e){return i===e},appendChild:(t=l,function(e,n){void 0!==n&&t.children[n]?t.insertBefore(e,t.children[n]):t.appendChild(e)}),createChildView:function(e){return function(t,n){return t(e,n)}}(e),linkView:function(e){return g.push(e),e},unlinkView:function(e){g.splice(g.indexOf(e),1)},appendChildView:s(0,g),removeChildView:u(l,g),registerWriter:function(e){return M.push(e)},registerReader:function(e){return C.push(e)},registerDestroyer:function(e){return G.push(e)},invalidateLayout:function(){return l.layoutCalculated=!1},dispatch:e.dispatch,query:e.query}),x={element:{get:U},childViews:{get:B},rect:{get:F},resting:{get:function(){return m}},isRectIgnored:function(){return P},_read:function(){I=null,g.forEach(function(e){return e._read()}),!(w&&_.width&&_.height)&&D(_,l,p);var e={root:k,props:o,rect:_};C.forEach(function(t){return t(e)})},_write:function(e,t,n){var r=0===t.length;return M.forEach(function(i){!1===i({props:o,root:k,actions:t,timestamp:e,shouldOptimize:n})&&(r=!1)}),O.forEach(function(t){!1===t.write(e)&&(r=!1)}),g.filter(function(e){return!!e.element.parentNode}).forEach(function(o){o._write(e,R(o,t),n)||(r=!1)}),g.forEach(function(o,i){o.element.parentNode||(k.appendChild(o.element,i),o._read(),o._write(e,R(o,t),n),r=!1)}),m=r,L({props:o,root:k,actions:t,timestamp:e}),r},_destroy:function(){O.forEach(function(e){return e.destroy()}),G.forEach(function(e){e({root:k,props:o})}),g.forEach(function(e){return e._destroy()})}},Y=Object.assign({},q,{rect:{get:function(){return _}}});Object.keys(N).sort(function(e,t){return"styles"===e?1:"styles"===t?-1:0}).forEach(function(e){var t=y[e]({mixinConfig:N[e],viewProps:o,viewState:b,viewInternalAPI:V,viewExternalAPI:x,view:n(Y)});t&&O.push(t)});var k=n(V);v({root:k,props:o});var j=f(l);return g.forEach(function(e,t){k.appendChild(e.element,j+t)}),S(k),n(x)}},A=function(e,t){return function(n){var r=n.root,o=n.props,i=n.actions,a=void 0===i?[]:i,s=n.timestamp,u=n.shouldOptimize;a.filter(function(t){return e[t.type]}).forEach(function(t){return e[t.type]({root:r,props:o,action:t.data,timestamp:s,shouldOptimize:u})}),t&&t({root:r,props:o,actions:a,timestamp:s,shouldOptimize:u})}},L=function(e,t){return t.parentNode.insertBefore(e,t)},b=function(e,t){return t.parentNode.insertBefore(e,t.nextSibling)},P=function(e){return Array.isArray(e)},M=function(e){return null==e},w=function(e){return e.trim()},C=function(e){return""+e},N=function(e){return"boolean"==typeof e},G=function(e){return N(e)?e:"true"===e},U=function(e){return"string"==typeof e},B=function(e){return _(e)?e:U(e)?C(e).replace(/[a-z]+/gi,""):0},F=function(e){return parseInt(B(e),10)},q=function(e){return parseFloat(B(e))},V=function(e){return _(e)&&isFinite(e)&&Math.floor(e)===e},x=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3;if(V(e))return e;var n=C(e).trim();return/MB$/i.test(n)?(n=n.replace(/MB$i/,"").trim(),F(n)*t*t):/KB/i.test(n)?(n=n.replace(/KB$i/,"").trim(),F(n)*t):F(n)},Y=function(e){return"function"==typeof e},k={process:"POST",patch:"PATCH",revert:"DELETE",fetch:"GET",restore:"GET",load:"GET"},j=function(e,t,n,r,o){if(null===t)return null;if("function"==typeof t)return t;var i={url:"GET"===n||"PATCH"===n?"?"+e+"=":"",method:n,headers:o,withCredentials:!1,timeout:r,onload:null,ondata:null,onerror:null};if(U(t))return i.url=t,i;if(Object.assign(i,t),U(i.headers)){var a=i.headers.split(/:(.+)/);i.headers={header:a[0],value:a[1]}}return i.withCredentials=G(i.withCredentials),i},H=function(e){return"object"==typeof e&&null!==e},X=function(e){return P(e)?"array":function(e){return null===e}(e)?"null":V(e)?"int":/^[0-9]+ ?(?:GB|MB|KB)$/gi.test(e)?"bytes":function(e){return H(e)&&U(e.url)&&H(e.process)&&H(e.revert)&&H(e.restore)&&H(e.fetch)}(e)?"api":typeof e},W={array:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:",";return M(e)?[]:P(e)?e:C(e).split(t).map(w).filter(function(e){return e.length})},boolean:G,int:function(e){return"bytes"===X(e)?x(e):F(e)},number:q,float:q,bytes:x,string:function(e){return Y(e)?e:C(e)},function:function(e){return function(e){for(var t=self,n=e.split("."),r=null;r=n.shift();)if(!(t=t[r]))return null;return t}(e)},serverapi:function(e){return(r={}).url=U(n=e)?n:n.url||"",r.timeout=n.timeout?parseInt(n.timeout,10):0,r.headers=n.headers?n.headers:{},t(k,function(e){r[e]=j(e,n[e],k[e],r.timeout,r.headers)}),r.process=n.process||U(n)||n.url?r.process:null,r.remove=n.remove||null,delete r.headers,r;var n,r},object:function(e){try{return JSON.parse(e.replace(/{\s*'/g,'{"').replace(/'\s*}/g,'"}').replace(/'\s*:/g,'":').replace(/:\s*'/g,':"').replace(/,\s*'/g,',"').replace(/'\s*,/g,'",'))}catch(e){return null}}},z=function(e,t,n){if(e===t)return e;var r,o=X(e);if(o!==n){var i=(r=e,W[n](r));if(o=X(i),null===i)throw'Trying to assign value with incorrect type to "'+option+'", allowed type: "'+n+'"';e=i}return e},Q=function(e){var r={};return t(e,function(t){var n,o,i,a=e[t];r[t]=(n=a[0],o=a[1],i=n,{enumerable:!0,get:function(){return i},set:function(e){i=z(e,n,o)}})}),n(r)},Z=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"-";return e.split(/(?=[A-Z])/).map(function(e){return e.toLowerCase()}).join(t)},K=function(e){return function(n,r,o){var i={};return t(e,function(e){var t=Z(e,"_").toUpperCase();i["SET_"+t]=function(r){try{o.options[e]=r.value}catch(e){}n("DID_SET_"+t,{value:o.options[e]})}}),i}},$=function(e){return function(n){var r={};return t(e,function(e){r["GET_"+Z(e,"_").toUpperCase()]=function(t){return n.options[e]}}),r}},J=1,ee=2,te=3,ne=4,re=5,oe=function(){return Math.random().toString(36).substring(2,11)};function ie(e){this.wrapped=e}function ae(e){var t,n;function r(t,n){try{var i=e[t](n),a=i.value,s=a instanceof ie;Promise.resolve(s?a.wrapped:a).then(function(e){s?r("next",e):o(i.done?"return":"normal",e)},function(e){r("throw",e)})}catch(e){o("throw",e)}}function o(e,o){switch(e){case"return":t.resolve({value:o,done:!0});break;case"throw":t.reject(o);break;default:t.resolve({value:o,done:!1})}(t=t.next)?r(t.key,t.arg):n=null}this._invoke=function(e,o){return new Promise(function(i,a){var s={key:e,arg:o,resolve:i,reject:a,next:null};n?n=n.next=s:(t=n=s,r(e,o))})},"function"!=typeof e.return&&(this.return=void 0)}function se(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}"function"==typeof Symbol&&Symbol.asyncIterator&&(ae.prototype[Symbol.asyncIterator]=function(){return this}),ae.prototype.next=function(e){return this._invoke("next",e)},ae.prototype.throw=function(e){return this._invoke("throw",e)},ae.prototype.return=function(e){return this._invoke("return",e)};function ue(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t1?t-1:0),o=1;o1?t-1:0),o=1;oBrowse',ge.STRING],labelInvalidField:["Field contains invalid files",ge.STRING],labelFileWaitingForSize:["Waiting for size",ge.STRING],labelFileSizeNotAvailable:["Size not available",ge.STRING],labelFileCountSingular:["file in list",ge.STRING],labelFileCountPlural:["files in list",ge.STRING],labelFileLoading:["Loading",ge.STRING],labelFileAdded:["Added",ge.STRING],labelFileLoadError:["Error during load",ge.STRING],labelFileRemoved:["Removed",ge.STRING],labelFileRemoveError:["Error during remove",ge.STRING],labelFileProcessing:["Uploading",ge.STRING],labelFileProcessingComplete:["Upload complete",ge.STRING],labelFileProcessingAborted:["Upload cancelled",ge.STRING],labelFileProcessingError:["Error during upload",ge.STRING],labelFileProcessingRevertError:["Error during revert",ge.STRING],labelTapToCancel:["tap to cancel",ge.STRING],labelTapToRetry:["tap to retry",ge.STRING],labelTapToUndo:["tap to undo",ge.STRING],labelButtonRemoveItem:["Remove",ge.STRING],labelButtonAbortItemLoad:["Abort",ge.STRING],labelButtonRetryItemLoad:["Retry",ge.STRING],labelButtonAbortItemProcessing:["Cancel",ge.STRING],labelButtonUndoItemProcessing:["Undo",ge.STRING],labelButtonRetryItemProcessing:["Retry",ge.STRING],labelButtonProcessItem:["Upload",ge.STRING],iconRemove:['',ge.STRING],iconProcess:['',ge.STRING],iconRetry:['',ge.STRING],iconUndo:['',ge.STRING],iconDone:['',ge.STRING],oninit:[null,ge.FUNCTION],onwarning:[null,ge.FUNCTION],onerror:[null,ge.FUNCTION],onactivatefile:[null,ge.FUNCTION],oninitfile:[null,ge.FUNCTION],onaddfilestart:[null,ge.FUNCTION],onaddfileprogress:[null,ge.FUNCTION],onaddfile:[null,ge.FUNCTION],onprocessfilestart:[null,ge.FUNCTION],onprocessfileprogress:[null,ge.FUNCTION],onprocessfileabort:[null,ge.FUNCTION],onprocessfilerevert:[null,ge.FUNCTION],onprocessfile:[null,ge.FUNCTION],onprocessfiles:[null,ge.FUNCTION],onremovefile:[null,ge.FUNCTION],onpreparefile:[null,ge.FUNCTION],onupdatefiles:[null,ge.FUNCTION],onreorderfiles:[null,ge.FUNCTION],beforeDropFile:[null,ge.FUNCTION],beforeAddFile:[null,ge.FUNCTION],beforeRemoveFile:[null,ge.FUNCTION],beforePrepareFile:[null,ge.FUNCTION],stylePanelLayout:[null,ge.STRING],stylePanelAspectRatio:[null,ge.STRING],styleItemPanelAspectRatio:[null,ge.STRING],styleButtonRemoveItemPosition:["left",ge.STRING],styleButtonProcessItemPosition:["right",ge.STRING],styleLoadIndicatorPosition:["right",ge.STRING],styleProgressIndicatorPosition:["right",ge.STRING],styleButtonRemoveItemAlign:[!1,ge.BOOLEAN],files:[[],ge.ARRAY],credits:[["https://pqina.nl/","Powered by PQINA"],ge.ARRAY]},Le=function(e,t){return M(t)?e[0]||null:V(t)?e[t]||null:("object"==typeof t&&(t=t.id),e.find(function(e){return e.id===t})||null)},be=function(e){if(M(e))return e;if(/:/.test(e)){var t=e.split(":");return t[1]/t[0]}return parseFloat(e)},Pe=function(e){return e.filter(function(e){return!e.archived})},Me={EMPTY:0,IDLE:1,ERROR:2,BUSY:3,READY:4},we=null,Ce=[Ie.LOAD_ERROR,Ie.PROCESSING_ERROR,Ie.PROCESSING_REVERT_ERROR],Ne=[Ie.LOADING,Ie.PROCESSING,Ie.PROCESSING_QUEUED,Ie.INIT],Ge=[Ie.PROCESSING_COMPLETE],Ue=function(e){return Ce.includes(e.status)},Be=function(e){return Ne.includes(e.status)},Fe=function(e){return Ge.includes(e.status)},qe=function(e){return H(e.options.server)&&(H(e.options.server.process)||Y(e.options.server.process))},Ve=function(e){return{GET_STATUS:function(){var t=Pe(e.items),n=Me.EMPTY,r=Me.ERROR,o=Me.BUSY,i=Me.IDLE,a=Me.READY;return 0===t.length?n:t.some(Ue)?r:t.some(Be)?o:t.some(Fe)?a:i},GET_ITEM:function(t){return Le(e.items,t)},GET_ACTIVE_ITEM:function(t){return Le(Pe(e.items),t)},GET_ACTIVE_ITEMS:function(){return Pe(e.items)},GET_ITEMS:function(){return e.items},GET_ITEM_NAME:function(t){var n=Le(e.items,t);return n?n.filename:null},GET_ITEM_SIZE:function(t){var n=Le(e.items,t);return n?n.fileSize:null},GET_STYLES:function(){return Object.keys(e.options).filter(function(e){return/^style/.test(e)}).map(function(t){return{name:t,value:e.options[t]}})},GET_PANEL_ASPECT_RATIO:function(){return/circle/.test(e.options.stylePanelLayout)?1:be(e.options.stylePanelAspectRatio)},GET_ITEM_PANEL_ASPECT_RATIO:function(){return e.options.styleItemPanelAspectRatio},GET_ITEMS_BY_STATUS:function(t){return Pe(e.items).filter(function(e){return e.status===t})},GET_TOTAL_ITEMS:function(){return Pe(e.items).length},SHOULD_UPDATE_FILE_INPUT:function(){return e.options.storeAsFile&&function(){if(null===we)try{var e=new DataTransfer;e.items.add(new File(["hello world"],"This_Works.txt"));var t=document.createElement("input");t.setAttribute("type","file"),t.files=e.files,we=1===t.files.length}catch(e){we=!1}return we}()&&!qe(e)},IS_ASYNC:function(){return qe(e)},GET_FILE_SIZE_LABELS:function(e){return{labelBytes:e("GET_LABEL_FILE_SIZE_BYTES")||void 0,labelKilobytes:e("GET_LABEL_FILE_SIZE_KILOBYTES")||void 0,labelMegabytes:e("GET_LABEL_FILE_SIZE_MEGABYTES")||void 0,labelGigabytes:e("GET_LABEL_FILE_SIZE_GIGABYTES")||void 0}}}},xe=function(e,t,n){return Math.max(Math.min(n,e),t)},Ye=function(e){return/^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*)\s*$/i.test(e)},ke=function(e){return(""+e).split("/").pop().split("?").shift()},je=function(e){return e.split(".").pop()},He=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return(t+e).slice(-t.length)},Xe=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new Date;return e.getFullYear()+"-"+He(e.getMonth()+1,"00")+"-"+He(e.getDate(),"00")+"_"+He(e.getHours(),"00")+"-"+He(e.getMinutes(),"00")+"-"+He(e.getSeconds(),"00")},We=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o="string"==typeof n?e.slice(0,e.size,n):e.slice(0,e.size,e.type);return o.lastModifiedDate=new Date,e._relativePath&&(o._relativePath=e._relativePath),U(t)||(t=Xe()),t&&null===r&&je(t)?o.name=t:(r=r||function(e){if("string"!=typeof e)return"";var t=e.split("/").pop();return/svg/.test(t)?"svg":/zip|compressed/.test(t)?"zip":/plain/.test(t)?"txt":/msword/.test(t)?"doc":/[a-z]+/.test(t)?"jpeg"===t?"jpg":t:""}(o.type),o.name=t+(r?"."+r:"")),o},ze=function(e,t){var n=window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder;if(n){var r=new n;return r.append(e),r.getBlob(t)}return new Blob([e],{type:t})},Qe=function(e){return(/^data:(.+);/.exec(e)||[])[1]||null},Ze=function(e){var t=Qe(e);return function(e,t){for(var n=new ArrayBuffer(e.length),r=new Uint8Array(n),o=0;o=200&&a.status<300?r.onload(a):r.onerror(a)},a.onerror=function(){return r.onerror(a)},a.onabort=function(){o=!0,r.onabort()},a.ontimeout=function(){return r.ontimeout(a)},a.open(n.method,t,!0),V(n.timeout)&&(a.timeout=n.timeout),Object.keys(n.headers).forEach(function(e){var t=unescape(encodeURIComponent(n.headers[e]));a.setRequestHeader(e,t)}),n.responseType&&(a.responseType=n.responseType),n.withCredentials&&(a.withCredentials=!0),a.send(e),r},ot=function(e,t,n,r){return{type:e,code:t,body:n,headers:r}},it=function(e){return function(t){e(ot("error",0,"Timeout",t.getAllResponseHeaders()))}},at=function(e){return/\?/.test(e)},st=function(){for(var e="",t=arguments.length,n=new Array(t),r=0;r0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0;if("function"==typeof t)return t;if(!t||!U(t.url))return null;var n=t.onload||function(e){return e},r=t.onerror||function(e){return null};return function(o,i,a,s,u,l){var c=rt(o,st(e,t.url),Object.assign({},t,{responseType:"blob"}));return c.onload=function(e){var r=e.getAllResponseHeaders(),a=et(r).name||ke(o);i(ot("load",e.status,"HEAD"===t.method?null:We(n(e.response),a),r))},c.onerror=function(e){a(ot("error",e.status,r(e.response)||e.statusText,e.getAllResponseHeaders()))},c.onheaders=function(e){l(ot("headers",e.status,null,e.getAllResponseHeaders()))},c.ontimeout=it(a),c.onprogress=s,c.onabort=u,c}},lt=0,ct=1,ft=2,dt=3,pt=4,Et=function(e,t,n,r,o,i,a,s,u,l,c){for(var f=[],d=c.chunkTransferId,p=c.chunkServer,E=c.chunkSize,_=c.chunkRetryDelays,T={serverId:d,aborted:!1},I=t.ondata||function(e){return e},v=t.onload||function(e,t){return"HEAD"===t?e.getResponseHeader("Upload-Offset"):e.response},m=t.onerror||function(e){return null},h=Math.floor(r.size/E),g=0;g<=h;g++){var R=g*E,O=r.slice(R,R+E,"application/offset+octet-stream");f[g]={index:g,size:O.size,offset:R,data:O,file:r,progress:0,retries:ue(_),status:lt,error:null,request:null,timeout:null}}var y,D,S,A,L=function(e){return e.status===lt||e.status===dt},b=function(t){if(!T.aborted)if(t=t||f.find(L)){t.status=ft,t.progress=null;var n=p.ondata||function(e){return e},o=p.onerror||function(e){return null},s=p.onload||function(){},l=st(e,p.url,T.serverId),c="function"==typeof p.headers?p.headers(t):Object.assign({},p.headers,{"Content-Type":"application/offset+octet-stream","Upload-Offset":t.offset,"Upload-Length":r.size,"Upload-Name":r.name}),d=t.request=rt(n(t.data),l,Object.assign({},p,{headers:c}));d.onload=function(e){s(e,t.index,f.length),t.status=ct,t.request=null,w()},d.onprogress=function(e,n,r){t.progress=e?n:null,M()},d.onerror=function(e){t.status=dt,t.request=null,t.error=o(e.response)||e.statusText,P(t)||a(ot("error",e.status,o(e.response)||e.statusText,e.getAllResponseHeaders()))},d.ontimeout=function(e){t.status=dt,t.request=null,P(t)||it(a)(e)},d.onabort=function(){t.status=lt,t.request=null,u()}}else f.every(function(e){return e.status===ct})&&i(T.serverId)},P=function(e){return 0!==e.retries.length&&(e.status=pt,clearTimeout(e.timeout),e.timeout=setTimeout(function(){b(e)},e.retries.shift()),!0)},M=function(){var e=f.reduce(function(e,t){return null===e||null===t.progress?null:e+t.progress},0);if(null===e)return s(!1,0,0);var t=f.reduce(function(e,t){return e+t.size},0);s(!0,e,t)},w=function(){f.filter(function(e){return e.status===ft}).length>=1||b()};return T.serverId?(y=function(e){T.aborted||(f.filter(function(t){return t.offset0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,r=arguments.length>3?arguments[3]:void 0;return"function"==typeof t?function(){for(var e=arguments.length,o=new Array(e),i=0;ir.chunkSize,p=f&&(d||r.chunkForce);if(o instanceof Blob&&p)return Et(e,t,n,o,i,a,s,u,l,c,r);var E=t.ondata||function(e){return e},_=t.onload||function(e){return e},T=t.onerror||function(e){return null},I="function"==typeof t.headers?t.headers(o,i)||{}:Object.assign({},t.headers),v=Object.assign({},t,{headers:I}),m=new FormData;H(i)&&m.append(n,JSON.stringify(i)),(o instanceof Blob?[{name:null,file:o}]:o).forEach(function(e){m.append(n,e.file,null===e.name?e.file.name:""+e.name+e.file.name)});var h=rt(E(m),st(e,t.url),v);return h.onload=function(e){a(ot("load",e.status,_(e.response),e.getAllResponseHeaders()))},h.onerror=function(e){s(ot("error",e.status,T(e.response)||e.statusText,e.getAllResponseHeaders()))},h.ontimeout=it(s),h.onprogress=u,h.onabort=l,h}}}(e,t,n,r):null},Tt=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0;if("function"==typeof t)return t;if(!t||!U(t.url))return function(e,t){return t()};var n=t.onload||function(e){return e},r=t.onerror||function(e){return null};return function(o,i,a){var s=rt(o,e+t.url,t);return s.onload=function(e){i(ot("load",e.status,n(e.response),e.getAllResponseHeaders()))},s.onerror=function(e){a(ot("error",e.status,r(e.response)||e.statusText,e.getAllResponseHeaders()))},s.ontimeout=it(a),s}},It=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return e+Math.random()*(t-e)},vt=function(e,t){var n={complete:!1,perceivedProgress:0,perceivedPerformanceUpdater:null,progress:null,timestamp:null,perceivedDuration:0,duration:0,request:null,response:null},r=t.allowMinimumUploadDuration,o=function(){n.request&&(n.perceivedPerformanceUpdater.clear(),n.request.abort&&n.request.abort(),n.complete=!0)},i=r?function(){return n.progress?Math.min(n.progress,n.perceivedProgress):null}:function(){return n.progress||null},a=r?function(){return Math.min(n.duration,n.perceivedDuration)}:function(){return n.duration},s=Object.assign({},pe(),{process:function(t,o){var i=function(){0!==n.duration&&null!==n.progress&&s.fire("progress",s.getProgress())},a=function(){n.complete=!0,s.fire("load-perceived",n.response.body)};s.fire("start"),n.timestamp=Date.now(),n.perceivedPerformanceUpdater=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3,n=(arguments.length>2&&void 0!==arguments[2]&&arguments[2],arguments.length>3&&void 0!==arguments[3]?arguments[3]:25),r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:250,o=null,i=Date.now();return t>0&&function a(){var s=Date.now()-i,u=It(n,r);s+u>t&&(u=s+u-t);var l=s/t;l>=1||document.hidden?e(1):(e(l),o=setTimeout(a,u))}(),{clear:function(){clearTimeout(o)}}}(function(e){n.perceivedProgress=e,n.perceivedDuration=Date.now()-n.timestamp,i(),n.response&&1===n.perceivedProgress&&!n.complete&&a()},r?It(750,1500):0),n.request=e(t,o,function(e){n.response=H(e)?e:{type:"load",code:200,body:""+e,headers:{}},n.duration=Date.now()-n.timestamp,n.progress=1,s.fire("load",n.response.body),(!r||r&&1===n.perceivedProgress)&&a()},function(e){n.perceivedPerformanceUpdater.clear(),s.fire("error",H(e)?e:{type:"error",code:0,body:""+e})},function(e,t,r){n.duration=Date.now()-n.timestamp,n.progress=e?t/r:null,i()},function(){n.perceivedPerformanceUpdater.clear(),s.fire("abort",n.response?n.response.body:null)},function(e){s.fire("transfer",e)})},abort:o,getProgress:i,getDuration:a,reset:function(){o(),n.complete=!1,n.perceivedProgress=0,n.progress=0,n.timestamp=null,n.perceivedDuration=0,n.duration=0,n.request=null,n.response=null}});return s},mt=function(e){return e.substring(0,e.lastIndexOf("."))||e},ht=function(e){return!!(e instanceof File||e instanceof Blob&&e.name)},gt=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,o=oe(),i={archived:!1,frozen:!1,released:!1,source:null,file:r,serverFileReference:t,transferId:null,processingAborted:!1,status:t?Ie.PROCESSING_COMPLETE:Ie.INIT,activeLoader:null,activeProcessor:null},a=null,s={},u=function(e){return i.status=e},l=function(e){if(!i.released&&!i.frozen){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1?t-1:0),r=1;r0&&void 0!==arguments[0]?arguments[0]:{},r=n.query,o=n.success,i=void 0===o?function(){}:o,a=n.failure,s=void 0===a?function(){}:a,u=se(n,["query","success","failure"]),l=Le(e.items,r);l?t(l,i,s,u||{}):s({error:ot("error",0,"Item not found"),file:null})}},Pt=function(e,t,n){return{ABORT_ALL:function(){Pe(n.items).forEach(function(e){e.freeze(),e.abortLoad(),e.abortProcessing()})},DID_SET_FILES:function(t){var r=t.value,o=(void 0===r?[]:r).map(function(e){return{source:e.source?e.source:e,options:e.options}}),i=Pe(n.items);i.forEach(function(t){o.find(function(e){return e.source===t.source||e.source===t.file})||e("REMOVE_ITEM",{query:t,remove:!1})}),i=Pe(n.items),o.forEach(function(t,n){i.find(function(e){return e.source===t.source||e.file===t.source})||e("ADD_ITEM",Object.assign({},t,{interactionMethod:re,index:n}))})},DID_UPDATE_ITEM_METADATA:function(r){var o=r.id,i=r.action,a=r.change;a.silent||(clearTimeout(n.itemUpdateTimeout),n.itemUpdateTimeout=setTimeout(function(){var r=Rt(n.items,o);if(t("IS_ASYNC")){r.origin===ve.LOCAL&&e("DID_LOAD_ITEM",{id:r.id,error:null,serverFileReference:r.source});var s,u=function(){setTimeout(function(){e("REQUEST_ITEM_PROCESSING",{query:o})},32)};return r.status===Ie.PROCESSING_COMPLETE?(s=n.options.instantUpload,void r.revert(Tt(n.options.server.url,n.options.server.revert),t("GET_FORCE_REVERT")).then(s?u:function(){}).catch(function(){})):r.status===Ie.PROCESSING?function(e){r.abortProcessing().then(e?u:function(){})}(n.options.instantUpload):void(n.options.instantUpload&&u())}Oe("SHOULD_PREPARE_OUTPUT",!1,{item:r,query:t,action:i,change:a}).then(function(n){var i=t("GET_BEFORE_PREPARE_FILE");i&&(n=i(r,n)),n&&e("REQUEST_PREPARE_OUTPUT",{query:o,item:r,success:function(t){e("DID_PREPARE_OUTPUT",{id:o,file:t})}},!0)})},0))},MOVE_ITEM:function(e){var t=e.query,r=e.index,o=Le(n.items,t);if(o){var i=n.items.indexOf(o);i!==(r=xe(r,0,n.items.length-1))&&n.items.splice(r,0,n.items.splice(i,1)[0])}},SORT:function(r){var o=r.compare;Lt(n,o),e("DID_SORT_ITEMS",{items:t("GET_ACTIVE_ITEMS")})},ADD_ITEMS:function(n){var r=n.items,o=n.index,i=n.interactionMethod,a=n.success,s=void 0===a?function(){}:a,u=n.failure,l=void 0===u?function(){}:u,c=o;if(-1===o||void 0===o){var f=t("GET_ITEM_INSERT_LOCATION"),d=t("GET_TOTAL_ITEMS");c="before"===f?0:d}var p=t("GET_IGNORED_FILES"),E=r.filter(function(e){return ht(e)?!p.includes(e.name.toLowerCase()):!M(e)}).map(function(t){return new Promise(function(n,r){e("ADD_ITEM",{interactionMethod:i,source:t.source||t,success:n,failure:r,index:c++,options:t.options||{}})})});Promise.all(E).then(s).catch(l)},ADD_ITEM:function(r){var o=r.source,i=r.index,a=void 0===i?-1:i,s=r.interactionMethod,u=r.success,l=void 0===u?function(){}:u,c=r.failure,f=void 0===c?function(){}:c,d=r.options,p=void 0===d?{}:d;if(M(o))f({error:ot("error",0,"No source"),file:null});else if(!ht(o)||!n.options.ignoredFiles.includes(o.name.toLowerCase())){if(!function(e){var t=Pe(e.items).length;if(!e.options.allowMultiple)return 0===t;var n=e.options.maxFiles;return null===n||t=400&&t.code<500)return e("DID_THROW_ITEM_INVALID",{id:h,error:t,status:{main:r,sub:t.code+" ("+t.body+")"}}),void f({error:t,file:Te(v)});e("DID_THROW_ITEM_LOAD_ERROR",{id:h,error:t,status:{main:r,sub:n.options.labelTapToRetry}})}),v.on("load-file-error",function(t){e("DID_THROW_ITEM_INVALID",{id:h,error:t.status,status:t.status}),f({error:t.status,file:Te(v)})}),v.on("load-abort",function(){e("REMOVE_ITEM",{query:h})}),v.on("load-skip",function(){v.on("metadata-update",function(t){ht(v.file)&&e("DID_UPDATE_ITEM_METADATA",{id:h,change:t})}),e("COMPLETE_LOAD_ITEM",{query:h,item:v,data:{source:o,success:l}})}),v.on("load",function(){var r=function(r){r?(v.on("metadata-update",function(t){e("DID_UPDATE_ITEM_METADATA",{id:h,change:t})}),Oe("SHOULD_PREPARE_OUTPUT",!1,{item:v,query:t}).then(function(r){var i=t("GET_BEFORE_PREPARE_FILE");i&&(r=i(v,r));var a=function(){e("COMPLETE_LOAD_ITEM",{query:h,item:v,data:{source:o,success:l}}),St(e,n)};r?e("REQUEST_PREPARE_OUTPUT",{query:h,item:v,success:function(t){e("DID_PREPARE_OUTPUT",{id:h,file:t}),a()}},!0):a()})):e("REMOVE_ITEM",{query:h})};Oe("DID_LOAD_ITEM",v,{query:t,dispatch:e}).then(function(){At(t("GET_BEFORE_ADD_FILE"),Te(v)).then(r)}).catch(function(t){if(!t||!t.error||!t.status)return r(!1);e("DID_THROW_ITEM_INVALID",{id:h,error:t.error,status:t.status})})}),v.on("process-start",function(){e("DID_START_ITEM_PROCESSING",{id:h})}),v.on("process-progress",function(t){e("DID_UPDATE_ITEM_PROCESS_PROGRESS",{id:h,progress:t})}),v.on("process-error",function(t){e("DID_THROW_ITEM_PROCESSING_ERROR",{id:h,error:t,status:{main:Dt(n.options.labelFileProcessingError)(t),sub:n.options.labelTapToRetry}})}),v.on("process-revert-error",function(t){e("DID_THROW_ITEM_PROCESSING_REVERT_ERROR",{id:h,error:t,status:{main:Dt(n.options.labelFileProcessingRevertError)(t),sub:n.options.labelTapToRetry}})}),v.on("process-complete",function(t){e("DID_COMPLETE_ITEM_PROCESSING",{id:h,error:null,serverFileReference:t}),e("DID_DEFINE_VALUE",{id:h,value:t})}),v.on("process-abort",function(){e("DID_ABORT_ITEM_PROCESSING",{id:h})}),v.on("process-revert",function(){e("DID_REVERT_ITEM_PROCESSING",{id:h}),e("DID_DEFINE_VALUE",{id:h,value:null})}),e("DID_ADD_ITEM",{id:h,index:a,interactionMethod:s}),St(e,n);var g=n.options.server||{},R=g.url,O=g.load,y=g.restore,D=g.fetch;v.load(o,tt(I===ve.INPUT?U(o)&&function(e){return(e.indexOf(":")>-1||e.indexOf("//")>-1)&&yt(location.href)!==yt(e)}(o)&&D?ut(R,D):Ot:ut(R,I===ve.LIMBO?y:O)),function(e,n,r){Oe("LOAD_FILE",e,{query:t}).then(n).catch(r)})}},REQUEST_PREPARE_OUTPUT:function(e){var n=e.item,r=e.success,o=e.failure,i=void 0===o?function(){}:o,a={error:ot("error",0,"Item not found"),file:null};if(n.archived)return i(a);Oe("PREPARE_OUTPUT",n.file,{query:t,item:n}).then(function(e){Oe("COMPLETE_PREPARE_OUTPUT",e,{query:t,item:n}).then(function(e){if(n.archived)return i(a);r(e)})})},COMPLETE_LOAD_ITEM:function(r){var o=r.item,i=r.data,a=i.success,s=i.source,u=t("GET_ITEM_INSERT_LOCATION");if(Y(u)&&s&&Lt(n,u),e("DID_LOAD_ITEM",{id:o.id,error:null,serverFileReference:o.origin===ve.INPUT?null:s}),a(Te(o)),o.origin!==ve.LOCAL)return o.origin===ve.LIMBO?(e("DID_COMPLETE_ITEM_PROCESSING",{id:o.id,error:null,serverFileReference:s}),void e("DID_DEFINE_VALUE",{id:o.id,value:o.serverId||s})):void(t("IS_ASYNC")&&n.options.instantUpload&&e("REQUEST_ITEM_PROCESSING",{query:o.id}));e("DID_LOAD_LOCAL_ITEM",{id:o.id})},RETRY_ITEM_LOAD:bt(n,function(e){e.retryLoad()}),REQUEST_ITEM_PREPARE:bt(n,function(t,n,r){e("REQUEST_PREPARE_OUTPUT",{query:t.id,item:t,success:function(r){e("DID_PREPARE_OUTPUT",{id:t.id,file:r}),n({file:t,output:r})},failure:r},!0)}),REQUEST_ITEM_PROCESSING:bt(n,function(r,o,i){if(r.status===Ie.IDLE||r.status===Ie.PROCESSING_ERROR)r.status!==Ie.PROCESSING_QUEUED&&(r.requestProcessing(),e("DID_REQUEST_ITEM_PROCESSING",{id:r.id}),e("PROCESS_ITEM",{query:r,success:o,failure:i},!0));else{var a=function(){return e("REQUEST_ITEM_PROCESSING",{query:r,success:o,failure:i})},s=function(){return document.hidden?a():setTimeout(a,32)};r.status===Ie.PROCESSING_COMPLETE||r.status===Ie.PROCESSING_REVERT_ERROR?r.revert(Tt(n.options.server.url,n.options.server.revert),t("GET_FORCE_REVERT")).then(s).catch(function(){}):r.status===Ie.PROCESSING&&r.abortProcessing().then(s)}}),PROCESS_ITEM:bt(n,function(r,o,i){var a=t("GET_MAX_PARALLEL_UPLOADS");if(t("GET_ITEMS_BY_STATUS",Ie.PROCESSING).length!==a){if(r.status!==Ie.PROCESSING){var s=function t(){var r=n.processingQueue.shift();if(r){var o=r.id,i=r.success,a=r.failure,s=Le(n.items,o);s&&!s.archived?e("PROCESS_ITEM",{query:o,success:i,failure:a},!0):t()}};r.onOnce("process-complete",function(){o(Te(r)),s();var i=n.options.server;if(n.options.instantUpload&&r.origin===ve.LOCAL&&Y(i.remove)){var a=function(){};r.origin=ve.LIMBO,n.options.server.remove(r.source,a,a)}t("GET_ITEMS_BY_STATUS",Ie.PROCESSING_COMPLETE).length===n.items.length&&e("DID_COMPLETE_ITEM_PROCESSING_ALL")}),r.onOnce("process-error",function(e){i({error:e,file:Te(r)}),s()});var u=n.options;r.process(vt(_t(u.server.url,u.server.process,u.name,{chunkTransferId:r.transferId,chunkServer:u.server.patch,chunkUploads:u.chunkUploads,chunkForce:u.chunkForce,chunkSize:u.chunkSize,chunkRetryDelays:u.chunkRetryDelays}),{allowMinimumUploadDuration:t("GET_ALLOW_MINIMUM_UPLOAD_DURATION")}),function(n,o,i){Oe("PREPARE_OUTPUT",n,{query:t,item:r}).then(function(t){e("DID_PREPARE_OUTPUT",{id:r.id,file:t}),o(t)}).catch(i)})}}else n.processingQueue.push({id:r.id,success:o,failure:i})}),RETRY_ITEM_PROCESSING:bt(n,function(t){e("REQUEST_ITEM_PROCESSING",{query:t})}),REQUEST_REMOVE_ITEM:bt(n,function(n){At(t("GET_BEFORE_REMOVE_FILE"),Te(n)).then(function(t){t&&e("REMOVE_ITEM",{query:n})})}),RELEASE_ITEM:bt(n,function(e){e.release()}),REMOVE_ITEM:bt(n,function(r,o,i,a){var s=function(){var t=r.id;Rt(n.items,t).archive(),e("DID_REMOVE_ITEM",{error:null,id:t,item:r}),St(e,n),o(Te(r))},u=n.options.server;r.origin===ve.LOCAL&&u&&Y(u.remove)&&!1!==a.remove?(e("DID_START_ITEM_REMOVE",{id:r.id}),u.remove(r.source,function(){return s()},function(t){e("DID_THROW_ITEM_REMOVE_ERROR",{id:r.id,error:ot("error",0,t,null),status:{main:Dt(n.options.labelFileRemoveError)(t),sub:n.options.labelTapToRetry}})})):((a.revert&&r.origin!==ve.LOCAL&&null!==r.serverId||n.options.chunkUploads&&r.file.size>n.options.chunkSize||n.options.chunkUploads&&n.options.chunkForce)&&r.revert(Tt(n.options.server.url,n.options.server.revert),t("GET_FORCE_REVERT")),s())}),ABORT_ITEM_LOAD:bt(n,function(e){e.abortLoad()}),ABORT_ITEM_PROCESSING:bt(n,function(t){t.serverId?e("REVERT_ITEM_PROCESSING",{id:t.id}):t.abortProcessing().then(function(){n.options.instantUpload&&e("REMOVE_ITEM",{query:t.id})})}),REQUEST_REVERT_ITEM_PROCESSING:bt(n,function(r){if(n.options.instantUpload){var o=function(t){t&&e("REVERT_ITEM_PROCESSING",{query:r})},i=t("GET_BEFORE_REMOVE_FILE");if(!i)return o(!0);var a=i(Te(r));return null==a?o(!0):"boolean"==typeof a?o(a):void("function"==typeof a.then&&a.then(o))}e("REVERT_ITEM_PROCESSING",{query:r})}),REVERT_ITEM_PROCESSING:bt(n,function(r){r.revert(Tt(n.options.server.url,n.options.server.revert),t("GET_FORCE_REVERT")).then(function(){(n.options.instantUpload||function(e){return!ht(e.file)}(r))&&e("REMOVE_ITEM",{query:r.id})}).catch(function(){})}),SET_OPTIONS:function(t){var n=t.options,r=Object.keys(n),o=Mt.filter(function(e){return r.includes(e)});[].concat(ue(o),ue(Object.keys(n).filter(function(e){return!o.includes(e)}))).forEach(function(t){e("SET_"+Z(t,"_").toUpperCase(),{value:n[t]})})}}},Mt=["server"],wt=function(e){return e},Ct=function(e){return document.createElement(e)},Nt=function(e,t){var n=e.childNodes[0];n?t!==n.nodeValue&&(n.nodeValue=t):(n=document.createTextNode(t),e.appendChild(n))},Gt=function(e,t,n,r){var o=(r%360-90)*Math.PI/180;return{x:e+n*Math.cos(o),y:t+n*Math.sin(o)}},Ut=function(e,t,n,r,o){var i=1;return o>r&&o-r<=.5&&(i=0),r>o&&r-o>=.5&&(i=0),function(e,t,n,r,o,i){var a=Gt(e,t,n,o),s=Gt(e,t,n,r);return["M",a.x,a.y,"A",n,n,0,i,0,s.x,s.y].join(" ")}(e,t,n,360*Math.min(.9999,r),360*Math.min(.9999,o),i)},Bt=S({tag:"div",name:"progress-indicator",ignoreRectUpdate:!0,ignoreRect:!0,create:function(e){var t=e.root,n=e.props;n.spin=!1,n.progress=0,n.opacity=0;var r=a("svg");t.ref.path=a("path",{"stroke-width":2,"stroke-linecap":"round"}),r.appendChild(t.ref.path),t.ref.svg=r,t.appendChild(r)},write:function(e){var t=e.root,n=e.props;if(0!==n.opacity){n.align&&(t.element.dataset.align=n.align);var o=parseInt(r(t.ref.path,"stroke-width"),10),i=.5*t.rect.element.width,a=0,s=0;n.spin?(a=0,s=.5):(a=0,s=n.progress);var u=Ut(i,i,i-o,a,s);r(t.ref.path,"d",u),r(t.ref.path,"stroke-opacity",n.spin||n.progress>0?1:0)}},mixins:{apis:["progress","spin","align"],styles:["opacity"],animations:{opacity:{type:"tween",duration:500},progress:{type:"spring",stiffness:.95,damping:.65,mass:10}}}}),Ft=S({tag:"button",attributes:{type:"button"},ignoreRect:!0,ignoreRectUpdate:!0,name:"file-action-button",mixins:{apis:["label"],styles:["translateX","translateY","scaleX","scaleY","opacity"],animations:{scaleX:"spring",scaleY:"spring",translateX:"spring",translateY:"spring",opacity:{type:"tween",duration:250}},listeners:!0},create:function(e){var t=e.root,n=e.props;t.element.innerHTML=(n.icon||"")+""+n.label+"",n.isDisabled=!1},write:function(e){var t=e.root,n=e.props,o=n.isDisabled,i=t.query("GET_DISABLED")||0===n.opacity;i&&!o?(n.isDisabled=!0,r(t.element,"disabled","disabled")):!i&&o&&(n.isDisabled=!1,t.element.removeAttribute("disabled"))}}),qt=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:".",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1e3,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=r.labelBytes,i=void 0===o?"bytes":o,a=r.labelKilobytes,s=void 0===a?"KB":a,u=r.labelMegabytes,l=void 0===u?"MB":u,c=r.labelGigabytes,f=void 0===c?"GB":c,d=n,p=n*n,E=n*n*n;return(e=Math.round(Math.abs(e)))0&&(t.height=t.ref.container.rect.element.height)),o&&(t.ref.panel.height=null),t.ref.panel.height=t.height}),mn=S({create:function(e){var t=e.root,n=e.props;t.ref.handleClick=function(e){return t.dispatch("DID_ACTIVATE_ITEM",{id:n.id})},t.element.id="filepond--item-"+n.id,t.element.addEventListener("click",t.ref.handleClick),t.ref.container=t.appendChildView(t.createChildView(fn,{id:n.id})),t.ref.panel=t.appendChildView(t.createChildView(En,{name:"item-panel"})),t.ref.panel.height=null,n.markedForRemoval=!1,t.query("GET_ALLOW_REORDER")&&(t.element.dataset.dragState="idle",t.element.addEventListener("pointerdown",function(e){if(e.isPrimary){var r=!1,o=e.pageX,i=e.pageY;n.dragOrigin={x:t.translateX,y:t.translateY},n.dragCenter={x:e.offsetX,y:e.offsetY};var a,s,u,l=(a=t.query("GET_ACTIVE_ITEMS"),s=a.map(function(e){return e.id}),u=void 0,{setIndex:function(e){u=e},getIndex:function(){return u},getItemIndex:function(e){return s.indexOf(e.id)}});t.dispatch("DID_GRAB_ITEM",{id:n.id,dragState:l});var c=function(e){e.isPrimary&&(e.stopPropagation(),e.preventDefault(),n.dragOffset={x:e.pageX-o,y:e.pageY-i},n.dragOffset.x*n.dragOffset.x+n.dragOffset.y*n.dragOffset.y>16&&!r&&(r=!0,t.element.removeEventListener("click",t.ref.handleClick)),t.dispatch("DID_DRAG_ITEM",{id:n.id,dragState:l}))},f=function(e){e.isPrimary&&(n.dragOffset={x:e.pageX-o,y:e.pageY-i},p())},d=function(){p()},p=function(){document.removeEventListener("pointercancel",d),document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",f),t.dispatch("DID_DROP_ITEM",{id:n.id,dragState:l}),r&&setTimeout(function(){return t.element.addEventListener("click",t.ref.handleClick)},0)};document.addEventListener("pointercancel",d),document.addEventListener("pointermove",c),document.addEventListener("pointerup",f)}}))},write:vn,destroy:function(e){var t=e.root,n=e.props;t.element.removeEventListener("click",t.ref.handleClick),t.dispatch("RELEASE_ITEM",{query:n.id})},tag:"li",name:"item",mixins:{apis:["id","interactionMethod","markedForRemoval","spawnDate","dragCenter","dragOrigin","dragOffset"],styles:["translateX","translateY","scaleX","scaleY","opacity","height"],animations:{scaleX:"spring",scaleY:"spring",translateX:_n,translateY:_n,opacity:{type:"tween",duration:150}}}}),hn=function(e,t){return Math.max(1,Math.floor((e+1)/t))},gn=function(e,t,n){if(n){var r=e.rect.element.width,o=t.length,i=null;if(0===o||n.topv){if(n.left3&&void 0!==arguments[3]?arguments[3]:0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1;e.dragOffset?(e.translateX=null,e.translateY=null,e.translateX=e.dragOrigin.x+e.dragOffset.x,e.translateY=e.dragOrigin.y+e.dragOffset.y,e.scaleX=1.025,e.scaleY=1.025):(e.translateX=t,e.translateY=n,Date.now()>e.spawnDate&&(0===e.opacity&&yn(e,t,n,r,o),e.scaleX=1,e.scaleY=1,e.opacity=1))},yn=function(e,t,n,r,o){e.interactionMethod===re?(e.translateX=null,e.translateX=t,e.translateY=null,e.translateY=n):e.interactionMethod===ee?(e.translateX=null,e.translateX=t-20*r,e.translateY=null,e.translateY=n-10*o,e.scaleX=.8,e.scaleY=.8):e.interactionMethod===te?(e.translateY=null,e.translateY=n-30):e.interactionMethod===J&&(e.translateX=null,e.translateX=t-30,e.translateY=null)},Dn=function(e){return e.rect.element.height+.5*e.rect.element.marginBottom+.5*e.rect.element.marginTop},Sn=A({DID_ADD_ITEM:function(e){var t=e.root,n=e.action,r=n.id,o=n.index,i=n.interactionMethod;t.ref.addIndex=o;var a=Date.now(),s=a,u=1;if(i!==re){u=0;var l=t.query("GET_ITEM_INSERT_INTERVAL"),c=a-t.ref.lastItemSpanwDate;s=cs&&(E=s);var _=Math.floor(s/E+1);Rn.setHeight=d*_,Rn.setWidth=p*E;var T={y:Math.floor(f/d),x:Math.floor(c/p),getGridIndex:function(){return f>Rn.getHeight||f<0||c>Rn.getWidth||c<0?u:this.y*E+this.x},getColIndex:function(){for(var e=t.query("GET_ACTIVE_ITEMS"),n=t.childViews.filter(function(e){return e.rect.element.height}),r=e.map(function(e){return n.find(function(t){return t.id===e.id})}),o=r.findIndex(function(e){return e===a}),i=Dn(a),s=r.length,u=s,l=0,c=0,d=0,p=0;pp){if(f1?T.getGridIndex():T.getColIndex();t.dispatch("MOVE_ITEM",{query:a,index:I});var v=o.getIndex();if(void 0===v||v!==I){if(o.setIndex(I),void 0===v)return;t.dispatch("DID_REORDER_ITEMS",{items:t.query("GET_ACTIVE_ITEMS"),origin:u,target:I})}}}}),An=S({create:function(e){var t=e.root;r(t.element,"role","list"),t.ref.lastItemSpanwDate=Date.now()},write:function(e){var t=e.root,n=e.props,r=e.actions,o=e.shouldOptimize;Sn({root:t,props:n,actions:r});var i=n.dragCoordinates,a=t.rect.element.width,s=t.childViews.filter(function(e){return e.rect.element.height}),u=t.query("GET_ACTIVE_ITEMS").map(function(e){return s.find(function(t){return t.id===e.id})}).filter(function(e){return e}),l=i?gn(t,u,i):null,c=t.ref.addIndex||null;t.ref.addIndex=null;var f=0,d=0,p=0;if(0!==u.length){var E=u[0].rect.element,_=E.marginTop+E.marginBottom,T=E.marginLeft+E.marginRight,I=E.width+T,v=E.height+_,m=hn(a,I);if(1===m){var h=0,g=0;u.forEach(function(e,t){if(l){var n=t-l;g=-2===n?.25*-_:-1===n?.75*-_:0===n?.75*_:1===n?.25*_:0}o&&(e.translateX=null,e.translateY=null),e.markedForRemoval||On(e,0,h+g);var r=(e.rect.element.height+_)*(e.markedForRemoval?e.opacity:1);h+=r})}else{var R=0,O=0;u.forEach(function(e,t){t===l&&(f=1),t===c&&(p+=1),e.markedForRemoval&&e.opacity<.5&&(d-=1);var n=t+p+f+d,r=n%m,i=Math.floor(n/m),a=r*I,s=i*v,u=Math.sign(a-R),E=Math.sign(s-O);R=a,O=s,e.markedForRemoval||(o&&(e.translateX=null,e.translateY=null),On(e,a,s,u,E))})}}},tag:"ul",name:"list",didWriteView:function(e){var t=e.root;t.childViews.filter(function(e){return e.markedForRemoval&&0===e.opacity&&e.resting}).forEach(function(e){e._destroy(),t.removeChildView(e)})},filterFrameActionsForChild:function(e,t){return t.filter(function(t){return!t.data||!t.data.id||e.id===t.data.id})},mixins:{apis:["dragCoordinates"]}}),Ln=A({DID_DRAG:function(e){var t=e.root,n=e.props,r=e.action;t.query("GET_ITEM_INSERT_LOCATION_FREEDOM")&&(n.dragCoordinates={left:r.position.scopeLeft-t.ref.list.rect.element.left,top:r.position.scopeTop-(t.rect.outer.top+t.rect.element.marginTop+t.rect.element.scrollTop)})},DID_END_DRAG:function(e){e.props.dragCoordinates=null}}),bn=S({create:function(e){var t=e.root,n=e.props;t.ref.list=t.appendChildView(t.createChildView(An)),n.dragCoordinates=null,n.overflowing=!1},write:function(e){var t=e.root,n=e.props,r=e.actions;if(Ln({root:t,props:n,actions:r}),t.ref.list.dragCoordinates=n.dragCoordinates,n.overflowing&&!n.overflow&&(n.overflowing=!1,t.element.dataset.state="",t.height=null),n.overflow){var o=Math.round(n.overflow);o!==t.height&&(n.overflowing=!0,t.element.dataset.state="overflow",t.height=o)}},name:"list-scroller",mixins:{apis:["overflow","dragCoordinates"],styles:["height","translateY"],animations:{translateY:"spring"}}}),Pn=function(e,t,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";n?r(e,t,o):e.removeAttribute(t)},Mn=function(e){var t=e.root,n=e.action;t.query("GET_ALLOW_SYNC_ACCEPT_ATTRIBUTE")&&Pn(t.element,"accept",!!n.value,n.value?n.value.join(","):"")},wn=function(e){var t=e.root,n=e.action;Pn(t.element,"multiple",n.value)},Cn=function(e){var t=e.root,n=e.action;Pn(t.element,"webkitdirectory",n.value)},Nn=function(e){var t=e.root,n=t.query("GET_DISABLED"),r=t.query("GET_ALLOW_BROWSE"),o=n||!r;Pn(t.element,"disabled",o)},Gn=function(e){var t=e.root;e.action.value?0===t.query("GET_TOTAL_ITEMS")&&Pn(t.element,"required",!0):Pn(t.element,"required",!1)},Un=function(e){var t=e.root,n=e.action;Pn(t.element,"capture",!!n.value,!0===n.value?"":n.value)},Bn=function(e){var t=e.root,n=t.element;if(t.query("GET_TOTAL_ITEMS")>0){Pn(n,"required",!1),Pn(n,"name",!1);for(var r=t.query("GET_ACTIVE_ITEMS"),o=!1,i=0;i0&&void 0!==arguments[0]?arguments[0]:"";return e=e.toLowerCase(),$n.includes(e)?"image/"+("jpg"===e?"jpeg":"svg"===e?"svg+xml":e):Jn.includes(e)?"text/"+e:er[e]||""},nr=function(e){return new Promise(function(t,n){var r=dr(e);if(r.length&&!rr(e))return t(r);or(e).then(t)})},rr=function(e){return!!e.files&&e.files.length>0},or=function(e){return new Promise(function(t,n){var r=(e.items?Array.from(e.items):[]).filter(function(e){return ir(e)}).map(function(e){return ar(e)});r.length?Promise.all(r).then(function(e){var n=[];e.forEach(function(e){n.push.apply(n,e)}),t(n.filter(function(e){return e}).map(function(e){return e._relativePath||(e._relativePath=e.webkitRelativePath),e}))}).catch(console.error):t(e.files?Array.from(e.files):[])})},ir=function(e){if(cr(e)){var t=fr(e);if(t)return t.isFile||t.isDirectory}return"file"===e.kind},ar=function(e){return new Promise(function(t,n){lr(e)?sr(fr(e)).then(t).catch(n):t([e.getAsFile()])})},sr=function(e){return new Promise(function(t,n){var r=[],o=0,i=0,a=function(){0===i&&0===o&&t(r)};!function e(t){o++;var s=t.createReader();!function t(){s.readEntries(function(n){if(0===n.length)return o--,void a();n.forEach(function(t){t.isDirectory?e(t):(i++,t.file(function(e){var n=ur(e);t.fullPath&&(n._relativePath=t.fullPath),r.push(n),i--,a()}))}),t()},n)}()}(e)})},ur=function(e){if(e.type.length)return e;var t=e.lastModifiedDate,n=e.name,r=tr(je(e.name));return r.length?((e=e.slice(0,e.size,r)).name=n,e.lastModifiedDate=t,e):e},lr=function(e){return cr(e)&&(fr(e)||{}).isDirectory},cr=function(e){return"webkitGetAsEntry"in e},fr=function(e){return e.webkitGetAsEntry()},dr=function(e){var t=[];try{if((t=Er(e)).length)return t;t=pr(e)}catch(e){}return t},pr=function(e){var t=e.getData("url");return"string"==typeof t&&t.length?[t]:[]},Er=function(e){var t=e.getData("text/html");if("string"==typeof t&&t.length){var n=t.match(/src\s*=\s*"(.+?)"/);if(n)return[n[1]]}return[]},_r=[],Tr=function(e){return{pageLeft:e.pageX,pageTop:e.pageY,scopeLeft:e.offsetX||e.layerX,scopeTop:e.offsetY||e.layerY}},Ir=function(e){var t=_r.find(function(t){return t.element===e});if(t)return t;var n=vr(e);return _r.push(n),n},vr=function(e){var n=[],r={dragenter:Rr,dragover:Or,dragleave:Dr,drop:yr},o={};t(r,function(t,r){o[t]=r(e,n),e.addEventListener(t,o[t],!1)});var i={element:e,addListener:function(a){return n.push(a),function(){n.splice(n.indexOf(a),1),0===n.length&&(_r.splice(_r.indexOf(i),1),t(r,function(t){e.removeEventListener(t,o[t],!1)}))}}};return i},mr=function(e,t){var n,r=function(e,t){return"elementFromPoint"in e||(e=document),e.elementFromPoint(t.x,t.y)}("getRootNode"in(n=t)?n.getRootNode():document,{x:e.pageX-window.pageXOffset,y:e.pageY-window.pageYOffset});return r===t||t.contains(r)},hr=null,gr=function(e,t){try{e.dropEffect=t}catch(e){}},Rr=function(e,t){return function(e){e.preventDefault(),hr=e.target,t.forEach(function(t){var n=t.element,r=t.onenter;mr(e,n)&&(t.state="enter",r(Tr(e)))})}},Or=function(e,t){return function(e){e.preventDefault();var n=e.dataTransfer;nr(n).then(function(r){var o=!1;t.some(function(t){var i=t.filterElement,a=t.element,s=t.onenter,u=t.onexit,l=t.ondrag,c=t.allowdrop;gr(n,"copy");var f=c(r);if(f)if(mr(e,a)){if(o=!0,null===t.state)return t.state="enter",void s(Tr(e));if(t.state="over",i&&!f)return void gr(n,"none");l(Tr(e))}else i&&!o&&gr(n,"none"),t.state&&(t.state=null,u(Tr(e)));else gr(n,"none")})})}},yr=function(e,t){return function(e){e.preventDefault();var n=e.dataTransfer;nr(n).then(function(n){t.forEach(function(t){var r=t.filterElement,o=t.element,i=t.ondrop,a=t.onexit,s=t.allowdrop;if(t.state=null,!r||mr(e,o))return s(n)?void i(Tr(e),n):a(Tr(e))})})}},Dr=function(e,t){return function(e){hr===e.target&&t.forEach(function(t){var n=t.onexit;t.state=null,n(Tr(e))})}},Sr=function(e,t,n){e.classList.add("filepond--hopper");var r=n.catchesDropsOnPage,o=n.requiresDropOnElement,i=n.filterItems,a=void 0===i?function(e){return e}:i,s=function(e,t,n){var r=Ir(t),o={element:e,filterElement:n,state:null,ondrop:function(){},onenter:function(){},ondrag:function(){},onexit:function(){},onload:function(){},allowdrop:function(){}};return o.destroy=r.addListener(o),o}(e,r?document.documentElement:e,o),u="",l="";s.allowdrop=function(e){return t(a(e))},s.ondrop=function(e,n){var r=a(n);t(r)?(l="drag-drop",c.onload(r,e)):c.ondragend(e)},s.ondrag=function(e){c.ondrag(e)},s.onenter=function(e){l="drag-over",c.ondragstart(e)},s.onexit=function(e){l="drag-exit",c.ondragend(e)};var c={updateHopperState:function(){u!==l&&(e.dataset.hopperState=l,u=l)},onload:function(){},ondragstart:function(){},ondrag:function(){},ondragend:function(){},destroy:function(){s.destroy()}};return c},Ar=!1,Lr=[],br=function(e){var t=document.activeElement;if(t&&(/textarea|input/i.test(t.nodeName)||"true"===t.getAttribute("contenteditable"))){for(var n=!1,r=t;r!==document.body;){if(r.classList.contains("filepond--root")){n=!0;break}r=r.parentNode}if(!n)return}nr(e.clipboardData).then(function(e){e.length&&Lr.forEach(function(t){return t(e)})})},Pr=function(){var e=function(e){t.onload(e)},t={destroy:function(){var t;t=e,de(Lr,Lr.indexOf(t)),0===Lr.length&&(document.removeEventListener("paste",br),Ar=!1)},onload:function(){}};return function(e){Lr.includes(e)||(Lr.push(e),Ar||(Ar=!0,document.addEventListener("paste",br)))}(e),t},Mr=null,wr=null,Cr=[],Nr=function(e,t){e.element.textContent=t},Gr=function(e,t,n){var r=e.query("GET_TOTAL_ITEMS");Nr(e,n+" "+t+", "+r+" "+(1===r?e.query("GET_LABEL_FILE_COUNT_SINGULAR"):e.query("GET_LABEL_FILE_COUNT_PLURAL"))),clearTimeout(wr),wr=setTimeout(function(){!function(e){e.element.textContent=""}(e)},1500)},Ur=function(e){return e.element.parentNode.contains(document.activeElement)},Br=function(e){var t=e.root,n=e.action,r=t.query("GET_ITEM",n.id).filename,o=t.query("GET_LABEL_FILE_PROCESSING_ABORTED");Nr(t,r+" "+o)},Fr=function(e){var t=e.root,n=e.action,r=t.query("GET_ITEM",n.id).filename;Nr(t,n.status.main+" "+r+" "+n.status.sub)},qr=S({create:function(e){var t=e.root,n=e.props;t.element.id="filepond--assistant-"+n.id,r(t.element,"role","alert"),r(t.element,"aria-live","polite"),r(t.element,"aria-relevant","additions")},ignoreRect:!0,ignoreRectUpdate:!0,write:A({DID_LOAD_ITEM:function(e){var t=e.root,n=e.action;if(Ur(t)){t.element.textContent="";var r=t.query("GET_ITEM",n.id);Cr.push(r.filename),clearTimeout(Mr),Mr=setTimeout(function(){Gr(t,Cr.join(", "),t.query("GET_LABEL_FILE_ADDED")),Cr.length=0},750)}},DID_REMOVE_ITEM:function(e){var t=e.root,n=e.action;if(Ur(t)){var r=n.item;Gr(t,r.filename,t.query("GET_LABEL_FILE_REMOVED"))}},DID_COMPLETE_ITEM_PROCESSING:function(e){var t=e.root,n=e.action,r=t.query("GET_ITEM",n.id).filename,o=t.query("GET_LABEL_FILE_PROCESSING_COMPLETE");Nr(t,r+" "+o)},DID_ABORT_ITEM_PROCESSING:Br,DID_REVERT_ITEM_PROCESSING:Br,DID_THROW_ITEM_REMOVE_ERROR:Fr,DID_THROW_ITEM_LOAD_ERROR:Fr,DID_THROW_ITEM_INVALID:Fr,DID_THROW_ITEM_PROCESSING_ERROR:Fr}),tag:"span",name:"assistant"}),Vr=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"-";return e.replace(new RegExp(t+".","g"),function(e){return e.charAt(1).toUpperCase()})},xr=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:16,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=Date.now(),o=null;return function(){for(var i=arguments.length,a=new Array(i),s=0;s=0?1:0,_=a.find(function(e){return e.markedForRemoval&&e.opacity<.45})?-1:0,T=a.length+E+_,I=hn(s,d);return 1===I?a.forEach(function(e){var r=e.rect.element.height+c;n+=r,t+=r*e.opacity}):(n=Math.ceil(T/I)*p,t=n),{visual:t,bounds:n}},Hr=function(e){var t=e.ref.measureHeight||null;return{cappedHeight:parseInt(e.style.maxHeight,10)||null,fixedHeight:0===t?null:t}},Xr=function(e,t){var n=e.query("GET_ALLOW_REPLACE"),r=e.query("GET_ALLOW_MULTIPLE"),o=e.query("GET_TOTAL_ITEMS"),i=e.query("GET_MAX_FILES"),a=t.length;return!r&&a>1?(e.dispatch("DID_THROW_MAX_FILES",{source:t,error:ot("warning",0,"Max files")}),!0):!(!r&&n)&&(!!(V(i=r?i:1)&&o+a>i)&&(e.dispatch("DID_THROW_MAX_FILES",{source:t,error:ot("warning",0,"Max files")}),!0))},Wr=function(e,t,n){var r=e.childViews[0];return gn(r,t,{left:n.scopeLeft-r.rect.element.left,top:n.scopeTop-(e.rect.outer.top+e.rect.element.marginTop+e.rect.element.scrollTop)})},zr=function(e){var t=e.query("GET_ALLOW_DROP"),n=e.query("GET_DISABLED"),r=t&&!n;if(r&&!e.ref.hopper){var o=Sr(e.element,function(t){var n=e.query("GET_BEFORE_DROP_FILE")||function(){return!0};return!e.query("GET_DROP_VALIDATION")||t.every(function(t){return ye("ALLOW_HOPPER_ITEM",t,{query:e.query}).every(function(e){return!0===e})&&n(t)})},{filterItems:function(t){var n=e.query("GET_IGNORED_FILES");return t.filter(function(e){return!ht(e)||!n.includes(e.name.toLowerCase())})},catchesDropsOnPage:e.query("GET_DROP_ON_PAGE"),requiresDropOnElement:e.query("GET_DROP_ON_ELEMENT")});o.onload=function(t,n){var r=e.ref.list.childViews[0].childViews.filter(function(e){return e.rect.element.height}),o=e.query("GET_ACTIVE_ITEMS").map(function(e){return r.find(function(t){return t.id===e.id})}).filter(function(e){return e});Oe("ADD_ITEMS",t,{dispatch:e.dispatch}).then(function(t){if(Xr(e,t))return!1;e.dispatch("ADD_ITEMS",{items:t,index:Wr(e.ref.list,o,n),interactionMethod:ee})}),e.dispatch("DID_DROP",{position:n}),e.dispatch("DID_END_DRAG",{position:n})},o.ondragstart=function(t){e.dispatch("DID_START_DRAG",{position:t})},o.ondrag=xr(function(t){e.dispatch("DID_DRAG",{position:t})}),o.ondragend=function(t){e.dispatch("DID_END_DRAG",{position:t})},e.ref.hopper=o,e.ref.drip=e.appendChildView(e.createChildView(Hn))}else!r&&e.ref.hopper&&(e.ref.hopper.destroy(),e.ref.hopper=null,e.removeChildView(e.ref.drip))},Qr=function(e,t){var n=e.query("GET_ALLOW_BROWSE"),r=e.query("GET_DISABLED"),o=n&&!r;o&&!e.ref.browser?e.ref.browser=e.appendChildView(e.createChildView(Fn,Object.assign({},t,{onload:function(t){Oe("ADD_ITEMS",t,{dispatch:e.dispatch}).then(function(t){if(Xr(e,t))return!1;e.dispatch("ADD_ITEMS",{items:t,index:-1,interactionMethod:te})})}})),0):!o&&e.ref.browser&&(e.removeChildView(e.ref.browser),e.ref.browser=null)},Zr=function(e){var t=e.query("GET_ALLOW_PASTE"),n=e.query("GET_DISABLED"),r=t&&!n;r&&!e.ref.paster?(e.ref.paster=Pr(),e.ref.paster.onload=function(t){Oe("ADD_ITEMS",t,{dispatch:e.dispatch}).then(function(t){if(Xr(e,t))return!1;e.dispatch("ADD_ITEMS",{items:t,index:-1,interactionMethod:ne})})}):!r&&e.ref.paster&&(e.ref.paster.destroy(),e.ref.paster=null)},Kr=A({DID_SET_ALLOW_BROWSE:function(e){var t=e.root,n=e.props;Qr(t,n)},DID_SET_ALLOW_DROP:function(e){var t=e.root;zr(t)},DID_SET_ALLOW_PASTE:function(e){var t=e.root;Zr(t)},DID_SET_DISABLED:function(e){var t=e.root,n=e.props;zr(t),Zr(t),Qr(t,n),t.query("GET_DISABLED")?t.element.dataset.disabled="disabled":t.element.removeAttribute("data-disabled")}}),$r=S({name:"root",read:function(e){var t=e.root;t.ref.measure&&(t.ref.measureHeight=t.ref.measure.offsetHeight)},create:function(e){var t=e.root,n=e.props,r=t.query("GET_ID");r&&(t.element.id=r);var o=t.query("GET_CLASS_NAME");o&&o.split(" ").filter(function(e){return e.length}).forEach(function(e){t.element.classList.add(e)}),t.ref.label=t.appendChildView(t.createChildView(Yn,Object.assign({},n,{translateY:null,caption:t.query("GET_LABEL_IDLE")}))),t.ref.list=t.appendChildView(t.createChildView(bn,{translateY:null})),t.ref.panel=t.appendChildView(t.createChildView(En,{name:"panel-root"})),t.ref.assistant=t.appendChildView(t.createChildView(qr,Object.assign({},n))),t.ref.data=t.appendChildView(t.createChildView(Kn,Object.assign({},n))),t.ref.measure=Ct("div"),t.ref.measure.style.height="100%",t.element.appendChild(t.ref.measure),t.ref.bounds=null,t.query("GET_STYLES").filter(function(e){return!M(e.value)}).map(function(e){var n=e.name,r=e.value;t.element.dataset[n]=r}),t.ref.widthPrevious=null,t.ref.widthUpdated=xr(function(){t.ref.updateHistory=[],t.dispatch("DID_RESIZE_ROOT")},250),t.ref.previousAspectRatio=null,t.ref.updateHistory=[];var i=window.matchMedia("(pointer: fine) and (hover: hover)").matches,a="PointerEvent"in window;t.query("GET_ALLOW_REORDER")&&a&&!i&&(t.element.addEventListener("touchmove",Yr,{passive:!1}),t.element.addEventListener("gesturestart",Yr));var s=t.query("GET_CREDITS");if(2===s.length){var u=document.createElement("a");u.className="filepond--credits",u.href=s[0],u.tabIndex=-1,u.target="_blank",u.rel="noopener noreferrer nofollow",u.textContent=s[1],t.element.appendChild(u),t.ref.credits=u}},write:function(e){var t=e.root,n=e.props,r=e.actions;if(Kr({root:t,props:n,actions:r}),r.filter(function(e){return/^DID_SET_STYLE_/.test(e.type)}).filter(function(e){return!M(e.data.value)}).map(function(e){var n=e.type,r=e.data,o=Vr(n.substring(8).toLowerCase(),"_");t.element.dataset[o]=r.value,t.invalidateLayout()}),!t.rect.element.hidden){t.rect.element.width!==t.ref.widthPrevious&&(t.ref.widthPrevious=t.rect.element.width,t.ref.widthUpdated());var o=t.ref.bounds;o||(o=t.ref.bounds=Hr(t),t.element.removeChild(t.ref.measure),t.ref.measure=null);var i=t.ref,a=i.hopper,s=i.label,u=i.list,l=i.panel;a&&a.updateHopperState();var c=t.query("GET_PANEL_ASPECT_RATIO"),f=t.query("GET_ALLOW_MULTIPLE"),d=t.query("GET_TOTAL_ITEMS"),p=d===(f?t.query("GET_MAX_FILES")||1e6:1),E=r.find(function(e){return"DID_ADD_ITEM"===e.type});if(p&&E){var _=E.data.interactionMethod;s.opacity=0,f?s.translateY=-40:_===J?s.translateX=40:s.translateY=_===te?40:30}else p||(s.opacity=1,s.translateX=0,s.translateY=0);var T=kr(t),I=jr(t),v=s.rect.element.height,m=!f||p?0:v,h=p?u.rect.element.marginTop:0,g=0===d?0:u.rect.element.marginBottom,R=m+h+I.visual+g,O=m+h+I.bounds+g;if(u.translateY=Math.max(0,m-u.rect.element.marginTop)-T.top,c){var y=t.rect.element.width,D=y*c;c!==t.ref.previousAspectRatio&&(t.ref.previousAspectRatio=c,t.ref.updateHistory=[]);var S=t.ref.updateHistory;if(S.push(y),S.length>4)for(var A=S.length,L=A-10,b=0,P=A;P>=L;P--)if(S[P]===S[P-2]&&b++,b>=2)return;l.scalable=!1,l.height=D;var w=D-m-(g-T.bottom)-(p?h:0);I.visual>w?u.overflow=w:u.overflow=null,t.height=D}else if(o.fixedHeight){l.scalable=!1;var C=o.fixedHeight-m-(g-T.bottom)-(p?h:0);I.visual>C?u.overflow=C:u.overflow=null}else if(o.cappedHeight){var N=R>=o.cappedHeight,G=Math.min(o.cappedHeight,R);l.scalable=!0,l.height=N?G:G-T.top-T.bottom;var U=G-m-(g-T.bottom)-(p?h:0);R>o.cappedHeight&&I.visual>U?u.overflow=U:u.overflow=null,t.height=Math.min(o.cappedHeight,O-T.top-T.bottom)}else{var B=d>0?T.top+T.bottom:0;l.scalable=!0,l.height=Math.max(v,R-B),t.height=Math.max(v,O-B)}t.ref.credits&&l.heightCurrent&&(t.ref.credits.style.transform="translateY("+l.heightCurrent+"px)")}},destroy:function(e){var t=e.root;t.ref.paster&&t.ref.paster.destroy(),t.ref.hopper&&t.ref.hopper.destroy(),t.element.removeEventListener("touchmove",Yr),t.element.removeEventListener("gesturestart",Yr)},mixins:{styles:["height"]}}),Jr=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=null,o=Se(),i=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=Object.assign({},e),o=[],i=[],a=function(e,t,n){!n||document.hidden?(c[e]&&c[e](t),o.push({type:e,data:t})):i.push({type:e,data:t})},s=function(e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:{};return new Promise(function(n,r){y([{source:e,options:t}],{index:t.index}).then(function(e){return n(e&&e[0])}).catch(r)})},addFiles:y,getFile:function(e){return i.query("GET_ACTIVE_ITEM",e)},processFile:S,prepareFile:R,removeFile:O,moveFile:function(e,t){return i.dispatch("MOVE_ITEM",{query:e,index:t})},getFiles:D,processFiles:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n={};return t(Se(),function(e,t){n[e]=t[0]}),Jr(Object.assign({},n,{},e))},to=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=[];t(e.attributes,function(t){o.push(e.attributes[t])});var i=o.filter(function(e){return e.name}).reduce(function(t,n){var o,i=r(e,n.name);return t[(o=n.name,Vr(o.replace(/^data-/,"")))]=i===n.name||i,t},{});return function e(n,r){t(r,function(r,o){t(n,function(e,t){var i=new RegExp(r);if(i.test(e)&&(delete n[e],!1!==o))if(U(o))n[o]=t;else{var a,s=o.group;H(o)&&!n[s]&&(n[s]={}),n[s][(a=e.replace(i,""),a.charAt(0).toLowerCase()+a.slice(1))]=t}}),o.mapping&&e(n[o.group],o.mapping)})}(i,n),i},no=function(){return(arguments.length<=0?void 0:arguments[0])instanceof HTMLElement?function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={"^class$":"className","^multiple$":"allowMultiple","^capture$":"captureMethod","^webkitdirectory$":"allowDirectoriesOnly","^server":{group:"server",mapping:{"^process":{group:"process"},"^revert":{group:"revert"},"^fetch":{group:"fetch"},"^restore":{group:"restore"},"^load":{group:"load"}}},"^type$":!1,"^files$":!1};ye("SET_ATTRIBUTE_TO_OPTION_MAP",n);var r=Object.assign({},t),o=to("FIELDSET"===e.nodeName?e.querySelector("input[type=file]"):e,n);Object.keys(o).forEach(function(e){H(o[e])?(H(r[e])||(r[e]={}),Object.assign(r[e],o[e])):r[e]=o[e]}),r.files=(t.files||[]).concat(Array.from(e.querySelectorAll("input:not([type=file])")).map(function(e){return{source:e.value,options:{type:e.dataset.type}}}));var i=eo(r);return e.files&&Array.from(e.files).forEach(function(e){i.addFile(e)}),i.replaceElement(e),i}.apply(void 0,arguments):eo.apply(void 0,arguments)},ro=["fire","_read","_write"],oo=function(e){var t={};return Ee(e,t,ro),t},io=function(e,t){return e.replace(/(?:{([a-zA-Z]+)})/g,function(e,n){return t[n]})},ao=function(e){var t=new Blob(["(",e.toString(),")()"],{type:"application/javascript"}),n=URL.createObjectURL(t),r=new Worker(n);return{transfer:function(e,t){},post:function(e,t,n){var o=oe();r.onmessage=function(e){e.data.id===o&&t(e.data.message)},r.postMessage({id:o,message:e},n)},terminate:function(){r.terminate(),URL.revokeObjectURL(n)}}},so=function(e){return new Promise(function(t,n){var r=new Image;r.onload=function(){t(r)},r.onerror=function(e){n(e)},r.src=e})},uo=function(e,t){var n=e.slice(0,e.size,e.type);return n.lastModifiedDate=e.lastModifiedDate,n.name=t,n},lo=function(e){return uo(e,e.name)},co=[],fo=function(e){if(!co.includes(e)){co.push(e);var n,r=e({addFilter:De,utils:{Type:ge,forin:t,isString:U,isFile:ht,toNaturalFileSize:qt,replaceInString:io,getExtensionFromFilename:je,getFilenameWithoutExtension:mt,guesstimateMimeType:tr,getFileFromBlob:We,getFilenameFromURL:ke,createRoute:A,createWorker:ao,createView:S,createItemAPI:Te,loadImage:so,copyFile:lo,renameFile:uo,createBlob:ze,applyFilterChain:Oe,text:Nt,getNumericAspectRatioFromString:be},views:{fileActionButton:Ft}});n=r.options,Object.assign(Ae,n)}},po=(Kt=c()&&!("[object OperaMini]"===Object.prototype.toString.call(window.operamini))&&"visibilityState"in document&&"Promise"in window&&"slice"in Blob.prototype&&"URL"in window&&"createObjectURL"in window.URL&&"performance"in window&&("supports"in(window.CSS||{})||/MSIE|Trident/.test(window.navigator.userAgent)),function(){return Kt}),Eo={apps:[]},_o=function(){};if(e.Status={},e.FileStatus={},e.FileOrigin={},e.OptionTypes={},e.create=_o,e.destroy=_o,e.parse=_o,e.find=_o,e.registerPlugin=_o,e.getOptions=_o,e.setOptions=_o,po()){!function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:60,r="__framePainter";if(window[r])return window[r].readers.push(e),void window[r].writers.push(t);window[r]={readers:[e],writers:[t]};var o=window[r],i=1e3/n,a=null,s=null,u=null,l=null,c=function(){document.hidden?(u=function(){return window.setTimeout(function(){return f(performance.now())},i)},l=function(){return window.clearTimeout(s)}):(u=function(){return window.requestAnimationFrame(f)},l=function(){return window.cancelAnimationFrame(s)})};document.addEventListener("visibilitychange",function(){l&&l(),c(),f(performance.now())});var f=function e(t){s=u(e),a||(a=t);var n=t-a;n<=i||(a=t-n%i,o.readers.forEach(function(e){return e()}),o.writers.forEach(function(e){return e(t)}))};c(),f(performance.now())}(function(){Eo.apps.forEach(function(e){return e._read()})},function(e){Eo.apps.forEach(function(t){return t._write(e)})});var To=function t(){document.dispatchEvent(new CustomEvent("FilePond:loaded",{detail:{supported:po,create:e.create,destroy:e.destroy,parse:e.parse,find:e.find,registerPlugin:e.registerPlugin,setOptions:e.setOptions}})),document.removeEventListener("DOMContentLoaded",t)};"loading"!==document.readyState?setTimeout(function(){return To()},0):document.addEventListener("DOMContentLoaded",To);var Io=function(){return t(Se(),function(t,n){e.OptionTypes[t]=n[1]})};e.Status=Object.assign({},Me),e.FileOrigin=Object.assign({},ve),e.FileStatus=Object.assign({},Ie),e.OptionTypes={},Io(),e.create=function(){var t=no.apply(void 0,arguments);return t.on("destroy",e.destroy),Eo.apps.push(t),oo(t)},e.destroy=function(e){var t=Eo.apps.findIndex(function(t){return t.isAttachedTo(e)});return t>=0&&(Eo.apps.splice(t,1)[0].restoreElement(),!0)},e.parse=function(t){return Array.from(t.querySelectorAll(".filepond")).filter(function(e){return!Eo.apps.find(function(t){return t.isAttachedTo(e)})}).map(function(t){return e.create(t)})},e.find=function(e){var t=Eo.apps.find(function(t){return t.isAttachedTo(e)});return t?oo(t):null},e.registerPlugin=function(){for(var e=arguments.length,t=new Array(e),n=0;ninput,[data-grav-field=array] .form-row>textarea{margin:0 .5rem;display:inline-block}.form-data.basic-captcha .form-input-wrapper{border:1px solid #ccc;border-radius:5px;display:flex;overflow:hidden}.form-data.basic-captcha .form-input-prepend{display:flex;color:#333;background-color:#ccc;flex-shrink:0}.form-data.basic-captcha .form-input-prepend img{margin:0}.form-data.basic-captcha .form-input-prepend button>svg{margin:0 8px;width:18px;height:18px}.form-data.basic-captcha input.form-input{border:0}/*# sourceMappingURL=form-styles.css.map */ +.form-group.has-errors{background:rgba(255,0,0,.05);border:1px solid rgba(255,0,0,.2);border-radius:3px;margin:0 -5px;padding:0 5px}.form-errors{color:#b52b27}.form-honeybear{display:none;position:absolute !important;height:1px;width:1px;overflow:hidden;clip-path:rect(0px, 1px, 1px, 0px)}.form-errors p{margin:0}.form-input-file input{display:none}.form-input-file .dz-default.dz-message{position:absolute;text-align:center;left:0;right:0;top:50%;transform:translateY(-50%);margin:0}.form-input-file.dropzone{position:relative;min-height:70px;border-radius:3px;margin-bottom:.85rem;border:2px dashed #ccc;color:#aaa;padding:.5rem}.form-input-file.dropzone .dz-preview{margin:.5rem}.form-input-file.dropzone .dz-preview:hover{z-index:2}.form-input-file.dropzone .dz-preview .dz-image img{margin:0}.form-input-file.dropzone .dz-preview .dz-remove{font-size:16px;position:absolute;top:3px;right:3px;display:inline-flex;height:20px;width:20px;background-color:red;justify-content:center;align-items:center;color:#fff;font-weight:bold;border-radius:50%;cursor:pointer;z-index:20}.form-input-file.dropzone .dz-preview .dz-remove:hover{background-color:darkred;text-decoration:none}.form-input-file.dropzone .dz-preview .dz-error-message{min-width:140px;width:auto}.form-input-file.dropzone .dz-preview .dz-image,.form-input-file.dropzone .dz-preview.dz-file-preview .dz-image{border-radius:3px;z-index:1}.filepond--root.form-input{min-height:7rem;height:auto;overflow:hidden;border:0}.form-tabs .tabs-nav{display:flex;padding-top:1px;margin-bottom:-1px}.form-tabs .tabs-nav a{flex:1;transition:color .5s ease,background .5s ease;cursor:pointer;text-align:center;padding:10px;display:flex;align-items:center;justify-content:center;border-bottom:1px solid #ccc;border-radius:5px 5px 0 0}.form-tabs .tabs-nav a.active{border:1px solid #ccc;border-bottom:1px solid rgba(0,0,0,0);margin:0 -1px}.form-tabs .tabs-nav a.active span{color:#000}.form-tabs .tabs-nav span{display:inline-block;line-height:1.1}.form-tabs.subtle .tabs-nav{margin-right:0 !important}.form-tabs .tabs-content .tab__content{display:none;padding-top:2rem}.form-tabs .tabs-content .tab__content.active{display:block}.checkboxes{display:inline-block}.checkboxes label{display:inline;cursor:pointer;position:relative;padding:0 0 0 20px;margin-right:15px}.checkboxes label:before{content:"";display:inline-block;width:20px;height:20px;left:0;margin-top:0;margin-right:10px;position:absolute;border-radius:3px;border:1px solid #e6e6e6}.checkboxes input[type=checkbox]{display:none}.checkboxes input[type=checkbox]:checked+label:before{content:"✓";font-size:20px;line-height:1;text-align:center}.checkboxes.toggleable label{margin-right:0}.form-field-toggleable .checkboxes.toggleable{margin-right:5px;vertical-align:middle}.form-field-toggleable .checkboxes+label{display:inline-block}.switch-toggle{display:inline-flex;overflow:hidden;border-radius:3px;line-height:35px;border:1px solid #ccc}.switch-toggle input[type=radio]{position:absolute;visibility:hidden;display:none}.switch-toggle label{display:inline-block;cursor:pointer;padding:0 15px;margin:0;white-space:nowrap;color:inherit;transition:background-color .5s ease}.switch-toggle input.highlight:checked+label{background:#333;color:#fff}.switch-toggle input:checked+label{color:#fff;background:#999}.signature-pad{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:10px;width:100%;height:100%;max-width:700px;max-height:460px;border:1px solid #f0f0f0;background-color:#fff;padding:16px}.signature-pad--body{position:relative;-webkit-box-flex:1;-ms-flex:1;flex:1;border:1px solid #f6f6f6;min-height:100px}.signature-pad--body canvas{position:absolute;left:0;top:0;width:100%;height:100%;border-radius:4px;box-shadow:0 0 5px rgba(0,0,0,.02) inset}.signature-pad--footer{color:#c3c3c3;text-align:center;font-size:1.2em}.signature-pad--actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-top:8px}[data-grav-field=array] .form-row{display:flex;align-items:center;margin-bottom:.5rem}[data-grav-field=array] .form-row>input,[data-grav-field=array] .form-row>textarea{margin:0 .5rem;display:inline-block}.form-data.basic-captcha .form-input-wrapper{border:1px solid #ccc;border-radius:5px;display:flex;overflow:hidden}.form-data.basic-captcha .form-input-prepend{display:flex;color:#333;background-color:#ccc;flex-shrink:0}.form-data.basic-captcha .form-input-prepend img{margin:0}.form-data.basic-captcha .form-input-prepend button>svg{margin:0 8px;width:18px;height:18px}.form-data.basic-captcha input.form-input{border:0}/*# sourceMappingURL=form-styles.css.map */ diff --git a/plugins/form/assets/form-styles.css.map b/plugins/form/assets/form-styles.css.map index af503bc..2d63e77 100644 --- a/plugins/form/assets/form-styles.css.map +++ b/plugins/form/assets/form-styles.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../scss/form-styles.scss"],"names":[],"mappings":"CAGA,uBACI,6BACA,kCACA,kBACA,cACA,cAGJ,aACI,cAGJ,gBACI,aACA,6BACA,WACA,UACA,gBACA,mCAGJ,eACI,SAKA,uBACI,aAGJ,wCACI,kBACA,kBACA,OACA,QACA,QACA,2BACA,SAGJ,0BACI,kBACA,gBACA,kBACA,qBACA,uBACA,WACA,cAEA,sCACI,aAEA,4CACI,UAGJ,wDACI,gBACA,WAGJ,gHAEI,kBACA,UAWZ,qBACI,aACA,gBAEA,mBAEA,uBACI,OACA,8CACA,eACA,kBACA,aACA,aACA,mBACA,uBACA,6BACA,0BAEA,8BACI,sBACA,sCACA,cAEA,mCACI,MAtGA,KA2GZ,0BACI,qBACA,gBAKR,4BACI,0BAKA,uCACI,aACA,iBAEA,8CACI,cAOhB,YACI,qBAEA,kBACI,eACA,eACA,kBACA,mBACA,kBAGJ,yBACI,WACA,qBACA,WACA,YACA,OACA,aACA,kBACA,kBACA,kBAEA,yBAGJ,iCACI,aAEJ,sDACI,YACA,eACA,cACA,kBAGJ,6BACI,eAMJ,8CACI,iBACA,sBAEJ,yCACI,qBAKR,eACI,oBACA,gBACA,kBACA,iBACA,sBAEA,iCACI,kBACA,kBACA,aAGJ,qBACI,qBACA,eACA,eACA,SACA,mBACA,cACA,qCAGJ,6CACI,gBACA,WAGJ,mCACI,WACA,gBAOR,eACI,kBACA,oBACA,oBACA,aACA,4BACA,6BACA,0BACA,sBACA,eACA,WACA,YACA,gBACA,iBACA,yBACA,sBACA,aAGJ,qBACI,kBACA,mBACA,WACA,OACA,yBACA,iBAGJ,4BACI,kBACA,OACA,MACA,WACA,YACA,kBACA,yCAGJ,uBACI,cACA,kBACA,gBAGJ,wBACI,oBACA,oBACA,aACA,yBACA,sBACA,8BACA,eAGJ,kCACI,aACA,mBACA,oBAGJ,mFAGI,eACA,qBAIA,6CACI,sBACA,kBACA,aACA,gBAEJ,6CACI,aACA,WACA,sBACA,cACA,iDACI,SAEJ,wDACI,aACA,WACA,YAGR,0CACI","file":"form-styles.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../scss/form-styles.scss"],"names":[],"mappings":"CAGA,uBACI,6BACA,kCACA,kBACA,cACA,cAGJ,aACI,cAGJ,gBACI,aACA,6BACA,WACA,UACA,gBACA,mCAGJ,eACI,SAKA,uBACI,aAGJ,wCACI,kBACA,kBACA,OACA,QACA,QACA,2BACA,SAGJ,0BACI,kBACA,gBACA,kBACA,qBACA,uBACA,WACA,cAEA,sCACI,aAEA,4CACI,UAGJ,oDACE,SAGF,iDACE,eACA,kBACA,QACA,UACA,oBACA,YACA,WACA,qBACA,uBACA,mBACA,WACA,iBACA,kBACA,eACA,WACA,uDACI,yBACA,qBAIN,wDACI,gBACA,WAGJ,gHAEI,kBACA,UAOhB,2BACE,gBACA,YACA,gBACA,SAME,qBACI,aACA,gBAEA,mBAEA,uBACI,OACA,8CACA,eACA,kBACA,aACA,aACA,mBACA,uBACA,6BACA,0BAEA,8BACI,sBACA,sCACA,cAEA,mCACI,MAtIA,KA2IZ,0BACI,qBACA,gBAKR,4BACI,0BAKA,uCACI,aACA,iBAEA,8CACI,cAOhB,YACI,qBAEA,kBACI,eACA,eACA,kBACA,mBACA,kBAGJ,yBACI,WACA,qBACA,WACA,YACA,OACA,aACA,kBACA,kBACA,kBAEA,yBAGJ,iCACI,aAEJ,sDACI,YACA,eACA,cACA,kBAGJ,6BACI,eAMJ,8CACI,iBACA,sBAEJ,yCACI,qBAKR,eACI,oBACA,gBACA,kBACA,iBACA,sBAEA,iCACI,kBACA,kBACA,aAGJ,qBACI,qBACA,eACA,eACA,SACA,mBACA,cACA,qCAGJ,6CACI,gBACA,WAGJ,mCACI,WACA,gBAOR,eACI,kBACA,oBACA,oBACA,aACA,4BACA,6BACA,0BACA,sBACA,eACA,WACA,YACA,gBACA,iBACA,yBACA,sBACA,aAGJ,qBACI,kBACA,mBACA,WACA,OACA,yBACA,iBAGJ,4BACI,kBACA,OACA,MACA,WACA,YACA,kBACA,yCAGJ,uBACI,cACA,kBACA,gBAGJ,wBACI,oBACA,oBACA,aACA,yBACA,sBACA,8BACA,eAGJ,kCACI,aACA,mBACA,oBAGJ,mFAGI,eACA,qBAIA,6CACI,sBACA,kBACA,aACA,gBAEJ,6CACI,aACA,WACA,sBACA,cACA,iDACI,SAEJ,wDACI,aACA,WACA,YAGR,0CACI","file":"form-styles.css"} \ No newline at end of file diff --git a/plugins/form/assets/form.min.js b/plugins/form/assets/form.min.js index 64bdb2a..5805bf8 100644 --- a/plugins/form/assets/form.min.js +++ b/plugins/form/assets/form.min.js @@ -1,276 +1 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ var executeModules = data[2]; -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ // add entry modules from loaded chunk to deferred list -/******/ deferredModules.push.apply(deferredModules, executeModules || []); -/******/ -/******/ // run deferred modules when all chunks ready -/******/ return checkDeferredModules(); -/******/ }; -/******/ function checkDeferredModules() { -/******/ var result; -/******/ for(var i = 0; i < deferredModules.length; i++) { -/******/ var deferredModule = deferredModules[i]; -/******/ var fulfilled = true; -/******/ for(var j = 1; j < deferredModule.length; j++) { -/******/ var depId = deferredModule[j]; -/******/ if(installedChunks[depId] !== 0) fulfilled = false; -/******/ } -/******/ if(fulfilled) { -/******/ deferredModules.splice(i--, 1); -/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); -/******/ } -/******/ } -/******/ -/******/ return result; -/******/ } -/******/ -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ "site": 0 -/******/ }; -/******/ -/******/ var deferredModules = []; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // add entry module to deferred list -/******/ deferredModules.push(["./app/main.js","vendor"]); -/******/ // run deferred modules when ready -/******/ return checkDeferredModules(); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./app/fields/array.js": -/*!*****************************!*\ - !*** ./app/fields/array.js ***! - \*****************************/ -/*! exports provided: default, Instance */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ArrayField; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Instance\", function() { return Instance; });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.esm.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\nvar body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\nvar Template = /*#__PURE__*/function () {\n function Template(container) {\n _classCallCheck(this, Template);\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n if (this.getName() === undefined) {\n this.container = this.container.closest('[data-grav-array-name]');\n }\n }\n return _createClass(Template, [{\n key: \"getName\",\n value: function getName() {\n return this.container.data('grav-array-name') || '';\n }\n }, {\n key: \"getKeyPlaceholder\",\n value: function getKeyPlaceholder() {\n return this.container.data('grav-array-keyname') || 'Key';\n }\n }, {\n key: \"getValuePlaceholder\",\n value: function getValuePlaceholder() {\n return this.container.data('grav-array-valuename') || 'Value';\n }\n }, {\n key: \"isValueOnly\",\n value: function isValueOnly() {\n return this.container.find('[data-grav-array-mode=\"value_only\"]:first').length || false;\n }\n }, {\n key: \"isTextArea\",\n value: function isTextArea() {\n return this.container.data('grav-array-textarea') || false;\n }\n }, {\n key: \"shouldBeDisabled\",\n value: function shouldBeDisabled() {\n // check for toggleables, if field is toggleable and it's not enabled, render disabled\n var toggle = this.container.closest('.form-field').find('[data-grav-field=\"toggleable\"] input[type=\"checkbox\"]');\n return toggle.length && toggle.is(':not(:checked)');\n }\n }, {\n key: \"getNewRow\",\n value: function getNewRow() {\n var tpl = '';\n var value = this.isTextArea() ? \"\") : \"\");\n if (this.isValueOnly()) {\n tpl += \"\\n
\\n \\n \".concat(value, \"\\n \");\n } else {\n tpl += \"\\n
\\n \\n \\n \").concat(value, \"\\n \");\n }\n tpl += \"\\n \\n \\n
\";\n return tpl;\n }\n }]);\n}();\nvar ArrayField = /*#__PURE__*/function () {\n function ArrayField() {\n var _this = this;\n _classCallCheck(this, ArrayField);\n body.on('input', '[data-grav-array-type=\"key\"], [data-grav-array-type=\"value\"]', function (event) {\n return _this.actionInput(event);\n });\n body.on('click touch', '[data-grav-array-action]:not([data-grav-array-action=\"sort\"])', function (event) {\n return _this.actionEvent(event);\n });\n this.arrays = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-field=\"array\"]').each(function (index, list) {\n return _this.addArray(list);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n return _createClass(ArrayField, [{\n key: \"addArray\",\n value: function addArray(list) {\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n list.find('[data-grav-array-type=\"container\"]').each(function (index, container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n if (container.data('array-sort') || container[0].hasAttribute('data-array-nosort')) {\n return;\n }\n container.data('array-sort', new sortablejs__WEBPACK_IMPORTED_MODULE_1__[\"default\"](container.get(0), {\n handle: '.fa-bars',\n animation: 150\n }));\n });\n }\n }, {\n key: \"actionInput\",\n value: function actionInput(event) {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var type = element.data('grav-array-type');\n this._setTemplate(element);\n var template = element.data('array-template');\n var keyElement = type === 'key' ? element : element.siblings('[data-grav-array-type=\"key\"]:first');\n var valueElement = type === 'value' ? element : element.siblings('[data-grav-array-type=\"value\"]:first');\n var escaped_name = !template.isValueOnly() ? keyElement.val() : this.getIndexFor(element);\n escaped_name = escaped_name.toString().replace(/\\[/g, '%5B').replace(/]/g, '%5D');\n var name = \"\".concat(template.getName(), \"[\").concat(escaped_name, \"]\");\n if (!template.isValueOnly() && !keyElement.val() && !valueElement.val()) {\n valueElement.attr('name', '');\n } else {\n // valueElement.attr('name', !valueElement.val() ? template.getName() : name);\n valueElement.attr('name', name);\n }\n this.refreshNames(template);\n }\n }, {\n key: \"actionEvent\",\n value: function actionEvent(event) {\n event && event.preventDefault();\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var action = element.data('grav-array-action');\n var container = element.parents('[data-grav-array-type=\"container\"]');\n this._setTemplate(element);\n this[\"\".concat(action, \"Action\")](element);\n var siblings = container.find('> div');\n container[siblings.length > 1 ? 'removeClass' : 'addClass']('one-child');\n }\n }, {\n key: \"addAction\",\n value: function addAction(element) {\n var template = element.data('array-template');\n var row = element.closest('[data-grav-array-type=\"row\"]');\n row.after(template.getNewRow());\n }\n }, {\n key: \"remAction\",\n value: function remAction(element) {\n var template = element.data('array-template');\n var row = element.closest('[data-grav-array-type=\"row\"]');\n var isLast = !row.siblings().length;\n if (isLast) {\n var newRow = jquery__WEBPACK_IMPORTED_MODULE_0___default()(template.getNewRow());\n row.after(newRow);\n newRow.find('[data-grav-array-type=\"value\"]:last').attr('name', template.getName());\n }\n row.remove();\n this.refreshNames(template);\n }\n }, {\n key: \"refreshNames\",\n value: function refreshNames(template) {\n if (!template.isValueOnly()) {\n return;\n }\n var row = template.container.find('> div > [data-grav-array-type=\"row\"]');\n var inputs = row.find('[name]:not([name=\"\"])');\n inputs.each(function (index, input) {\n input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(input);\n var name = input.attr('name');\n name = name.replace(/\\[\\d+\\]$/, \"[\".concat(index, \"]\"));\n input.attr('name', name);\n });\n if (!inputs.length) {\n row.find('[data-grav-array-type=\"value\"]').attr('name', template.getName());\n }\n }\n }, {\n key: \"getIndexFor\",\n value: function getIndexFor(element) {\n var template = element.data('array-template');\n var row = element.closest('[data-grav-array-type=\"row\"]');\n return template.container.find(\"\".concat(template.isValueOnly() ? '> div ' : '', \" > [data-grav-array-type=\\\"row\\\"]\")).index(row);\n }\n }, {\n key: \"_setTemplate\",\n value: function _setTemplate(element) {\n if (!element.data('array-template')) {\n element.data('array-template', new Template(element.closest('[data-grav-array-name]')));\n }\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target /* , record, instance */) {\n var _this2 = this;\n var arrays = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-field=\"array\"]');\n if (!arrays.length) {\n return;\n }\n arrays.each(function (index, list) {\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n if (!~_this2.arrays.index(list)) {\n _this2.addArray(list);\n }\n });\n }\n }]);\n}();\n\nvar Instance = new ArrayField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvZmllbGRzL2FycmF5LmpzPzFlMzMiXSwibmFtZXMiOlsiYm9keSIsIiQiLCJUZW1wbGF0ZSIsImNvbnRhaW5lciIsIl9jbGFzc0NhbGxDaGVjayIsImdldE5hbWUiLCJ1bmRlZmluZWQiLCJjbG9zZXN0IiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJkYXRhIiwiZ2V0S2V5UGxhY2Vob2xkZXIiLCJnZXRWYWx1ZVBsYWNlaG9sZGVyIiwiaXNWYWx1ZU9ubHkiLCJmaW5kIiwibGVuZ3RoIiwiaXNUZXh0QXJlYSIsInNob3VsZEJlRGlzYWJsZWQiLCJ0b2dnbGUiLCJpcyIsImdldE5ld1JvdyIsInRwbCIsImNvbmNhdCIsIkFycmF5RmllbGQiLCJfdGhpcyIsIm9uIiwiZXZlbnQiLCJhY3Rpb25JbnB1dCIsImFjdGlvbkV2ZW50IiwiYXJyYXlzIiwiZWFjaCIsImluZGV4IiwibGlzdCIsImFkZEFycmF5IiwiX29uQWRkZWROb2RlcyIsImJpbmQiLCJoYXNBdHRyaWJ1dGUiLCJTb3J0YWJsZSIsImdldCIsImhhbmRsZSIsImFuaW1hdGlvbiIsImVsZW1lbnQiLCJ0YXJnZXQiLCJ0eXBlIiwiX3NldFRlbXBsYXRlIiwidGVtcGxhdGUiLCJrZXlFbGVtZW50Iiwic2libGluZ3MiLCJ2YWx1ZUVsZW1lbnQiLCJlc2NhcGVkX25hbWUiLCJ2YWwiLCJnZXRJbmRleEZvciIsInRvU3RyaW5nIiwicmVwbGFjZSIsIm5hbWUiLCJhdHRyIiwicmVmcmVzaE5hbWVzIiwicHJldmVudERlZmF1bHQiLCJhY3Rpb24iLCJwYXJlbnRzIiwiYWRkQWN0aW9uIiwicm93IiwiYWZ0ZXIiLCJyZW1BY3Rpb24iLCJpc0xhc3QiLCJuZXdSb3ciLCJyZW1vdmUiLCJpbnB1dHMiLCJpbnB1dCIsIl90aGlzMiIsIkluc3RhbmNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBdUI7QUFDVztBQUVsQyxJQUFJQSxJQUFJLEdBQUdDLDZDQUFDLENB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O0lBQUFDLEtBQUEsRUFFRCxTQUFBbUMsYUFBYUgsT0FBTyxFQUFFO01BQ2xCLElBQUksQ0FBQ0EsT0FBTyxDQUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDakMrQixPQUFPLENBQUMvQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSVQsUUFBUSxDQUFDd0MsT0FBTyxDQUFDbkMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztNQUMzRjtJQUNKO0VBQUM7SUFBQUUsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQXlCLGNBQWNSLEtBQUssRUFBRWdCLE1BQU0sMkJBQTBCO01BQUEsSUFBQTJCLE1BQUE7TUFDakQsSUFBSXhDLE1BQU0sR0FBRzdCLDZDQUFDLENBQUMwQyxNQUFNLENBQUMsQ0FBQzVCLElBQUksQ0FBQywyQkFBMkIsQ0FBQztNQUN4RCxJQUFJLENBQUNlLE1BQU0sQ0FBQ2QsTUFBTSxFQUFFO1FBQUU7TUFBUTtNQUU5QmMsTUFBTSxDQUFDQyxJQUFJLENBQUMsVUFBQ0MsS0FBSyxFQUFFQyxJQUFJLEVBQUs7UUFDekJBLElBQUksR0FBR2hDLDZDQUFDLENBQUNnQyxJQUFJLENBQUM7UUFDZCxJQUFJLENBQUMsQ0FBQ3FDLE1BQUksQ0FBQ3hDLE1BQU0sQ0FBQ0UsS0FBSyxDQUFDQyxJQUFJLENBQUMsRUFBRTtVQUMzQnFDLE1BQUksQ0FBQ3BDLFFBQVEsQ0FBQ0QsSUFBSSxDQUFDO1FBQ3ZCO01BQ0osQ0FBQyxDQUFDO0lBQ047RUFBQztBQUFBO0FBOUgwQjtBQWlJeEIsSUFBSXNDLFFBQVEsR0FBRyxJQUFJL0MsVUFBVSxDQUFDLENBQUMiLCJmaWxlIjoiLi9hcHAvZmllbGRzL2FycmF5LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBTb3J0YWJsZSBmcm9tICdzb3J0YWJsZWpzJztcblxubGV0IGJvZHkgPSAkKCdib2R5Jyk7XG5cbmNsYXNzIFRlbXBsYXRlIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG5cbiAgICAgICAgaWYgKHRoaXMuZ2V0TmFtZSgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5jb250YWluZXIuY2xvc2VzdCgnW2RhdGEtZ3Jhdi1hcnJheS1uYW1lXScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmRhdGEoJ2dyYXYtYXJyYXktbmFtZScpIHx8ICcnO1xuICAgIH1cblxuICAgIGdldEtleVBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuZGF0YSgnZ3Jhdi1hcnJheS1rZXluYW1lJykgfHwgJ0tleSc7XG4gICAgfVxuXG4gICAgZ2V0VmFsdWVQbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmRhdGEoJ2dyYXYtYXJyYXktdmFsdWVuYW1lJykgfHwgJ1ZhbHVlJztcbiAgICB9XG5cbiAgICBpc1ZhbHVlT25seSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmZpbmQoJ1tkYXRhLWdyYXYtYXJyYXktbW9kZT1cInZhbHVlX29ubHlcIl06Zmlyc3QnKS5sZW5ndGggfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgaXNUZXh0QXJlYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmRhdGEoJ2dyYXYtYXJyYXktdGV4dGFyZWEnKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBzaG91bGRCZURpc2FibGVkKCkge1xuICAgICAgICAvLyBjaGVjayBmb3IgdG9nZ2xlYWJsZXMsIGlmIGZpZWxkIGlzIHRvZ2dsZWFibGUgYW5kIGl0J3Mgbm90IGVuYWJsZWQsIHJlbmRlciBkaXNhYmxlZFxuICAgICAgICBsZXQgdG9nZ2xlID0gdGhpcy5jb250YWluZXIuY2xvc2VzdCgnLmZvcm0tZmllbGQnKS5maW5kKCdbZGF0YS1ncmF2LWZpZWxkPVwidG9nZ2xlYWJsZVwiXSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKTtcbiAgICAgICAgcmV0dXJuIHRvZ2dsZS5sZW5ndGggJiYgdG9nZ2xlLmlzKCc6bm90KDpjaGVja2VkKScpO1xuICAgIH1cblxuICAgIGdldE5ld1JvdygpIHtcbiAgICAgICAgbGV0IHRwbCA9ICcnO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXNUZXh0QXJlYSgpXG4gICAgICAgICAgICA/IGA8dGV4dGFyZWEgJHt0aGlzLnNob3VsZEJlRGlzYWJsZWQoKSA/ICdkaXNhYmxlZD1cImRpc2FibGVkXCInIDogJyd9IGRhdGEtZ3Jhdi1hcnJheS10eXBlPVwidmFsdWVcIiBuYW1lPVwiXCIgcGxhY2Vob2xkZXI9XCIke3RoaXMuZ2V0VmFsdWVQbGFjZWhvbGRlcigpfVwiPjwvdGV4dGFyZWE+YFxuICAgICAgICAgICAgOiBgPGlucHV0ICR7dGhpcy5zaG91bGRCZURpc2FibGVkKCkgPyAnZGlzYWJsZWQ9XCJkaXNhYmxlZFwiJyA6ICcnfSBkYXRhLWdyYXYtYXJyYXktdHlwZT1cInZhbHVlXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiXCIgdmFsdWU9XCJcIiAgcGxhY2Vob2xkZXI9XCIke3RoaXMuZ2V0VmFsdWVQbGFjZWhvbGRlcigpfVwiIC8+YDtcblxuICAgICAgICBpZiAodGhpcy5pc1ZhbHVlT25seSgpKSB7XG4gICAgICAgICAgICB0cGwgKz0gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93IGFycmF5LWZpZWxkLXZhbHVlX29ubHlcIiBkYXRhLWdyYXYtYXJyYXktdHlwZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtZ3Jhdi1hcnJheS1hY3Rpb249XCJzb3J0XCIgY2xhc3M9XCJmYSBmYS1iYXJzXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICR7dmFsdWV9XG4gICAgICAgICAgICBgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHBsICs9IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiIGRhdGEtZ3Jhdi1hcnJheS10eXBlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1ncmF2LWFycmF5LWFjdGlvbj1cInNvcnRcIiBjbGFzcz1cImZhIGZhLWJhcnNcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0ICR7dGhpcy5zaG91bGRCZURpc2FibGVkKCkgPyAnZGlzYWJsZWQ9XCJkaXNhYmxlZFwiJyA6ICcnfSBkYXRhLWdyYXYtYXJyYXktdHlwZT1cImtleVwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIiR7dGhpcy5nZXRLZXlQbGFjZWhvbGRlcigpfVwiIC8+XG4gICAgICAgICAgICAgICAgJHt2YWx1ZX1cbiAgICAgICAgICAgIGA7XG4gICAgICAgIH1cblxuICAgICAgICB0cGwgKz0gYFxuICAgICAgICAgICAgPHNwYW4gZGF0YS1ncmF2LWFycmF5LWFjdGlvbj1cInJlbVwiIGNsYXNzPVwiZmEgZmEtbWludXNcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBkYXRhLWdyYXYtYXJyYXktYWN0aW9uPVwiYWRkXCIgY2xhc3M9XCJmYSBmYS1wbHVzXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gO1xuXG4gICAgICAgIHJldHVybiB0cGw7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcnJheUZpZWxkIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgYm9keS5vbignaW5wdXQnLCAnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwia2V5XCJdLCBbZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJ2YWx1ZVwiXScsIChldmVudCkgPT4gdGhpcy5hY3Rpb25JbnB1dChldmVudCkpO1xuICAgICAgICBib2R5Lm9uKCdjbGljayB0b3VjaCcsICdbZGF0YS1ncmF2LWFycmF5LWFjdGlvbl06bm90KFtkYXRhLWdyYXYtYXJyYXktYWN0aW9uPVwic29ydFwiXSknLCAoZXZlbnQpID0+IHRoaXMuYWN0aW9uRXZlbnQoZXZlbnQpKTtcblxuICAgICAgICB0aGlzLmFycmF5cyA9ICQoKTtcblxuICAgICAgICAkKCdbZGF0YS1ncmF2LWZpZWxkPVwiYXJyYXlcIl0nKS5lYWNoKChpbmRleCwgbGlzdCkgPT4gdGhpcy5hZGRBcnJheShsaXN0KSk7XG4gICAgICAgICQoJ2JvZHknKS5vbignbXV0YXRpb24uX2dyYXYnLCB0aGlzLl9vbkFkZGVkTm9kZXMuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgYWRkQXJyYXkobGlzdCkge1xuICAgICAgICBsaXN0ID0gJChsaXN0KTtcblxuICAgICAgICBsaXN0LmZpbmQoJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cImNvbnRhaW5lclwiXScpLmVhY2goKGluZGV4LCBjb250YWluZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnRhaW5lciA9ICQoY29udGFpbmVyKTtcbiAgICAgICAgICAgIGlmIChjb250YWluZXIuZGF0YSgnYXJyYXktc29ydCcpIHx8IGNvbnRhaW5lclswXS5oYXNBdHRyaWJ1dGUoJ2RhdGEtYXJyYXktbm9zb3J0JykpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5kYXRhKCdhcnJheS1zb3J0JywgbmV3IFNvcnRhYmxlKGNvbnRhaW5lci5nZXQoMCksIHtcbiAgICAgICAgICAgICAgICBoYW5kbGU6ICcuZmEtYmFycycsXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uOiAxNTBcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWN0aW9uSW5wdXQoZXZlbnQpIHtcbiAgICAgICAgbGV0IGVsZW1lbnQgPSAkKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIGxldCB0eXBlID0gZWxlbWVudC5kYXRhKCdncmF2LWFycmF5LXR5cGUnKTtcblxuICAgICAgICB0aGlzLl9zZXRUZW1wbGF0ZShlbGVtZW50KTtcblxuICAgICAgICBsZXQgdGVtcGxhdGUgPSBlbGVtZW50LmRhdGEoJ2FycmF5LXRlbXBsYXRlJyk7XG4gICAgICAgIGxldCBrZXlFbGVtZW50ID0gdHlwZSA9PT0gJ2tleScgPyBlbGVtZW50IDogZWxlbWVudC5zaWJsaW5ncygnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwia2V5XCJdOmZpcnN0Jyk7XG4gICAgICAgIGxldCB2YWx1ZUVsZW1lbnQgPSB0eXBlID09PSAndmFsdWUnID8gZWxlbWVudCA6IGVsZW1lbnQuc2libGluZ3MoJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cInZhbHVlXCJdOmZpcnN0Jyk7XG5cbiAgICAgICAgbGV0IGVzY2FwZWRfbmFtZSA9ICF0ZW1wbGF0ZS5pc1ZhbHVlT25seSgpID8ga2V5RWxlbWVudC52YWwoKSA6IHRoaXMuZ2V0SW5kZXhGb3IoZWxlbWVudCk7XG4gICAgICAgIGVzY2FwZWRfbmFtZSA9IGVzY2FwZWRfbmFtZS50b1N0cmluZygpLnJlcGxhY2UoL1xcWy9nLCAnJTVCJykucmVwbGFjZSgvXS9nLCAnJTVEJyk7XG4gICAgICAgIGxldCBuYW1lID0gYCR7dGVtcGxhdGUuZ2V0TmFtZSgpfVske2VzY2FwZWRfbmFtZX1dYDtcblxuICAgICAgICBpZiAoIXRlbXBsYXRlLmlzVmFsdWVPbmx5KCkgJiYgKCFrZXlFbGVtZW50LnZhbCgpICYmICF2YWx1ZUVsZW1lbnQudmFsKCkpKSB7XG4gICAgICAgICAgICB2YWx1ZUVsZW1lbnQuYXR0cignbmFtZScsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHZhbHVlRWxlbWVudC5hdHRyKCduYW1lJywgIXZhbHVlRWxlbWVudC52YWwoKSA/IHRlbXBsYXRlLmdldE5hbWUoKSA6IG5hbWUpO1xuICAgICAgICAgICAgdmFsdWVFbGVtZW50LmF0dHIoJ25hbWUnLCBuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmcmVzaE5hbWVzKHRlbXBsYXRlKTtcbiAgICB9XG5cbiAgICBhY3Rpb25FdmVudChldmVudCkge1xuICAgICAgICBldmVudCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBsZXQgZWxlbWVudCA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgbGV0IGFjdGlvbiA9IGVsZW1lbnQuZGF0YSgnZ3Jhdi1hcnJheS1hY3Rpb24nKTtcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50cygnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwiY29udGFpbmVyXCJdJyk7XG5cbiAgICAgICAgdGhpcy5fc2V0VGVtcGxhdGUoZWxlbWVudCk7XG5cbiAgICAgICAgdGhpc1tgJHthY3Rpb259QWN0aW9uYF0oZWxlbWVudCk7XG5cbiAgICAgICAgbGV0IHNpYmxpbmdzID0gY29udGFpbmVyLmZpbmQoJz4gZGl2Jyk7XG4gICAgICAgIGNvbnRhaW5lcltzaWJsaW5ncy5sZW5ndGggPiAxID8gJ3JlbW92ZUNsYXNzJyA6ICdhZGRDbGFzcyddKCdvbmUtY2hpbGQnKTtcbiAgICB9XG5cbiAgICBhZGRBY3Rpb24oZWxlbWVudCkge1xuICAgICAgICBsZXQgdGVtcGxhdGUgPSBlbGVtZW50LmRhdGEoJ2FycmF5LXRlbXBsYXRlJyk7XG4gICAgICAgIGxldCByb3cgPSBlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cInJvd1wiXScpO1xuXG4gICAgICAgIHJvdy5hZnRlcih0ZW1wbGF0ZS5nZXROZXdSb3coKSk7XG4gICAgfVxuXG4gICAgcmVtQWN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlID0gZWxlbWVudC5kYXRhKCdhcnJheS10ZW1wbGF0ZScpO1xuICAgICAgICBsZXQgcm93ID0gZWxlbWVudC5jbG9zZXN0KCdbZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJyb3dcIl0nKTtcbiAgICAgICAgbGV0IGlzTGFzdCA9ICFyb3cuc2libGluZ3MoKS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGlzTGFzdCkge1xuICAgICAgICAgICAgbGV0IG5ld1JvdyA9ICQodGVtcGxhdGUuZ2V0TmV3Um93KCkpO1xuICAgICAgICAgICAgcm93LmFmdGVyKG5ld1Jvdyk7XG4gICAgICAgICAgICBuZXdSb3cuZmluZCgnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwidmFsdWVcIl06bGFzdCcpLmF0dHIoJ25hbWUnLCB0ZW1wbGF0ZS5nZXROYW1lKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcm93LnJlbW92ZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hOYW1lcyh0ZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaE5hbWVzKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmICghdGVtcGxhdGUuaXNWYWx1ZU9ubHkoKSkgeyByZXR1cm47IH1cblxuICAgICAgICBsZXQgcm93ID0gdGVtcGxhdGUuY29udGFpbmVyLmZpbmQoJz4gZGl2ID4gW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwicm93XCJdJyk7XG4gICAgICAgIGxldCBpbnB1dHMgPSByb3cuZmluZCgnW25hbWVdOm5vdChbbmFtZT1cIlwiXSknKTtcblxuICAgICAgICBpbnB1dHMuZWFjaCgoaW5kZXgsIGlucHV0KSA9PiB7XG4gICAgICAgICAgICBpbnB1dCA9ICQoaW5wdXQpO1xuICAgICAgICAgICAgbGV0IG5hbWUgPSBpbnB1dC5hdHRyKCduYW1lJyk7XG4gICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC9cXFtcXGQrXFxdJC8sIGBbJHtpbmRleH1dYCk7XG4gICAgICAgICAgICBpbnB1dC5hdHRyKCduYW1lJywgbmFtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghaW5wdXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcm93LmZpbmQoJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cInZhbHVlXCJdJykuYXR0cignbmFtZScsIHRlbXBsYXRlLmdldE5hbWUoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRJbmRleEZvcihlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9IGVsZW1lbnQuZGF0YSgnYXJyYXktdGVtcGxhdGUnKTtcbiAgICAgICAgbGV0IHJvdyA9IGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwicm93XCJdJyk7XG5cbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRhaW5lci5maW5kKGAke3RlbXBsYXRlLmlzVmFsdWVPbmx5KCkgPyAnPiBkaXYgJyA6ICcnfSA+IFtkYXRhLWdyYXYtYXJyYXktdHlwZT1cInJvd1wiXWApLmluZGV4KHJvdyk7XG4gICAgfVxuXG4gICAgX3NldFRlbXBsYXRlKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50LmRhdGEoJ2FycmF5LXRlbXBsYXRlJykpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnYXJyYXktdGVtcGxhdGUnLCBuZXcgVGVtcGxhdGUoZWxlbWVudC5jbG9zZXN0KCdbZGF0YS1ncmF2LWFycmF5LW5hbWVdJykpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkFkZGVkTm9kZXMoZXZlbnQsIHRhcmdldC8qICwgcmVjb3JkLCBpbnN0YW5jZSAqLykge1xuICAgICAgICBsZXQgYXJyYXlzID0gJCh0YXJnZXQpLmZpbmQoJ1tkYXRhLWdyYXYtZmllbGQ9XCJhcnJheVwiXScpO1xuICAgICAgICBpZiAoIWFycmF5cy5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgYXJyYXlzLmVhY2goKGluZGV4LCBsaXN0KSA9PiB7XG4gICAgICAgICAgICBsaXN0ID0gJChsaXN0KTtcbiAgICAgICAgICAgIGlmICghfnRoaXMuYXJyYXlzLmluZGV4KGxpc3QpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBcnJheShsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IEFycmF5RmllbGQoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/fields/array.js\n"); - -/***/ }), - -/***/ "./app/fields/file.js": -/*!****************************!*\ - !*** ./app/fields/file.js ***! - \****************************/ -/*! exports provided: default, Instances */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return FilesField; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Instances\", function() { return Instances; });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dropzone */ \"./node_modules/dropzone/dist/dropzone.js\");\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dropzone__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var grav_form__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! grav-form */ \"grav-form\");\n/* harmony import */ var grav_form__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(grav_form__WEBPACK_IMPORTED_MODULE_2__);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n// import EXIF from 'exif-js';\n\n\n// translations\nvar Dictionary = {\n dictCancelUpload: grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.DROPZONE_CANCEL_UPLOAD,\n dictCancelUploadConfirmation: grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.DROPZONE_CANCEL_UPLOAD_CONFIRMATION,\n dictDefaultMessage: grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.DROPZONE_DEFAULT_MESSAGE,\n dictFallbackMessage: grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.DROPZONE_FALLBACK_MESSAGE,\n dictFallbackText: grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.DROPZONE_FALLBACK_TEXT,\n dictFileTooBig: grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.DROPZONE_FILE_TOO_BIG,\n dictInvalidFileType: grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.DROPZONE_INVALID_FILE_TYPE,\n dictMaxFilesExceeded: grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.DROPZONE_MAX_FILES_EXCEEDED,\n dictRemoveFile: grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.DROPZONE_REMOVE_FILE,\n dictRemoveFileConfirmation: grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.DROPZONE_REMOVE_FILE_CONFIRMATION,\n dictResponseError: grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.DROPZONE_RESPONSE_ERROR\n};\ndropzone__WEBPACK_IMPORTED_MODULE_1___default.a.autoDiscover = false;\nvar DropzoneMediaConfig = {\n createImageThumbnails: {\n thumbnailWidth: 150\n },\n addRemoveLinks: false,\n dictDefaultMessage: Dictionary.dictDefaultMessage,\n dictRemoveFileConfirmation: Dictionary.dictRemoveFileConfirmation,\n previewTemplate: ''\n};\n\n// window.EXIF = EXIF;\nvar FilesField = /*#__PURE__*/function () {\n function FilesField() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$container = _ref.container,\n container = _ref$container === void 0 ? '.dropzone.files-upload' : _ref$container,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options;\n _classCallCheck(this, FilesField);\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n if (!this.container.length) {\n return;\n }\n this.urls = {};\n DropzoneMediaConfig.previewTemplate = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#dropzone-template').html();\n this.options = Object.assign({}, Dictionary, DropzoneMediaConfig, {\n klass: this,\n url: this.container.data('file-url-add') || grav_form__WEBPACK_IMPORTED_MODULE_2__[\"config\"].current_url,\n acceptedFiles: this.container.data('media-types'),\n init: this.initDropzone\n }, this.container.data('dropzone-options'), options);\n this.dropzone = new dropzone__WEBPACK_IMPORTED_MODULE_1___default.a(container, this.options);\n this.dropzone.on('complete', this.onDropzoneComplete.bind(this));\n this.dropzone.on('success', this.onDropzoneSuccess.bind(this));\n this.dropzone.on('removedfile', this.onDropzoneRemovedFile.bind(this));\n this.dropzone.on('sending', this.onDropzoneSending.bind(this));\n this.dropzone.on('error', this.onDropzoneError.bind(this));\n }\n return _createClass(FilesField, [{\n key: \"initDropzone\",\n value: function initDropzone() {\n var _this = this;\n var files = this.options.klass.container.find('[data-file]');\n var dropzone = this;\n if (!files.length) {\n return;\n }\n files.each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n var data = file.data('file');\n var mock = {\n name: data.name,\n size: data.size,\n type: data.type,\n status: dropzone__WEBPACK_IMPORTED_MODULE_1___default.a.ADDED,\n accepted: true,\n url: _this.options.url,\n removeUrl: data.remove,\n data: data\n };\n dropzone.files.push(mock);\n dropzone.options.addedfile.call(dropzone, mock);\n if (mock.type.match(/^image\\//)) dropzone.options.thumbnail.call(dropzone, mock, data.path);\n file.remove();\n });\n }\n }, {\n key: \"getURI\",\n value: function getURI() {\n return this.container.data('mediaUri') || '';\n }\n }, {\n key: \"onDropzoneSending\",\n value: function onDropzoneSending(file, xhr, formData) {\n var form = this.container.closest('form');\n var unique_id = form.find('[name=\"__unique_form_id__\"]');\n formData.append('__form-name__', form.find('[name=\"__form-name__\"]').val());\n if (unique_id.length) {\n formData.append('__unique_form_id__', unique_id.val());\n }\n formData.append('__form-file-uploader__', 1);\n formData.append('name', this.options.dotNotation);\n formData.append('form-nonce', grav_form__WEBPACK_IMPORTED_MODULE_2__[\"config\"].form_nonce);\n formData.append('task', 'filesupload');\n formData.append('uri', this.getURI());\n }\n }, {\n key: \"onDropzoneSuccess\",\n value: function onDropzoneSuccess(file, response, xhr) {\n if (this.options.reloadPage) {\n global.location.reload();\n }\n\n // store params for removing file from session before it gets saved\n if (response.session) {\n file.sessionParams = response.session;\n file.removeUrl = this.options.url;\n\n // Touch field value to force a mutation detection\n var input = this.container.find('[name][type=\"hidden\"]');\n var value = input.val();\n input.val(value + ' ');\n }\n return this.handleError({\n file: file,\n data: response,\n mode: 'removeFile',\n msg: \"

\".concat(grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.FILE_ERROR_UPLOAD, \" \").concat(file.name, \"

\\n
\").concat(response.message, \"
\")\n });\n }\n }, {\n key: \"onDropzoneComplete\",\n value: function onDropzoneComplete(file) {\n if (!file.accepted && !file.rejected) {\n var data = {\n status: 'error',\n message: \"\".concat(grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.FILE_UNSUPPORTED, \": \").concat(file.name.match(/\\..+/).join(''))\n };\n return this.handleError({\n file: file,\n data: data,\n mode: 'removeFile',\n msg: \"

\".concat(grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.FILE_ERROR_ADD, \" \").concat(file.name, \"

\\n
\").concat(data.message, \"
\")\n });\n }\n if (this.options.reloadPage) {\n global.location.reload();\n }\n }\n }, {\n key: \"onDropzoneRemovedFile\",\n value: function onDropzoneRemovedFile(file) {\n var _this2 = this;\n if (!file.accepted || file.rejected) {\n return;\n }\n var form = this.container.closest('form');\n var unique_id = form.find('[name=\"__unique_form_id__\"]');\n var url = file.removeUrl || this.urls[\"delete\"] || \"\".concat(location.href, \".json\");\n var path = (url || '').match(/path:(.*)\\//);\n var data = new FormData();\n data.append('filename', file.name);\n data.append('__form-name__', form.find('[name=\"__form-name__\"]').val());\n data.append('name', this.options.dotNotation);\n data.append('form-nonce', grav_form__WEBPACK_IMPORTED_MODULE_2__[\"config\"].form_nonce);\n data.append('uri', this.getURI());\n if (file.sessionParams) {\n data.append('__form-file-remover__', '1');\n data.append('session', file.sessionParams);\n }\n if (unique_id.length) {\n data.append('__unique_form_id__', unique_id.val());\n }\n jquery__WEBPACK_IMPORTED_MODULE_0___default.a.ajax({\n url: url,\n data: data,\n method: 'POST',\n contentType: false,\n processData: false,\n success: function success() {\n if (!path) {\n return;\n }\n path = global.atob(path[1]);\n var input = _this2.container.find('[name][type=\"hidden\"]');\n var data = JSON.parse(input.val() || '{}');\n delete data[path];\n input.val(JSON.stringify(data));\n }\n });\n }\n }, {\n key: \"onDropzoneError\",\n value: function onDropzoneError(file, response, xhr) {\n var message = xhr && response.error ? response.error.message : response;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(file.previewElement).find('[data-dz-errormessage]').html(message);\n return this.handleError({\n file: file,\n data: {\n status: 'error'\n },\n msg: \"
\".concat(message, \"
\")\n });\n }\n }, {\n key: \"handleError\",\n value: function handleError(options) {\n return true;\n /* let { file, data, mode, msg } = options;\n if (data.status !== 'error' && data.status !== 'unauthorized') { return; }\n switch (mode) {\n case 'addBack':\n if (file instanceof File) {\n this.dropzone.addFile.call(this.dropzone, file);\n } else {\n this.dropzone.files.push(file);\n this.dropzone.options.addedfile.call(this.dropzone, file);\n this.dropzone.options.thumbnail.call(this.dropzone, file, file.extras.url);\n }\n break;\n case 'removeFile':\n default:\n if (~this.dropzone.files.indexOf(file)) {\n file.rejected = true;\n this.dropzone.removeFile.call(this.dropzone, file, { silent: true });\n }\n break;\n }\n let modal = $('[data-remodal-id=\"generic\"]');\n modal.find('.error-content').html(msg);\n $.remodal.lookup[modal.data('remodal')].open(); */\n }\n }]);\n}();\n/*\nexport function UriToMarkdown(uri) {\n uri = uri.replace(/@3x|@2x|@1x/, '');\n uri = uri.replace(/\\(/g, '%28');\n uri = uri.replace(/\\)/g, '%29');\n\n return uri.match(/\\.(jpe?g|png|gif|svg)$/i) ? `![](${uri})` : `[${decodeURI(uri)}](${uri})`;\n}\n*/\n\nvar instances = [];\nvar cache = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\nvar onAddedNodes = function onAddedNodes(event, target /* , record, instance */) {\n var files = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('.dropzone.files-upload');\n if (!files.length) {\n return;\n }\n files.each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n if (!~cache.index(file)) {\n addNode(file);\n }\n });\n};\nvar addNode = function addNode(container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n var input = container.find('input[type=\"file\"]');\n var settings = container.data('grav-file-settings') || {};\n if (settings.accept && ~settings.accept.indexOf('*')) {\n settings.accept = [''];\n }\n var options = {\n url: container.data('file-url-add') || (container.closest('form').attr('action') || grav_form__WEBPACK_IMPORTED_MODULE_2__[\"config\"].current_url) + '.json',\n paramName: settings.paramName || 'file',\n dotNotation: settings.name || 'file',\n acceptedFiles: settings.accept ? settings.accept.join(',') : input.attr('accept') || container.data('media-types'),\n maxFilesize: settings.filesize || 256,\n maxFiles: settings.limit || null,\n resizeWidth: settings.resizeWidth || null,\n resizeHeight: settings.resizeHeight || null,\n resizeQuality: settings.resizeQuality || null,\n accept: function accept(file, done) {\n var resolution = settings.resolution;\n var error = '';\n if (!resolution) return done();\n if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n done(this.options.dictMaxFilesExceeded.replace('{{maxFiles}}', this.options.maxFiles));\n return this.emit('maxfilesexceeded', file);\n }\n var reader = new FileReader();\n if (resolution.min || !(settings.resizeWidth || settings.resizeHeight) && resolution.max) {\n reader.onload = function (event) {\n var image = new Image();\n image.src = event.target.result;\n image.onload = function () {\n var _this3 = this;\n if (resolution.min) {\n Object.keys(resolution.min).forEach(function (attr) {\n if (_this3[attr] < resolution.min[attr]) {\n error += grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.RESOLUTION_MIN.replace(/{{attr}}/g, attr).replace(/{{min}}/g, resolution.min[attr]);\n }\n });\n }\n if (!(settings.resizeWidth || settings.resizeHeight)) {\n if (resolution.max) {\n Object.keys(resolution.max).forEach(function (attr) {\n if (_this3[attr] > resolution.max[attr]) {\n error += grav_form__WEBPACK_IMPORTED_MODULE_2__[\"translations\"].PLUGIN_FORM.RESOLUTION_MAX.replace(/{{attr}}/g, attr).replace(/{{max}}/g, resolution.max[attr]);\n }\n });\n }\n }\n done(error);\n };\n };\n reader.readAsDataURL(file);\n } else {\n return done(error);\n }\n }\n };\n cache = cache.add(container);\n container = container[0];\n instances.push(new FilesField({\n container: container,\n options: options\n }));\n};\nvar Instances = function () {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).ready(function () {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone.files-upload').each(function (i, container) {\n return addNode(container);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', onAddedNodes);\n });\n return instances;\n}();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvZmllbGRzL2ZpbGUuanM/MWU4OSJdLCJuYW1lcyI6WyJEaWN0aW9uYXJ5IiwiZGljdENhbmNlbFVwbG9hZCIsInRyYW5zbGF0aW9ucyIsIlBMVUdJTl9GT1JNIiwiRFJPUFpPTkVfQ0FOQ0VMX1VQTE9BRCIsImRpY3RDYW5jZWxVcGxvYWRDb25maXJtYXRpb24iLCJEUk9QWk9ORV9DQU5DRUxfVVBMT0FEX0NPTkZJUk1BVElPTiIsImRpY3REZWZhdWx0TWVzc2FnZSIsIkRST1BaT05FX0RFRkFVTFRfTUVTU0FHRSIsImRpY3RGYWxsYmFja01lc3NhZ2UiLCJEUk9QWk9ORV9GQUxMQkFDS19NRVNTQUdFIiwiZGljdEZhbGxiYWNrVGV4dCIsIkRST1BaT05FX0ZBTExCQUNLX1RFWFQiLCJkaWN0RmlsZVRvb0JpZyIsIkRST1BaT05FX0ZJTEVfVE9PX0JJRyIsImRpY3RJbnZhbGlkRmlsZVR5cGUiLCJEUk9QWk9ORV9JTlZBTElEX0ZJTEVfVFlQRSIsImRpY3RNYXhGaWxlc0V4Y2VlZGVkIiwiRFJPUFpPTkVfTUFYX0ZJTEVTX0VYQ0VFREVEIiwiZGljdFJlbW92ZUZpbGUiLCJEUk9QWk9ORV9SRU1PVkVfRklMRSIsImRpY3RSZW1vdmVGaWxlQ29uZmlybWF0aW9uIiwiRFJPUFpPTkVfUkVNT1ZFX0ZJTEVfQ09ORklSTUFUSU9OIiwiZGljdFJlc3BvbnNlRXJyb3IiLCJEUk9QWk9ORV9SRVNQT05TRV9FUlJPUiIsIkRyb3B6b25lIiwiYXV0b0Rpc2NvdmVyIiwiRHJvcHpvbmVNZWRpYUNvbmZpZyIsImNyZWF0ZUltYWdlVGh1bWJuYWlscyIsInRodW1ibmFpbFdpZHRoIiwiYWRkUmVtb3ZlTGlua3MiLCJwcmV2aWV3VGVtcGxhdGUiLCJGaWxlc0ZpZWxkIiwiX3JlZiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIl9yZWYkY29udGFpbmVyIiwiY29udGFpbmVyIiwiX3JlZiRvcHRpb25zIiwib3B0aW9ucyIsIl9jbGFzc0NhbGxDaGVjayIsIiQiLCJ1cmxzIiwiaHRtbCIsIk9iamVjdCIsImFzc2lnbiIsImtsYXNzIiwidXJsIiwiZGF0YSIsImNvbmZpZyIsImN1cnJlbnRfdXJsIiwiYWNjZXB0ZWRGaWxlcyIsImluaXQiLCJpbml0RHJvcHpvbmUiLCJkcm9wem9uZSIsIm9uIiwib25Ecm9wem9uZUNvbXBsZXRlIiwiYmluZCIsIm9uRHJvcHpvbmVTdWNjZXNzIiwib25Ecm9wem9uZVJlbW92ZWRGaWxlIiwib25Ecm9wem9uZVNlbmRpbmciLCJvbkRyb3B6b25lRXJyb3IiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsIl90aGlzIiwiZmlsZXMiLCJmaW5kIiwiZWFjaCIsImluZGV4IiwiZmlsZSIsIm1vY2siLCJuYW1lIiwic2l6ZSIsInR5cGUiLCJzdGF0dXMiLCJBRERFRCIsImFjY2VwdGVkIiwicmVtb3ZlVXJsIiwicmVtb3ZlIiwicHVzaCIsImFkZGVkZmlsZSIsImNhbGwiLCJtYXRjaCIsInRodW1ibmFpbCIsInBhdGgiLCJnZXRVUkkiLCJ4aHIiLCJmb3JtRGF0YSIsImZvcm0iLCJjbG9zZXN0IiwidW5pcXVlX2lkIiwiYXBwZW5kIiwidmFsIiwiZG90Tm90YXRpb24iLCJmb3JtX25vbmNlIiwicmVzcG9uc2UiLCJyZWxvYWRQYWdlIiwiZ2xvYmFsIiwibG9jYXRpb24iLCJyZWxvYWQiLCJzZXNzaW9uIiwic2Vzc2lvblBhcmFtcyIsImlucHV0IiwiaGFuZGxlRXJyb3IiLCJtb2RlIiwibXNnIiwiY29uY2F0IiwiRklMRV9FUlJPUl9VUExPQUQiLCJtZXNzYWdlIiwicmVqZWN0ZWQiLCJGSUxFX1VOU1VQUE9SVEVEIiwiam9pbiIsIkZJTEVfRVJST1JfQUREIiwiX3RoaXMyIiwiaHJlZiIsIkZvcm1EYXRhIiwiYWpheCIsIm1ldGhvZCIsImNvbnRlbnRUeXBlIiwicHJvY2Vzc0RhdGEiLCJzdWNjZXNzIiwiYXRvYiIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsImVycm9yIiwicHJldmlld0VsZW1lbnQiLCJpbnN0YW5jZXMiLCJjYWNoZSIsIm9uQWRkZWROb2RlcyIsImV2ZW50IiwidGFyZ2V0IiwiYWRkTm9kZSIsInNldHRpbmdzIiwiYWNjZXB0IiwiaW5kZXhPZiIsImF0dHIiLCJwYXJhbU5hbWUiLCJtYXhGaWxlc2l6ZSIsImZpbGVzaXplIiwibWF4RmlsZXMiLCJsaW1pdCIsInJlc2l6ZVdpZHRoIiwicmVzaXplSGVpZ2h0IiwicmVzaXplUXVhbGl0eSIsImRvbmUiLCJyZXNvbHV0aW9uIiwiZ2V0QWNjZXB0ZWRGaWxlcyIsInJlcGxhY2UiLCJlbWl0IiwicmVhZGVyIiwiRmlsZVJlYWRlciIsIm1pbiIsIm1heCIsIm9ubG9hZCIsImltYWdlIiwiSW1hZ2UiLCJzcmMiLCJyZXN1bHQiLCJfdGhpczMiLCJrZXlzIiwiZm9yRWFjaCIsIlJFU09MVVRJT05fTUlOIiwiUkVTT0xVVElPTl9NQVgiLCJyZWFkQXNEYXRhVVJMIiwiYWRkIiwiSW5zdGFuY2VzIiwiZG9jdW1lbnQiLCJyZWFkeSIsImkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUF1QjtBQUNTO0FBQ2hDO0FBQytDOztBQUUvQztBQUNBLElBQU1BLFVBQVUsR0FBRztFQUNmQyxnQkFBZ0IsRUFBRUMsc0RBQVksQ0FBQ0MsV0FBVyxDQUFDQyxzQkFBc0I7RUFDakVDLDRCQUE0QixFQUFFSCxzREFBWSxDQUFDQyxXQUFXLENBQUNHLG1DQUFtQztFQUMxRkMsa0JBQWtCLEVBQUVMLHNEQUFZLENBQUNDLFdBQVcsQ0FBQ0ssd0JBQXdCO0VBQ3JFQyxtQkFBbUIsRUFBRVAsc0RBQVksQ0FBQ0MsV0FBVyxDQUFDTyx5QkFBeUI7RUFDdkVDLGdCQUFnQixFQUFFVCxzREFBWSxDQUFDQyxXQUFXLENBQUNTLHNCQUFzQjtFQUNqRUMsY0FBYyxFQUFFWCxzREFBWSxDQUFDQyxXQUFXLENBQUNXLHFCQUFxQjtFQUM5REMsbUJBQW1CLEVBQUViLHNEQUFZLENBQUNDLFdBQVcsQ0FBQ2EsMEJBQTBCO0VBQ3hFQyxvQkFBb0IsRUFBRWYs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QixDQUFDLE1BQU07UUFDSCxPQUFPNEUsSUFBSSxDQUFDcEIsS0FBSyxDQUFDO01BQ3RCO0lBQ0o7RUFDSixDQUFDO0VBRURHLEtBQUssR0FBR0EsS0FBSyxDQUFDcUMsR0FBRyxDQUFDakksU0FBUyxDQUFDO0VBQzVCQSxTQUFTLEdBQUdBLFNBQVMsQ0FBQyxDQUFDLENBQUM7RUFDeEIyRixTQUFTLENBQUNoRCxJQUFJLENBQUMsSUFBSWpELFVBQVUsQ0FBQztJQUFDTSxTQUFTLEVBQVRBLFNBQVM7SUFBRUUsT0FBTyxFQUFQQTtFQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFTSxJQUFJZ0ksU0FBUyxHQUFJLFlBQU07RUFDMUI5SCw2Q0FBQyxDQUFDK0gsUUFBUSxDQUFDLENBQUNDLEtBQUssQ0FBQyxZQUFNO0lBQ3BCaEksNkNBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDMkIsSUFBSSxDQUFDLFVBQUNzRyxDQUFDLEVBQUVySSxTQUFTO01BQUEsT0FBS2dHLE9BQU8sQ0FBQ2hHLFNBQVMsQ0FBQztJQUFBLEVBQUM7SUFDdEVJLDZDQUFDLENBQUMsTUFBTSxDQUFDLENBQUNjLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRTJFLFlBQVksQ0FBQztFQUNoRCxDQUFDLENBQUM7RUFFRixPQUFPRixTQUFTO0FBQ3BCLENBQUMsQ0FBRSxDQUFDLEMiLCJmaWxlIjoiLi9hcHAvZmllbGRzL2ZpbGUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IERyb3B6b25lIGZyb20gJ2Ryb3B6b25lJztcbi8vIGltcG9ydCBFWElGIGZyb20gJ2V4aWYtanMnO1xuaW1wb3J0IHtjb25maWcsIHRyYW5zbGF0aW9uc30gZnJvbSAnZ3Jhdi1mb3JtJztcblxuLy8gdHJhbnNsYXRpb25zXG5jb25zdCBEaWN0aW9uYXJ5ID0ge1xuICAgIGRpY3RDYW5jZWxVcGxvYWQ6IHRyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5EUk9QWk9ORV9DQU5DRUxfVVBMT0FELFxuICAgIGRpY3RDYW5jZWxVcGxvYWRDb25maXJtYXRpb246IHRyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5EUk9QWk9ORV9DQU5DRUxfVVBMT0FEX0NPTkZJUk1BVElPTixcbiAgICBkaWN0RGVmYXVsdE1lc3NhZ2U6IHRyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5EUk9QWk9ORV9ERUZBVUxUX01FU1NBR0UsXG4gICAgZGljdEZhbGxiYWNrTWVzc2FnZTogdHJhbnNsYXRpb25zLlBMVUdJTl9GT1JNLkRST1BaT05FX0ZBTExCQUNLX01FU1NBR0UsXG4gICAgZGljdEZhbGxiYWNrVGV4dDogdHJhbnNsYXRpb25zLlBMVUdJTl9GT1JNLkRST1BaT05FX0ZBTExCQUNLX1RFWFQsXG4gICAgZGljdEZpbGVUb29CaWc6IHRyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5EUk9QWk9ORV9GSUxFX1RPT19CSUcsXG4gICAgZGljdEludmFsaWRGaWxlVHlwZTogdHJhbnNsYXRpb25zLlBMVUdJTl9GT1JNLkRST1BaT05FX0lOVkFMSURfRklMRV9UWVBFLFxuICAgIGRpY3RNYXhGaWxlc0V4Y2VlZGVkOiB0cmFuc2xhdGlvbnMuUExVR0lOX0ZPUk0uRFJPUFpPTkVfTUFYX0ZJTEVTX0VYQ0VFREVELFxuICAgIGRpY3RSZW1vdmVGaWxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0ZPUk0uRFJPUFpPTkVfUkVNT1ZFX0ZJTEUsXG4gICAgZGljdFJlbW92ZUZpbGVDb25maXJtYXRpb246IHRyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5EUk9QWk9ORV9SRU1PVkVfRklMRV9DT05GSVJNQVRJT04sXG4gICAgZGljdFJlc3BvbnNlRXJyb3I6IHRyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5EUk9QWk9ORV9SRVNQT05TRV9FUlJPUlxufTtcblxuRHJvcHpvbmUuYXV0b0Rpc2NvdmVyID0gZmFsc2U7XG5cbmNvbnN0IERyb3B6b25lTWVkaWFDb25maWcgPSB7XG4gICAgY3JlYXRlSW1hZ2VUaHVtYm5haWxzOiB7dGh1bWJuYWlsV2lkdGg6IDE1MH0sXG4gICAgYWRkUmVtb3ZlTGlua3M6IGZhbHNlLFxuICAgIGRpY3REZWZhdWx0TWVzc2FnZTogRGljdGlvbmFyeS5kaWN0RGVmYXVsdE1lc3NhZ2UsXG4gICAgZGljdFJlbW92ZUZpbGVDb25maXJtYXRpb246IERpY3Rpb25hcnkuZGljdFJlbW92ZUZpbGVDb25maXJtYXRpb24sXG4gICAgcHJldmlld1RlbXBsYXRlOiAnJ1xufTtcblxuLy8gd2luZG93LkVYSUYgPSBFWElGO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlc0ZpZWxkIHtcbiAgICBjb25zdHJ1Y3Rvcih7Y29udGFpbmVyID0gJy5kcm9wem9uZS5maWxlcy11cGxvYWQnLCBvcHRpb25zID0ge319ID0ge30pIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVybHMgPSB7fTtcbiAgICAgICAgRHJvcHpvbmVNZWRpYUNvbmZpZy5wcmV2aWV3VGVtcGxhdGUgPSAkKCcjZHJvcHpvbmUtdGVtcGxhdGUnKS5odG1sKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIERpY3Rpb25hcnksIERyb3B6b25lTWVkaWFDb25maWcsIHtcbiAgICAgICAgICAgIGtsYXNzOiB0aGlzLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmNvbnRhaW5lci5kYXRhKCdmaWxlLXVybC1hZGQnKSB8fCBjb25maWcuY3VycmVudF91cmwsXG4gICAgICAgICAgICBhY2NlcHRlZEZpbGVzOiB0aGlzLmNvbnRhaW5lci5kYXRhKCdtZWRpYS10eXBlcycpLFxuICAgICAgICAgICAgaW5pdDogdGhpcy5pbml0RHJvcHpvbmVcbiAgICAgICAgfSwgdGhpcy5jb250YWluZXIuZGF0YSgnZHJvcHpvbmUtb3B0aW9ucycpLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmRyb3B6b25lID0gbmV3IERyb3B6b25lKGNvbnRhaW5lciwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5kcm9wem9uZS5vbignY29tcGxldGUnLCB0aGlzLm9uRHJvcHpvbmVDb21wbGV0ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5kcm9wem9uZS5vbignc3VjY2VzcycsIHRoaXMub25Ecm9wem9uZVN1Y2Nlc3MuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZHJvcHpvbmUub24oJ3JlbW92ZWRmaWxlJywgdGhpcy5vbkRyb3B6b25lUmVtb3ZlZEZpbGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZHJvcHpvbmUub24oJ3NlbmRpbmcnLCB0aGlzLm9uRHJvcHpvbmVTZW5kaW5nLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmRyb3B6b25lLm9uKCdlcnJvcicsIHRoaXMub25Ecm9wem9uZUVycm9yLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGluaXREcm9wem9uZSgpIHtcbiAgICAgICAgbGV0IGZpbGVzID0gdGhpcy5vcHRpb25zLmtsYXNzLmNvbnRhaW5lci5maW5kKCdbZGF0YS1maWxlXScpO1xuICAgICAgICBsZXQgZHJvcHpvbmUgPSB0aGlzO1xuICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZmlsZXMuZWFjaCgoaW5kZXgsIGZpbGUpID0+IHtcbiAgICAgICAgICAgIGZpbGUgPSAkKGZpbGUpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBmaWxlLmRhdGEoJ2ZpbGUnKTtcbiAgICAgICAgICAgIGxldCBtb2NrID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSxcbiAgICAgICAgICAgICAgICBzaXplOiBkYXRhLnNpemUsXG4gICAgICAgICAgICAgICAgdHlwZTogZGF0YS50eXBlLFxuICAgICAgICAgICAgICAgIHN0YXR1czogRHJvcHpvbmUuQURERUQsXG4gICAgICAgICAgICAgICAgYWNjZXB0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsLFxuICAgICAgICAgICAgICAgIHJlbW92ZVVybDogZGF0YS5yZW1vdmUsXG4gICAgICAgICAgICAgICAgZGF0YVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZHJvcHpvbmUuZmlsZXMucHVzaChtb2NrKTtcbiAgICAgICAgICAgIGRyb3B6b25lLm9wdGlvbnMuYWRkZWRmaWxlLmNhbGwoZHJvcHpvbmUsIG1vY2spO1xuICAgICAgICAgICAgaWYgKG1vY2sudHlwZS5tYXRjaCgvXmltYWdlXFwvLykpIGRyb3B6b25lLm9wdGlvbnMudGh1bWJuYWlsLmNhbGwoZHJvcHpvbmUsIG1vY2ssIGRhdGEucGF0aCk7XG5cbiAgICAgICAgICAgIGZpbGUucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFVSSSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmRhdGEoJ21lZGlhVXJpJykgfHwgJyc7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZVNlbmRpbmcoZmlsZSwgeGhyLCBmb3JtRGF0YSkge1xuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5jb250YWluZXIuY2xvc2VzdCgnZm9ybScpO1xuICAgICAgICBjb25zdCB1bmlxdWVfaWQgPSBmb3JtLmZpbmQoJ1tuYW1lPVwiX191bmlxdWVfZm9ybV9pZF9fXCJdJyk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnX19mb3JtLW5hbWVfXycsIGZvcm0uZmluZCgnW25hbWU9XCJfX2Zvcm0tbmFtZV9fXCJdJykudmFsKCkpO1xuICAgICAgICBpZiAodW5pcXVlX2lkLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdfX3VuaXF1ZV9mb3JtX2lkX18nLCB1bmlxdWVfaWQudmFsKCkpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnX19mb3JtLWZpbGUtdXBsb2FkZXJfXycsIDEpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ25hbWUnLCB0aGlzLm9wdGlvbnMuZG90Tm90YXRpb24pO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2Zvcm0tbm9uY2UnLCBjb25maWcuZm9ybV9ub25jZSk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgndGFzaycsICdmaWxlc3VwbG9hZCcpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3VyaScsIHRoaXMuZ2V0VVJJKCkpO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVTdWNjZXNzKGZpbGUsIHJlc3BvbnNlLCB4aHIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWxvYWRQYWdlKSB7XG4gICAgICAgICAgICBnbG9iYWwubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdG9yZSBwYXJhbXMgZm9yIHJlbW92aW5nIGZpbGUgZnJvbSBzZXNzaW9uIGJlZm9yZSBpdCBnZXRzIHNhdmVkXG4gICAgICAgIGlmIChyZXNwb25zZS5zZXNzaW9uKSB7XG4gICAgICAgICAgICBmaWxlLnNlc3Npb25QYXJhbXMgPSByZXNwb25zZS5zZXNzaW9uO1xuICAgICAgICAgICAgZmlsZS5yZW1vdmVVcmwgPSB0aGlzLm9wdGlvbnMudXJsO1xuXG4gICAgICAgICAgICAvLyBUb3VjaCBmaWVsZCB2YWx1ZSB0byBmb3JjZSBhIG11dGF0aW9uIGRldGVjdGlvblxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmNvbnRhaW5lci5maW5kKCdbbmFtZV1bdHlwZT1cImhpZGRlblwiXScpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWwoKTtcbiAgICAgICAgICAgIGlucHV0LnZhbCh2YWx1ZSArICcgJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcih7XG4gICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICBtb2RlOiAncmVtb3ZlRmlsZScsXG4gICAgICAgICAgICBtc2c6IGA8cD4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5GSUxFX0VSUk9SX1VQTE9BRH0gPHN0cm9uZz4ke2ZpbGUubmFtZX08L3N0cm9uZz48L3A+XG4gICAgICAgICAgICA8cHJlPiR7cmVzcG9uc2UubWVzc2FnZX08L3ByZT5gXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVDb21wbGV0ZShmaWxlKSB7XG4gICAgICAgIGlmICghZmlsZS5hY2NlcHRlZCAmJiAhZmlsZS5yZWplY3RlZCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3RyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5GSUxFX1VOU1VQUE9SVEVEfTogJHtmaWxlLm5hbWUubWF0Y2goL1xcLi4rLykuam9pbignJyl9YFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICBtb2RlOiAncmVtb3ZlRmlsZScsXG4gICAgICAgICAgICAgICAgbXNnOiBgPHA+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0ZPUk0uRklMRV9FUlJPUl9BRER9IDxzdHJvbmc+JHtmaWxlLm5hbWV9PC9zdHJvbmc+PC9wPlxuICAgICAgICAgICAgICAgIDxwcmU+JHtkYXRhLm1lc3NhZ2V9PC9wcmU+YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlbG9hZFBhZ2UpIHtcbiAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRHJvcHpvbmVSZW1vdmVkRmlsZShmaWxlLCAuLi5leHRyYSkge1xuICAgICAgICBpZiAoIWZpbGUuYWNjZXB0ZWQgfHwgZmlsZS5yZWplY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmNvbnRhaW5lci5jbG9zZXN0KCdmb3JtJyk7XG4gICAgICAgIGNvbnN0IHVuaXF1ZV9pZCA9IGZvcm0uZmluZCgnW25hbWU9XCJfX3VuaXF1ZV9mb3JtX2lkX19cIl0nKTtcbiAgICAgICAgbGV0IHVybCA9IGZpbGUucmVtb3ZlVXJsIHx8IHRoaXMudXJscy5kZWxldGUgfHwgYCR7bG9jYXRpb24uaHJlZn0uanNvbmA7XG4gICAgICAgIGxldCBwYXRoID0gKHVybCB8fCAnJykubWF0Y2goL3BhdGg6KC4qKVxcLy8pO1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgICAgIGRhdGEuYXBwZW5kKCdmaWxlbmFtZScsIGZpbGUubmFtZSk7XG4gICAgICAgIGRhdGEuYXBwZW5kKCdfX2Zvcm0tbmFtZV9fJywgZm9ybS5maW5kKCdbbmFtZT1cIl9fZm9ybS1uYW1lX19cIl0nKS52YWwoKSk7XG4gICAgICAgIGRhdGEuYXBwZW5kKCduYW1lJywgdGhpcy5vcHRpb25zLmRvdE5vdGF0aW9uKTtcbiAgICAgICAgZGF0YS5hcHBlbmQoJ2Zvcm0tbm9uY2UnLCBjb25maWcuZm9ybV9ub25jZSk7XG4gICAgICAgIGRhdGEuYXBwZW5kKCd1cmknLCB0aGlzLmdldFVSSSgpKTtcblxuICAgICAgICBpZiAoZmlsZS5zZXNzaW9uUGFyYW1zKSB7XG4gICAgICAgICAgICBkYXRhLmFwcGVuZCgnX19mb3JtLWZpbGUtcmVtb3Zlcl9fJywgJzEnKTtcbiAgICAgICAgICAgIGRhdGEuYXBwZW5kKCdzZXNzaW9uJywgZmlsZS5zZXNzaW9uUGFyYW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1bmlxdWVfaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhLmFwcGVuZCgnX191bmlxdWVfZm9ybV9pZF9fJywgdW5pcXVlX2lkLnZhbCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXG4gICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICAgICAgICBzdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXRoID0gZ2xvYmFsLmF0b2IocGF0aFsxXSk7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gdGhpcy5jb250YWluZXIuZmluZCgnW25hbWVdW3R5cGU9XCJoaWRkZW5cIl0nKTtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoaW5wdXQudmFsKCkgfHwgJ3t9Jyk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGFbcGF0aF07XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZUVycm9yKGZpbGUsIHJlc3BvbnNlLCB4aHIpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB4aHIgJiYgcmVzcG9uc2UuZXJyb3IgPyByZXNwb25zZS5lcnJvci5tZXNzYWdlIDogcmVzcG9uc2U7XG4gICAgICAgICQoZmlsZS5wcmV2aWV3RWxlbWVudCkuZmluZCgnW2RhdGEtZHotZXJyb3JtZXNzYWdlXScpLmh0bWwobWVzc2FnZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3Ioe1xuICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgIGRhdGE6IHtzdGF0dXM6ICdlcnJvcid9LFxuICAgICAgICAgICAgbXNnOiBgPHByZT4ke21lc3NhZ2V9PC9wcmU+YFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvcihvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvKiBsZXQgeyBmaWxlLCBkYXRhLCBtb2RlLCBtc2cgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChkYXRhLnN0YXR1cyAhPT0gJ2Vycm9yJyAmJiBkYXRhLnN0YXR1cyAhPT0gJ3VuYXV0aG9yaXplZCcpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdhZGRCYWNrJzpcbiAgICAgICAgICAgICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5hZGRGaWxlLmNhbGwodGhpcy5kcm9wem9uZSwgZmlsZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLm9wdGlvbnMuYWRkZWRmaWxlLmNhbGwodGhpcy5kcm9wem9uZSwgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUub3B0aW9ucy50aHVtYm5haWwuY2FsbCh0aGlzLmRyb3B6b25lLCBmaWxlLCBmaWxlLmV4dHJhcy51cmwpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmVtb3ZlRmlsZSc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmICh+dGhpcy5kcm9wem9uZS5maWxlcy5pbmRleE9mKGZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGUucmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLnJlbW92ZUZpbGUuY2FsbCh0aGlzLmRyb3B6b25lLCBmaWxlLCB7IHNpbGVudDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtb2RhbCA9ICQoJ1tkYXRhLXJlbW9kYWwtaWQ9XCJnZW5lcmljXCJdJyk7XG4gICAgICAgIG1vZGFsLmZpbmQoJy5lcnJvci1jb250ZW50JykuaHRtbChtc2cpO1xuICAgICAgICAkLnJlbW9kYWwubG9va3VwW21vZGFsLmRhdGEoJ3JlbW9kYWwnKV0ub3BlbigpOyAqL1xuICAgIH1cbn1cblxuLypcbmV4cG9ydCBmdW5jdGlvbiBVcmlUb01hcmtkb3duKHVyaSkge1xuICAgIHVyaSA9IHVyaS5yZXBsYWNlKC9AM3h8QDJ4fEAxeC8sICcnKTtcbiAgICB1cmkgPSB1cmkucmVwbGFjZSgvXFwoL2csICclMjgnKTtcbiAgICB1cmkgPSB1cmkucmVwbGFjZSgvXFwpL2csICclMjknKTtcblxuICAgIHJldHVybiB1cmkubWF0Y2goL1xcLihqcGU/Z3xwbmd8Z2lmfHN2ZykkL2kpID8gYCFbXSgke3VyaX0pYCA6IGBbJHtkZWNvZGVVUkkodXJpKX1dKCR7dXJpfSlgO1xufVxuKi9cblxubGV0IGluc3RhbmNlcyA9IFtdO1xubGV0IGNhY2hlID0gJCgpO1xuY29uc3Qgb25BZGRlZE5vZGVzID0gKGV2ZW50LCB0YXJnZXQvKiAsIHJlY29yZCwgaW5zdGFuY2UgKi8pID0+IHtcbiAgICBsZXQgZmlsZXMgPSAkKHRhcmdldCkuZmluZCgnLmRyb3B6b25lLmZpbGVzLXVwbG9hZCcpO1xuICAgIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWxlcy5lYWNoKChpbmRleCwgZmlsZSkgPT4ge1xuICAgICAgICBmaWxlID0gJChmaWxlKTtcbiAgICAgICAgaWYgKCF+Y2FjaGUuaW5kZXgoZmlsZSkpIHtcbiAgICAgICAgICAgIGFkZE5vZGUoZmlsZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbmNvbnN0IGFkZE5vZGUgPSAoY29udGFpbmVyKSA9PiB7XG4gICAgY29udGFpbmVyID0gJChjb250YWluZXIpO1xuICAgIGxldCBpbnB1dCA9IGNvbnRhaW5lci5maW5kKCdpbnB1dFt0eXBlPVwiZmlsZVwiXScpO1xuICAgIGxldCBzZXR0aW5ncyA9IGNvbnRhaW5lci5kYXRhKCdncmF2LWZpbGUtc2V0dGluZ3MnKSB8fCB7fTtcblxuICAgIGlmIChzZXR0aW5ncy5hY2NlcHQgJiYgfnNldHRpbmdzLmFjY2VwdC5pbmRleE9mKCcqJykpIHtcbiAgICAgICAgc2V0dGluZ3MuYWNjZXB0ID0gWycnXTtcbiAgICB9XG5cbiAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgdXJsOiBjb250YWluZXIuZGF0YSgnZmlsZS11cmwtYWRkJykgfHwgKGNvbnRhaW5lci5jbG9zZXN0KCdmb3JtJykuYXR0cignYWN0aW9uJykgfHwgY29uZmlnLmN1cnJlbnRfdXJsKSArICcuanNvbicsXG4gICAgICAgIHBhcmFtTmFtZTogc2V0dGluZ3MucGFyYW1OYW1lIHx8ICdmaWxlJyxcbiAgICAgICAgZG90Tm90YXRpb246IHNldHRpbmdzLm5hbWUgfHwgJ2ZpbGUnLFxuICAgICAgICBhY2NlcHRlZEZpbGVzOiBzZXR0aW5ncy5hY2NlcHQgPyBzZXR0aW5ncy5hY2NlcHQuam9pbignLCcpIDogaW5wdXQuYXR0cignYWNjZXB0JykgfHwgY29udGFpbmVyLmRhdGEoJ21lZGlhLXR5cGVzJyksXG4gICAgICAgIG1heEZpbGVzaXplOiBzZXR0aW5ncy5maWxlc2l6ZSB8fCAyNTYsXG4gICAgICAgIG1heEZpbGVzOiBzZXR0aW5ncy5saW1pdCB8fCBudWxsLFxuICAgICAgICByZXNpemVXaWR0aDogc2V0dGluZ3MucmVzaXplV2lkdGggfHwgbnVsbCxcbiAgICAgICAgcmVzaXplSGVpZ2h0OiBzZXR0aW5ncy5yZXNpemVIZWlnaHQgfHwgbnVsbCxcbiAgICAgICAgcmVzaXplUXVhbGl0eTogc2V0dGluZ3MucmVzaXplUXVhbGl0eSB8fCBudWxsLFxuICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uKGZpbGUsIGRvbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSBzZXR0aW5ncy5yZXNvbHV0aW9uO1xuICAgICAgICAgICAgbGV0IGVycm9yID0gJyc7XG4gICAgICAgICAgICBpZiAoIXJlc29sdXRpb24pIHJldHVybiBkb25lKCk7XG5cbiAgICAgICAgICAgIGlmICgodGhpcy5vcHRpb25zLm1heEZpbGVzICE9IG51bGwpICYmICh0aGlzLmdldEFjY2VwdGVkRmlsZXMoKS5sZW5ndGggPj0gdGhpcy5vcHRpb25zLm1heEZpbGVzKSkge1xuICAgICAgICAgICAgICAgIGRvbmUodGhpcy5vcHRpb25zLmRpY3RNYXhGaWxlc0V4Y2VlZGVkLnJlcGxhY2UoJ3t7bWF4RmlsZXN9fScsIHRoaXMub3B0aW9ucy5tYXhGaWxlcykpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ21heGZpbGVzZXhjZWVkZWQnLCBmaWxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uLm1pbiB8fCAoIShzZXR0aW5ncy5yZXNpemVXaWR0aCB8fCBzZXR0aW5ncy5yZXNpemVIZWlnaHQpICYmIHJlc29sdXRpb24ubWF4KSkge1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5zcmMgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uLm1pbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc29sdXRpb24ubWluKS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW2F0dHJdIDwgcmVzb2x1dGlvbi5taW5bYXR0cl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yICs9IHRyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5SRVNPTFVUSU9OX01JTi5yZXBsYWNlKC97e2F0dHJ9fS9nLCBhdHRyKS5yZXBsYWNlKC97e21pbn19L2csIHJlc29sdXRpb24ubWluW2F0dHJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzZXR0aW5ncy5yZXNpemVXaWR0aCB8fCBzZXR0aW5ncy5yZXNpemVIZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24ubWF4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc29sdXRpb24ubWF4KS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1thdHRyXSA+IHJlc29sdXRpb24ubWF4W2F0dHJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgKz0gdHJhbnNsYXRpb25zLlBMVUdJTl9GT1JNLlJFU09MVVRJT05fTUFYLnJlcGxhY2UoL3t7YXR0cn19L2csIGF0dHIpLnJlcGxhY2UoL3t7bWF4fX0vZywgcmVzb2x1dGlvbi5tYXhbYXR0cl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNhY2hlID0gY2FjaGUuYWRkKGNvbnRhaW5lcik7XG4gICAgY29udGFpbmVyID0gY29udGFpbmVyWzBdO1xuICAgIGluc3RhbmNlcy5wdXNoKG5ldyBGaWxlc0ZpZWxkKHtjb250YWluZXIsIG9wdGlvbnN9KSk7XG59O1xuXG5leHBvcnQgbGV0IEluc3RhbmNlcyA9ICgoKSA9PiB7XG4gICAgJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICAgICAgICAkKCcuZHJvcHpvbmUuZmlsZXMtdXBsb2FkJykuZWFjaCgoaSwgY29udGFpbmVyKSA9PiBhZGROb2RlKGNvbnRhaW5lcikpO1xuICAgICAgICAkKCdib2R5Jykub24oJ211dGF0aW9uLl9ncmF2Jywgb25BZGRlZE5vZGVzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpbnN0YW5jZXM7XG59KSgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/fields/file.js\n"); - -/***/ }), - -/***/ "./app/fields/form.js": -/*!****************************!*\ - !*** ./app/fields/form.js ***! - \****************************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n\nvar attachToggleables = function attachToggleables(form) {\n form = jquery__WEBPACK_IMPORTED_MODULE_0___default()(form);\n var query = '[data-grav-field=\"toggleable\"] input[type=\"checkbox\"]';\n form.on('change', query, function (event) {\n var toggle = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var enabled = toggle.is(':checked');\n var parent = toggle.closest('.form-field');\n var label = parent.find('label.toggleable');\n var fields = parent.find('.form-data');\n var inputs = fields.find('input, select, textarea, button');\n label.add(fields).css('opacity', enabled ? '' : 0.7);\n inputs.map(function (index, input) {\n var isSelectize = input.selectize;\n input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(input);\n if (isSelectize) {\n isSelectize[enabled ? 'enable' : 'disable']();\n } else {\n input.prop('disabled', !enabled);\n }\n });\n });\n form.find(query).trigger('change');\n};\nvar attachDisabledFields = function attachDisabledFields(form) {\n form = jquery__WEBPACK_IMPORTED_MODULE_0___default()(form);\n var prefix = '.form-field-toggleable .form-data';\n var query = [];\n ['input', 'select', 'label[for]', 'textarea', '.selectize-control'].forEach(function (item) {\n query.push(\"\".concat(prefix, \" \").concat(item));\n });\n form.on('mousedown', query.join(', '), function (event) {\n var input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var isFor = input.prop('for');\n var isSelectize = (input.hasClass('selectize-control') || input.parents('.selectize-control')).length;\n if (isFor) {\n input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[id=\\\"\".concat(isFor, \"\\\"]\"));\n }\n if (isSelectize) {\n input = input.closest('.selectize-control').siblings('select[name]');\n }\n if (!input.prop('disabled')) {\n return true;\n }\n var toggle = input.closest('.form-field').find('[data-grav-field=\"toggleable\"] input[type=\"checkbox\"]');\n toggle.trigger('click');\n });\n};\n\n/*\nconst submitUncheckedFields = (forms) => {\n forms = $(forms);\n let submitted = false;\n forms.each((index, form) => {\n form = $(form);\n form.on('submit', () => {\n // workaround for MS Edge, submitting multiple forms at the same time\n if (submitted) { return false; }\n\n let formId = form.attr('id');\n let unchecked = form.find('input[type=\"checkbox\"]:not(:checked):not(:disabled)');\n let submit = form.find('[type=\"submit\"]').add(`[form=\"${formId}\"][type=\"submit\"]`);\n\n if (!unchecked.length) { return true; }\n\n submit.addClass('pointer-events-disabled');\n unchecked.each((index, element) => {\n element = $(element);\n let name = element.prop('name');\n let fake = $(``);\n form.append(fake);\n });\n submitted = true;\n return true;\n });\n });\n};\n*/\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).ready(function () {\n var forms = jquery__WEBPACK_IMPORTED_MODULE_0___default()('form').filter(function (form) {\n return jquery__WEBPACK_IMPORTED_MODULE_0___default()(form).find('[name=\"__form-name__\"]');\n });\n if (!forms.length) {\n return;\n }\n forms.each(function (index, form) {\n attachToggleables(form);\n attachDisabledFields(form);\n // submitUncheckedFields(form);\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvZmllbGRzL2Zvcm0uanM/YWRkYiJdLCJuYW1lcyI6WyJhdHRhY2hUb2dnbGVhYmxlcyIsImZvcm0iLCIkIiwicXVlcnkiLCJvbiIsImV2ZW50IiwidG9nZ2xlIiwidGFyZ2V0IiwiZW5hYmxlZCIsImlzIiwicGFyZW50IiwiY2xvc2VzdCIsImxhYmVsIiwiZmluZCIsImZpZWxkcyIsImlucHV0cyIsImFkZCIsImNzcyIsIm1hcCIsImluZGV4IiwiaW5wdXQiLCJpc1NlbGVjdGl6ZSIsInNlbGVjdGl6ZSIsInByb3AiLCJ0cmlnZ2VyIiwiYXR0YWNoRGlzYWJsZWRGaWVsZHMiLCJwcmVmaXgiLCJmb3JFYWNoIiwiaXRlbSIsInB1c2giLCJjb25jYXQiLCJqb2luIiwiaXNGb3IiLCJoYXNDbGFzcyIsInBhcmVudHMiLCJsZW5ndGgiLCJzaWJsaW5ncyIsImRvY3VtZW50IiwicmVhZHkiLCJmb3JtcyIsImZpbHRlciIsImVhY2giXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUF1QjtBQUV2QixJQUFNQSxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQWlCQSxDQUFJQyxJQUFJLEVBQUs7RUFDaENBLElBQUksR0FBR0MsNkNBQUMsQ0FBQ0QsSUFBSSxDQUFDO0VBQ2QsSUFBSUUsS0FBSyxHQUFHLHVEQUF1RDtFQUVuRUYsSUFBSSxDQUFDRyxFQUFFLENBQUMsUUFBUSxFQUFFRCxLQUFLLEVBQUUsVUFBQ0UsS0FBSyxFQUFLO0lBQ2hDLElBQUlDLE1BQU0sR0FBR0osNkNBQUMsQ0FBQ0csS0FBSyxDQUFDRSxNQUFNLENBQUM7SUFDNUIsSUFBSUMsT0FBTyxHQUFHRixNQUFNLENBQUNHLEVBQUUsQ0FBQyxVQUFVLENBQUM7SUFDbkMsSUFBSUMsTUFBTSxHQUFHSixNQUFNLENBQUNLLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFDMUMsSUFBSUMsS0FBSyxHQUFHRixNQUFNLENBQUNHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUMzQyxJQUFJQyxNQUFNLEdBQUdKLE1BQU0sQ0FBQ0csSUFBSSxDQUFDLFlBQVksQ0FBQztJQUN0QyxJQUFJRSxNQUFNLEdBQUdELE1BQU0sQ0FBQ0QsSUFBSSxDQUFDLGlDQUFpQyxDQUFDO0lBRTNERCxLQUFLLENBQUNJLEdBQUcsQ0FBQ0YsTUFBTSxDQUFDLENBQUNHLEdBQUcsQ0FBQyxTQUFTLEVBQUVULE9BQU8sR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ3BETyxNQUFNLENBQUNHLEdBQUcsQ0FBQyxVQUFDQyxLQUFLLEVBQUVDLEtBQUssRUFBSztNQUN6QixJQUFJQyxXQUFXLEdBQUdELEtBQUssQ0FBQ0UsU0FBUztNQUNqQ0YsS0FBSyxHQUFHbEIsNkNBQUMsQ0FBQ2tCLEtBQUssQ0FBQztNQUVoQixJQUFJQyxXQUFXLEVBQUU7UUFDYkEsV0FBVyxDQUFDYixPQUFPLEdBQUcsUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7TUFDakQsQ0FBQyxNQUFNO1FBQ0hZLEtBQUssQ0FBQ0csSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDZixPQUFPLENBQUM7TUFDcEM7SUFDSixDQUFDLENBQUM7RUFDTixDQUFDLENBQUM7RUFFRlAsSUFBSSxDQUFDWSxJQUFJLENBQUNWLEtBQUssQ0FBQyxDQUFDcUIsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUN0QyxDQUFDO0FBRUQsSUFBTUMsb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUFvQkEsQ0FBSXhCLElBQUksRUFBSztFQUNuQ0EsSUFBSSxHQUFHQyw2Q0FBQyxDQUFDRCxJQUFJLENBQUM7RUFDZCxJQUFJeUIsTUFBTSxHQUFHLG1DQUFtQztFQUNoRCxJQUFJdkIsS0FBSyxHQUFHLEVBQUU7RUFFZCxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDd0IsT0FBTyxDQUFDLFVBQUNDLElBQUksRUFBSztJQUNsRnpCLEtBQUssQ0FBQzBCLElBQUksSUFBQUMsTUFBQSxDQUFJSixNQUFNLE9BQUFJLE1BQUEsQ0FBSUYsSUFBSSxDQUFFLENBQUM7RUFDbkMsQ0FBQyxDQUFDO0VBRUYzQixJQUFJLENBQUNHLEVBQUUsQ0FBQyxXQUFXLEVBQUVELEtBQUssQ0FBQzRCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFDMUIsS0FBSyxFQUFLO0lBQzlDLElBQUllLEtBQUssR0FBR2xCLDZDQUFDLENBQUNHLEtBQUssQ0FBQ0UsTUFBTSxDQUFDO0lBQzNCLElBQUl5QixLQUFLLEdBQUdaLEtBQUssQ0FBQ0csSUFBSSxDQUFDLEtBQUssQ0FBQztJQUM3QixJQUFJRixXQUFXLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDYSxRQUFRLENBQUMsbUJBQW1CLENBQUMsSUFBSWIsS0FBSyxDQUFDYyxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRUMsTUFBTTtJQUVyRyxJQUFJSCxLQUFLLEVBQUU7TUFBRVosS0FBSyxHQUFHbEIsNkNBQUMsVUFBQTRCLE1BQUEsQ0FBU0UsS0FBSyxRQUFJLENBQUM7SUFBRTtJQUMzQyxJQUFJWCxXQUFXLEVBQUU7TUFBRUQsS0FBSyxHQUFHQSxLQUFLLENBQUNULE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDeUIsUUFBUSxDQUFDLGNBQWMsQ0FBQztJQUFFO0lBRXpGLElBQUksQ0FBQ2hCLEtBQUssQ0FBQ0csSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO01BQUUsT0FBTyxJQUFJO0lBQUU7SUFFNUMsSUFBSWpCLE1BQU0sR0FBR2MsS0FBSyxDQUFDVCxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUNFLElBQUksQ0FBQyx1REFBdUQsQ0FBQztJQUN2R1AsTUFBTSxDQUFDa0IsT0FBTyxDQUFDLE9BQU8sQ0FBQztFQUMzQixDQUFDLENBQUM7QUFDTixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUF0Qiw2Q0FBQyxDQUFDbUMsUUFBUSxDQUFDLENBQUNDLEtBQUssQ0FBQyxZQUFNO0VBQ3BCLElBQU1DLEtBQUssR0FBR3JDLDZDQUFDLENBQUMsTUFBTSxDQUFDLENBQUNzQyxNQUFNLENBQUMsVUFBQ3ZDLElBQUk7SUFBQSxPQUFLQyw2Q0FBQyxDQUFDRCxJQUFJLENBQUMsQ0FBQ1ksSUFBSSxDQUFDLHdCQUF3QixDQUFDO0VBQUEsRUFBQztFQUNoRixJQUFJLENBQUMwQixLQUFLLENBQUNKLE1BQU0sRUFBRTtJQUFFO0VBQVE7RUFFN0JJLEtBQUssQ0FBQ0UsSUFBSSxDQUFDLFVBQUN0QixLQUFLLEVBQUVsQixJQUFJLEVBQUs7SUFDeEJELGlCQUFpQixDQUFDQyxJQUFJLENBQUM7SUFDdkJ3QixvQkFBb0IsQ0FBQ3hCLElBQUksQ0FBQztJQUMxQjtFQUNKLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyIsImZpbGUiOiIuL2FwcC9maWVsZHMvZm9ybS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmNvbnN0IGF0dGFjaFRvZ2dsZWFibGVzID0gKGZvcm0pID0+IHtcbiAgICBmb3JtID0gJChmb3JtKTtcbiAgICBsZXQgcXVlcnkgPSAnW2RhdGEtZ3Jhdi1maWVsZD1cInRvZ2dsZWFibGVcIl0gaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJztcblxuICAgIGZvcm0ub24oJ2NoYW5nZScsIHF1ZXJ5LCAoZXZlbnQpID0+IHtcbiAgICAgICAgbGV0IHRvZ2dsZSA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgbGV0IGVuYWJsZWQgPSB0b2dnbGUuaXMoJzpjaGVja2VkJyk7XG4gICAgICAgIGxldCBwYXJlbnQgPSB0b2dnbGUuY2xvc2VzdCgnLmZvcm0tZmllbGQnKTtcbiAgICAgICAgbGV0IGxhYmVsID0gcGFyZW50LmZpbmQoJ2xhYmVsLnRvZ2dsZWFibGUnKTtcbiAgICAgICAgbGV0IGZpZWxkcyA9IHBhcmVudC5maW5kKCcuZm9ybS1kYXRhJyk7XG4gICAgICAgIGxldCBpbnB1dHMgPSBmaWVsZHMuZmluZCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGJ1dHRvbicpO1xuXG4gICAgICAgIGxhYmVsLmFkZChmaWVsZHMpLmNzcygnb3BhY2l0eScsIGVuYWJsZWQgPyAnJyA6IDAuNyk7XG4gICAgICAgIGlucHV0cy5tYXAoKGluZGV4LCBpbnB1dCkgPT4ge1xuICAgICAgICAgICAgbGV0IGlzU2VsZWN0aXplID0gaW5wdXQuc2VsZWN0aXplO1xuICAgICAgICAgICAgaW5wdXQgPSAkKGlucHV0KTtcblxuICAgICAgICAgICAgaWYgKGlzU2VsZWN0aXplKSB7XG4gICAgICAgICAgICAgICAgaXNTZWxlY3RpemVbZW5hYmxlZCA/ICdlbmFibGUnIDogJ2Rpc2FibGUnXSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5wcm9wKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBmb3JtLmZpbmQocXVlcnkpLnRyaWdnZXIoJ2NoYW5nZScpO1xufTtcblxuY29uc3QgYXR0YWNoRGlzYWJsZWRGaWVsZHMgPSAoZm9ybSkgPT4ge1xuICAgIGZvcm0gPSAkKGZvcm0pO1xuICAgIGxldCBwcmVmaXggPSAnLmZvcm0tZmllbGQtdG9nZ2xlYWJsZSAuZm9ybS1kYXRhJztcbiAgICBsZXQgcXVlcnkgPSBbXTtcblxuICAgIFsnaW5wdXQnLCAnc2VsZWN0JywgJ2xhYmVsW2Zvcl0nLCAndGV4dGFyZWEnLCAnLnNlbGVjdGl6ZS1jb250cm9sJ10uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBxdWVyeS5wdXNoKGAke3ByZWZpeH0gJHtpdGVtfWApO1xuICAgIH0pO1xuXG4gICAgZm9ybS5vbignbW91c2Vkb3duJywgcXVlcnkuam9pbignLCAnKSwgKGV2ZW50KSA9PiB7XG4gICAgICAgIGxldCBpbnB1dCA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgbGV0IGlzRm9yID0gaW5wdXQucHJvcCgnZm9yJyk7XG4gICAgICAgIGxldCBpc1NlbGVjdGl6ZSA9IChpbnB1dC5oYXNDbGFzcygnc2VsZWN0aXplLWNvbnRyb2wnKSB8fCBpbnB1dC5wYXJlbnRzKCcuc2VsZWN0aXplLWNvbnRyb2wnKSkubGVuZ3RoO1xuXG4gICAgICAgIGlmIChpc0ZvcikgeyBpbnB1dCA9ICQoYFtpZD1cIiR7aXNGb3J9XCJdYCk7IH1cbiAgICAgICAgaWYgKGlzU2VsZWN0aXplKSB7IGlucHV0ID0gaW5wdXQuY2xvc2VzdCgnLnNlbGVjdGl6ZS1jb250cm9sJykuc2libGluZ3MoJ3NlbGVjdFtuYW1lXScpOyB9XG5cbiAgICAgICAgaWYgKCFpbnB1dC5wcm9wKCdkaXNhYmxlZCcpKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICAgICAgbGV0IHRvZ2dsZSA9IGlucHV0LmNsb3Nlc3QoJy5mb3JtLWZpZWxkJykuZmluZCgnW2RhdGEtZ3Jhdi1maWVsZD1cInRvZ2dsZWFibGVcIl0gaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG4gICAgICAgIHRvZ2dsZS50cmlnZ2VyKCdjbGljaycpO1xuICAgIH0pO1xufTtcblxuLypcbmNvbnN0IHN1Ym1pdFVuY2hlY2tlZEZpZWxkcyA9IChmb3JtcykgPT4ge1xuICAgIGZvcm1zID0gJChmb3Jtcyk7XG4gICAgbGV0IHN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIGZvcm1zLmVhY2goKGluZGV4LCBmb3JtKSA9PiB7XG4gICAgICAgIGZvcm0gPSAkKGZvcm0pO1xuICAgICAgICBmb3JtLm9uKCdzdWJtaXQnLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBNUyBFZGdlLCBzdWJtaXR0aW5nIG11bHRpcGxlIGZvcm1zIGF0IHRoZSBzYW1lIHRpbWVcbiAgICAgICAgICAgIGlmIChzdWJtaXR0ZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgICAgIGxldCBmb3JtSWQgPSBmb3JtLmF0dHIoJ2lkJyk7XG4gICAgICAgICAgICBsZXQgdW5jaGVja2VkID0gZm9ybS5maW5kKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06bm90KDpjaGVja2VkKTpub3QoOmRpc2FibGVkKScpO1xuICAgICAgICAgICAgbGV0IHN1Ym1pdCA9IGZvcm0uZmluZCgnW3R5cGU9XCJzdWJtaXRcIl0nKS5hZGQoYFtmb3JtPVwiJHtmb3JtSWR9XCJdW3R5cGU9XCJzdWJtaXRcIl1gKTtcblxuICAgICAgICAgICAgaWYgKCF1bmNoZWNrZWQubGVuZ3RoKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICAgICAgICAgIHN1Ym1pdC5hZGRDbGFzcygncG9pbnRlci1ldmVudHMtZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIHVuY2hlY2tlZC5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gZWxlbWVudC5wcm9wKCduYW1lJyk7XG4gICAgICAgICAgICAgICAgbGV0IGZha2UgPSAkKGA8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCIke25hbWV9XCIgdmFsdWU9XCIwXCIgLz5gKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChmYWtlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG4qL1xuXG4kKGRvY3VtZW50KS5yZWFkeSgoKSA9PiB7XG4gICAgY29uc3QgZm9ybXMgPSAkKCdmb3JtJykuZmlsdGVyKChmb3JtKSA9PiAkKGZvcm0pLmZpbmQoJ1tuYW1lPVwiX19mb3JtLW5hbWVfX1wiXScpKTtcbiAgICBpZiAoIWZvcm1zLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgIGZvcm1zLmVhY2goKGluZGV4LCBmb3JtKSA9PiB7XG4gICAgICAgIGF0dGFjaFRvZ2dsZWFibGVzKGZvcm0pO1xuICAgICAgICBhdHRhY2hEaXNhYmxlZEZpZWxkcyhmb3JtKTtcbiAgICAgICAgLy8gc3VibWl0VW5jaGVja2VkRmllbGRzKGZvcm0pO1xuICAgIH0pO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/fields/form.js\n"); - -/***/ }), - -/***/ "./app/fields/index.js": -/*!*****************************!*\ - !*** ./app/fields/index.js ***! - \*****************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _form__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./form */ \"./app/fields/form.js\");\n/* harmony import */ var _file__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./file */ \"./app/fields/file.js\");\n/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./array */ \"./app/fields/array.js\");\n/* harmony import */ var _media__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./media */ \"./app/fields/media.js\");\n/* harmony import */ var _tabs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tabs */ \"./app/fields/tabs.js\");\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n FileInstances: _file__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n ArrayInstances: _array__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n Media: {\n PageMedia: _media__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n PageMediaInstances: _media__WEBPACK_IMPORTED_MODULE_3__[\"Instance\"]\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvZmllbGRzL2luZGV4LmpzPzE4OGEiXSwibmFtZXMiOlsiRmlsZUluc3RhbmNlcyIsIkFycmF5SW5zdGFuY2VzIiwiTWVkaWEiLCJQYWdlTWVkaWEiLCJQYWdlTWVkaWFJbnN0YW5jZXMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFnQjtBQUNtQjtBQUNFO0FBQytCO0FBQ3BEO0FBRUQ7RUFBRUEsYUFBYSxFQUFiQSw2Q0FBYTtFQUFFQyxjQUFjLEVBQWRBLDhDQUFjO0VBQUVDLEtBQUssRUFBRTtJQUFFQyxTQUFTLEVBQVRBLDhDQUFTO0lBQUVDLGtCQUFrQixFQUFsQkEsK0NBQWtCQTtFQUFDO0FBQUUsQ0FBQyIsImZpbGUiOiIuL2FwcC9maWVsZHMvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJy4vZm9ybSc7XG5pbXBvcnQgRmlsZUluc3RhbmNlcyBmcm9tICcuL2ZpbGUnO1xuaW1wb3J0IEFycmF5SW5zdGFuY2VzIGZyb20gJy4vYXJyYXknO1xuaW1wb3J0IFBhZ2VNZWRpYSwgeyBJbnN0YW5jZSBhcyBQYWdlTWVkaWFJbnN0YW5jZXMgfSBmcm9tICcuL21lZGlhJztcbmltcG9ydCAnLi90YWJzJztcblxuZXhwb3J0IGRlZmF1bHQgeyBGaWxlSW5zdGFuY2VzLCBBcnJheUluc3RhbmNlcywgTWVkaWE6IHsgUGFnZU1lZGlhLCBQYWdlTWVkaWFJbnN0YW5jZXMgfSB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/fields/index.js\n"); - -/***/ }), - -/***/ "./app/fields/media.js": -/*!*****************************!*\ - !*** ./app/fields/media.js ***! - \*****************************/ -/*! exports provided: default, Instance */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return PageMedia; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Instance\", function() { return Instance; });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _file__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./file */ \"./app/fields/file.js\");\n/* harmony import */ var grav_form__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! grav-form */ \"grav-form\");\n/* harmony import */ var grav_form__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(grav_form__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.esm.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _get() { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get.bind(); } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n\n\n\nvar template = \"\\n \").trim();\nvar PageMedia = /*#__PURE__*/function (_FilesField) {\n function PageMedia() {\n var _this;\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$container = _ref.container,\n container = _ref$container === void 0 ? '#grav-dropzone' : _ref$container,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options;\n _classCallCheck(this, PageMedia);\n var previewTemplate = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#dropzone-media-template').html() || template;\n options = Object.assign(options, {\n previewTemplate: previewTemplate\n });\n _this = _callSuper(this, PageMedia, [{\n container: container,\n options: options\n }]);\n if (!_this.container.length) {\n return _possibleConstructorReturn(_this);\n }\n _this.urls = {\n fetch: \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_form__WEBPACK_IMPORTED_MODULE_2__[\"config\"].param_sep, \"listmedia\"),\n add: \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_form__WEBPACK_IMPORTED_MODULE_2__[\"config\"].param_sep, \"addmedia\"),\n \"delete\": \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_form__WEBPACK_IMPORTED_MODULE_2__[\"config\"].param_sep, \"delmedia\")\n };\n _this.dropzone.options.url = _this.urls.add;\n if (typeof _this.options.fetchMedia === 'undefined' || _this.options.fetchMedia) {\n _this.fetchMedia();\n }\n var field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[name=\\\"\".concat(_this.container.data('dropzone-field'), \"\\\"]\"));\n if (field.length) {\n _this.sortable = new sortablejs__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this.container.get(0), {\n animation: 150,\n // forceFallback: true,\n setData: function setData(dataTransfer, target) {\n target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target);\n _this.dropzone.disable();\n target.addClass('hide-backface');\n dataTransfer.effectAllowed = 'copy';\n },\n onSort: function onSort() {\n var names = [];\n _this.container.find('[data-dz-name]').each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n var name = file.text().trim();\n names.push(name);\n });\n field.val(names.join(','));\n }\n });\n }\n return _this;\n }\n _inherits(PageMedia, _FilesField);\n return _createClass(PageMedia, [{\n key: \"onDropzoneRemovedFile\",\n value: function onDropzoneRemovedFile(file) {\n var _this2 = this;\n if (!file.accepted || file.rejected) {\n return;\n }\n var form = this.container.closest('form');\n var unique_id = form.find('[name=\"__unique_form_id__\"]');\n var url = file.removeUrl || this.urls[\"delete\"] || \"\".concat(location.href, \".json\");\n var path = (url || '').match(/path:(.*)\\//);\n var data = new FormData();\n data.append('filename', file.name);\n data.append('__form-name__', form.find('[name=\"__form-name__\"]').val());\n if (unique_id.length) {\n data.append('__unique_form_id__', unique_id.val());\n }\n data.append('name', this.options.dotNotation);\n data.append('form-nonce', grav_form__WEBPACK_IMPORTED_MODULE_2__[\"config\"].form_nonce);\n if (file.sessionParams) {\n data.append('__form-file-remover__', '1');\n data.append('session', file.sessionParams);\n }\n jquery__WEBPACK_IMPORTED_MODULE_0___default.a.ajax({\n url: url,\n data: data,\n method: 'POST',\n contentType: false,\n processData: false,\n success: function success() {\n if (!path) {\n return;\n }\n path = global.atob(path[1]);\n var input = _this2.container.find('[name][type=\"hidden\"]');\n var data = JSON.parse(input.val() || '{}');\n delete data[path];\n input.val(JSON.stringify(data));\n }\n });\n }\n }, {\n key: \"fetchMedia\",\n value: function fetchMedia() {\n var _this3 = this;\n var order = this.container.closest('.form-field').find('[name=\"data[header][media_order]\"]').val();\n var data = {\n order: order\n };\n var url = this.urls.fetch;\n jquery__WEBPACK_IMPORTED_MODULE_0___default.a.ajax({\n url: url,\n method: 'POST',\n data: data,\n success: function success(response) {\n if (typeof response === 'string' || response instanceof String) {\n return false;\n }\n response = response.results;\n Object.keys(response).forEach(function (name) {\n var data = response[name];\n var mock = {\n name: name,\n size: data.size,\n accepted: true,\n extras: data\n };\n _this3.dropzone.files.push(mock);\n _this3.dropzone.options.addedfile.call(_this3.dropzone, mock);\n _this3.dropzone.options.thumbnail.call(_this3.dropzone, mock, data.url);\n });\n _this3.container.find('.dz-preview').prop('draggable', 'true');\n }\n });\n\n /*\n request(url, { method: 'post', body }, (response) => {\n let results = response.results;\n Object.keys(results).forEach((name) => {\n let data = results[name];\n let mock = { name, size: data.size, accepted: true, extras: data };\n this.dropzone.files.push(mock);\n this.dropzone.options.addedfile.call(this.dropzone, mock);\n this.dropzone.options.thumbnail.call(this.dropzone, mock, data.url);\n });\n this.container.find('.dz-preview').prop('draggable', 'true');\n });*/\n }\n }, {\n key: \"onDropzoneSending\",\n value: function onDropzoneSending(file, xhr, formData) {\n /*\n // Cannot call super because Safari and IE API don't implement `delete`\n super.onDropzoneSending(file, xhr, formData);\n formData.delete('task');\n */\n\n formData.append('name', this.options.dotNotation);\n formData.append('admin-nonce', grav_form__WEBPACK_IMPORTED_MODULE_2__[\"config\"].admin_nonce);\n }\n }, {\n key: \"onDropzoneComplete\",\n value: function onDropzoneComplete(file) {\n _get(_getPrototypeOf(PageMedia.prototype), \"onDropzoneComplete\", this).call(this, file);\n this.sortable.options.onSort();\n\n // accepted\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dz-preview').prop('draggable', 'true');\n }\n\n // onDropzoneRemovedFile(file, ...extra) {\n // super.onDropzoneRemovedFile(file, ...extra);\n // this.sortable.options.onSort();\n // }\n }]);\n}(_file__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\nvar Instance = new PageMedia();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvZmllbGRzL21lZGlhLmpzPzk5MTciXSwibmFtZXMiOlsidGVtcGxhdGUiLCJjb25jYXQiLCJ0cmFuc2xhdGlvbnMiLCJQTFVHSU5fRk9STSIsIkRFTEVURSIsInRyaW0iLCJQYWdlTWVkaWEiLCJfRmlsZXNGaWVsZCIsIl90aGlzIiwiX3JlZiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIl9yZWYkY29udGFpbmVyIiwiY29udGFpbmVyIiwiX3JlZiRvcHRpb25zIiwib3B0aW9ucyIsIl9jbGFzc0NhbGxDaGVjayIsInByZXZpZXdUZW1wbGF0ZSIsIiQiLCJodG1sIiwiT2JqZWN0IiwiYXNzaWduIiwiX2NhbGxTdXBlciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwidXJscyIsImZldGNoIiwiZGF0YSIsImNvbmZpZyIsInBhcmFtX3NlcCIsImFkZCIsImRyb3B6b25lIiwidXJsIiwiZmV0Y2hNZWRpYSIsImZpZWxkIiwic29ydGFibGUiLCJTb3J0YWJsZSIsImdldCIsImFuaW1hdGlvbiIsInNldERhdGEiLCJkYXRhVHJhbnNmZXIiLCJ0YXJnZXQiLCJkaXNhYmxlIiwiYWRkQ2xhc3MiLCJlZmZlY3RBbGxvd2VkIiwib25Tb3J0IiwibmFtZXMiLCJmaW5kIiwiZWFjaCIsImluZGV4IiwiZmlsZSIsIm5hbWUiLCJ0ZXh0IiwicHVzaCIsInZhbCIsImpvaW4iLCJfaW5oZXJpdHMiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsIm9uRHJvcHpvbmVSZW1vdmVkRmlsZSIsIl90aGlzMiIsImFjY2VwdGVkIiwicmVqZWN0ZWQiLCJmb3JtIiwiY2xvc2VzdCIsInVuaXF1ZV9pZCIsInJlbW92ZVVybCIsImxvY2F0aW9uIiwiaHJlZiIsInBhdGgiLCJtYXRjaCIsIkZvcm1EYXRhIiwiYXBwZW5kIiwiZG90Tm90YXRpb24iLCJmb3JtX25vbmNlIiwic2Vzc2lvblBhcmFtcyIsImFqYXgiLCJtZXRob2QiLCJjb250ZW50VHlwZSIsInByb2Nlc3NEYXRhIiwic3VjY2VzcyIsImdsb2JhbCIsImF0b2IiLCJpbnB1dCIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsIl90aGlzMyIsIm9yZGVyIiwicmVzcG9uc2UiLCJTdHJpbmciLCJyZXN1bHRzIiwia2V5cyIsImZvckVhY2giLCJtb2NrIiwic2l6ZSIsImV4dHJhcyIsImZpbGVzIiwiYWRkZWRmaWxlIiwiY2FsbCIsInRodW1ibmFpbCIsInByb3AiLCJvbkRyb3B6b25lU2VuZGluZyIsInhociIsImZvcm1EYXRhIiwiYWRtaW5fbm9uY2UiLCJvbkRyb3B6b25lQ29tcGxldGUiLCJfZ2V0IiwiX2dldFByb3RvdHlwZU9mIiwicHJvdG90eXBlIiwiRmlsZXNGaWVsZCIsIkluc3RhbmNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBdUI7QUFDUztBQUNpQjtBQUNmO0FBRWxDLElBQU1BLFFBQVEsR0FBRyxxbEJBQUFDLE1BQUEsQ0FXbUJDLHNEQUFZLENBQUNDLFdBQVcsQ0FBQ0MsTUFBTSx1REFBQUgsTUFBQSxDQUFpREMsc0RBQVksQ0FBQ0MsV0FBVyxDQUFDQyxNQUFNLHNCQUN2SUMsSUFBSSxDQUFDLENBQUM7QUFBQyxJQUVFQyxTQUFTLDBCQUFBQyxXQUFBO0VBQzFCLFNBQUFELFVBQUEsRUFBaUU7SUFBQSxJQUFBRSxLQUFBO0lBQUEsSUFBQUMsSUFBQSxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBSixDQUFDLENBQUM7TUFBQUcsY0FBQSxHQUFBSixJQUFBLENBQWpESyxTQUFTO01BQVRBLFNBQVMsR0FBQUQsY0FBQSxjQUFHLGdCQUFnQixHQUFBQSxjQUFBO01BQUFFLFlBQUEsR0FBQU4sSUFBQSxDQUFFTyxPQUFPO01BQVBBLE9BQU8sR0FBQUQsWUFBQSxjQUFHLENBQUMsQ0FBQyxHQUFBQSxZQUFBO0lBQUFFLGVBQUEsT0FBQVgsU0FBQTtJQUNwRCxJQUFN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L2ZpZWxkcy9tZWRpYS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgRmlsZXNGaWVsZCBmcm9tICcuL2ZpbGUnO1xuaW1wb3J0IHsgY29uZmlnLCB0cmFuc2xhdGlvbnMgfSBmcm9tICdncmF2LWZvcm0nO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gJ3NvcnRhYmxlanMnO1xuXG5jb25zdCB0ZW1wbGF0ZSA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiZHotcHJldmlldyBkei1maWxlLXByZXZpZXdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkei1kZXRhaWxzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkei1maWxlbmFtZVwiPjxzcGFuIGRhdGEtZHotbmFtZT48L3NwYW4+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkei1zaXplXCIgZGF0YS1kei1zaXplPjwvZGl2PlxuICAgICAgICA8aW1nIGRhdGEtZHotdGh1bWJuYWlsIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkei1wcm9ncmVzc1wiPjxzcGFuIGNsYXNzPVwiZHotdXBsb2FkXCIgZGF0YS1kei11cGxvYWRwcm9ncmVzcz48L3NwYW4+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHotc3VjY2Vzcy1tYXJrXCI+PHNwYW4+4pyUPC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImR6LWVycm9yLW1hcmtcIj48c3Bhbj7inJg8L3NwYW4+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHotZXJyb3ItbWVzc2FnZVwiPjxzcGFuIGRhdGEtZHotZXJyb3JtZXNzYWdlPjwvc3Bhbj48L2Rpdj5cbiAgICAgIDxhIGNsYXNzPVwiZHotcmVtb3ZlXCIgdGl0bGU9XCIke3RyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5ERUxFVEV9XCIgaHJlZj1cImphdmFzY3JpcHQ6dW5kZWZpbmVkO1wiIGRhdGEtZHotcmVtb3ZlPiR7dHJhbnNsYXRpb25zLlBMVUdJTl9GT1JNLkRFTEVURX08L2E+XG4gICAgPC9kaXY+YC50cmltKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VNZWRpYSBleHRlbmRzIEZpbGVzRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKHsgY29udGFpbmVyID0gJyNncmF2LWRyb3B6b25lJywgb3B0aW9ucyA9IHt9IH0gPSB7fSkge1xuICAgICAgICBjb25zdCBwcmV2aWV3VGVtcGxhdGUgPSAkKCcjZHJvcHpvbmUtbWVkaWEtdGVtcGxhdGUnKS5odG1sKCkgfHwgdGVtcGxhdGU7XG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHsgcHJldmlld1RlbXBsYXRlIH0pO1xuICAgICAgICBzdXBlcih7IGNvbnRhaW5lciwgb3B0aW9ucyB9KTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdGhpcy51cmxzID0ge1xuICAgICAgICAgICAgZmV0Y2g6IGAke3RoaXMuY29udGFpbmVyLmRhdGEoJ21lZGlhLXVybCcpfS90YXNrJHtjb25maWcucGFyYW1fc2VwfWxpc3RtZWRpYWAsXG4gICAgICAgICAgICBhZGQ6IGAke3RoaXMuY29udGFpbmVyLmRhdGEoJ21lZGlhLXVybCcpfS90YXNrJHtjb25maWcucGFyYW1fc2VwfWFkZG1lZGlhYCxcbiAgICAgICAgICAgIGRlbGV0ZTogYCR7dGhpcy5jb250YWluZXIuZGF0YSgnbWVkaWEtdXJsJyl9L3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9ZGVsbWVkaWFgXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kcm9wem9uZS5vcHRpb25zLnVybCA9IHRoaXMudXJscy5hZGQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZmV0Y2hNZWRpYSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRpb25zLmZldGNoTWVkaWEpIHtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hNZWRpYSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGQgPSAkKGBbbmFtZT1cIiR7dGhpcy5jb250YWluZXIuZGF0YSgnZHJvcHpvbmUtZmllbGQnKX1cIl1gKTtcblxuICAgICAgICBpZiAoZmllbGQubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRhYmxlID0gbmV3IFNvcnRhYmxlKHRoaXMuY29udGFpbmVyLmdldCgwKSwge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogMTUwLFxuICAgICAgICAgICAgICAgIC8vIGZvcmNlRmFsbGJhY2s6IHRydWUsXG4gICAgICAgICAgICAgICAgc2V0RGF0YTogKGRhdGFUcmFuc2ZlciwgdGFyZ2V0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9ICQodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5kaXNhYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRDbGFzcygnaGlkZS1iYWNrZmFjZScpO1xuICAgICAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdjb3B5JztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uU29ydDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuZmluZCgnW2RhdGEtZHotbmFtZV0nKS5lYWNoKChpbmRleCwgZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9ICQoZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gZmlsZS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsKG5hbWVzLmpvaW4oJywnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkRyb3B6b25lUmVtb3ZlZEZpbGUoZmlsZSwgLi4uZXh0cmEpIHtcbiAgICAgICAgaWYgKCFmaWxlLmFjY2VwdGVkIHx8IGZpbGUucmVqZWN0ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmNvbnRhaW5lci5jbG9zZXN0KCdmb3JtJyk7XG4gICAgICAgIGNvbnN0IHVuaXF1ZV9pZCA9IGZvcm0uZmluZCgnW25hbWU9XCJfX3VuaXF1ZV9mb3JtX2lkX19cIl0nKTtcbiAgICAgICAgbGV0IHVybCA9IGZpbGUucmVtb3ZlVXJsIHx8IHRoaXMudXJscy5kZWxldGUgfHwgYCR7bG9jYXRpb24uaHJlZn0uanNvbmA7XG4gICAgICAgIGxldCBwYXRoID0gKHVybCB8fCAnJykubWF0Y2goL3BhdGg6KC4qKVxcLy8pO1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgICAgIGRhdGEuYXBwZW5kKCdmaWxlbmFtZScsIGZpbGUubmFtZSk7XG4gICAgICAgIGRhdGEuYXBwZW5kKCdfX2Zvcm0tbmFtZV9fJywgZm9ybS5maW5kKCdbbmFtZT1cIl9fZm9ybS1uYW1lX19cIl0nKS52YWwoKSk7XG4gICAgICAgIGlmICh1bmlxdWVfaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhLmFwcGVuZCgnX191bmlxdWVfZm9ybV9pZF9fJywgdW5pcXVlX2lkLnZhbCgpKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLmFwcGVuZCgnbmFtZScsIHRoaXMub3B0aW9ucy5kb3ROb3RhdGlvbik7XG4gICAgICAgIGRhdGEuYXBwZW5kKCdmb3JtLW5vbmNlJywgY29uZmlnLmZvcm1fbm9uY2UpO1xuXG4gICAgICAgIGlmIChmaWxlLnNlc3Npb25QYXJhbXMpIHtcbiAgICAgICAgICAgIGRhdGEuYXBwZW5kKCdfX2Zvcm0tZmlsZS1yZW1vdmVyX18nLCAnMScpO1xuICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ3Nlc3Npb24nLCBmaWxlLnNlc3Npb25QYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcbiAgICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgICAgICAgIHN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXBhdGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgICAgICBwYXRoID0gZ2xvYmFsLmF0b2IocGF0aFsxXSk7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gdGhpcy5jb250YWluZXIuZmluZCgnW25hbWVdW3R5cGU9XCJoaWRkZW5cIl0nKTtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoaW5wdXQudmFsKCkgfHwgJ3t9Jyk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGFbcGF0aF07XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmV0Y2hNZWRpYSgpIHtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLmNvbnRhaW5lci5jbG9zZXN0KCcuZm9ybS1maWVsZCcpLmZpbmQoJ1tuYW1lPVwiZGF0YVtoZWFkZXJdW21lZGlhX29yZGVyXVwiXScpLnZhbCgpO1xuICAgICAgICBjb25zdCBkYXRhID0geyBvcmRlciB9O1xuICAgICAgICBsZXQgdXJsID0gdGhpcy51cmxzLmZldGNoO1xuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBzdWNjZXNzOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJyB8fCByZXNwb25zZSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5yZXN1bHRzO1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gcmVzcG9uc2VbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBtb2NrID0geyBuYW1lLCBzaXplOiBkYXRhLnNpemUsIGFjY2VwdGVkOiB0cnVlLCBleHRyYXM6IGRhdGEgfTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLmZpbGVzLnB1c2gobW9jayk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUub3B0aW9ucy5hZGRlZGZpbGUuY2FsbCh0aGlzLmRyb3B6b25lLCBtb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5vcHRpb25zLnRodW1ibmFpbC5jYWxsKHRoaXMuZHJvcHpvbmUsIG1vY2ssIGRhdGEudXJsKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5kei1wcmV2aWV3JykucHJvcCgnZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLypcbiAgICAgICAgcmVxdWVzdCh1cmwsIHsgbWV0aG9kOiAncG9zdCcsIGJvZHkgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0cyA9IHJlc3BvbnNlLnJlc3VsdHM7XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc3VsdHMpLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHJlc3VsdHNbbmFtZV07XG4gICAgICAgICAgICAgICAgbGV0IG1vY2sgPSB7IG5hbWUsIHNpemU6IGRhdGEuc2l6ZSwgYWNjZXB0ZWQ6IHRydWUsIGV4dHJhczogZGF0YSB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5maWxlcy5wdXNoKG1vY2spO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUub3B0aW9ucy5hZGRlZGZpbGUuY2FsbCh0aGlzLmRyb3B6b25lLCBtb2NrKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLm9wdGlvbnMudGh1bWJuYWlsLmNhbGwodGhpcy5kcm9wem9uZSwgbW9jaywgZGF0YS51cmwpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5kei1wcmV2aWV3JykucHJvcCgnZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgICAgfSk7Ki9cbiAgICB9XG5cbiAgICBvbkRyb3B6b25lU2VuZGluZyhmaWxlLCB4aHIsIGZvcm1EYXRhKSB7XG4gICAgICAgIC8qXG4gICAgICAgIC8vIENhbm5vdCBjYWxsIHN1cGVyIGJlY2F1c2UgU2FmYXJpIGFuZCBJRSBBUEkgZG9uJ3QgaW1wbGVtZW50IGBkZWxldGVgXG4gICAgICAgIHN1cGVyLm9uRHJvcHpvbmVTZW5kaW5nKGZpbGUsIHhociwgZm9ybURhdGEpO1xuICAgICAgICBmb3JtRGF0YS5kZWxldGUoJ3Rhc2snKTtcbiAgICAgICAgKi9cblxuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ25hbWUnLCB0aGlzLm9wdGlvbnMuZG90Tm90YXRpb24pO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2FkbWluLW5vbmNlJywgY29uZmlnLmFkbWluX25vbmNlKTtcbiAgICB9XG5cbiAgICBvbkRyb3B6b25lQ29tcGxldGUoZmlsZSkge1xuICAgICAgICBzdXBlci5vbkRyb3B6b25lQ29tcGxldGUoZmlsZSk7XG4gICAgICAgIHRoaXMuc29ydGFibGUub3B0aW9ucy5vblNvcnQoKTtcblxuICAgICAgICAvLyBhY2NlcHRlZFxuICAgICAgICAkKCcuZHotcHJldmlldycpLnByb3AoJ2RyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgfVxuXG4gICAgLy8gb25Ecm9wem9uZVJlbW92ZWRGaWxlKGZpbGUsIC4uLmV4dHJhKSB7XG4gICAgLy8gICAgIHN1cGVyLm9uRHJvcHpvbmVSZW1vdmVkRmlsZShmaWxlLCAuLi5leHRyYSk7XG4gICAgLy8gICAgIHRoaXMuc29ydGFibGUub3B0aW9ucy5vblNvcnQoKTtcbiAgICAvLyB9XG59XG5cbmV4cG9ydCBsZXQgSW5zdGFuY2UgPSBuZXcgUGFnZU1lZGlhKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/fields/media.js\n"); - -/***/ }), - -/***/ "./app/fields/tabs.js": -/*!****************************!*\ - !*** ./app/fields/tabs.js ***! - \****************************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('touchstart click', '[data-tabid]', function (event) {\n event && event.stopPropagation();\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var panel = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[id=\\\"\".concat(target.data('tabid'), \"\\\"]\"));\n target.siblings('[data-tabid]').removeClass('active');\n target.addClass('active');\n panel.siblings('[id]').removeClass('active');\n panel.addClass('active');\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvZmllbGRzL3RhYnMuanM/NGRlZSJdLCJuYW1lcyI6WyIkIiwib24iLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsInRhcmdldCIsImN1cnJlbnRUYXJnZXQiLCJwYW5lbCIsImNvbmNhdCIsImRhdGEiLCJzaWJsaW5ncyIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUF1QjtBQUV2QkEsNkNBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQ0MsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxVQUFDQyxLQUFLLEVBQUs7RUFDeERBLEtBQUssSUFBSUEsS0FBSyxDQUFDQyxlQUFlLENBQUMsQ0FBQztFQUNoQyxJQUFJQyxNQUFNLEdBQUdKLDZDQUFDLENBQUNFLEtBQUssQ0FBQ0csYUFBYSxDQUFDO0VBRW5DLElBQU1DLEtBQUssR0FBR04sNkNBQUMsVUFBQU8sTUFBQSxDQUFTSCxNQUFNLENBQUNJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBSSxDQUFDO0VBRWpESixNQUFNLENBQUNLLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLFFBQVEsQ0FBQztFQUNyRE4sTUFBTSxDQUFDTyxRQUFRLENBQUMsUUFBUSxDQUFDO0VBRXpCTCxLQUFLLENBQUNHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLFFBQVEsQ0FBQztFQUM1Q0osS0FBSyxDQUFDSyxRQUFRLENBQUMsUUFBUSxDQUFDO0FBQzVCLENBQUMsQ0FBQyIsImZpbGUiOiIuL2FwcC9maWVsZHMvdGFicy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbiQoJ2JvZHknKS5vbigndG91Y2hzdGFydCBjbGljaycsICdbZGF0YS10YWJpZF0nLCAoZXZlbnQpID0+IHtcbiAgICBldmVudCAmJiBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBsZXQgdGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcblxuICAgIGNvbnN0IHBhbmVsID0gJChgW2lkPVwiJHt0YXJnZXQuZGF0YSgndGFiaWQnKX1cIl1gKTtcblxuICAgIHRhcmdldC5zaWJsaW5ncygnW2RhdGEtdGFiaWRdJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgIHRhcmdldC5hZGRDbGFzcygnYWN0aXZlJyk7XG5cbiAgICBwYW5lbC5zaWJsaW5ncygnW2lkXScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICBwYW5lbC5hZGRDbGFzcygnYWN0aXZlJyk7XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/fields/tabs.js\n"); - -/***/ }), - -/***/ "./app/main.js": -/*!*********************!*\ - !*** ./app/main.js ***! - \*********************/ -/*! exports provided: Instances */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _fields__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fields */ \"./app/fields/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Instances\", function() { return _fields__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _utils_keep_alive__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/keep-alive */ \"./app/utils/keep-alive.js\");\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvbWFpbi5qcz9mMTYxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBaUM7QUFDTCIsImZpbGUiOiIuL2FwcC9tYWluLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEluc3RhbmNlcyBmcm9tICcuL2ZpZWxkcyc7XG5pbXBvcnQgJy4vdXRpbHMva2VlcC1hbGl2ZSc7XG5cbmV4cG9ydCB7IEluc3RhbmNlcyB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/main.js\n"); - -/***/ }), - -/***/ "./app/utils/keep-alive.js": -/*!*********************************!*\ - !*** ./app/utils/keep-alive.js ***! - \*********************************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_form__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-form */ \"grav-form\");\n/* harmony import */ var grav_form__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_form__WEBPACK_IMPORTED_MODULE_1__);\n\n\nvar MAX_SAFE_DELAY = 2147483647;\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).ready(function () {\n var keepAlive = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-keepalive]');\n if (keepAlive.length) {\n var timeout = grav_form__WEBPACK_IMPORTED_MODULE_1__[\"config\"].session_timeout / 1.5 * 1000;\n setInterval(function () {\n jquery__WEBPACK_IMPORTED_MODULE_0___default.a.ajax({\n url: \"\".concat(grav_form__WEBPACK_IMPORTED_MODULE_1__[\"config\"].base_url_relative, \"/task\").concat(grav_form__WEBPACK_IMPORTED_MODULE_1__[\"config\"].param_sep, \"keep-alive\")\n });\n }, Math.min(timeout, MAX_SAFE_DELAY));\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hcHAvdXRpbHMva2VlcC1hbGl2ZS5qcz9iMjJmIl0sIm5hbWVzIjpbIk1BWF9TQUZFX0RFTEFZIiwiJCIsImRvY3VtZW50IiwicmVhZHkiLCJrZWVwQWxpdmUiLCJsZW5ndGgiLCJ0aW1lb3V0IiwiY29uZmlnIiwic2Vzc2lvbl90aW1lb3V0Iiwic2V0SW50ZXJ2YWwiLCJhamF4IiwidXJsIiwiY29uY2F0IiwiYmFzZV91cmxfcmVsYXRpdmUiLCJwYXJhbV9zZXAiLCJNYXRoIiwibWluIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXVCO0FBQ1U7QUFFakMsSUFBTUEsY0FBYyxHQUFHLFVBQVU7QUFFakNDLDZDQUFDLENBQUNDLFFBQVEsQ0FBQyxDQUFDQyxLQUFLLENBQUMsWUFBTTtFQUNwQixJQUFNQyxTQUFTLEdBQUdILDZDQUFDLENBQUMsdUJBQXVCLENBQUM7RUFFNUMsSUFBSUcsU0FBUyxDQUFDQyxNQUFNLEVBQUU7SUFDbEIsSUFBTUMsT0FBTyxHQUFHQyxnREFBTSxDQUFDQyxlQUFlLEdBQUcsR0FBRyxHQUFHLElBQUk7SUFDbkRDLFdBQVcsQ0FBQyxZQUFNO01BQ2RSLDZDQUFDLENBQUNTLElBQUksQ0FBQztRQUNIQyxHQUFHLEtBQUFDLE1BQUEsQ0FBS0wsZ0RBQU0sQ0FBQ00saUJBQWlCLFdBQUFELE1BQUEsQ0FBUUwsZ0RBQU0sQ0FBQ08sU0FBUztNQUM1RCxDQUFDLENBQUM7SUFDTixDQUFDLEVBQUVDLElBQUksQ0FBQ0MsR0FBRyxDQUFDVixPQUFPLEVBQUVOLGNBQWMsQ0FBQyxDQUFDO0VBQ3pDO0FBQ0osQ0FBQyxDQUFDIiwiZmlsZSI6Ii4vYXBwL3V0aWxzL2tlZXAtYWxpdmUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHtjb25maWd9IGZyb20gJ2dyYXYtZm9ybSc7XG5cbmNvbnN0IE1BWF9TQUZFX0RFTEFZID0gMjE0NzQ4MzY0NztcblxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICAgIGNvbnN0IGtlZXBBbGl2ZSA9ICQoJ1tkYXRhLWdyYXYta2VlcGFsaXZlXScpO1xuXG4gICAgaWYgKGtlZXBBbGl2ZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IGNvbmZpZy5zZXNzaW9uX3RpbWVvdXQgLyAxLjUgKiAxMDAwO1xuICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS90YXNrJHtjb25maWcucGFyYW1fc2VwfWtlZXAtYWxpdmVgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgTWF0aC5taW4odGltZW91dCwgTUFYX1NBRkVfREVMQVkpKTtcbiAgICB9XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/utils/keep-alive.js\n"); - -/***/ }), - -/***/ "grav-form": -/*!***************************!*\ - !*** external "GravForm" ***! - \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("module.exports = GravForm;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJHcmF2Rm9ybVwiPzFkNmQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEiLCJmaWxlIjoiZ3Jhdi1mb3JtLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBHcmF2Rm9ybTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///grav-form\n"); - -/***/ }), - -/***/ "jquery": -/*!*************************!*\ - !*** external "jQuery" ***! - \*************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("module.exports = jQuery;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJqUXVlcnlcIj9jZDBjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6ImpxdWVyeS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0galF1ZXJ5OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///jquery\n"); - -/***/ }) - -/******/ }); \ No newline at end of file +(()=>{"use strict";var e,a={"./app/fields/array.js":(e,a,t)=>{t.r(a),t.d(a,{Instance:()=>m,default:()=>p});var n=t("jquery"),r=t.n(n),o=t("./node_modules/sortablejs/modular/sortable.esm.js");function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function s(e,a){if(!(e instanceof a))throw new TypeError("Cannot call a class as a function")}function l(e,a){for(var t=0;t'):"');return this.isValueOnly()?e+='\n
\n \n '.concat(a,"\n "):e+='\n
\n \n \n ').concat(a,"\n "),e+='\n \n \n
'}}])}(),p=function(){return c((function e(){var a=this;s(this,e),u.on("input",'[data-grav-array-type="key"], [data-grav-array-type="value"]',(function(e){return a.actionInput(e)})),u.on("click touch",'[data-grav-array-action]:not([data-grav-array-action="sort"])',(function(e){return a.actionEvent(e)})),this.arrays=r()(),r()('[data-grav-field="array"]').each((function(e,t){return a.addArray(t)})),r()("body").on("mutation._grav",this._onAddedNodes.bind(this))}),[{key:"addArray",value:function(e){(e=r()(e)).find('[data-grav-array-type="container"]').each((function(e,a){(a=r()(a)).data("array-sort")||a[0].hasAttribute("data-array-nosort")||a.data("array-sort",new o.default(a.get(0),{handle:".fa-bars",animation:150}))}))}},{key:"actionInput",value:function(e){var a=r()(e.target),t=a.data("grav-array-type");this._setTemplate(a);var n=a.data("array-template"),o="key"===t?a:a.siblings('[data-grav-array-type="key"]:first'),i="value"===t?a:a.siblings('[data-grav-array-type="value"]:first'),s=n.isValueOnly()?this.getIndexFor(a):o.val();s=s.toString().replace(/\[/g,"%5B").replace(/]/g,"%5D");var l="".concat(n.getName(),"[").concat(s,"]");n.isValueOnly()||o.val()||i.val()?i.attr("name",l):i.attr("name",""),this.refreshNames(n)}},{key:"actionEvent",value:function(e){e&&e.preventDefault();var a=r()(e.target),t=a.data("grav-array-action"),n=a.parents('[data-grav-array-type="container"]');this._setTemplate(a),this["".concat(t,"Action")](a);var o=n.find("> div");n[o.length>1?"removeClass":"addClass"]("one-child")}},{key:"addAction",value:function(e){var a=e.data("array-template");e.closest('[data-grav-array-type="row"]').after(a.getNewRow())}},{key:"remAction",value:function(e){var a=e.data("array-template"),t=e.closest('[data-grav-array-type="row"]');if(!t.siblings().length){var n=r()(a.getNewRow());t.after(n),n.find('[data-grav-array-type="value"]:last').attr("name",a.getName())}t.remove(),this.refreshNames(a)}},{key:"refreshNames",value:function(e){if(e.isValueOnly()){var a=e.container.find('> div > [data-grav-array-type="row"]'),t=a.find('[name]:not([name=""])');t.each((function(e,a){var t=(a=r()(a)).attr("name");t=t.replace(/\[\d+\]$/,"[".concat(e,"]")),a.attr("name",t)})),t.length||a.find('[data-grav-array-type="value"]').attr("name",e.getName())}}},{key:"getIndexFor",value:function(e){var a=e.data("array-template"),t=e.closest('[data-grav-array-type="row"]');return a.container.find("".concat(a.isValueOnly()?"> div ":"",' > [data-grav-array-type="row"]')).index(t)}},{key:"_setTemplate",value:function(e){e.data("array-template")||e.data("array-template",new f(e.closest("[data-grav-array-name]")))}},{key:"_onAddedNodes",value:function(e,a){var t=this,n=r()(a).find('[data-grav-field="array"]');n.length&&n.each((function(e,a){a=r()(a),~t.arrays.index(a)||t.addArray(a)}))}}])}(),m=new p},"./app/fields/file.js":(e,a,t)=>{t.r(a),t.d(a,{Instances:()=>g,default:()=>p});var n=t("jquery"),r=t.n(n),o=t("./node_modules/dropzone/dist/dropzone.js"),i=t.n(o),s=t("grav-form");function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,a){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:{},t=a.container,n=void 0===t?".dropzone.files-upload":t,o=a.options,l=void 0===o?{}:o;!function(e,a){if(!(e instanceof a))throw new TypeError("Cannot call a class as a function")}(this,e),this.container=r()(n),this.container.length&&(this.urls={},f.previewTemplate=r()("#dropzone-template").html(),this.options=Object.assign({},u,f,{klass:this,url:this.container.data("file-url-add")||s.config.current_url,acceptedFiles:this.container.data("media-types"),init:this.initDropzone},this.container.data("dropzone-options"),l),this.dropzone=new(i())(n,this.options),this.dropzone.on("complete",this.onDropzoneComplete.bind(this)),this.dropzone.on("success",this.onDropzoneSuccess.bind(this)),this.dropzone.on("removedfile",this.onDropzoneRemovedFile.bind(this)),this.dropzone.on("sending",this.onDropzoneSending.bind(this)),this.dropzone.on("error",this.onDropzoneError.bind(this)))},(a=[{key:"initDropzone",value:function(){var e=this,a=this.options.klass.container.find("[data-file]"),t=this;a.length&&a.each((function(a,n){var o=(n=r()(n)).data("file"),s={name:o.name,size:o.size,type:o.type,status:i().ADDED,accepted:!0,url:e.options.url,removeUrl:o.remove,data:o};t.files.push(s),t.options.addedfile.call(t,s),s.type.match(/^image\//)&&t.options.thumbnail.call(t,s,o.path),n.remove()}))}},{key:"getURI",value:function(){return this.container.data("mediaUri")||""}},{key:"onDropzoneSending",value:function(e,a,t){var n=this.container.closest("form"),r=n.find('[name="__unique_form_id__"]');t.append("__form-name__",n.find('[name="__form-name__"]').val()),r.length&&t.append("__unique_form_id__",r.val()),t.append("__form-file-uploader__",1),t.append("name",this.options.dotNotation),t.append("form-nonce",s.config.form_nonce),t.append("task","filesupload"),t.append("uri",this.getURI())}},{key:"onDropzoneSuccess",value:function(e,a,n){if(this.options.reloadPage&&t.g.location.reload(),a&&"error"===a.status)return this.handleError({file:e,data:a,mode:"removeFile",msg:"

".concat(s.translations.PLUGIN_FORM.FILE_ERROR_UPLOAD," ").concat(e.name,"

\n
").concat(a.message,"
")});if(a&&a.session){e.sessionParams=a.session,e.removeUrl=this.options.url;var r=this.container.find('[name][type="hidden"]'),o=r.val();r.val(o+" ")}return!0}},{key:"onDropzoneComplete",value:function(e){if(!e.accepted&&!e.rejected){var a={status:"error",message:"".concat(s.translations.PLUGIN_FORM.FILE_UNSUPPORTED,": ").concat(e.name.match(/\..+/).join(""))};return this.handleError({file:e,data:a,mode:"removeFile",msg:"

".concat(s.translations.PLUGIN_FORM.FILE_ERROR_ADD," ").concat(e.name,"

\n
").concat(a.message,"
")})}this.options.reloadPage&&t.g.location.reload()}},{key:"onDropzoneRemovedFile",value:function(e){var a=this;if(e.accepted&&!e.rejected){var n=this.container.closest("form"),o=n.find('[name="__unique_form_id__"]'),i=e.removeUrl||this.urls.delete||"".concat(location.href,".json"),l=(i||"").match(/path:(.*)\//),c=new FormData;c.append("filename",e.name),c.append("__form-name__",n.find('[name="__form-name__"]').val()),c.append("name",this.options.dotNotation),c.append("form-nonce",s.config.form_nonce),c.append("uri",this.getURI()),e.sessionParams&&(c.append("__form-file-remover__","1"),c.append("session",e.sessionParams)),o.length&&c.append("__unique_form_id__",o.val()),r().ajax({url:i,data:c,method:"POST",contentType:!1,processData:!1,success:function(){if(l){l=t.g.atob(l[1]);var e=a.container.find('[name][type="hidden"]'),n=JSON.parse(e.val()||"{}");delete n[l],e.val(JSON.stringify(n))}}})}}},{key:"onDropzoneError",value:function(e,a,t){var n=t&&a.error?a.error.message:a;return r()(e.previewElement).find("[data-dz-errormessage]").html(n),this.handleError({file:e,data:{status:"error"},msg:"
".concat(n,"
")})}},{key:"handleError",value:function(e){var a=this,n=e.file,o=e.data,l=e.msg,c=o&&o.status;if("error"!==c&&"unauthorized"!==c)return!1;var d=o&&o.message?o.message:l||s.translations.PLUGIN_FORM.FILEPOND_ERROR_FILESIZE;if(n&&this.dropzone){n.accepted=!1,n.status=i().ERROR,n.rejected=!0;var u=r()(n.previewElement);u.length&&(u.addClass("dz-error"),u.find("[data-dz-errormessage]").html(d)),~this.dropzone.files.indexOf(n)&&setTimeout((function(){a.dropzone.removeFile.call(a.dropzone,n,{silent:!0}),a.dropzone._updateMaxFilesReachedClass()}),100)}var f=this.container.closest(".form-field");if(f.length){var p=f.find(".form-errors");p.length||(p=r()('
').appendTo(f)),p.html('

'.concat(d,"

"))}else"function"==typeof t.g.alert&&t.g.alert(d);return!0}}])&&c(e.prototype,a),n&&c(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,a,n}(),m=[],v=r()(),y=function(e,a){var t=r()(a).find(".dropzone.files-upload");t.length&&t.each((function(e,a){a=r()(a),~v.index(a)||h(a)}))},h=function(e){var a=(e=r()(e)).find('input[type="file"]'),t=e.data("grav-file-settings")||{};t.accept&&~t.accept.indexOf("*")&&(t.accept=[""]);var n={url:e.data("file-url-add")||(e.closest("form").attr("action")||s.config.current_url)+".json",paramName:t.paramName||"file",dotNotation:t.name||"file",acceptedFiles:t.accept?t.accept.join(","):a.attr("accept")||e.data("media-types"),maxFilesize:t.filesize||256,maxFiles:t.limit||null,resizeWidth:t.resizeWidth||null,resizeHeight:t.resizeHeight||null,resizeQuality:t.resizeQuality||null,accept:function(e,a){var n=t.resolution,r="";if(!n)return a();if(null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles)return a(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e);var o=new FileReader;if(!n.min&&(t.resizeWidth||t.resizeHeight||!n.max))return a(r);o.onload=function(e){var o=new Image;o.src=e.target.result,o.onload=function(){var e=this;n.min&&Object.keys(n.min).forEach((function(a){e[a]n.max[a]&&(r+=s.translations.PLUGIN_FORM.RESOLUTION_MAX.replace(/{{attr}}/g,a).replace(/{{max}}/g,n.max[a]))})),a(r)}},o.readAsDataURL(e)}};v=v.add(e),e=e[0],m.push(new p({container:e,options:n}))},g=(r()(document).ready((function(){r()(".dropzone.files-upload").each((function(e,a){return h(a)})),r()("body").on("mutation._grav",y)})),m);void 0===window.GravForm&&(window.GravForm={}),window.GravForm.FilesField={addNode:h,instances:g}},"./app/fields/form.js":(e,a,t)=>{t.r(a);var n=t("jquery"),r=t.n(n);r()(document).ready((function(){var e=r()("form").filter((function(e){return r()(e).find('[name="__form-name__"]')}));e.length&&e.each((function(e,a){!function(e){var a='[data-grav-field="toggleable"] input[type="checkbox"]';(e=r()(e)).on("change",a,(function(e){var a=r()(e.target),t=a.is(":checked"),n=a.closest(".form-field"),o=n.find("label.toggleable"),i=n.find(".form-data"),s=i.find("input, select, textarea, button");o.add(i).css("opacity",t?"":.7),s.map((function(e,a){var n=a.selectize;a=r()(a),n?n[t?"enable":"disable"]():a.prop("disabled",!t)}))})),e.find(a).trigger("change")}(a),function(e){e=r()(e);var a=[];["input","select","label[for]","textarea",".selectize-control"].forEach((function(e){a.push("".concat(".form-field-toggleable .form-data"," ").concat(e))})),e.on("mousedown",a.join(", "),(function(e){var a=r()(e.target),t=a.prop("for"),n=(a.hasClass("selectize-control")||a.parents(".selectize-control")).length;if(t&&(a=r()('[id="'.concat(t,'"]'))),n&&(a=a.closest(".selectize-control").siblings("select[name]")),!a.prop("disabled"))return!0;a.closest(".form-field").find('[data-grav-field="toggleable"] input[type="checkbox"]').trigger("click")}))}(a)}))}))},"./app/fields/index.js":(e,a,t)=>{t.r(a),t.d(a,{default:()=>i});t("./app/fields/form.js");var n=t("./app/fields/file.js"),r=t("./app/fields/array.js"),o=t("./app/fields/media.js");t("./app/fields/tabs.js");const i={FileInstances:n.default,ArrayInstances:r.default,Media:{PageMedia:o.default,PageMediaInstances:o.Instance}}},"./app/fields/media.js":(e,a,t)=>{t.r(a),t.d(a,{Instance:()=>g,default:()=>h});var n=t("jquery"),r=t.n(n),o=t("./app/fields/file.js"),i=t("grav-form"),s=t("./node_modules/sortablejs/modular/sortable.esm.js");function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,a){for(var t=0;t').concat(i.translations.PLUGIN_FORM.DELETE,"\n
").trim(),h=function(e){function a(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.container,o=void 0===n?"#grav-dropzone":n,l=t.options,c=void 0===l?{}:l;!function(e,a){if(!(e instanceof a))throw new TypeError("Cannot call a class as a function")}(this,a);var d,p,v,h=r()("#dropzone-media-template").html()||y;if(c=Object.assign(c,{previewTemplate:h}),d=this,v=[{container:o,options:c}],p=m(p=a),!(e=u(d,f()?Reflect.construct(p,v||[],m(d).constructor):p.apply(d,v))).container.length)return u(e);e.urls={fetch:"".concat(e.container.data("media-url"),"/task").concat(i.config.param_sep,"listmedia"),add:"".concat(e.container.data("media-url"),"/task").concat(i.config.param_sep,"addmedia"),delete:"".concat(e.container.data("media-url"),"/task").concat(i.config.param_sep,"delmedia")},e.dropzone.options.url=e.urls.add,(void 0===e.options.fetchMedia||e.options.fetchMedia)&&e.fetchMedia();var g=r()('[name="'.concat(e.container.data("dropzone-field"),'"]'));return g.length&&(e.sortable=new s.default(e.container.get(0),{animation:150,setData:function(a,t){t=r()(t),e.dropzone.disable(),t.addClass("hide-backface"),a.effectAllowed="copy"},onSort:function(){var a=[];e.container.find("[data-dz-name]").each((function(e,t){var n=(t=r()(t)).text().trim();a.push(n)})),g.val(a.join(","))}})),e}return function(e,a){if("function"!=typeof a&&null!==a)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(a&&a.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),a&&v(e,a)}(a,e),n=a,(o=[{key:"onDropzoneRemovedFile",value:function(e){var a=this;if(e.accepted&&!e.rejected){var n=this.container.closest("form"),o=n.find('[name="__unique_form_id__"]'),s=e.removeUrl||this.urls.delete||"".concat(location.href,".json"),l=(s||"").match(/path:(.*)\//),c=new FormData;c.append("filename",e.name),c.append("__form-name__",n.find('[name="__form-name__"]').val()),o.length&&c.append("__unique_form_id__",o.val()),c.append("name",this.options.dotNotation),c.append("form-nonce",i.config.form_nonce),e.sessionParams&&(c.append("__form-file-remover__","1"),c.append("session",e.sessionParams)),r().ajax({url:s,data:c,method:"POST",contentType:!1,processData:!1,success:function(){if(l){l=t.g.atob(l[1]);var e=a.container.find('[name][type="hidden"]'),n=JSON.parse(e.val()||"{}");delete n[l],e.val(JSON.stringify(n))}}})}}},{key:"fetchMedia",value:function(){var e=this,a={order:this.container.closest(".form-field").find('[name="data[header][media_order]"]').val()},t=this.urls.fetch;r().ajax({url:t,method:"POST",data:a,success:function(a){if("string"==typeof a||a instanceof String)return!1;a=a.results,Object.keys(a).forEach((function(t){var n=a[t],r={name:t,size:n.size,accepted:!0,extras:n};e.dropzone.files.push(r),e.dropzone.options.addedfile.call(e.dropzone,r),e.dropzone.options.thumbnail.call(e.dropzone,r,n.url)})),e.container.find(".dz-preview").prop("draggable","true")}})}},{key:"onDropzoneSending",value:function(e,a,t){t.append("name",this.options.dotNotation),t.append("admin-nonce",i.config.admin_nonce)}},{key:"onDropzoneComplete",value:function(e){p(m(a.prototype),"onDropzoneComplete",this).call(this,e),this.sortable.options.onSort(),r()(".dz-preview").prop("draggable","true")}}])&&c(n.prototype,o),l&&c(n,l),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,o,l}(o.default),g=new h},"./app/fields/tabs.js":(e,a,t)=>{t.r(a);var n=t("jquery"),r=t.n(n);r()("body").on("touchstart click","[data-tabid]",(function(e){e&&e.stopPropagation();var a=r()(e.currentTarget),t=r()('[id="'.concat(a.data("tabid"),'"]'));a.siblings("[data-tabid]").removeClass("active"),a.addClass("active"),t.siblings("[id]").removeClass("active"),t.addClass("active")}))},"./app/main.js":(e,a,t)=>{t.r(a),t.d(a,{Instances:()=>n.default});var n=t("./app/fields/index.js");t("./app/utils/keep-alive.js")},"./app/utils/keep-alive.js":(e,a,t)=>{t.r(a);var n=t("jquery"),r=t.n(n),o=t("grav-form");r()(document).ready((function(){if(r()("[data-grav-keepalive]").length){var e=o.config.session_timeout/1.5*1e3;setInterval((function(){r().ajax({url:"".concat(o.config.base_url_relative,"/task").concat(o.config.param_sep,"keep-alive")})}),Math.min(e,2147483647))}}))},"grav-form":e=>{e.exports=GravForm},jquery:e=>{e.exports=jQuery}},t={};function n(e){var r=t[e];if(void 0!==r)return r.exports;var o=t[e]={id:e,loaded:!1,exports:{}};return a[e](o,o.exports,n),o.loaded=!0,o.exports}n.m=a,e=[],n.O=(a,t,r,o)=>{if(!t){var i=1/0;for(d=0;d=o)&&Object.keys(n.O).every((e=>n.O[e](t[l])))?t.splice(l--,1):(s=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[t,r,o]},n.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return n.d(a,{a}),a},n.d=(e,a)=>{for(var t in a)n.o(a,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:a[t]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e={site:0};n.O.j=a=>0===e[a];var a=(a,t)=>{var r,o,[i,s,l]=t,c=0;if(i.some((a=>0!==e[a]))){for(r in s)n.o(s,r)&&(n.m[r]=s[r]);if(l)var d=l(n)}for(a&&a(t);cn("./app/main.js")));r=n.O(r)})(); \ No newline at end of file diff --git a/plugins/form/assets/form.vendor.js b/plugins/form/assets/form.vendor.js index a226c43..28919a1 100644 --- a/plugins/form/assets/form.vendor.js +++ b/plugins/form/assets/form.vendor.js @@ -1,49 +1 @@ -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["vendor"],{ - -/***/ "./node_modules/dropzone/dist/dropzone.js": -/*!************************************************!*\ - !*** ./node_modules/dropzone/dist/dropzone.js ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/*\n *\n * More info at [www.dropzonejs.com](http://www.dropzonejs.com)\n *\n * Copyright (c) 2012, Matias Meno\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n// The Emitter class provides the ability to call `.on()` on Dropzone to listen\n// to events.\n// It is strongly based on component's emitter class, and I removed the\n// functionality because of the dependency hell with different frameworks.\nvar Emitter =\n/*#__PURE__*/\nfunction () {\n function Emitter() {\n _classCallCheck(this, Emitter);\n }\n\n _createClass(Emitter, [{\n key: \"on\",\n // Add an event listener for given event\n value: function on(event, fn) {\n this._callbacks = this._callbacks || {}; // Create namespace for this event\n\n if (!this._callbacks[event]) {\n this._callbacks[event] = [];\n }\n\n this._callbacks[event].push(fn);\n\n return this;\n }\n }, {\n key: \"emit\",\n value: function emit(event) {\n this._callbacks = this._callbacks || {};\n var callbacks = this._callbacks[event];\n\n if (callbacks) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = callbacks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var callback = _step.value;\n callback.apply(this, args);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) {\n _iterator[\"return\"]();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n\n return this;\n } // Remove event listener for given event. If fn is not provided, all event\n // listeners for that event will be removed. If neither is provided, all\n // event listeners will be removed.\n\n }, {\n key: \"off\",\n value: function off(event, fn) {\n if (!this._callbacks || arguments.length === 0) {\n this._callbacks = {};\n return this;\n } // specific event\n\n\n var callbacks = this._callbacks[event];\n\n if (!callbacks) {\n return this;\n } // remove all handlers\n\n\n if (arguments.length === 1) {\n delete this._callbacks[event];\n return this;\n } // remove specific handler\n\n\n for (var i = 0; i < callbacks.length; i++) {\n var callback = callbacks[i];\n\n if (callback === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n\n return this;\n }\n }]);\n\n return Emitter;\n}();\n\nvar Dropzone =\n/*#__PURE__*/\nfunction (_Emitter) {\n _inherits(Dropzone, _Emitter);\n\n _createClass(Dropzone, null, [{\n key: \"initClass\",\n value: function initClass() {\n // Exposing the emitter class, mainly for tests\n this.prototype.Emitter = Emitter;\n /*\n This is a list of all available events you can register on a dropzone object.\n You can register an event handler like this:\n dropzone.on(\"dragEnter\", function() { });\n */\n\n this.prototype.events = [\"drop\", \"dragstart\", \"dragend\", \"dragenter\", \"dragover\", \"dragleave\", \"addedfile\", \"addedfiles\", \"removedfile\", \"thumbnail\", \"error\", \"errormultiple\", \"processing\", \"processingmultiple\", \"uploadprogress\", \"totaluploadprogress\", \"sending\", \"sendingmultiple\", \"success\", \"successmultiple\", \"canceled\", \"canceledmultiple\", \"complete\", \"completemultiple\", \"reset\", \"maxfilesexceeded\", \"maxfilesreached\", \"queuecomplete\"];\n this.prototype.defaultOptions = {\n /**\n * Has to be specified on elements other than form (or when the form\n * doesn't have an `action` attribute). You can also\n * provide a function that will be called with `files` and\n * must return the url (since `v3.12.0`)\n */\n url: null,\n\n /**\n * Can be changed to `\"put\"` if necessary. You can also provide a function\n * that will be called with `files` and must return the method (since `v3.12.0`).\n */\n method: \"post\",\n\n /**\n * Will be set on the XHRequest.\n */\n withCredentials: false,\n\n /**\n * The timeout for the XHR requests in milliseconds (since `v4.4.0`).\n */\n timeout: 30000,\n\n /**\n * How many file uploads to process in parallel (See the\n * Enqueuing file uploads documentation section for more info)\n */\n parallelUploads: 2,\n\n /**\n * Whether to send multiple files in one request. If\n * this it set to true, then the fallback file input element will\n * have the `multiple` attribute as well. This option will\n * also trigger additional events (like `processingmultiple`). See the events\n * documentation section for more information.\n */\n uploadMultiple: false,\n\n /**\n * Whether you want files to be uploaded in chunks to your server. This can't be\n * used in combination with `uploadMultiple`.\n *\n * See [chunksUploaded](#config-chunksUploaded) for the callback to finalise an upload.\n */\n chunking: false,\n\n /**\n * If `chunking` is enabled, this defines whether **every** file should be chunked,\n * even if the file size is below chunkSize. This means, that the additional chunk\n * form data will be submitted and the `chunksUploaded` callback will be invoked.\n */\n forceChunking: false,\n\n /**\n * If `chunking` is `true`, then this defines the chunk size in bytes.\n */\n chunkSize: 2000000,\n\n /**\n * If `true`, the individual chunks of a file are being uploaded simultaneously.\n */\n parallelChunkUploads: false,\n\n /**\n * Whether a chunk should be retried if it fails.\n */\n retryChunks: false,\n\n /**\n * If `retryChunks` is true, how many times should it be retried.\n */\n retryChunksLimit: 3,\n\n /**\n * If not `null` defines how many files this Dropzone handles. If it exceeds,\n * the event `maxfilesexceeded` will be called. The dropzone element gets the\n * class `dz-max-files-reached` accordingly so you can provide visual feedback.\n */\n maxFilesize: 256,\n\n /**\n * The name of the file param that gets transferred.\n * **NOTE**: If you have the option `uploadMultiple` set to `true`, then\n * Dropzone will append `[]` to the name.\n */\n paramName: \"file\",\n\n /**\n * Whether thumbnails for images should be generated\n */\n createImageThumbnails: true,\n\n /**\n * In MB. When the filename exceeds this limit, the thumbnail will not be generated.\n */\n maxThumbnailFilesize: 10,\n\n /**\n * If `null`, the ratio of the image will be used to calculate it.\n */\n thumbnailWidth: 120,\n\n /**\n * The same as `thumbnailWidth`. If both are null, images will not be resized.\n */\n thumbnailHeight: 120,\n\n /**\n * How the images should be scaled down in case both, `thumbnailWidth` and `thumbnailHeight` are provided.\n * Can be either `contain` or `crop`.\n */\n thumbnailMethod: 'crop',\n\n /**\n * If set, images will be resized to these dimensions before being **uploaded**.\n * If only one, `resizeWidth` **or** `resizeHeight` is provided, the original aspect\n * ratio of the file will be preserved.\n *\n * The `options.transformFile` function uses these options, so if the `transformFile` function\n * is overridden, these options don't do anything.\n */\n resizeWidth: null,\n\n /**\n * See `resizeWidth`.\n */\n resizeHeight: null,\n\n /**\n * The mime type of the resized image (before it gets uploaded to the server).\n * If `null` the original mime type will be used. To force jpeg, for example, use `image/jpeg`.\n * See `resizeWidth` for more information.\n */\n resizeMimeType: null,\n\n /**\n * The quality of the resized images. See `resizeWidth`.\n */\n resizeQuality: 0.8,\n\n /**\n * How the images should be scaled down in case both, `resizeWidth` and `resizeHeight` are provided.\n * Can be either `contain` or `crop`.\n */\n resizeMethod: 'contain',\n\n /**\n * The base that is used to calculate the filesize. You can change this to\n * 1024 if you would rather display kibibytes, mebibytes, etc...\n * 1024 is technically incorrect, because `1024 bytes` are `1 kibibyte` not `1 kilobyte`.\n * You can change this to `1024` if you don't care about validity.\n */\n filesizeBase: 1000,\n\n /**\n * Can be used to limit the maximum number of files that will be handled by this Dropzone\n */\n maxFiles: null,\n\n /**\n * An optional object to send additional headers to the server. Eg:\n * `{ \"My-Awesome-Header\": \"header value\" }`\n */\n headers: null,\n\n /**\n * If `true`, the dropzone element itself will be clickable, if `false`\n * nothing will be clickable.\n *\n * You can also pass an HTML element, a CSS selector (for multiple elements)\n * or an array of those. In that case, all of those elements will trigger an\n * upload when clicked.\n */\n clickable: true,\n\n /**\n * Whether hidden files in directories should be ignored.\n */\n ignoreHiddenFiles: true,\n\n /**\n * The default implementation of `accept` checks the file's mime type or\n * extension against this list. This is a comma separated list of mime\n * types or file extensions.\n *\n * Eg.: `image/*,application/pdf,.psd`\n *\n * If the Dropzone is `clickable` this option will also be used as\n * [`accept`](https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept)\n * parameter on the hidden file input as well.\n */\n acceptedFiles: null,\n\n /**\n * **Deprecated!**\n * Use acceptedFiles instead.\n */\n acceptedMimeTypes: null,\n\n /**\n * If false, files will be added to the queue but the queue will not be\n * processed automatically.\n * This can be useful if you need some additional user input before sending\n * files (or if you want want all files sent at once).\n * If you're ready to send the file simply call `myDropzone.processQueue()`.\n *\n * See the [enqueuing file uploads](#enqueuing-file-uploads) documentation\n * section for more information.\n */\n autoProcessQueue: true,\n\n /**\n * If false, files added to the dropzone will not be queued by default.\n * You'll have to call `enqueueFile(file)` manually.\n */\n autoQueue: true,\n\n /**\n * If `true`, this will add a link to every file preview to remove or cancel (if\n * already uploading) the file. The `dictCancelUpload`, `dictCancelUploadConfirmation`\n * and `dictRemoveFile` options are used for the wording.\n */\n addRemoveLinks: false,\n\n /**\n * Defines where to display the file previews – if `null` the\n * Dropzone element itself is used. Can be a plain `HTMLElement` or a CSS\n * selector. The element should have the `dropzone-previews` class so\n * the previews are displayed properly.\n */\n previewsContainer: null,\n\n /**\n * This is the element the hidden input field (which is used when clicking on the\n * dropzone to trigger file selection) will be appended to. This might\n * be important in case you use frameworks to switch the content of your page.\n *\n * Can be a selector string, or an element directly.\n */\n hiddenInputContainer: \"body\",\n\n /**\n * If null, no capture type will be specified\n * If camera, mobile devices will skip the file selection and choose camera\n * If microphone, mobile devices will skip the file selection and choose the microphone\n * If camcorder, mobile devices will skip the file selection and choose the camera in video mode\n * On apple devices multiple must be set to false. AcceptedFiles may need to\n * be set to an appropriate mime type (e.g. \"image/*\", \"audio/*\", or \"video/*\").\n */\n capture: null,\n\n /**\n * **Deprecated**. Use `renameFile` instead.\n */\n renameFilename: null,\n\n /**\n * A function that is invoked before the file is uploaded to the server and renames the file.\n * This function gets the `File` as argument and can use the `file.name`. The actual name of the\n * file that gets used during the upload can be accessed through `file.upload.filename`.\n */\n renameFile: null,\n\n /**\n * If `true` the fallback will be forced. This is very useful to test your server\n * implementations first and make sure that everything works as\n * expected without dropzone if you experience problems, and to test\n * how your fallbacks will look.\n */\n forceFallback: false,\n\n /**\n * The text used before any files are dropped.\n */\n dictDefaultMessage: \"Drop files here to upload\",\n\n /**\n * The text that replaces the default message text it the browser is not supported.\n */\n dictFallbackMessage: \"Your browser does not support drag'n'drop file uploads.\",\n\n /**\n * The text that will be added before the fallback form.\n * If you provide a fallback element yourself, or if this option is `null` this will\n * be ignored.\n */\n dictFallbackText: \"Please use the fallback form below to upload your files like in the olden days.\",\n\n /**\n * If the filesize is too big.\n * `{{filesize}}` and `{{maxFilesize}}` will be replaced with the respective configuration values.\n */\n dictFileTooBig: \"File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.\",\n\n /**\n * If the file doesn't match the file type.\n */\n dictInvalidFileType: \"You can't upload files of this type.\",\n\n /**\n * If the server response was invalid.\n * `{{statusCode}}` will be replaced with the servers status code.\n */\n dictResponseError: \"Server responded with {{statusCode}} code.\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used for the cancel upload link.\n */\n dictCancelUpload: \"Cancel upload\",\n\n /**\n * The text that is displayed if an upload was manually canceled\n */\n dictUploadCanceled: \"Upload canceled.\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used for confirmation when cancelling upload.\n */\n dictCancelUploadConfirmation: \"Are you sure you want to cancel this upload?\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used to remove a file.\n */\n dictRemoveFile: \"Remove file\",\n\n /**\n * If this is not null, then the user will be prompted before removing a file.\n */\n dictRemoveFileConfirmation: null,\n\n /**\n * Displayed if `maxFiles` is st and exceeded.\n * The string `{{maxFiles}}` will be replaced by the configuration value.\n */\n dictMaxFilesExceeded: \"You can not upload any more files.\",\n\n /**\n * Allows you to translate the different units. Starting with `tb` for terabytes and going down to\n * `b` for bytes.\n */\n dictFileSizeUnits: {\n tb: \"TB\",\n gb: \"GB\",\n mb: \"MB\",\n kb: \"KB\",\n b: \"b\"\n },\n\n /**\n * Called when dropzone initialized\n * You can add event listeners here\n */\n init: function init() {},\n\n /**\n * Can be an **object** of additional parameters to transfer to the server, **or** a `Function`\n * that gets invoked with the `files`, `xhr` and, if it's a chunked upload, `chunk` arguments. In case\n * of a function, this needs to return a map.\n *\n * The default implementation does nothing for normal uploads, but adds relevant information for\n * chunked uploads.\n *\n * This is the same as adding hidden input fields in the form element.\n */\n params: function params(files, xhr, chunk) {\n if (chunk) {\n return {\n dzuuid: chunk.file.upload.uuid,\n dzchunkindex: chunk.index,\n dztotalfilesize: chunk.file.size,\n dzchunksize: this.options.chunkSize,\n dztotalchunkcount: chunk.file.upload.totalChunkCount,\n dzchunkbyteoffset: chunk.index * this.options.chunkSize\n };\n }\n },\n\n /**\n * A function that gets a [file](https://developer.mozilla.org/en-US/docs/DOM/File)\n * and a `done` function as parameters.\n *\n * If the done function is invoked without arguments, the file is \"accepted\" and will\n * be processed. If you pass an error message, the file is rejected, and the error\n * message will be displayed.\n * This function will not be called if the file is too big or doesn't match the mime types.\n */\n accept: function accept(file, done) {\n return done();\n },\n\n /**\n * The callback that will be invoked when all chunks have been uploaded for a file.\n * It gets the file for which the chunks have been uploaded as the first parameter,\n * and the `done` function as second. `done()` needs to be invoked when everything\n * needed to finish the upload process is done.\n */\n chunksUploaded: function chunksUploaded(file, done) {\n done();\n },\n\n /**\n * Gets called when the browser is not supported.\n * The default implementation shows the fallback input field and adds\n * a text.\n */\n fallback: function fallback() {\n // This code should pass in IE7... :(\n var messageElement;\n this.element.className = \"\".concat(this.element.className, \" dz-browser-not-supported\");\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = this.element.getElementsByTagName(\"div\")[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var child = _step2.value;\n\n if (/(^| )dz-message($| )/.test(child.className)) {\n messageElement = child;\n child.className = \"dz-message\"; // Removes the 'dz-default' class\n\n break;\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) {\n _iterator2[\"return\"]();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n if (!messageElement) {\n messageElement = Dropzone.createElement(\"
\");\n this.element.appendChild(messageElement);\n }\n\n var span = messageElement.getElementsByTagName(\"span\")[0];\n\n if (span) {\n if (span.textContent != null) {\n span.textContent = this.options.dictFallbackMessage;\n } else if (span.innerText != null) {\n span.innerText = this.options.dictFallbackMessage;\n }\n }\n\n return this.element.appendChild(this.getFallbackForm());\n },\n\n /**\n * Gets called to calculate the thumbnail dimensions.\n *\n * It gets `file`, `width` and `height` (both may be `null`) as parameters and must return an object containing:\n *\n * - `srcWidth` & `srcHeight` (required)\n * - `trgWidth` & `trgHeight` (required)\n * - `srcX` & `srcY` (optional, default `0`)\n * - `trgX` & `trgY` (optional, default `0`)\n *\n * Those values are going to be used by `ctx.drawImage()`.\n */\n resize: function resize(file, width, height, resizeMethod) {\n var info = {\n srcX: 0,\n srcY: 0,\n srcWidth: file.width,\n srcHeight: file.height\n };\n var srcRatio = file.width / file.height; // Automatically calculate dimensions if not specified\n\n if (width == null && height == null) {\n width = info.srcWidth;\n height = info.srcHeight;\n } else if (width == null) {\n width = height * srcRatio;\n } else if (height == null) {\n height = width / srcRatio;\n } // Make sure images aren't upscaled\n\n\n width = Math.min(width, info.srcWidth);\n height = Math.min(height, info.srcHeight);\n var trgRatio = width / height;\n\n if (info.srcWidth > width || info.srcHeight > height) {\n // Image is bigger and needs rescaling\n if (resizeMethod === 'crop') {\n if (srcRatio > trgRatio) {\n info.srcHeight = file.height;\n info.srcWidth = info.srcHeight * trgRatio;\n } else {\n info.srcWidth = file.width;\n info.srcHeight = info.srcWidth / trgRatio;\n }\n } else if (resizeMethod === 'contain') {\n // Method 'contain'\n if (srcRatio > trgRatio) {\n height = width / srcRatio;\n } else {\n width = height * srcRatio;\n }\n } else {\n throw new Error(\"Unknown resizeMethod '\".concat(resizeMethod, \"'\"));\n }\n }\n\n info.srcX = (file.width - info.srcWidth) / 2;\n info.srcY = (file.height - info.srcHeight) / 2;\n info.trgWidth = width;\n info.trgHeight = height;\n return info;\n },\n\n /**\n * Can be used to transform the file (for example, resize an image if necessary).\n *\n * The default implementation uses `resizeWidth` and `resizeHeight` (if provided) and resizes\n * images according to those dimensions.\n *\n * Gets the `file` as the first parameter, and a `done()` function as the second, that needs\n * to be invoked with the file when the transformation is done.\n */\n transformFile: function transformFile(file, done) {\n if ((this.options.resizeWidth || this.options.resizeHeight) && file.type.match(/image.*/)) {\n return this.resizeImage(file, this.options.resizeWidth, this.options.resizeHeight, this.options.resizeMethod, done);\n } else {\n return done(file);\n }\n },\n\n /**\n * A string that contains the template used for each dropped\n * file. Change it to fulfill your needs but make sure to properly\n * provide all elements.\n *\n * If you want to use an actual HTML element instead of providing a String\n * as a config option, you could create a div with the id `tpl`,\n * put the template inside it and provide the element like this:\n *\n * document\n * .querySelector('#tpl')\n * .innerHTML\n *\n */\n previewTemplate: \"
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n \\n Check\\n \\n \\n \\n \\n
\\n
\\n \\n Error\\n \\n \\n \\n \\n \\n \\n
\\n
\",\n // END OPTIONS\n // (Required by the dropzone documentation parser)\n\n /*\n Those functions register themselves to the events on init and handle all\n the user interface specific stuff. Overwriting them won't break the upload\n but can break the way it's displayed.\n You can overwrite them if you don't like the default behavior. If you just\n want to add an additional event handler, register it on the dropzone object\n and don't overwrite those options.\n */\n // Those are self explanatory and simply concern the DragnDrop.\n drop: function drop(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n dragstart: function dragstart(e) {},\n dragend: function dragend(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n dragenter: function dragenter(e) {\n return this.element.classList.add(\"dz-drag-hover\");\n },\n dragover: function dragover(e) {\n return this.element.classList.add(\"dz-drag-hover\");\n },\n dragleave: function dragleave(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n paste: function paste(e) {},\n // Called whenever there are no files left in the dropzone anymore, and the\n // dropzone should be displayed as if in the initial state.\n reset: function reset() {\n return this.element.classList.remove(\"dz-started\");\n },\n // Called when a file is added to the queue\n // Receives `file`\n addedfile: function addedfile(file) {\n var _this2 = this;\n\n if (this.element === this.previewsContainer) {\n this.element.classList.add(\"dz-started\");\n }\n\n if (this.previewsContainer) {\n file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim());\n file.previewTemplate = file.previewElement; // Backwards compatibility\n\n this.previewsContainer.appendChild(file.previewElement);\n var _iteratorNormalCompletion3 = true;\n var _didIteratorError3 = false;\n var _iteratorError3 = undefined;\n\n try {\n for (var _iterator3 = file.previewElement.querySelectorAll(\"[data-dz-name]\")[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n var node = _step3.value;\n node.textContent = file.name;\n }\n } catch (err) {\n _didIteratorError3 = true;\n _iteratorError3 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion3 && _iterator3[\"return\"] != null) {\n _iterator3[\"return\"]();\n }\n } finally {\n if (_didIteratorError3) {\n throw _iteratorError3;\n }\n }\n }\n\n var _iteratorNormalCompletion4 = true;\n var _didIteratorError4 = false;\n var _iteratorError4 = undefined;\n\n try {\n for (var _iterator4 = file.previewElement.querySelectorAll(\"[data-dz-size]\")[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n node = _step4.value;\n node.innerHTML = this.filesize(file.size);\n }\n } catch (err) {\n _didIteratorError4 = true;\n _iteratorError4 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion4 && _iterator4[\"return\"] != null) {\n _iterator4[\"return\"]();\n }\n } finally {\n if (_didIteratorError4) {\n throw _iteratorError4;\n }\n }\n }\n\n if (this.options.addRemoveLinks) {\n file._removeLink = Dropzone.createElement(\"\".concat(this.options.dictRemoveFile, \"\"));\n file.previewElement.appendChild(file._removeLink);\n }\n\n var removeFileEvent = function removeFileEvent(e) {\n e.preventDefault();\n e.stopPropagation();\n\n if (file.status === Dropzone.UPLOADING) {\n return Dropzone.confirm(_this2.options.dictCancelUploadConfirmation, function () {\n return _this2.removeFile(file);\n });\n } else {\n if (_this2.options.dictRemoveFileConfirmation) {\n return Dropzone.confirm(_this2.options.dictRemoveFileConfirmation, function () {\n return _this2.removeFile(file);\n });\n } else {\n return _this2.removeFile(file);\n }\n }\n };\n\n var _iteratorNormalCompletion5 = true;\n var _didIteratorError5 = false;\n var _iteratorError5 = undefined;\n\n try {\n for (var _iterator5 = file.previewElement.querySelectorAll(\"[data-dz-remove]\")[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {\n var removeLink = _step5.value;\n removeLink.addEventListener(\"click\", removeFileEvent);\n }\n } catch (err) {\n _didIteratorError5 = true;\n _iteratorError5 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion5 && _iterator5[\"return\"] != null) {\n _iterator5[\"return\"]();\n }\n } finally {\n if (_didIteratorError5) {\n throw _iteratorError5;\n }\n }\n }\n }\n },\n // Called whenever a file is removed.\n removedfile: function removedfile(file) {\n if (file.previewElement != null && file.previewElement.parentNode != null) {\n file.previewElement.parentNode.removeChild(file.previewElement);\n }\n\n return this._updateMaxFilesReachedClass();\n },\n // Called when a thumbnail has been generated\n // Receives `file` and `dataUrl`\n thumbnail: function thumbnail(file, dataUrl) {\n if (file.previewElement) {\n file.previewElement.classList.remove(\"dz-file-preview\");\n var _iteratorNormalCompletion6 = true;\n var _didIteratorError6 = false;\n var _iteratorError6 = undefined;\n\n try {\n for (var _iterator6 = file.previewElement.querySelectorAll(\"[data-dz-thumbnail]\")[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {\n var thumbnailElement = _step6.value;\n thumbnailElement.alt = file.name;\n thumbnailElement.src = dataUrl;\n }\n } catch (err) {\n _didIteratorError6 = true;\n _iteratorError6 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion6 && _iterator6[\"return\"] != null) {\n _iterator6[\"return\"]();\n }\n } finally {\n if (_didIteratorError6) {\n throw _iteratorError6;\n }\n }\n }\n\n return setTimeout(function () {\n return file.previewElement.classList.add(\"dz-image-preview\");\n }, 1);\n }\n },\n // Called whenever an error occurs\n // Receives `file` and `message`\n error: function error(file, message) {\n if (file.previewElement) {\n file.previewElement.classList.add(\"dz-error\");\n\n if (typeof message !== \"String\" && message.error) {\n message = message.error;\n }\n\n var _iteratorNormalCompletion7 = true;\n var _didIteratorError7 = false;\n var _iteratorError7 = undefined;\n\n try {\n for (var _iterator7 = file.previewElement.querySelectorAll(\"[data-dz-errormessage]\")[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {\n var node = _step7.value;\n node.textContent = message;\n }\n } catch (err) {\n _didIteratorError7 = true;\n _iteratorError7 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion7 && _iterator7[\"return\"] != null) {\n _iterator7[\"return\"]();\n }\n } finally {\n if (_didIteratorError7) {\n throw _iteratorError7;\n }\n }\n }\n }\n },\n errormultiple: function errormultiple() {},\n // Called when a file gets processed. Since there is a cue, not all added\n // files are processed immediately.\n // Receives `file`\n processing: function processing(file) {\n if (file.previewElement) {\n file.previewElement.classList.add(\"dz-processing\");\n\n if (file._removeLink) {\n return file._removeLink.innerHTML = this.options.dictCancelUpload;\n }\n }\n },\n processingmultiple: function processingmultiple() {},\n // Called whenever the upload progress gets updated.\n // Receives `file`, `progress` (percentage 0-100) and `bytesSent`.\n // To get the total number of bytes of the file, use `file.size`\n uploadprogress: function uploadprogress(file, progress, bytesSent) {\n if (file.previewElement) {\n var _iteratorNormalCompletion8 = true;\n var _didIteratorError8 = false;\n var _iteratorError8 = undefined;\n\n try {\n for (var _iterator8 = file.previewElement.querySelectorAll(\"[data-dz-uploadprogress]\")[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {\n var node = _step8.value;\n node.nodeName === 'PROGRESS' ? node.value = progress : node.style.width = \"\".concat(progress, \"%\");\n }\n } catch (err) {\n _didIteratorError8 = true;\n _iteratorError8 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion8 && _iterator8[\"return\"] != null) {\n _iterator8[\"return\"]();\n }\n } finally {\n if (_didIteratorError8) {\n throw _iteratorError8;\n }\n }\n }\n }\n },\n // Called whenever the total upload progress gets updated.\n // Called with totalUploadProgress (0-100), totalBytes and totalBytesSent\n totaluploadprogress: function totaluploadprogress() {},\n // Called just before the file is sent. Gets the `xhr` object as second\n // parameter, so you can modify it (for example to add a CSRF token) and a\n // `formData` object to add additional information.\n sending: function sending() {},\n sendingmultiple: function sendingmultiple() {},\n // When the complete upload is finished and successful\n // Receives `file`\n success: function success(file) {\n if (file.previewElement) {\n return file.previewElement.classList.add(\"dz-success\");\n }\n },\n successmultiple: function successmultiple() {},\n // When the upload is canceled.\n canceled: function canceled(file) {\n return this.emit(\"error\", file, this.options.dictUploadCanceled);\n },\n canceledmultiple: function canceledmultiple() {},\n // When the upload is finished, either with success or an error.\n // Receives `file`\n complete: function complete(file) {\n if (file._removeLink) {\n file._removeLink.innerHTML = this.options.dictRemoveFile;\n }\n\n if (file.previewElement) {\n return file.previewElement.classList.add(\"dz-complete\");\n }\n },\n completemultiple: function completemultiple() {},\n maxfilesexceeded: function maxfilesexceeded() {},\n maxfilesreached: function maxfilesreached() {},\n queuecomplete: function queuecomplete() {},\n addedfiles: function addedfiles() {}\n };\n this.prototype._thumbnailQueue = [];\n this.prototype._processingThumbnail = false;\n } // global utility\n\n }, {\n key: \"extend\",\n value: function extend(target) {\n for (var _len2 = arguments.length, objects = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n objects[_key2 - 1] = arguments[_key2];\n }\n\n for (var _i = 0, _objects = objects; _i < _objects.length; _i++) {\n var object = _objects[_i];\n\n for (var key in object) {\n var val = object[key];\n target[key] = val;\n }\n }\n\n return target;\n }\n }]);\n\n function Dropzone(el, options) {\n var _this;\n\n _classCallCheck(this, Dropzone);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(Dropzone).call(this));\n var fallback, left;\n _this.element = el; // For backwards compatibility since the version was in the prototype previously\n\n _this.version = Dropzone.version;\n _this.defaultOptions.previewTemplate = _this.defaultOptions.previewTemplate.replace(/\\n*/g, \"\");\n _this.clickableElements = [];\n _this.listeners = [];\n _this.files = []; // All files\n\n if (typeof _this.element === \"string\") {\n _this.element = document.querySelector(_this.element);\n } // Not checking if instance of HTMLElement or Element since IE9 is extremely weird.\n\n\n if (!_this.element || _this.element.nodeType == null) {\n throw new Error(\"Invalid dropzone element.\");\n }\n\n if (_this.element.dropzone) {\n throw new Error(\"Dropzone already attached.\");\n } // Now add this dropzone to the instances.\n\n\n Dropzone.instances.push(_assertThisInitialized(_this)); // Put the dropzone inside the element itself.\n\n _this.element.dropzone = _assertThisInitialized(_this);\n var elementOptions = (left = Dropzone.optionsForElement(_this.element)) != null ? left : {};\n _this.options = Dropzone.extend({}, _this.defaultOptions, elementOptions, options != null ? options : {}); // If the browser failed, just call the fallback and leave\n\n if (_this.options.forceFallback || !Dropzone.isBrowserSupported()) {\n return _possibleConstructorReturn(_this, _this.options.fallback.call(_assertThisInitialized(_this)));\n } // @options.url = @element.getAttribute \"action\" unless @options.url?\n\n\n if (_this.options.url == null) {\n _this.options.url = _this.element.getAttribute(\"action\");\n }\n\n if (!_this.options.url) {\n throw new Error(\"No URL provided.\");\n }\n\n if (_this.options.acceptedFiles && _this.options.acceptedMimeTypes) {\n throw new Error(\"You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.\");\n }\n\n if (_this.options.uploadMultiple && _this.options.chunking) {\n throw new Error('You cannot set both: uploadMultiple and chunking.');\n } // Backwards compatibility\n\n\n if (_this.options.acceptedMimeTypes) {\n _this.options.acceptedFiles = _this.options.acceptedMimeTypes;\n delete _this.options.acceptedMimeTypes;\n } // Backwards compatibility\n\n\n if (_this.options.renameFilename != null) {\n _this.options.renameFile = function (file) {\n return _this.options.renameFilename.call(_assertThisInitialized(_this), file.name, file);\n };\n }\n\n _this.options.method = _this.options.method.toUpperCase();\n\n if ((fallback = _this.getExistingFallback()) && fallback.parentNode) {\n // Remove the fallback\n fallback.parentNode.removeChild(fallback);\n } // Display previews in the previewsContainer element or the Dropzone element unless explicitly set to false\n\n\n if (_this.options.previewsContainer !== false) {\n if (_this.options.previewsContainer) {\n _this.previewsContainer = Dropzone.getElement(_this.options.previewsContainer, \"previewsContainer\");\n } else {\n _this.previewsContainer = _this.element;\n }\n }\n\n if (_this.options.clickable) {\n if (_this.options.clickable === true) {\n _this.clickableElements = [_this.element];\n } else {\n _this.clickableElements = Dropzone.getElements(_this.options.clickable, \"clickable\");\n }\n }\n\n _this.init();\n\n return _this;\n } // Returns all files that have been accepted\n\n\n _createClass(Dropzone, [{\n key: \"getAcceptedFiles\",\n value: function getAcceptedFiles() {\n return this.files.filter(function (file) {\n return file.accepted;\n }).map(function (file) {\n return file;\n });\n } // Returns all files that have been rejected\n // Not sure when that's going to be useful, but added for completeness.\n\n }, {\n key: \"getRejectedFiles\",\n value: function getRejectedFiles() {\n return this.files.filter(function (file) {\n return !file.accepted;\n }).map(function (file) {\n return file;\n });\n }\n }, {\n key: \"getFilesWithStatus\",\n value: function getFilesWithStatus(status) {\n return this.files.filter(function (file) {\n return file.status === status;\n }).map(function (file) {\n return file;\n });\n } // Returns all files that are in the queue\n\n }, {\n key: \"getQueuedFiles\",\n value: function getQueuedFiles() {\n return this.getFilesWithStatus(Dropzone.QUEUED);\n }\n }, {\n key: \"getUploadingFiles\",\n value: function getUploadingFiles() {\n return this.getFilesWithStatus(Dropzone.UPLOADING);\n }\n }, {\n key: \"getAddedFiles\",\n value: function getAddedFiles() {\n return this.getFilesWithStatus(Dropzone.ADDED);\n } // Files that are either queued or uploading\n\n }, {\n key: \"getActiveFiles\",\n value: function getActiveFiles() {\n return this.files.filter(function (file) {\n return file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED;\n }).map(function (file) {\n return file;\n });\n } // The function that gets called when Dropzone is initialized. You\n // can (and should) setup event listeners inside this function.\n\n }, {\n key: \"init\",\n value: function init() {\n var _this3 = this;\n\n // In case it isn't set already\n if (this.element.tagName === \"form\") {\n this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n }\n\n if (this.element.classList.contains(\"dropzone\") && !this.element.querySelector(\".dz-message\")) {\n this.element.appendChild(Dropzone.createElement(\"
\")));\n }\n\n if (this.clickableElements.length) {\n var setupHiddenFileInput = function setupHiddenFileInput() {\n if (_this3.hiddenFileInput) {\n _this3.hiddenFileInput.parentNode.removeChild(_this3.hiddenFileInput);\n }\n\n _this3.hiddenFileInput = document.createElement(\"input\");\n\n _this3.hiddenFileInput.setAttribute(\"type\", \"file\");\n\n if (_this3.options.maxFiles === null || _this3.options.maxFiles > 1) {\n _this3.hiddenFileInput.setAttribute(\"multiple\", \"multiple\");\n }\n\n _this3.hiddenFileInput.className = \"dz-hidden-input\";\n\n if (_this3.options.acceptedFiles !== null) {\n _this3.hiddenFileInput.setAttribute(\"accept\", _this3.options.acceptedFiles);\n }\n\n if (_this3.options.capture !== null) {\n _this3.hiddenFileInput.setAttribute(\"capture\", _this3.options.capture);\n } // Not setting `display=\"none\"` because some browsers don't accept clicks\n // on elements that aren't displayed.\n\n\n _this3.hiddenFileInput.style.visibility = \"hidden\";\n _this3.hiddenFileInput.style.position = \"absolute\";\n _this3.hiddenFileInput.style.top = \"0\";\n _this3.hiddenFileInput.style.left = \"0\";\n _this3.hiddenFileInput.style.height = \"0\";\n _this3.hiddenFileInput.style.width = \"0\";\n Dropzone.getElement(_this3.options.hiddenInputContainer, 'hiddenInputContainer').appendChild(_this3.hiddenFileInput);\n return _this3.hiddenFileInput.addEventListener(\"change\", function () {\n var files = _this3.hiddenFileInput.files;\n\n if (files.length) {\n var _iteratorNormalCompletion9 = true;\n var _didIteratorError9 = false;\n var _iteratorError9 = undefined;\n\n try {\n for (var _iterator9 = files[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {\n var file = _step9.value;\n\n _this3.addFile(file);\n }\n } catch (err) {\n _didIteratorError9 = true;\n _iteratorError9 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion9 && _iterator9[\"return\"] != null) {\n _iterator9[\"return\"]();\n }\n } finally {\n if (_didIteratorError9) {\n throw _iteratorError9;\n }\n }\n }\n }\n\n _this3.emit(\"addedfiles\", files);\n\n return setupHiddenFileInput();\n });\n };\n\n setupHiddenFileInput();\n }\n\n this.URL = window.URL !== null ? window.URL : window.webkitURL; // Setup all event listeners on the Dropzone object itself.\n // They're not in @setupEventListeners() because they shouldn't be removed\n // again when the dropzone gets disabled.\n\n var _iteratorNormalCompletion10 = true;\n var _didIteratorError10 = false;\n var _iteratorError10 = undefined;\n\n try {\n for (var _iterator10 = this.events[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {\n var eventName = _step10.value;\n this.on(eventName, this.options[eventName]);\n }\n } catch (err) {\n _didIteratorError10 = true;\n _iteratorError10 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion10 && _iterator10[\"return\"] != null) {\n _iterator10[\"return\"]();\n }\n } finally {\n if (_didIteratorError10) {\n throw _iteratorError10;\n }\n }\n }\n\n this.on(\"uploadprogress\", function () {\n return _this3.updateTotalUploadProgress();\n });\n this.on(\"removedfile\", function () {\n return _this3.updateTotalUploadProgress();\n });\n this.on(\"canceled\", function (file) {\n return _this3.emit(\"complete\", file);\n }); // Emit a `queuecomplete` event if all files finished uploading.\n\n this.on(\"complete\", function (file) {\n if (_this3.getAddedFiles().length === 0 && _this3.getUploadingFiles().length === 0 && _this3.getQueuedFiles().length === 0) {\n // This needs to be deferred so that `queuecomplete` really triggers after `complete`\n return setTimeout(function () {\n return _this3.emit(\"queuecomplete\");\n }, 0);\n }\n });\n\n var containsFiles = function containsFiles(e) {\n if (e.dataTransfer.types) {\n // Because e.dataTransfer.types is an Object in\n // IE, we need to iterate like this instead of\n // using e.dataTransfer.types.some()\n for (var i = 0; i < e.dataTransfer.types.length; i++) {\n if (e.dataTransfer.types[i] === \"Files\") return true;\n }\n }\n\n return false;\n };\n\n var noPropagation = function noPropagation(e) {\n // If there are no files, we don't want to stop\n // propagation so we don't interfere with other\n // drag and drop behaviour.\n if (!containsFiles(e)) return;\n e.stopPropagation();\n\n if (e.preventDefault) {\n return e.preventDefault();\n } else {\n return e.returnValue = false;\n }\n }; // Create the listeners\n\n\n this.listeners = [{\n element: this.element,\n events: {\n \"dragstart\": function dragstart(e) {\n return _this3.emit(\"dragstart\", e);\n },\n \"dragenter\": function dragenter(e) {\n noPropagation(e);\n return _this3.emit(\"dragenter\", e);\n },\n \"dragover\": function dragover(e) {\n // Makes it possible to drag files from chrome's download bar\n // http://stackoverflow.com/questions/19526430/drag-and-drop-file-uploads-from-chrome-downloads-bar\n // Try is required to prevent bug in Internet Explorer 11 (SCRIPT65535 exception)\n var efct;\n\n try {\n efct = e.dataTransfer.effectAllowed;\n } catch (error) {}\n\n e.dataTransfer.dropEffect = 'move' === efct || 'linkMove' === efct ? 'move' : 'copy';\n noPropagation(e);\n return _this3.emit(\"dragover\", e);\n },\n \"dragleave\": function dragleave(e) {\n return _this3.emit(\"dragleave\", e);\n },\n \"drop\": function drop(e) {\n noPropagation(e);\n return _this3.drop(e);\n },\n \"dragend\": function dragend(e) {\n return _this3.emit(\"dragend\", e);\n }\n } // This is disabled right now, because the browsers don't implement it properly.\n // \"paste\": (e) =>\n // noPropagation e\n // @paste e\n\n }];\n this.clickableElements.forEach(function (clickableElement) {\n return _this3.listeners.push({\n element: clickableElement,\n events: {\n \"click\": function click(evt) {\n // Only the actual dropzone or the message element should trigger file selection\n if (clickableElement !== _this3.element || evt.target === _this3.element || Dropzone.elementInside(evt.target, _this3.element.querySelector(\".dz-message\"))) {\n _this3.hiddenFileInput.click(); // Forward the click\n\n }\n\n return true;\n }\n }\n });\n });\n this.enable();\n return this.options.init.call(this);\n } // Not fully tested yet\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.disable();\n this.removeAllFiles(true);\n\n if (this.hiddenFileInput != null ? this.hiddenFileInput.parentNode : undefined) {\n this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);\n this.hiddenFileInput = null;\n }\n\n delete this.element.dropzone;\n return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1);\n }\n }, {\n key: \"updateTotalUploadProgress\",\n value: function updateTotalUploadProgress() {\n var totalUploadProgress;\n var totalBytesSent = 0;\n var totalBytes = 0;\n var activeFiles = this.getActiveFiles();\n\n if (activeFiles.length) {\n var _iteratorNormalCompletion11 = true;\n var _didIteratorError11 = false;\n var _iteratorError11 = undefined;\n\n try {\n for (var _iterator11 = this.getActiveFiles()[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {\n var file = _step11.value;\n totalBytesSent += file.upload.bytesSent;\n totalBytes += file.upload.total;\n }\n } catch (err) {\n _didIteratorError11 = true;\n _iteratorError11 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion11 && _iterator11[\"return\"] != null) {\n _iterator11[\"return\"]();\n }\n } finally {\n if (_didIteratorError11) {\n throw _iteratorError11;\n }\n }\n }\n\n totalUploadProgress = 100 * totalBytesSent / totalBytes;\n } else {\n totalUploadProgress = 100;\n }\n\n return this.emit(\"totaluploadprogress\", totalUploadProgress, totalBytes, totalBytesSent);\n } // @options.paramName can be a function taking one parameter rather than a string.\n // A parameter name for a file is obtained simply by calling this with an index number.\n\n }, {\n key: \"_getParamName\",\n value: function _getParamName(n) {\n if (typeof this.options.paramName === \"function\") {\n return this.options.paramName(n);\n } else {\n return \"\".concat(this.options.paramName).concat(this.options.uploadMultiple ? \"[\".concat(n, \"]\") : \"\");\n }\n } // If @options.renameFile is a function,\n // the function will be used to rename the file.name before appending it to the formData\n\n }, {\n key: \"_renameFile\",\n value: function _renameFile(file) {\n if (typeof this.options.renameFile !== \"function\") {\n return file.name;\n }\n\n return this.options.renameFile(file);\n } // Returns a form that can be used as fallback if the browser does not support DragnDrop\n //\n // If the dropzone is already a form, only the input field and button are returned. Otherwise a complete form element is provided.\n // This code has to pass in IE7 :(\n\n }, {\n key: \"getFallbackForm\",\n value: function getFallbackForm() {\n var existingFallback, form;\n\n if (existingFallback = this.getExistingFallback()) {\n return existingFallback;\n }\n\n var fieldsString = \"
\";\n\n if (this.options.dictFallbackText) {\n fieldsString += \"

\".concat(this.options.dictFallbackText, \"

\");\n }\n\n fieldsString += \"
\");\n var fields = Dropzone.createElement(fieldsString);\n\n if (this.element.tagName !== \"FORM\") {\n form = Dropzone.createElement(\"\"));\n form.appendChild(fields);\n } else {\n // Make sure that the enctype and method attributes are set properly\n this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n this.element.setAttribute(\"method\", this.options.method);\n }\n\n return form != null ? form : fields;\n } // Returns the fallback elements if they exist already\n //\n // This code has to pass in IE7 :(\n\n }, {\n key: \"getExistingFallback\",\n value: function getExistingFallback() {\n var getFallback = function getFallback(elements) {\n var _iteratorNormalCompletion12 = true;\n var _didIteratorError12 = false;\n var _iteratorError12 = undefined;\n\n try {\n for (var _iterator12 = elements[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) {\n var el = _step12.value;\n\n if (/(^| )fallback($| )/.test(el.className)) {\n return el;\n }\n }\n } catch (err) {\n _didIteratorError12 = true;\n _iteratorError12 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion12 && _iterator12[\"return\"] != null) {\n _iterator12[\"return\"]();\n }\n } finally {\n if (_didIteratorError12) {\n throw _iteratorError12;\n }\n }\n }\n };\n\n for (var _i2 = 0, _arr = [\"div\", \"form\"]; _i2 < _arr.length; _i2++) {\n var tagName = _arr[_i2];\n var fallback;\n\n if (fallback = getFallback(this.element.getElementsByTagName(tagName))) {\n return fallback;\n }\n }\n } // Activates all listeners stored in @listeners\n\n }, {\n key: \"setupEventListeners\",\n value: function setupEventListeners() {\n return this.listeners.map(function (elementListeners) {\n return function () {\n var result = [];\n\n for (var event in elementListeners.events) {\n var listener = elementListeners.events[event];\n result.push(elementListeners.element.addEventListener(event, listener, false));\n }\n\n return result;\n }();\n });\n } // Deactivates all listeners stored in @listeners\n\n }, {\n key: \"removeEventListeners\",\n value: function removeEventListeners() {\n return this.listeners.map(function (elementListeners) {\n return function () {\n var result = [];\n\n for (var event in elementListeners.events) {\n var listener = elementListeners.events[event];\n result.push(elementListeners.element.removeEventListener(event, listener, false));\n }\n\n return result;\n }();\n });\n } // Removes all event listeners and cancels all files in the queue or being processed.\n\n }, {\n key: \"disable\",\n value: function disable() {\n var _this4 = this;\n\n this.clickableElements.forEach(function (element) {\n return element.classList.remove(\"dz-clickable\");\n });\n this.removeEventListeners();\n this.disabled = true;\n return this.files.map(function (file) {\n return _this4.cancelUpload(file);\n });\n }\n }, {\n key: \"enable\",\n value: function enable() {\n delete this.disabled;\n this.clickableElements.forEach(function (element) {\n return element.classList.add(\"dz-clickable\");\n });\n return this.setupEventListeners();\n } // Returns a nicely formatted filesize\n\n }, {\n key: \"filesize\",\n value: function filesize(size) {\n var selectedSize = 0;\n var selectedUnit = \"b\";\n\n if (size > 0) {\n var units = ['tb', 'gb', 'mb', 'kb', 'b'];\n\n for (var i = 0; i < units.length; i++) {\n var unit = units[i];\n var cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10;\n\n if (size >= cutoff) {\n selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i);\n selectedUnit = unit;\n break;\n }\n }\n\n selectedSize = Math.round(10 * selectedSize) / 10; // Cutting of digits\n }\n\n return \"\".concat(selectedSize, \" \").concat(this.options.dictFileSizeUnits[selectedUnit]);\n } // Adds or removes the `dz-max-files-reached` class from the form.\n\n }, {\n key: \"_updateMaxFilesReachedClass\",\n value: function _updateMaxFilesReachedClass() {\n if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n if (this.getAcceptedFiles().length === this.options.maxFiles) {\n this.emit('maxfilesreached', this.files);\n }\n\n return this.element.classList.add(\"dz-max-files-reached\");\n } else {\n return this.element.classList.remove(\"dz-max-files-reached\");\n }\n }\n }, {\n key: \"drop\",\n value: function drop(e) {\n if (!e.dataTransfer) {\n return;\n }\n\n this.emit(\"drop\", e); // Convert the FileList to an Array\n // This is necessary for IE11\n\n var files = [];\n\n for (var i = 0; i < e.dataTransfer.files.length; i++) {\n files[i] = e.dataTransfer.files[i];\n } // Even if it's a folder, files.length will contain the folders.\n\n\n if (files.length) {\n var items = e.dataTransfer.items;\n\n if (items && items.length && items[0].webkitGetAsEntry != null) {\n // The browser supports dropping of folders, so handle items instead of files\n this._addFilesFromItems(items);\n } else {\n this.handleFiles(files);\n }\n }\n\n this.emit(\"addedfiles\", files);\n }\n }, {\n key: \"paste\",\n value: function paste(e) {\n if (__guard__(e != null ? e.clipboardData : undefined, function (x) {\n return x.items;\n }) == null) {\n return;\n }\n\n this.emit(\"paste\", e);\n var items = e.clipboardData.items;\n\n if (items.length) {\n return this._addFilesFromItems(items);\n }\n }\n }, {\n key: \"handleFiles\",\n value: function handleFiles(files) {\n var _iteratorNormalCompletion13 = true;\n var _didIteratorError13 = false;\n var _iteratorError13 = undefined;\n\n try {\n for (var _iterator13 = files[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) {\n var file = _step13.value;\n this.addFile(file);\n }\n } catch (err) {\n _didIteratorError13 = true;\n _iteratorError13 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion13 && _iterator13[\"return\"] != null) {\n _iterator13[\"return\"]();\n }\n } finally {\n if (_didIteratorError13) {\n throw _iteratorError13;\n }\n }\n }\n } // When a folder is dropped (or files are pasted), items must be handled\n // instead of files.\n\n }, {\n key: \"_addFilesFromItems\",\n value: function _addFilesFromItems(items) {\n var _this5 = this;\n\n return function () {\n var result = [];\n var _iteratorNormalCompletion14 = true;\n var _didIteratorError14 = false;\n var _iteratorError14 = undefined;\n\n try {\n for (var _iterator14 = items[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) {\n var item = _step14.value;\n var entry;\n\n if (item.webkitGetAsEntry != null && (entry = item.webkitGetAsEntry())) {\n if (entry.isFile) {\n result.push(_this5.addFile(item.getAsFile()));\n } else if (entry.isDirectory) {\n // Append all files from that directory to files\n result.push(_this5._addFilesFromDirectory(entry, entry.name));\n } else {\n result.push(undefined);\n }\n } else if (item.getAsFile != null) {\n if (item.kind == null || item.kind === \"file\") {\n result.push(_this5.addFile(item.getAsFile()));\n } else {\n result.push(undefined);\n }\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _didIteratorError14 = true;\n _iteratorError14 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion14 && _iterator14[\"return\"] != null) {\n _iterator14[\"return\"]();\n }\n } finally {\n if (_didIteratorError14) {\n throw _iteratorError14;\n }\n }\n }\n\n return result;\n }();\n } // Goes through the directory, and adds each file it finds recursively\n\n }, {\n key: \"_addFilesFromDirectory\",\n value: function _addFilesFromDirectory(directory, path) {\n var _this6 = this;\n\n var dirReader = directory.createReader();\n\n var errorHandler = function errorHandler(error) {\n return __guardMethod__(console, 'log', function (o) {\n return o.log(error);\n });\n };\n\n var readEntries = function readEntries() {\n return dirReader.readEntries(function (entries) {\n if (entries.length > 0) {\n var _iteratorNormalCompletion15 = true;\n var _didIteratorError15 = false;\n var _iteratorError15 = undefined;\n\n try {\n for (var _iterator15 = entries[Symbol.iterator](), _step15; !(_iteratorNormalCompletion15 = (_step15 = _iterator15.next()).done); _iteratorNormalCompletion15 = true) {\n var entry = _step15.value;\n\n if (entry.isFile) {\n entry.file(function (file) {\n if (_this6.options.ignoreHiddenFiles && file.name.substring(0, 1) === '.') {\n return;\n }\n\n file.fullPath = \"\".concat(path, \"/\").concat(file.name);\n return _this6.addFile(file);\n });\n } else if (entry.isDirectory) {\n _this6._addFilesFromDirectory(entry, \"\".concat(path, \"/\").concat(entry.name));\n }\n } // Recursively call readEntries() again, since browser only handle\n // the first 100 entries.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/DirectoryReader#readEntries\n\n } catch (err) {\n _didIteratorError15 = true;\n _iteratorError15 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion15 && _iterator15[\"return\"] != null) {\n _iterator15[\"return\"]();\n }\n } finally {\n if (_didIteratorError15) {\n throw _iteratorError15;\n }\n }\n }\n\n readEntries();\n }\n\n return null;\n }, errorHandler);\n };\n\n return readEntries();\n } // If `done()` is called without argument the file is accepted\n // If you call it with an error message, the file is rejected\n // (This allows for asynchronous validation)\n //\n // This function checks the filesize, and if the file.type passes the\n // `acceptedFiles` check.\n\n }, {\n key: \"accept\",\n value: function accept(file, done) {\n if (this.options.maxFilesize && file.size > this.options.maxFilesize * 1024 * 1024) {\n done(this.options.dictFileTooBig.replace(\"{{filesize}}\", Math.round(file.size / 1024 / 10.24) / 100).replace(\"{{maxFilesize}}\", this.options.maxFilesize));\n } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) {\n done(this.options.dictInvalidFileType);\n } else if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n done(this.options.dictMaxFilesExceeded.replace(\"{{maxFiles}}\", this.options.maxFiles));\n this.emit(\"maxfilesexceeded\", file);\n } else {\n this.options.accept.call(this, file, done);\n }\n }\n }, {\n key: \"addFile\",\n value: function addFile(file) {\n var _this7 = this;\n\n file.upload = {\n uuid: Dropzone.uuidv4(),\n progress: 0,\n // Setting the total upload size to file.size for the beginning\n // It's actual different than the size to be transmitted.\n total: file.size,\n bytesSent: 0,\n filename: this._renameFile(file) // Not setting chunking information here, because the acutal data — and\n // thus the chunks — might change if `options.transformFile` is set\n // and does something to the data.\n\n };\n this.files.push(file);\n file.status = Dropzone.ADDED;\n this.emit(\"addedfile\", file);\n\n this._enqueueThumbnail(file);\n\n this.accept(file, function (error) {\n if (error) {\n file.accepted = false;\n\n _this7._errorProcessing([file], error); // Will set the file.status\n\n } else {\n file.accepted = true;\n\n if (_this7.options.autoQueue) {\n _this7.enqueueFile(file);\n } // Will set .accepted = true\n\n }\n\n _this7._updateMaxFilesReachedClass();\n });\n } // Wrapper for enqueueFile\n\n }, {\n key: \"enqueueFiles\",\n value: function enqueueFiles(files) {\n var _iteratorNormalCompletion16 = true;\n var _didIteratorError16 = false;\n var _iteratorError16 = undefined;\n\n try {\n for (var _iterator16 = files[Symbol.iterator](), _step16; !(_iteratorNormalCompletion16 = (_step16 = _iterator16.next()).done); _iteratorNormalCompletion16 = true) {\n var file = _step16.value;\n this.enqueueFile(file);\n }\n } catch (err) {\n _didIteratorError16 = true;\n _iteratorError16 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion16 && _iterator16[\"return\"] != null) {\n _iterator16[\"return\"]();\n }\n } finally {\n if (_didIteratorError16) {\n throw _iteratorError16;\n }\n }\n }\n\n return null;\n }\n }, {\n key: \"enqueueFile\",\n value: function enqueueFile(file) {\n var _this8 = this;\n\n if (file.status === Dropzone.ADDED && file.accepted === true) {\n file.status = Dropzone.QUEUED;\n\n if (this.options.autoProcessQueue) {\n return setTimeout(function () {\n return _this8.processQueue();\n }, 0); // Deferring the call\n }\n } else {\n throw new Error(\"This file can't be queued because it has already been processed or was rejected.\");\n }\n }\n }, {\n key: \"_enqueueThumbnail\",\n value: function _enqueueThumbnail(file) {\n var _this9 = this;\n\n if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) {\n this._thumbnailQueue.push(file);\n\n return setTimeout(function () {\n return _this9._processThumbnailQueue();\n }, 0); // Deferring the call\n }\n }\n }, {\n key: \"_processThumbnailQueue\",\n value: function _processThumbnailQueue() {\n var _this10 = this;\n\n if (this._processingThumbnail || this._thumbnailQueue.length === 0) {\n return;\n }\n\n this._processingThumbnail = true;\n\n var file = this._thumbnailQueue.shift();\n\n return this.createThumbnail(file, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, true, function (dataUrl) {\n _this10.emit(\"thumbnail\", file, dataUrl);\n\n _this10._processingThumbnail = false;\n return _this10._processThumbnailQueue();\n });\n } // Can be called by the user to remove a file\n\n }, {\n key: \"removeFile\",\n value: function removeFile(file) {\n if (file.status === Dropzone.UPLOADING) {\n this.cancelUpload(file);\n }\n\n this.files = without(this.files, file);\n this.emit(\"removedfile\", file);\n\n if (this.files.length === 0) {\n return this.emit(\"reset\");\n }\n } // Removes all files that aren't currently processed from the list\n\n }, {\n key: \"removeAllFiles\",\n value: function removeAllFiles(cancelIfNecessary) {\n // Create a copy of files since removeFile() changes the @files array.\n if (cancelIfNecessary == null) {\n cancelIfNecessary = false;\n }\n\n var _iteratorNormalCompletion17 = true;\n var _didIteratorError17 = false;\n var _iteratorError17 = undefined;\n\n try {\n for (var _iterator17 = this.files.slice()[Symbol.iterator](), _step17; !(_iteratorNormalCompletion17 = (_step17 = _iterator17.next()).done); _iteratorNormalCompletion17 = true) {\n var file = _step17.value;\n\n if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) {\n this.removeFile(file);\n }\n }\n } catch (err) {\n _didIteratorError17 = true;\n _iteratorError17 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion17 && _iterator17[\"return\"] != null) {\n _iterator17[\"return\"]();\n }\n } finally {\n if (_didIteratorError17) {\n throw _iteratorError17;\n }\n }\n }\n\n return null;\n } // Resizes an image before it gets sent to the server. This function is the default behavior of\n // `options.transformFile` if `resizeWidth` or `resizeHeight` are set. The callback is invoked with\n // the resized blob.\n\n }, {\n key: \"resizeImage\",\n value: function resizeImage(file, width, height, resizeMethod, callback) {\n var _this11 = this;\n\n return this.createThumbnail(file, width, height, resizeMethod, true, function (dataUrl, canvas) {\n if (canvas == null) {\n // The image has not been resized\n return callback(file);\n } else {\n var resizeMimeType = _this11.options.resizeMimeType;\n\n if (resizeMimeType == null) {\n resizeMimeType = file.type;\n }\n\n var resizedDataURL = canvas.toDataURL(resizeMimeType, _this11.options.resizeQuality);\n\n if (resizeMimeType === 'image/jpeg' || resizeMimeType === 'image/jpg') {\n /* Commented out because Resize + Exif + Rotation combo breaks the Orientation\n /* You do not want to restore unless exif updated after rotation */\n\n // Now add the original EXIF information\n // resizedDataURL = ExifRestore.restore(file.dataURL, resizedDataURL);\n }\n\n return callback(Dropzone.dataURItoBlob(resizedDataURL));\n }\n });\n }\n }, {\n key: \"createThumbnail\",\n value: function createThumbnail(file, width, height, resizeMethod, fixOrientation, callback) {\n var _this12 = this;\n\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n file.dataURL = fileReader.result; // Don't bother creating a thumbnail for SVG images since they're vector\n\n if (file.type === \"image/svg+xml\") {\n if (callback != null) {\n callback(fileReader.result);\n }\n\n return;\n }\n\n _this12.createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback);\n };\n\n fileReader.readAsDataURL(file);\n } // `mockFile` needs to have these attributes:\n // \n // { name: 'name', size: 12345, imageUrl: '' }\n //\n // `callback` will be invoked when the image has been downloaded and displayed.\n // `crossOrigin` will be added to the `img` tag when accessing the file.\n\n }, {\n key: \"displayExistingFile\",\n value: function displayExistingFile(mockFile, imageUrl, callback, crossOrigin) {\n var _this13 = this;\n\n var resizeThumbnail = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n this.emit(\"addedfile\", mockFile);\n this.emit(\"complete\", mockFile);\n\n if (!resizeThumbnail) {\n this.emit(\"thumbnail\", mockFile, imageUrl);\n if (callback) callback();\n } else {\n var onDone = function onDone(thumbnail) {\n _this13.emit('thumbnail', mockFile, thumbnail);\n\n if (callback) callback();\n };\n\n mockFile.dataURL = imageUrl;\n this.createThumbnailFromUrl(mockFile, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.resizeMethod, this.options.fixOrientation, onDone, crossOrigin);\n }\n }\n }, {\n key: \"createThumbnailFromUrl\",\n value: function createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback, crossOrigin) {\n var _this14 = this;\n\n // Not using `new Image` here because of a bug in latest Chrome versions.\n // See https://github.com/enyo/dropzone/pull/226\n var img = document.createElement(\"img\");\n\n if (crossOrigin) {\n img.crossOrigin = crossOrigin;\n }\n\n img.onload = function () {\n var loadExif = function loadExif(callback) {\n return callback(1);\n };\n\n if (typeof EXIF !== 'undefined' && EXIF !== null && fixOrientation) {\n loadExif = function loadExif(callback) {\n return EXIF.getData(img, function () {\n return callback(EXIF.getTag(this, 'Orientation'));\n });\n };\n }\n\n return loadExif(function (orientation) {\n file.width = img.width;\n file.height = img.height;\n\n var resizeInfo = _this14.options.resize.call(_this14, file, width, height, resizeMethod);\n\n var canvas = document.createElement(\"canvas\");\n var ctx = canvas.getContext(\"2d\");\n canvas.width = resizeInfo.trgWidth;\n canvas.height = resizeInfo.trgHeight;\n\n if (orientation > 4) {\n canvas.width = resizeInfo.trgHeight;\n canvas.height = resizeInfo.trgWidth;\n }\n\n switch (orientation) {\n case 2:\n // horizontal flip\n ctx.translate(canvas.width, 0);\n ctx.scale(-1, 1);\n break;\n\n case 3:\n // 180° rotate left\n ctx.translate(canvas.width, canvas.height);\n ctx.rotate(Math.PI);\n break;\n\n case 4:\n // vertical flip\n ctx.translate(0, canvas.height);\n ctx.scale(1, -1);\n break;\n\n case 5:\n // vertical flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.scale(1, -1);\n break;\n\n case 6:\n // 90° rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.translate(0, -canvas.width);\n break;\n\n case 7:\n // horizontal flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.translate(canvas.height, -canvas.width);\n ctx.scale(-1, 1);\n break;\n\n case 8:\n // 90° rotate left\n ctx.rotate(-0.5 * Math.PI);\n ctx.translate(-canvas.height, 0);\n break;\n } // This is a bugfix for iOS' scaling bug.\n\n\n drawImageIOSFix(ctx, img, resizeInfo.srcX != null ? resizeInfo.srcX : 0, resizeInfo.srcY != null ? resizeInfo.srcY : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, resizeInfo.trgX != null ? resizeInfo.trgX : 0, resizeInfo.trgY != null ? resizeInfo.trgY : 0, resizeInfo.trgWidth, resizeInfo.trgHeight);\n var thumbnail = canvas.toDataURL(\"image/png\");\n\n if (callback != null) {\n return callback(thumbnail, canvas);\n }\n });\n };\n\n if (callback != null) {\n img.onerror = callback;\n }\n\n return img.src = file.dataURL;\n } // Goes through the queue and processes files if there aren't too many already.\n\n }, {\n key: \"processQueue\",\n value: function processQueue() {\n var parallelUploads = this.options.parallelUploads;\n var processingLength = this.getUploadingFiles().length;\n var i = processingLength; // There are already at least as many files uploading than should be\n\n if (processingLength >= parallelUploads) {\n return;\n }\n\n var queuedFiles = this.getQueuedFiles();\n\n if (!(queuedFiles.length > 0)) {\n return;\n }\n\n if (this.options.uploadMultiple) {\n // The files should be uploaded in one request\n return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));\n } else {\n while (i < parallelUploads) {\n if (!queuedFiles.length) {\n return;\n } // Nothing left to process\n\n\n this.processFile(queuedFiles.shift());\n i++;\n }\n }\n } // Wrapper for `processFiles`\n\n }, {\n key: \"processFile\",\n value: function processFile(file) {\n return this.processFiles([file]);\n } // Loads the file, then calls finishedLoading()\n\n }, {\n key: \"processFiles\",\n value: function processFiles(files) {\n var _iteratorNormalCompletion18 = true;\n var _didIteratorError18 = false;\n var _iteratorError18 = undefined;\n\n try {\n for (var _iterator18 = files[Symbol.iterator](), _step18; !(_iteratorNormalCompletion18 = (_step18 = _iterator18.next()).done); _iteratorNormalCompletion18 = true) {\n var file = _step18.value;\n file.processing = true; // Backwards compatibility\n\n file.status = Dropzone.UPLOADING;\n this.emit(\"processing\", file);\n }\n } catch (err) {\n _didIteratorError18 = true;\n _iteratorError18 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion18 && _iterator18[\"return\"] != null) {\n _iterator18[\"return\"]();\n }\n } finally {\n if (_didIteratorError18) {\n throw _iteratorError18;\n }\n }\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"processingmultiple\", files);\n }\n\n return this.uploadFiles(files);\n }\n }, {\n key: \"_getFilesWithXhr\",\n value: function _getFilesWithXhr(xhr) {\n var files;\n return files = this.files.filter(function (file) {\n return file.xhr === xhr;\n }).map(function (file) {\n return file;\n });\n } // Cancels the file upload and sets the status to CANCELED\n // **if** the file is actually being uploaded.\n // If it's still in the queue, the file is being removed from it and the status\n // set to CANCELED.\n\n }, {\n key: \"cancelUpload\",\n value: function cancelUpload(file) {\n if (file.status === Dropzone.UPLOADING) {\n var groupedFiles = this._getFilesWithXhr(file.xhr);\n\n var _iteratorNormalCompletion19 = true;\n var _didIteratorError19 = false;\n var _iteratorError19 = undefined;\n\n try {\n for (var _iterator19 = groupedFiles[Symbol.iterator](), _step19; !(_iteratorNormalCompletion19 = (_step19 = _iterator19.next()).done); _iteratorNormalCompletion19 = true) {\n var groupedFile = _step19.value;\n groupedFile.status = Dropzone.CANCELED;\n }\n } catch (err) {\n _didIteratorError19 = true;\n _iteratorError19 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion19 && _iterator19[\"return\"] != null) {\n _iterator19[\"return\"]();\n }\n } finally {\n if (_didIteratorError19) {\n throw _iteratorError19;\n }\n }\n }\n\n if (typeof file.xhr !== 'undefined') {\n file.xhr.abort();\n }\n\n var _iteratorNormalCompletion20 = true;\n var _didIteratorError20 = false;\n var _iteratorError20 = undefined;\n\n try {\n for (var _iterator20 = groupedFiles[Symbol.iterator](), _step20; !(_iteratorNormalCompletion20 = (_step20 = _iterator20.next()).done); _iteratorNormalCompletion20 = true) {\n var _groupedFile = _step20.value;\n this.emit(\"canceled\", _groupedFile);\n }\n } catch (err) {\n _didIteratorError20 = true;\n _iteratorError20 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion20 && _iterator20[\"return\"] != null) {\n _iterator20[\"return\"]();\n }\n } finally {\n if (_didIteratorError20) {\n throw _iteratorError20;\n }\n }\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"canceledmultiple\", groupedFiles);\n }\n } else if (file.status === Dropzone.ADDED || file.status === Dropzone.QUEUED) {\n file.status = Dropzone.CANCELED;\n this.emit(\"canceled\", file);\n\n if (this.options.uploadMultiple) {\n this.emit(\"canceledmultiple\", [file]);\n }\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n }\n }, {\n key: \"resolveOption\",\n value: function resolveOption(option) {\n if (typeof option === 'function') {\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n\n return option.apply(this, args);\n }\n\n return option;\n }\n }, {\n key: \"uploadFile\",\n value: function uploadFile(file) {\n return this.uploadFiles([file]);\n }\n }, {\n key: \"uploadFiles\",\n value: function uploadFiles(files) {\n var _this15 = this;\n\n this._transformFiles(files, function (transformedFiles) {\n if (_this15.options.chunking) {\n // Chunking is not allowed to be used with `uploadMultiple` so we know\n // that there is only __one__file.\n var transformedFile = transformedFiles[0];\n files[0].upload.chunked = _this15.options.chunking && (_this15.options.forceChunking || transformedFile.size > _this15.options.chunkSize);\n files[0].upload.totalChunkCount = Math.ceil(transformedFile.size / _this15.options.chunkSize);\n }\n\n if (files[0].upload.chunked) {\n // This file should be sent in chunks!\n // If the chunking option is set, we **know** that there can only be **one** file, since\n // uploadMultiple is not allowed with this option.\n var file = files[0];\n var _transformedFile = transformedFiles[0];\n var startedChunkCount = 0;\n file.upload.chunks = [];\n\n var handleNextChunk = function handleNextChunk() {\n var chunkIndex = 0; // Find the next item in file.upload.chunks that is not defined yet.\n\n while (file.upload.chunks[chunkIndex] !== undefined) {\n chunkIndex++;\n } // This means, that all chunks have already been started.\n\n\n if (chunkIndex >= file.upload.totalChunkCount) return;\n startedChunkCount++;\n var start = chunkIndex * _this15.options.chunkSize;\n var end = Math.min(start + _this15.options.chunkSize, file.size);\n var dataBlock = {\n name: _this15._getParamName(0),\n data: _transformedFile.webkitSlice ? _transformedFile.webkitSlice(start, end) : _transformedFile.slice(start, end),\n filename: file.upload.filename,\n chunkIndex: chunkIndex\n };\n file.upload.chunks[chunkIndex] = {\n file: file,\n index: chunkIndex,\n dataBlock: dataBlock,\n // In case we want to retry.\n status: Dropzone.UPLOADING,\n progress: 0,\n retries: 0 // The number of times this block has been retried.\n\n };\n\n _this15._uploadData(files, [dataBlock]);\n };\n\n file.upload.finishedChunkUpload = function (chunk) {\n var allFinished = true;\n chunk.status = Dropzone.SUCCESS; // Clear the data from the chunk\n\n chunk.dataBlock = null; // Leaving this reference to xhr intact here will cause memory leaks in some browsers\n\n chunk.xhr = null;\n\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] === undefined) {\n return handleNextChunk();\n }\n\n if (file.upload.chunks[i].status !== Dropzone.SUCCESS) {\n allFinished = false;\n }\n }\n\n if (allFinished) {\n _this15.options.chunksUploaded(file, function () {\n _this15._finished(files, '', null);\n });\n }\n };\n\n if (_this15.options.parallelChunkUploads) {\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n handleNextChunk();\n }\n } else {\n handleNextChunk();\n }\n } else {\n var dataBlocks = [];\n\n for (var _i3 = 0; _i3 < files.length; _i3++) {\n dataBlocks[_i3] = {\n name: _this15._getParamName(_i3),\n data: transformedFiles[_i3],\n filename: files[_i3].upload.filename\n };\n }\n\n _this15._uploadData(files, dataBlocks);\n }\n });\n } /// Returns the right chunk for given file and xhr\n\n }, {\n key: \"_getChunk\",\n value: function _getChunk(file, xhr) {\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].xhr === xhr) {\n return file.upload.chunks[i];\n }\n }\n } // This function actually uploads the file(s) to the server.\n // If dataBlocks contains the actual data to upload (meaning, that this could either be transformed\n // files, or individual chunks for chunked upload).\n\n }, {\n key: \"_uploadData\",\n value: function _uploadData(files, dataBlocks) {\n var _this16 = this;\n\n var xhr = new XMLHttpRequest(); // Put the xhr object in the file objects to be able to reference it later.\n\n var _iteratorNormalCompletion21 = true;\n var _didIteratorError21 = false;\n var _iteratorError21 = undefined;\n\n try {\n for (var _iterator21 = files[Symbol.iterator](), _step21; !(_iteratorNormalCompletion21 = (_step21 = _iterator21.next()).done); _iteratorNormalCompletion21 = true) {\n var file = _step21.value;\n file.xhr = xhr;\n }\n } catch (err) {\n _didIteratorError21 = true;\n _iteratorError21 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion21 && _iterator21[\"return\"] != null) {\n _iterator21[\"return\"]();\n }\n } finally {\n if (_didIteratorError21) {\n throw _iteratorError21;\n }\n }\n }\n\n if (files[0].upload.chunked) {\n // Put the xhr object in the right chunk object, so it can be associated later, and found with _getChunk\n files[0].upload.chunks[dataBlocks[0].chunkIndex].xhr = xhr;\n }\n\n var method = this.resolveOption(this.options.method, files);\n var url = this.resolveOption(this.options.url, files);\n xhr.open(method, url, true); // Setting the timeout after open because of IE11 issue: https://gitlab.com/meno/dropzone/issues/8\n\n xhr.timeout = this.resolveOption(this.options.timeout, files); // Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179\n\n xhr.withCredentials = !!this.options.withCredentials;\n\n xhr.onload = function (e) {\n _this16._finishedUploading(files, xhr, e);\n };\n\n xhr.ontimeout = function () {\n _this16._handleUploadError(files, xhr, \"Request timedout after \".concat(_this16.options.timeout, \" seconds\"));\n };\n\n xhr.onerror = function () {\n _this16._handleUploadError(files, xhr);\n }; // Some browsers do not have the .upload property\n\n\n var progressObj = xhr.upload != null ? xhr.upload : xhr;\n\n progressObj.onprogress = function (e) {\n return _this16._updateFilesUploadProgress(files, xhr, e);\n };\n\n var headers = {\n \"Accept\": \"application/json\",\n \"Cache-Control\": \"no-cache\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n };\n\n if (this.options.headers) {\n Dropzone.extend(headers, this.options.headers);\n }\n\n for (var headerName in headers) {\n var headerValue = headers[headerName];\n\n if (headerValue) {\n xhr.setRequestHeader(headerName, headerValue);\n }\n }\n\n var formData = new FormData(); // Adding all @options parameters\n\n if (this.options.params) {\n var additionalParams = this.options.params;\n\n if (typeof additionalParams === 'function') {\n additionalParams = additionalParams.call(this, files, xhr, files[0].upload.chunked ? this._getChunk(files[0], xhr) : null);\n }\n\n for (var key in additionalParams) {\n var value = additionalParams[key];\n formData.append(key, value);\n }\n } // Let the user add additional data if necessary\n\n\n var _iteratorNormalCompletion22 = true;\n var _didIteratorError22 = false;\n var _iteratorError22 = undefined;\n\n try {\n for (var _iterator22 = files[Symbol.iterator](), _step22; !(_iteratorNormalCompletion22 = (_step22 = _iterator22.next()).done); _iteratorNormalCompletion22 = true) {\n var _file = _step22.value;\n this.emit(\"sending\", _file, xhr, formData);\n }\n } catch (err) {\n _didIteratorError22 = true;\n _iteratorError22 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion22 && _iterator22[\"return\"] != null) {\n _iterator22[\"return\"]();\n }\n } finally {\n if (_didIteratorError22) {\n throw _iteratorError22;\n }\n }\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"sendingmultiple\", files, xhr, formData);\n }\n\n this._addFormElementData(formData); // Finally add the files\n // Has to be last because some servers (eg: S3) expect the file to be the last parameter\n\n\n for (var i = 0; i < dataBlocks.length; i++) {\n var dataBlock = dataBlocks[i];\n formData.append(dataBlock.name, dataBlock.data, dataBlock.filename);\n }\n\n this.submitRequest(xhr, formData, files);\n } // Transforms all files with this.options.transformFile and invokes done with the transformed files when done.\n\n }, {\n key: \"_transformFiles\",\n value: function _transformFiles(files, done) {\n var _this17 = this;\n\n var transformedFiles = []; // Clumsy way of handling asynchronous calls, until I get to add a proper Future library.\n\n var doneCounter = 0;\n\n var _loop = function _loop(i) {\n _this17.options.transformFile.call(_this17, files[i], function (transformedFile) {\n transformedFiles[i] = transformedFile;\n\n if (++doneCounter === files.length) {\n done(transformedFiles);\n }\n });\n };\n\n for (var i = 0; i < files.length; i++) {\n _loop(i);\n }\n } // Takes care of adding other input elements of the form to the AJAX request\n\n }, {\n key: \"_addFormElementData\",\n value: function _addFormElementData(formData) {\n // Take care of other input elements\n if (this.element.tagName === \"FORM\") {\n var _iteratorNormalCompletion23 = true;\n var _didIteratorError23 = false;\n var _iteratorError23 = undefined;\n\n try {\n for (var _iterator23 = this.element.querySelectorAll(\"input, textarea, select, button\")[Symbol.iterator](), _step23; !(_iteratorNormalCompletion23 = (_step23 = _iterator23.next()).done); _iteratorNormalCompletion23 = true) {\n var input = _step23.value;\n var inputName = input.getAttribute(\"name\");\n var inputType = input.getAttribute(\"type\");\n if (inputType) inputType = inputType.toLowerCase(); // If the input doesn't have a name, we can't use it.\n\n if (typeof inputName === 'undefined' || inputName === null) continue;\n\n if (input.tagName === \"SELECT\" && input.hasAttribute(\"multiple\")) {\n // Possibly multiple values\n var _iteratorNormalCompletion24 = true;\n var _didIteratorError24 = false;\n var _iteratorError24 = undefined;\n\n try {\n for (var _iterator24 = input.options[Symbol.iterator](), _step24; !(_iteratorNormalCompletion24 = (_step24 = _iterator24.next()).done); _iteratorNormalCompletion24 = true) {\n var option = _step24.value;\n\n if (option.selected) {\n formData.append(inputName, option.value);\n }\n }\n } catch (err) {\n _didIteratorError24 = true;\n _iteratorError24 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion24 && _iterator24[\"return\"] != null) {\n _iterator24[\"return\"]();\n }\n } finally {\n if (_didIteratorError24) {\n throw _iteratorError24;\n }\n }\n }\n } else if (!inputType || inputType !== \"checkbox\" && inputType !== \"radio\" || input.checked) {\n formData.append(inputName, input.value);\n }\n }\n } catch (err) {\n _didIteratorError23 = true;\n _iteratorError23 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion23 && _iterator23[\"return\"] != null) {\n _iterator23[\"return\"]();\n }\n } finally {\n if (_didIteratorError23) {\n throw _iteratorError23;\n }\n }\n }\n }\n } // Invoked when there is new progress information about given files.\n // If e is not provided, it is assumed that the upload is finished.\n\n }, {\n key: \"_updateFilesUploadProgress\",\n value: function _updateFilesUploadProgress(files, xhr, e) {\n var progress;\n\n if (typeof e !== 'undefined') {\n progress = 100 * e.loaded / e.total;\n\n if (files[0].upload.chunked) {\n var file = files[0]; // Since this is a chunked upload, we need to update the appropriate chunk progress.\n\n var chunk = this._getChunk(file, xhr);\n\n chunk.progress = progress;\n chunk.total = e.total;\n chunk.bytesSent = e.loaded;\n var fileProgress = 0,\n fileTotal,\n fileBytesSent;\n file.upload.progress = 0;\n file.upload.total = 0;\n file.upload.bytesSent = 0;\n\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].progress !== undefined) {\n file.upload.progress += file.upload.chunks[i].progress;\n file.upload.total += file.upload.chunks[i].total;\n file.upload.bytesSent += file.upload.chunks[i].bytesSent;\n }\n }\n\n file.upload.progress = file.upload.progress / file.upload.totalChunkCount;\n } else {\n var _iteratorNormalCompletion25 = true;\n var _didIteratorError25 = false;\n var _iteratorError25 = undefined;\n\n try {\n for (var _iterator25 = files[Symbol.iterator](), _step25; !(_iteratorNormalCompletion25 = (_step25 = _iterator25.next()).done); _iteratorNormalCompletion25 = true) {\n var _file2 = _step25.value;\n _file2.upload.progress = progress;\n _file2.upload.total = e.total;\n _file2.upload.bytesSent = e.loaded;\n }\n } catch (err) {\n _didIteratorError25 = true;\n _iteratorError25 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion25 && _iterator25[\"return\"] != null) {\n _iterator25[\"return\"]();\n }\n } finally {\n if (_didIteratorError25) {\n throw _iteratorError25;\n }\n }\n }\n }\n\n var _iteratorNormalCompletion26 = true;\n var _didIteratorError26 = false;\n var _iteratorError26 = undefined;\n\n try {\n for (var _iterator26 = files[Symbol.iterator](), _step26; !(_iteratorNormalCompletion26 = (_step26 = _iterator26.next()).done); _iteratorNormalCompletion26 = true) {\n var _file3 = _step26.value;\n this.emit(\"uploadprogress\", _file3, _file3.upload.progress, _file3.upload.bytesSent);\n }\n } catch (err) {\n _didIteratorError26 = true;\n _iteratorError26 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion26 && _iterator26[\"return\"] != null) {\n _iterator26[\"return\"]();\n }\n } finally {\n if (_didIteratorError26) {\n throw _iteratorError26;\n }\n }\n }\n } else {\n // Called when the file finished uploading\n var allFilesFinished = true;\n progress = 100;\n var _iteratorNormalCompletion27 = true;\n var _didIteratorError27 = false;\n var _iteratorError27 = undefined;\n\n try {\n for (var _iterator27 = files[Symbol.iterator](), _step27; !(_iteratorNormalCompletion27 = (_step27 = _iterator27.next()).done); _iteratorNormalCompletion27 = true) {\n var _file4 = _step27.value;\n\n if (_file4.upload.progress !== 100 || _file4.upload.bytesSent !== _file4.upload.total) {\n allFilesFinished = false;\n }\n\n _file4.upload.progress = progress;\n _file4.upload.bytesSent = _file4.upload.total;\n } // Nothing to do, all files already at 100%\n\n } catch (err) {\n _didIteratorError27 = true;\n _iteratorError27 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion27 && _iterator27[\"return\"] != null) {\n _iterator27[\"return\"]();\n }\n } finally {\n if (_didIteratorError27) {\n throw _iteratorError27;\n }\n }\n }\n\n if (allFilesFinished) {\n return;\n }\n\n var _iteratorNormalCompletion28 = true;\n var _didIteratorError28 = false;\n var _iteratorError28 = undefined;\n\n try {\n for (var _iterator28 = files[Symbol.iterator](), _step28; !(_iteratorNormalCompletion28 = (_step28 = _iterator28.next()).done); _iteratorNormalCompletion28 = true) {\n var _file5 = _step28.value;\n this.emit(\"uploadprogress\", _file5, progress, _file5.upload.bytesSent);\n }\n } catch (err) {\n _didIteratorError28 = true;\n _iteratorError28 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion28 && _iterator28[\"return\"] != null) {\n _iterator28[\"return\"]();\n }\n } finally {\n if (_didIteratorError28) {\n throw _iteratorError28;\n }\n }\n }\n }\n }\n }, {\n key: \"_finishedUploading\",\n value: function _finishedUploading(files, xhr, e) {\n var response;\n\n if (files[0].status === Dropzone.CANCELED) {\n return;\n }\n\n if (xhr.readyState !== 4) {\n return;\n }\n\n if (xhr.responseType !== 'arraybuffer' && xhr.responseType !== 'blob') {\n response = xhr.responseText;\n\n if (xhr.getResponseHeader(\"content-type\") && ~xhr.getResponseHeader(\"content-type\").indexOf(\"application/json\")) {\n try {\n response = JSON.parse(response);\n } catch (error) {\n e = error;\n response = \"Invalid JSON response from server.\";\n }\n }\n }\n\n this._updateFilesUploadProgress(files);\n\n if (!(200 <= xhr.status && xhr.status < 300)) {\n this._handleUploadError(files, xhr, response);\n } else {\n if (files[0].upload.chunked) {\n files[0].upload.finishedChunkUpload(this._getChunk(files[0], xhr));\n } else {\n this._finished(files, response, e);\n }\n }\n }\n }, {\n key: \"_handleUploadError\",\n value: function _handleUploadError(files, xhr, response) {\n if (files[0].status === Dropzone.CANCELED) {\n return;\n }\n\n if (files[0].upload.chunked && this.options.retryChunks) {\n var chunk = this._getChunk(files[0], xhr);\n\n if (chunk.retries++ < this.options.retryChunksLimit) {\n this._uploadData(files, [chunk.dataBlock]);\n\n return;\n } else {\n console.warn('Retried this chunk too often. Giving up.');\n }\n }\n\n this._errorProcessing(files, response || this.options.dictResponseError.replace(\"{{statusCode}}\", xhr.status), xhr);\n }\n }, {\n key: \"submitRequest\",\n value: function submitRequest(xhr, formData, files) {\n xhr.send(formData);\n } // Called internally when processing is finished.\n // Individual callbacks have to be called in the appropriate sections.\n\n }, {\n key: \"_finished\",\n value: function _finished(files, responseText, e) {\n var _iteratorNormalCompletion29 = true;\n var _didIteratorError29 = false;\n var _iteratorError29 = undefined;\n\n try {\n for (var _iterator29 = files[Symbol.iterator](), _step29; !(_iteratorNormalCompletion29 = (_step29 = _iterator29.next()).done); _iteratorNormalCompletion29 = true) {\n var file = _step29.value;\n file.status = Dropzone.SUCCESS;\n this.emit(\"success\", file, responseText, e);\n this.emit(\"complete\", file);\n }\n } catch (err) {\n _didIteratorError29 = true;\n _iteratorError29 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion29 && _iterator29[\"return\"] != null) {\n _iterator29[\"return\"]();\n }\n } finally {\n if (_didIteratorError29) {\n throw _iteratorError29;\n }\n }\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"successmultiple\", files, responseText, e);\n this.emit(\"completemultiple\", files);\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n } // Called internally when processing is finished.\n // Individual callbacks have to be called in the appropriate sections.\n\n }, {\n key: \"_errorProcessing\",\n value: function _errorProcessing(files, message, xhr) {\n var _iteratorNormalCompletion30 = true;\n var _didIteratorError30 = false;\n var _iteratorError30 = undefined;\n\n try {\n for (var _iterator30 = files[Symbol.iterator](), _step30; !(_iteratorNormalCompletion30 = (_step30 = _iterator30.next()).done); _iteratorNormalCompletion30 = true) {\n var file = _step30.value;\n file.status = Dropzone.ERROR;\n this.emit(\"error\", file, message, xhr);\n this.emit(\"complete\", file);\n }\n } catch (err) {\n _didIteratorError30 = true;\n _iteratorError30 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion30 && _iterator30[\"return\"] != null) {\n _iterator30[\"return\"]();\n }\n } finally {\n if (_didIteratorError30) {\n throw _iteratorError30;\n }\n }\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"errormultiple\", files, message, xhr);\n this.emit(\"completemultiple\", files);\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n }\n }], [{\n key: \"uuidv4\",\n value: function uuidv4() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0,\n v = c === 'x' ? r : r & 0x3 | 0x8;\n return v.toString(16);\n });\n }\n }]);\n\n return Dropzone;\n}(Emitter);\n\nDropzone.initClass();\nDropzone.version = \"5.7.1\"; // This is a map of options for your different dropzones. Add configurations\n// to this object for your different dropzone elemens.\n//\n// Example:\n//\n// Dropzone.options.myDropzoneElementId = { maxFilesize: 1 };\n//\n// To disable autoDiscover for a specific element, you can set `false` as an option:\n//\n// Dropzone.options.myDisabledElementId = false;\n//\n// And in html:\n//\n//
\n\nDropzone.options = {}; // Returns the options for an element or undefined if none available.\n\nDropzone.optionsForElement = function (element) {\n // Get the `Dropzone.options.elementId` for this element if it exists\n if (element.getAttribute(\"id\")) {\n return Dropzone.options[camelize(element.getAttribute(\"id\"))];\n } else {\n return undefined;\n }\n}; // Holds a list of all dropzone instances\n\n\nDropzone.instances = []; // Returns the dropzone for given element if any\n\nDropzone.forElement = function (element) {\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n }\n\n if ((element != null ? element.dropzone : undefined) == null) {\n throw new Error(\"No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.\");\n }\n\n return element.dropzone;\n}; // Set to false if you don't want Dropzone to automatically find and attach to .dropzone elements.\n\n\nDropzone.autoDiscover = true; // Looks for all .dropzone elements and creates a dropzone for them\n\nDropzone.discover = function () {\n var dropzones;\n\n if (document.querySelectorAll) {\n dropzones = document.querySelectorAll(\".dropzone\");\n } else {\n dropzones = []; // IE :(\n\n var checkElements = function checkElements(elements) {\n return function () {\n var result = [];\n var _iteratorNormalCompletion31 = true;\n var _didIteratorError31 = false;\n var _iteratorError31 = undefined;\n\n try {\n for (var _iterator31 = elements[Symbol.iterator](), _step31; !(_iteratorNormalCompletion31 = (_step31 = _iterator31.next()).done); _iteratorNormalCompletion31 = true) {\n var el = _step31.value;\n\n if (/(^| )dropzone($| )/.test(el.className)) {\n result.push(dropzones.push(el));\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _didIteratorError31 = true;\n _iteratorError31 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion31 && _iterator31[\"return\"] != null) {\n _iterator31[\"return\"]();\n }\n } finally {\n if (_didIteratorError31) {\n throw _iteratorError31;\n }\n }\n }\n\n return result;\n }();\n };\n\n checkElements(document.getElementsByTagName(\"div\"));\n checkElements(document.getElementsByTagName(\"form\"));\n }\n\n return function () {\n var result = [];\n var _iteratorNormalCompletion32 = true;\n var _didIteratorError32 = false;\n var _iteratorError32 = undefined;\n\n try {\n for (var _iterator32 = dropzones[Symbol.iterator](), _step32; !(_iteratorNormalCompletion32 = (_step32 = _iterator32.next()).done); _iteratorNormalCompletion32 = true) {\n var dropzone = _step32.value;\n\n // Create a dropzone unless auto discover has been disabled for specific element\n if (Dropzone.optionsForElement(dropzone) !== false) {\n result.push(new Dropzone(dropzone));\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _didIteratorError32 = true;\n _iteratorError32 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion32 && _iterator32[\"return\"] != null) {\n _iterator32[\"return\"]();\n }\n } finally {\n if (_didIteratorError32) {\n throw _iteratorError32;\n }\n }\n }\n\n return result;\n }();\n}; // Since the whole Drag'n'Drop API is pretty new, some browsers implement it,\n// but not correctly.\n// So I created a blacklist of userAgents. Yes, yes. Browser sniffing, I know.\n// But what to do when browsers *theoretically* support an API, but crash\n// when using it.\n//\n// This is a list of regular expressions tested against navigator.userAgent\n//\n// ** It should only be used on browser that *do* support the API, but\n// incorrectly **\n//\n\n\nDropzone.blacklistedBrowsers = [// The mac os and windows phone version of opera 12 seems to have a problem with the File drag'n'drop API.\n/opera.*(Macintosh|Windows Phone).*version\\/12/i]; // Checks if the browser is supported\n\nDropzone.isBrowserSupported = function () {\n var capableBrowser = true;\n\n if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) {\n if (!(\"classList\" in document.createElement(\"a\"))) {\n capableBrowser = false;\n } else {\n // The browser supports the API, but may be blacklisted.\n var _iteratorNormalCompletion33 = true;\n var _didIteratorError33 = false;\n var _iteratorError33 = undefined;\n\n try {\n for (var _iterator33 = Dropzone.blacklistedBrowsers[Symbol.iterator](), _step33; !(_iteratorNormalCompletion33 = (_step33 = _iterator33.next()).done); _iteratorNormalCompletion33 = true) {\n var regex = _step33.value;\n\n if (regex.test(navigator.userAgent)) {\n capableBrowser = false;\n continue;\n }\n }\n } catch (err) {\n _didIteratorError33 = true;\n _iteratorError33 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion33 && _iterator33[\"return\"] != null) {\n _iterator33[\"return\"]();\n }\n } finally {\n if (_didIteratorError33) {\n throw _iteratorError33;\n }\n }\n }\n }\n } else {\n capableBrowser = false;\n }\n\n return capableBrowser;\n};\n\nDropzone.dataURItoBlob = function (dataURI) {\n // convert base64 to raw binary data held in a string\n // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\n var byteString = atob(dataURI.split(',')[1]); // separate out the mime component\n\n var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to an ArrayBuffer\n\n var ab = new ArrayBuffer(byteString.length);\n var ia = new Uint8Array(ab);\n\n for (var i = 0, end = byteString.length, asc = 0 <= end; asc ? i <= end : i >= end; asc ? i++ : i--) {\n ia[i] = byteString.charCodeAt(i);\n } // write the ArrayBuffer to a blob\n\n\n return new Blob([ab], {\n type: mimeString\n });\n}; // Returns an array without the rejected item\n\n\nvar without = function without(list, rejectedItem) {\n return list.filter(function (item) {\n return item !== rejectedItem;\n }).map(function (item) {\n return item;\n });\n}; // abc-def_ghi -> abcDefGhi\n\n\nvar camelize = function camelize(str) {\n return str.replace(/[\\-_](\\w)/g, function (match) {\n return match.charAt(1).toUpperCase();\n });\n}; // Creates an element from string\n\n\nDropzone.createElement = function (string) {\n var div = document.createElement(\"div\");\n div.innerHTML = string;\n return div.childNodes[0];\n}; // Tests if given element is inside (or simply is) the container\n\n\nDropzone.elementInside = function (element, container) {\n if (element === container) {\n return true;\n } // Coffeescript doesn't support do/while loops\n\n\n while (element = element.parentNode) {\n if (element === container) {\n return true;\n }\n }\n\n return false;\n};\n\nDropzone.getElement = function (el, name) {\n var element;\n\n if (typeof el === \"string\") {\n element = document.querySelector(el);\n } else if (el.nodeType != null) {\n element = el;\n }\n\n if (element == null) {\n throw new Error(\"Invalid `\".concat(name, \"` option provided. Please provide a CSS selector or a plain HTML element.\"));\n }\n\n return element;\n};\n\nDropzone.getElements = function (els, name) {\n var el, elements;\n\n if (els instanceof Array) {\n elements = [];\n\n try {\n var _iteratorNormalCompletion34 = true;\n var _didIteratorError34 = false;\n var _iteratorError34 = undefined;\n\n try {\n for (var _iterator34 = els[Symbol.iterator](), _step34; !(_iteratorNormalCompletion34 = (_step34 = _iterator34.next()).done); _iteratorNormalCompletion34 = true) {\n el = _step34.value;\n elements.push(this.getElement(el, name));\n }\n } catch (err) {\n _didIteratorError34 = true;\n _iteratorError34 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion34 && _iterator34[\"return\"] != null) {\n _iterator34[\"return\"]();\n }\n } finally {\n if (_didIteratorError34) {\n throw _iteratorError34;\n }\n }\n }\n } catch (e) {\n elements = null;\n }\n } else if (typeof els === \"string\") {\n elements = [];\n var _iteratorNormalCompletion35 = true;\n var _didIteratorError35 = false;\n var _iteratorError35 = undefined;\n\n try {\n for (var _iterator35 = document.querySelectorAll(els)[Symbol.iterator](), _step35; !(_iteratorNormalCompletion35 = (_step35 = _iterator35.next()).done); _iteratorNormalCompletion35 = true) {\n el = _step35.value;\n elements.push(el);\n }\n } catch (err) {\n _didIteratorError35 = true;\n _iteratorError35 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion35 && _iterator35[\"return\"] != null) {\n _iterator35[\"return\"]();\n }\n } finally {\n if (_didIteratorError35) {\n throw _iteratorError35;\n }\n }\n }\n } else if (els.nodeType != null) {\n elements = [els];\n }\n\n if (elements == null || !elements.length) {\n throw new Error(\"Invalid `\".concat(name, \"` option provided. Please provide a CSS selector, a plain HTML element or a list of those.\"));\n }\n\n return elements;\n}; // Asks the user the question and calls accepted or rejected accordingly\n//\n// The default implementation just uses `window.confirm` and then calls the\n// appropriate callback.\n\n\nDropzone.confirm = function (question, accepted, rejected) {\n if (window.confirm(question)) {\n return accepted();\n } else if (rejected != null) {\n return rejected();\n }\n}; // Validates the mime type like this:\n//\n// https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept\n\n\nDropzone.isValidFile = function (file, acceptedFiles) {\n if (!acceptedFiles) {\n return true;\n } // If there are no accepted mime types, it's OK\n\n\n acceptedFiles = acceptedFiles.split(\",\");\n var mimeType = file.type;\n var baseMimeType = mimeType.replace(/\\/.*$/, \"\");\n var _iteratorNormalCompletion36 = true;\n var _didIteratorError36 = false;\n var _iteratorError36 = undefined;\n\n try {\n for (var _iterator36 = acceptedFiles[Symbol.iterator](), _step36; !(_iteratorNormalCompletion36 = (_step36 = _iterator36.next()).done); _iteratorNormalCompletion36 = true) {\n var validType = _step36.value;\n validType = validType.trim();\n\n if (validType.charAt(0) === \".\") {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // This is something like a image/* mime type\n if (baseMimeType === validType.replace(/\\/.*$/, \"\")) {\n return true;\n }\n } else {\n if (mimeType === validType) {\n return true;\n }\n }\n }\n } catch (err) {\n _didIteratorError36 = true;\n _iteratorError36 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion36 && _iterator36[\"return\"] != null) {\n _iterator36[\"return\"]();\n }\n } finally {\n if (_didIteratorError36) {\n throw _iteratorError36;\n }\n }\n }\n\n return false;\n}; // Augment jQuery\n\n\nif (typeof jQuery !== 'undefined' && jQuery !== null) {\n jQuery.fn.dropzone = function (options) {\n return this.each(function () {\n return new Dropzone(this, options);\n });\n };\n}\n\nif ( true && module !== null) {\n module.exports = Dropzone;\n} else {\n window.Dropzone = Dropzone;\n} // Dropzone file status codes\n\n\nDropzone.ADDED = \"added\";\nDropzone.QUEUED = \"queued\"; // For backwards compatibility. Now, if a file is accepted, it's either queued\n// or uploading.\n\nDropzone.ACCEPTED = Dropzone.QUEUED;\nDropzone.UPLOADING = \"uploading\";\nDropzone.PROCESSING = Dropzone.UPLOADING; // alias\n\nDropzone.CANCELED = \"canceled\";\nDropzone.ERROR = \"error\";\nDropzone.SUCCESS = \"success\";\n/*\n\n Bugfix for iOS 6 and 7\n Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios\n based on the work of https://github.com/stomita/ios-imagefile-megapixel\n\n */\n// Detecting vertical squash in loaded image.\n// Fixes a bug which squash image vertically while drawing into canvas for some images.\n// This is a bug in iOS6 devices. This function from https://github.com/stomita/ios-imagefile-megapixel\n\nvar detectVerticalSquash = function detectVerticalSquash(img) {\n var iw = img.naturalWidth;\n var ih = img.naturalHeight;\n var canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = ih;\n var ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, 0, 0);\n\n var _ctx$getImageData = ctx.getImageData(1, 0, 1, ih),\n data = _ctx$getImageData.data; // search image edge pixel position in case it is squashed vertically.\n\n\n var sy = 0;\n var ey = ih;\n var py = ih;\n\n while (py > sy) {\n var alpha = data[(py - 1) * 4 + 3];\n\n if (alpha === 0) {\n ey = py;\n } else {\n sy = py;\n }\n\n py = ey + sy >> 1;\n }\n\n var ratio = py / ih;\n\n if (ratio === 0) {\n return 1;\n } else {\n return ratio;\n }\n}; // A replacement for context.drawImage\n// (args are for source and destination).\n\n\nvar drawImageIOSFix = function drawImageIOSFix(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {\n var vertSquashRatio = detectVerticalSquash(img);\n return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);\n}; // Based on MinifyJpeg\n// Source: http://www.perry.cz/files/ExifRestorer.js\n// http://elicon.blog57.fc2.com/blog-entry-206.html\n\n\nvar ExifRestore =\n/*#__PURE__*/\nfunction () {\n function ExifRestore() {\n _classCallCheck(this, ExifRestore);\n }\n\n _createClass(ExifRestore, null, [{\n key: \"initClass\",\n value: function initClass() {\n this.KEY_STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n }\n }, {\n key: \"encode64\",\n value: function encode64(input) {\n var output = '';\n var chr1 = undefined;\n var chr2 = undefined;\n var chr3 = '';\n var enc1 = undefined;\n var enc2 = undefined;\n var enc3 = undefined;\n var enc4 = '';\n var i = 0;\n\n while (true) {\n chr1 = input[i++];\n chr2 = input[i++];\n chr3 = input[i++];\n enc1 = chr1 >> 2;\n enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n enc4 = chr3 & 63;\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n\n output = output + this.KEY_STR.charAt(enc1) + this.KEY_STR.charAt(enc2) + this.KEY_STR.charAt(enc3) + this.KEY_STR.charAt(enc4);\n chr1 = chr2 = chr3 = '';\n enc1 = enc2 = enc3 = enc4 = '';\n\n if (!(i < input.length)) {\n break;\n }\n }\n\n return output;\n }\n }, {\n key: \"restore\",\n value: function restore(origFileBase64, resizedFileBase64) {\n if (!origFileBase64.match('data:image/jpeg;base64,')) {\n return resizedFileBase64;\n }\n\n var rawImage = this.decode64(origFileBase64.replace('data:image/jpeg;base64,', ''));\n var segments = this.slice2Segments(rawImage);\n var image = this.exifManipulation(resizedFileBase64, segments);\n return \"data:image/jpeg;base64,\".concat(this.encode64(image));\n }\n }, {\n key: \"exifManipulation\",\n value: function exifManipulation(resizedFileBase64, segments) {\n var exifArray = this.getExifArray(segments);\n var newImageArray = this.insertExif(resizedFileBase64, exifArray);\n var aBuffer = new Uint8Array(newImageArray);\n return aBuffer;\n }\n }, {\n key: \"getExifArray\",\n value: function getExifArray(segments) {\n var seg = undefined;\n var x = 0;\n\n while (x < segments.length) {\n seg = segments[x];\n\n if (seg[0] === 255 & seg[1] === 225) {\n return seg;\n }\n\n x++;\n }\n\n return [];\n }\n }, {\n key: \"insertExif\",\n value: function insertExif(resizedFileBase64, exifArray) {\n var imageData = resizedFileBase64.replace('data:image/jpeg;base64,', '');\n var buf = this.decode64(imageData);\n var separatePoint = buf.indexOf(255, 3);\n var mae = buf.slice(0, separatePoint);\n var ato = buf.slice(separatePoint);\n var array = mae;\n array = array.concat(exifArray);\n array = array.concat(ato);\n return array;\n }\n }, {\n key: \"slice2Segments\",\n value: function slice2Segments(rawImageArray) {\n var head = 0;\n var segments = [];\n\n while (true) {\n var length;\n\n if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 218) {\n break;\n }\n\n if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 216) {\n head += 2;\n } else {\n length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];\n var endPoint = head + length + 2;\n var seg = rawImageArray.slice(head, endPoint);\n segments.push(seg);\n head = endPoint;\n }\n\n if (head > rawImageArray.length) {\n break;\n }\n }\n\n return segments;\n }\n }, {\n key: \"decode64\",\n value: function decode64(input) {\n var output = '';\n var chr1 = undefined;\n var chr2 = undefined;\n var chr3 = '';\n var enc1 = undefined;\n var enc2 = undefined;\n var enc3 = undefined;\n var enc4 = '';\n var i = 0;\n var buf = []; // remove all characters that are not A-Z, a-z, 0-9, +, /, or =\n\n var base64test = /[^A-Za-z0-9\\+\\/\\=]/g;\n\n if (base64test.exec(input)) {\n console.warn('There were invalid base64 characters in the input text.\\nValid base64 characters are A-Z, a-z, 0-9, \\'+\\', \\'/\\',and \\'=\\'\\nExpect errors in decoding.');\n }\n\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, '');\n\n while (true) {\n enc1 = this.KEY_STR.indexOf(input.charAt(i++));\n enc2 = this.KEY_STR.indexOf(input.charAt(i++));\n enc3 = this.KEY_STR.indexOf(input.charAt(i++));\n enc4 = this.KEY_STR.indexOf(input.charAt(i++));\n chr1 = enc1 << 2 | enc2 >> 4;\n chr2 = (enc2 & 15) << 4 | enc3 >> 2;\n chr3 = (enc3 & 3) << 6 | enc4;\n buf.push(chr1);\n\n if (enc3 !== 64) {\n buf.push(chr2);\n }\n\n if (enc4 !== 64) {\n buf.push(chr3);\n }\n\n chr1 = chr2 = chr3 = '';\n enc1 = enc2 = enc3 = enc4 = '';\n\n if (!(i < input.length)) {\n break;\n }\n }\n\n return buf;\n }\n }]);\n\n return ExifRestore;\n}();\n\nExifRestore.initClass();\n/*\n * contentloaded.js\n *\n * Author: Diego Perini (diego.perini at gmail.com)\n * Summary: cross-browser wrapper for DOMContentLoaded\n * Updated: 20101020\n * License: MIT\n * Version: 1.2\n *\n * URL:\n * http://javascript.nwbox.com/ContentLoaded/\n * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE\n */\n// @win window reference\n// @fn function reference\n\nvar contentLoaded = function contentLoaded(win, fn) {\n var done = false;\n var top = true;\n var doc = win.document;\n var root = doc.documentElement;\n var add = doc.addEventListener ? \"addEventListener\" : \"attachEvent\";\n var rem = doc.addEventListener ? \"removeEventListener\" : \"detachEvent\";\n var pre = doc.addEventListener ? \"\" : \"on\";\n\n var init = function init(e) {\n if (e.type === \"readystatechange\" && doc.readyState !== \"complete\") {\n return;\n }\n\n (e.type === \"load\" ? win : doc)[rem](pre + e.type, init, false);\n\n if (!done && (done = true)) {\n return fn.call(win, e.type || e);\n }\n };\n\n var poll = function poll() {\n try {\n root.doScroll(\"left\");\n } catch (e) {\n setTimeout(poll, 50);\n return;\n }\n\n return init(\"poll\");\n };\n\n if (doc.readyState !== \"complete\") {\n if (doc.createEventObject && root.doScroll) {\n try {\n top = !win.frameElement;\n } catch (error) {}\n\n if (top) {\n poll();\n }\n }\n\n doc[add](pre + \"DOMContentLoaded\", init, false);\n doc[add](pre + \"readystatechange\", init, false);\n return win[add](pre + \"load\", init, false);\n }\n}; // As a single function to be able to write tests.\n\n\nDropzone._autoDiscoverFunction = function () {\n if (Dropzone.autoDiscover) {\n return Dropzone.discover();\n }\n};\n\ncontentLoaded(window, Dropzone._autoDiscoverFunction);\n\nfunction __guard__(value, transform) {\n return typeof value !== 'undefined' && value !== null ? transform(value) : undefined;\n}\n\nfunction __guardMethod__(obj, methodName, transform) {\n if (typeof obj !== 'undefined' && obj !== null && typeof obj[methodName] === 'function') {\n return transform(obj, methodName);\n } else {\n return undefined;\n }\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZHJvcHpvbmUvZGlzdC9kcm9wem9uZS5qcz83OWUzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhDQUFhOztBQUViLHVCQUF1QiwyQkFBMkIsMkVBQTJFLGtDQUFrQyxtQkFBbUIsR0FBRyxFQUFFLE9BQU8sa0NBQWtDLDhIQUE4SCxHQUFHLEVBQUUscUJBQXFCOztBQUV4WCxpREFBaUQsMEVBQTBFLGFBQWEsRUFBRSxxQ0FBcUM7O0FBRS9LLDZCQUE2QixnR0FBZ0csZ0RBQWdELEdBQUcsMkJBQTJCOztBQUUzTSx1Q0FBdUMsdUJBQXVCLHVGQUF1RixFQUFFLGFBQWE7O0FBRXBLLDBDQUEwQywrREFBK0QsMkVBQTJFLEVBQUUseUVBQXlFLGVBQWUsc0RBQXNELEVBQUUsRUFBRSx1REFBdUQ7O0FBRS9YLGdDQUFnQyw0RUFBNEUsaUJBQWlCLFVBQVUsR0FBRyw4QkFBOEI7O0FBRXhLLGlEQUFpRCwwQ0FBMEMsMERBQTBELEVBQUU7O0FBRXZKLDJDQUEyQyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVELDJEQUEyRCxFQUFFOztBQUUzVCw2REFBNkQsc0VBQXNFLDhEQUE4RCxvQkFBb0I7O0FBRXJOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEZBQThGLGFBQWE7QUFDM0c7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtRUFBbUUsZ0VBQWdFO0FBQ25JO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7O0FBRUE7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQLHFCQUFxQixzQkFBc0I7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxFQUFFO0FBQy9DOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxzQ0FBc0M7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLFVBQVUsU0FBUyxhQUFhO0FBQzlDO0FBQ0EsNENBQTRDLFVBQVUsc0JBQXNCLGFBQWE7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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBOztBQUVBLDJFQUEyRTtBQUMzRTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5COztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2Ryb3B6b25lL2Rpc3QvZHJvcHpvbmUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuLypcbiAqXG4gKiBNb3JlIGluZm8gYXQgW3d3dy5kcm9wem9uZWpzLmNvbV0oaHR0cDovL3d3dy5kcm9wem9uZWpzLmNvbSlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE1hdGlhcyBNZW5vXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqXG4gKi9cbi8vIFRoZSBFbWl0dGVyIGNsYXNzIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGNhbGwgYC5vbigpYCBvbiBEcm9wem9uZSB0byBsaXN0ZW5cbi8vIHRvIGV2ZW50cy5cbi8vIEl0IGlzIHN0cm9uZ2x5IGJhc2VkIG9uIGNvbXBvbmVudCdzIGVtaXR0ZXIgY2xhc3MsIGFuZCBJIHJlbW92ZWQgdGhlXG4vLyBmdW5jdGlvbmFsaXR5IGJlY2F1c2Ugb2YgdGhlIGRlcGVuZGVuY3kgaGVsbCB3aXRoIGRpZmZlcmVudCBmcmFtZXdvcmtzLlxudmFyIEVtaXR0ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFbWl0dGVyKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbWl0dGVyKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhFbWl0dGVyLCBbe1xuICAgIGtleTogXCJvblwiLFxuICAgIC8vIEFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgZ2l2ZW4gZXZlbnRcbiAgICB2YWx1ZTogZnVuY3Rpb24gb24oZXZlbnQsIGZuKSB7XG4gICAgICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307IC8vIENyZWF0ZSBuYW1lc3BhY2UgZm9yIHRoaXMgZXZlbnRcblxuICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3NbZXZlbnRdKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrc1tldmVudF0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2FsbGJhY2tzW2V2ZW50XS5wdXNoKGZuKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVtaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgICAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuICAgICAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1tldmVudF07XG5cbiAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gY2FsbGJhY2tzW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IChfc3RlcCA9IF9pdGVyYXRvci5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvcltcInJldHVyblwiXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcltcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gLy8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZvciBnaXZlbiBldmVudC4gSWYgZm4gaXMgbm90IHByb3ZpZGVkLCBhbGwgZXZlbnRcbiAgICAvLyBsaXN0ZW5lcnMgZm9yIHRoYXQgZXZlbnQgd2lsbCBiZSByZW1vdmVkLiBJZiBuZWl0aGVyIGlzIHByb3ZpZGVkLCBhbGxcbiAgICAvLyBldmVudCBsaXN0ZW5lcnMgd2lsbCBiZSByZW1vdmVkLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwib2ZmXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9mZihldmVudCwgZm4pIHtcbiAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0ge307XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSAvLyBzcGVjaWZpYyBldmVudFxuXG5cbiAgICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbZXZlbnRdO1xuXG4gICAgICBpZiAoIWNhbGxiYWNrcykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gLy8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xuXG5cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbZXZlbnRdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gLy8gcmVtb3ZlIHNwZWNpZmljIGhhbmRsZXJcblxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbaV07XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrID09PSBmbikge1xuICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEVtaXR0ZXI7XG59KCk7XG5cbnZhciBEcm9wem9uZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0VtaXR0ZXIpIHtcbiAgX2luaGVyaXRzKERyb3B6b25lLCBfRW1pdHRlcik7XG5cbiAgX2NyZWF0ZUNsYXNzKERyb3B6b25lLCBudWxsLCBbe1xuICAgIGtleTogXCJpbml0Q2xhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdENsYXNzKCkge1xuICAgICAgLy8gRXhwb3NpbmcgdGhlIGVtaXR0ZXIgY2xhc3MsIG1haW5seSBmb3IgdGVzdHNcbiAgICAgIHRoaXMucHJvdG90eXBlLkVtaXR0ZXIgPSBFbWl0dGVyO1xuICAgICAgLypcbiAgICAgICBUaGlzIGlzIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGV2ZW50cyB5b3UgY2FuIHJlZ2lzdGVyIG9uIGEgZHJvcHpvbmUgb2JqZWN0LlxuICAgICAgICBZb3UgY2FuIHJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIgbGlrZSB0aGlzOlxuICAgICAgICBkcm9wem9uZS5vbihcImRyYWdFbnRlclwiLCBmdW5jdGlvbigpIHsgfSk7XG4gICAgICAgICovXG5cbiAgICAgIHRoaXMucHJvdG90eXBlLmV2ZW50cyA9IFtcImRyb3BcIiwgXCJkcmFnc3RhcnRcIiwgXCJkcmFnZW5kXCIsIFwiZHJhZ2VudGVyXCIsIFwiZHJhZ292ZXJcIiwgXCJkcmFnbGVhdmVcIiwgXCJhZGRlZGZpbGVcIiwgXCJhZGRlZGZpbGVzXCIsIFwicmVtb3ZlZGZpbGVcIiwgXCJ0aHVtYm5haWxcIiwgXCJlcnJvclwiLCBcImVycm9ybXVsdGlwbGVcIiwgXCJwcm9jZXNzaW5nXCIsIFwicHJvY2Vzc2luZ211bHRpcGxlXCIsIFwidXBsb2FkcHJvZ3Jlc3NcIiwgXCJ0b3RhbHVwbG9hZHByb2dyZXNzXCIsIFwic2VuZGluZ1wiLCBcInNlbmRpbmdtdWx0aXBsZVwiLCBcInN1Y2Nlc3NcIiwgXCJzdWNjZXNzbXVsdGlwbGVcIiwgXCJjYW5jZWxlZFwiLCBcImNhbmNlbGVkbXVsdGlwbGVcIiwgXCJjb21wbGV0ZVwiLCBcImNvbXBsZXRlbXVsdGlwbGVcIiwgXCJyZXNldFwiLCBcIm1heGZpbGVzZXhjZWVkZWRcIiwgXCJtYXhmaWxlc3JlYWNoZWRcIiwgXCJxdWV1ZWNvbXBsZXRlXCJdO1xuICAgICAgdGhpcy5wcm90b3R5cGUuZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYXMgdG8gYmUgc3BlY2lmaWVkIG9uIGVsZW1lbnRzIG90aGVyIHRoYW4gZm9ybSAob3Igd2hlbiB0aGUgZm9ybVxuICAgICAgICAgKiBkb2Vzbid0IGhhdmUgYW4gYGFjdGlvbmAgYXR0cmlidXRlKS4gWW91IGNhbiBhbHNvXG4gICAgICAgICAqIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggYGZpbGVzYCBhbmRcbiAgICAgICAgICogbXVzdCByZXR1cm4gdGhlIHVybCAoc2luY2UgYHYzLjEyLjBgKVxuICAgICAgICAgKi9cbiAgICAgICAgdXJsOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYW4gYmUgY2hhbmdlZCB0byBgXCJwdXRcImAgaWYgbmVjZXNzYXJ5LiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIGZ1bmN0aW9uXG4gICAgICAgICAqIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBgZmlsZXNgIGFuZCBtdXN0IHJldHVybiB0aGUgbWV0aG9kIChzaW5jZSBgdjMuMTIuMGApLlxuICAgICAgICAgKi9cbiAgICAgICAgbWV0aG9kOiBcInBvc3RcIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogV2lsbCBiZSBzZXQgb24gdGhlIFhIUmVxdWVzdC5cbiAgICAgICAgICovXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aW1lb3V0IGZvciB0aGUgWEhSIHJlcXVlc3RzIGluIG1pbGxpc2Vjb25kcyAoc2luY2UgYHY0LjQuMGApLlxuICAgICAgICAgKi9cbiAgICAgICAgdGltZW91dDogMzAwMDAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdyBtYW55IGZpbGUgdXBsb2FkcyB0byBwcm9jZXNzIGluIHBhcmFsbGVsIChTZWUgdGhlXG4gICAgICAgICAqIEVucXVldWluZyBmaWxlIHVwbG9hZHMgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIGZvciBtb3JlIGluZm8pXG4gICAgICAgICAqL1xuICAgICAgICBwYXJhbGxlbFVwbG9hZHM6IDIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgdG8gc2VuZCBtdWx0aXBsZSBmaWxlcyBpbiBvbmUgcmVxdWVzdC4gSWZcbiAgICAgICAgICogdGhpcyBpdCBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgZmFsbGJhY2sgZmlsZSBpbnB1dCBlbGVtZW50IHdpbGxcbiAgICAgICAgICogaGF2ZSB0aGUgYG11bHRpcGxlYCBhdHRyaWJ1dGUgYXMgd2VsbC4gVGhpcyBvcHRpb24gd2lsbFxuICAgICAgICAgKiBhbHNvIHRyaWdnZXIgYWRkaXRpb25hbCBldmVudHMgKGxpa2UgYHByb2Nlc3NpbmdtdWx0aXBsZWApLiBTZWUgdGhlIGV2ZW50c1xuICAgICAgICAgKiBkb2N1bWVudGF0aW9uIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICB1cGxvYWRNdWx0aXBsZTogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgeW91IHdhbnQgZmlsZXMgdG8gYmUgdXBsb2FkZWQgaW4gY2h1bmtzIHRvIHlvdXIgc2VydmVyLiBUaGlzIGNhbid0IGJlXG4gICAgICAgICAqIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgdXBsb2FkTXVsdGlwbGVgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBTZWUgW2NodW5rc1VwbG9hZGVkXSgjY29uZmlnLWNodW5rc1VwbG9hZGVkKSBmb3IgdGhlIGNhbGxiYWNrIHRvIGZpbmFsaXNlIGFuIHVwbG9hZC5cbiAgICAgICAgICovXG4gICAgICAgIGNodW5raW5nOiBmYWxzZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYGNodW5raW5nYCBpcyBlbmFibGVkLCB0aGlzIGRlZmluZXMgd2hldGhlciAqKmV2ZXJ5KiogZmlsZSBzaG91bGQgYmUgY2h1bmtlZCxcbiAgICAgICAgICogZXZlbiBpZiB0aGUgZmlsZSBzaXplIGlzIGJlbG93IGNodW5rU2l6ZS4gVGhpcyBtZWFucywgdGhhdCB0aGUgYWRkaXRpb25hbCBjaHVua1xuICAgICAgICAgKiBmb3JtIGRhdGEgd2lsbCBiZSBzdWJtaXR0ZWQgYW5kIHRoZSBgY2h1bmtzVXBsb2FkZWRgIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZC5cbiAgICAgICAgICovXG4gICAgICAgIGZvcmNlQ2h1bmtpbmc6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBgY2h1bmtpbmdgIGlzIGB0cnVlYCwgdGhlbiB0aGlzIGRlZmluZXMgdGhlIGNodW5rIHNpemUgaW4gYnl0ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBjaHVua1NpemU6IDIwMDAwMDAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGB0cnVlYCwgdGhlIGluZGl2aWR1YWwgY2h1bmtzIG9mIGEgZmlsZSBhcmUgYmVpbmcgdXBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuXG4gICAgICAgICAqL1xuICAgICAgICBwYXJhbGxlbENodW5rVXBsb2FkczogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgYSBjaHVuayBzaG91bGQgYmUgcmV0cmllZCBpZiBpdCBmYWlscy5cbiAgICAgICAgICovXG4gICAgICAgIHJldHJ5Q2h1bmtzOiBmYWxzZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYHJldHJ5Q2h1bmtzYCBpcyB0cnVlLCBob3cgbWFueSB0aW1lcyBzaG91bGQgaXQgYmUgcmV0cmllZC5cbiAgICAgICAgICovXG4gICAgICAgIHJldHJ5Q2h1bmtzTGltaXQ6IDMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIG5vdCBgbnVsbGAgZGVmaW5lcyBob3cgbWFueSBmaWxlcyB0aGlzIERyb3B6b25lIGhhbmRsZXMuIElmIGl0IGV4Y2VlZHMsXG4gICAgICAgICAqIHRoZSBldmVudCBgbWF4ZmlsZXNleGNlZWRlZGAgd2lsbCBiZSBjYWxsZWQuIFRoZSBkcm9wem9uZSBlbGVtZW50IGdldHMgdGhlXG4gICAgICAgICAqIGNsYXNzIGBkei1tYXgtZmlsZXMtcmVhY2hlZGAgYWNjb3JkaW5nbHkgc28geW91IGNhbiBwcm92aWRlIHZpc3VhbCBmZWVkYmFjay5cbiAgICAgICAgICovXG4gICAgICAgIG1heEZpbGVzaXplOiAyNTYsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHBhcmFtIHRoYXQgZ2V0cyB0cmFuc2ZlcnJlZC5cbiAgICAgICAgICogKipOT1RFKio6IElmIHlvdSBoYXZlIHRoZSBvcHRpb24gIGB1cGxvYWRNdWx0aXBsZWAgc2V0IHRvIGB0cnVlYCwgdGhlblxuICAgICAgICAgKiBEcm9wem9uZSB3aWxsIGFwcGVuZCBgW11gIHRvIHRoZSBuYW1lLlxuICAgICAgICAgKi9cbiAgICAgICAgcGFyYW1OYW1lOiBcImZpbGVcIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogV2hldGhlciB0aHVtYm5haWxzIGZvciBpbWFnZXMgc2hvdWxkIGJlIGdlbmVyYXRlZFxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlSW1hZ2VUaHVtYm5haWxzOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBNQi4gV2hlbiB0aGUgZmlsZW5hbWUgZXhjZWVkcyB0aGlzIGxpbWl0LCB0aGUgdGh1bWJuYWlsIHdpbGwgbm90IGJlIGdlbmVyYXRlZC5cbiAgICAgICAgICovXG4gICAgICAgIG1heFRodW1ibmFpbEZpbGVzaXplOiAxMCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYG51bGxgLCB0aGUgcmF0aW8gb2YgdGhlIGltYWdlIHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgaXQuXG4gICAgICAgICAqL1xuICAgICAgICB0aHVtYm5haWxXaWR0aDogMTIwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2FtZSBhcyBgdGh1bWJuYWlsV2lkdGhgLiBJZiBib3RoIGFyZSBudWxsLCBpbWFnZXMgd2lsbCBub3QgYmUgcmVzaXplZC5cbiAgICAgICAgICovXG4gICAgICAgIHRodW1ibmFpbEhlaWdodDogMTIwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIb3cgdGhlIGltYWdlcyBzaG91bGQgYmUgc2NhbGVkIGRvd24gaW4gY2FzZSBib3RoLCBgdGh1bWJuYWlsV2lkdGhgIGFuZCBgdGh1bWJuYWlsSGVpZ2h0YCBhcmUgcHJvdmlkZWQuXG4gICAgICAgICAqIENhbiBiZSBlaXRoZXIgYGNvbnRhaW5gIG9yIGBjcm9wYC5cbiAgICAgICAgICovXG4gICAgICAgIHRodW1ibmFpbE1ldGhvZDogJ2Nyb3AnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBzZXQsIGltYWdlcyB3aWxsIGJlIHJlc2l6ZWQgdG8gdGhlc2UgZGltZW5zaW9ucyBiZWZvcmUgYmVpbmcgKip1cGxvYWRlZCoqLlxuICAgICAgICAgKiBJZiBvbmx5IG9uZSwgYHJlc2l6ZVdpZHRoYCAqKm9yKiogYHJlc2l6ZUhlaWdodGAgaXMgcHJvdmlkZWQsIHRoZSBvcmlnaW5hbCBhc3BlY3RcbiAgICAgICAgICogcmF0aW8gb2YgdGhlIGZpbGUgd2lsbCBiZSBwcmVzZXJ2ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBgb3B0aW9ucy50cmFuc2Zvcm1GaWxlYCBmdW5jdGlvbiB1c2VzIHRoZXNlIG9wdGlvbnMsIHNvIGlmIHRoZSBgdHJhbnNmb3JtRmlsZWAgZnVuY3Rpb25cbiAgICAgICAgICogaXMgb3ZlcnJpZGRlbiwgdGhlc2Ugb3B0aW9ucyBkb24ndCBkbyBhbnl0aGluZy5cbiAgICAgICAgICovXG4gICAgICAgIHJlc2l6ZVdpZHRoOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZWUgYHJlc2l6ZVdpZHRoYC5cbiAgICAgICAgICovXG4gICAgICAgIHJlc2l6ZUhlaWdodDogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG1pbWUgdHlwZSBvZiB0aGUgcmVzaXplZCBpbWFnZSAoYmVmb3JlIGl0IGdldHMgdXBsb2FkZWQgdG8gdGhlIHNlcnZlcikuXG4gICAgICAgICAqIElmIGBudWxsYCB0aGUgb3JpZ2luYWwgbWltZSB0eXBlIHdpbGwgYmUgdXNlZC4gVG8gZm9yY2UganBlZywgZm9yIGV4YW1wbGUsIHVzZSBgaW1hZ2UvanBlZ2AuXG4gICAgICAgICAqIFNlZSBgcmVzaXplV2lkdGhgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgcmVzaXplTWltZVR5cGU6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBxdWFsaXR5IG9mIHRoZSByZXNpemVkIGltYWdlcy4gU2VlIGByZXNpemVXaWR0aGAuXG4gICAgICAgICAqL1xuICAgICAgICByZXNpemVRdWFsaXR5OiAwLjgsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdyB0aGUgaW1hZ2VzIHNob3VsZCBiZSBzY2FsZWQgZG93biBpbiBjYXNlIGJvdGgsIGByZXNpemVXaWR0aGAgYW5kIGByZXNpemVIZWlnaHRgIGFyZSBwcm92aWRlZC5cbiAgICAgICAgICogQ2FuIGJlIGVpdGhlciBgY29udGFpbmAgb3IgYGNyb3BgLlxuICAgICAgICAgKi9cbiAgICAgICAgcmVzaXplTWV0aG9kOiAnY29udGFpbicsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBiYXNlIHRoYXQgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGZpbGVzaXplLiBZb3UgY2FuIGNoYW5nZSB0aGlzIHRvXG4gICAgICAgICAqIDEwMjQgaWYgeW91IHdvdWxkIHJhdGhlciBkaXNwbGF5IGtpYmlieXRlcywgbWViaWJ5dGVzLCBldGMuLi5cbiAgICAgICAgICogMTAyNCBpcyB0ZWNobmljYWxseSBpbmNvcnJlY3QsIGJlY2F1c2UgYDEwMjQgYnl0ZXNgIGFyZSBgMSBraWJpYnl0ZWAgbm90IGAxIGtpbG9ieXRlYC5cbiAgICAgICAgICogWW91IGNhbiBjaGFuZ2UgdGhpcyB0byBgMTAyNGAgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgdmFsaWRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlc2l6ZUJhc2U6IDEwMDAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbiBiZSB1c2VkIHRvIGxpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGlzIERyb3B6b25lXG4gICAgICAgICAqL1xuICAgICAgICBtYXhGaWxlczogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIHNlbmQgYWRkaXRpb25hbCBoZWFkZXJzIHRvIHRoZSBzZXJ2ZXIuIEVnOlxuICAgICAgICAgKiBgeyBcIk15LUF3ZXNvbWUtSGVhZGVyXCI6IFwiaGVhZGVyIHZhbHVlXCIgfWBcbiAgICAgICAgICovXG4gICAgICAgIGhlYWRlcnM6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGB0cnVlYCwgdGhlIGRyb3B6b25lIGVsZW1lbnQgaXRzZWxmIHdpbGwgYmUgY2xpY2thYmxlLCBpZiBgZmFsc2VgXG4gICAgICAgICAqIG5vdGhpbmcgd2lsbCBiZSBjbGlja2FibGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFlvdSBjYW4gYWxzbyBwYXNzIGFuIEhUTUwgZWxlbWVudCwgYSBDU1Mgc2VsZWN0b3IgKGZvciBtdWx0aXBsZSBlbGVtZW50cylcbiAgICAgICAgICogb3IgYW4gYXJyYXkgb2YgdGhvc2UuIEluIHRoYXQgY2FzZSwgYWxsIG9mIHRob3NlIGVsZW1lbnRzIHdpbGwgdHJpZ2dlciBhblxuICAgICAgICAgKiB1cGxvYWQgd2hlbiBjbGlja2VkLlxuICAgICAgICAgKi9cbiAgICAgICAgY2xpY2thYmxlOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIGhpZGRlbiBmaWxlcyBpbiBkaXJlY3RvcmllcyBzaG91bGQgYmUgaWdub3JlZC5cbiAgICAgICAgICovXG4gICAgICAgIGlnbm9yZUhpZGRlbkZpbGVzOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgYWNjZXB0YCBjaGVja3MgdGhlIGZpbGUncyBtaW1lIHR5cGUgb3JcbiAgICAgICAgICogZXh0ZW5zaW9uIGFnYWluc3QgdGhpcyBsaXN0LiBUaGlzIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbWltZVxuICAgICAgICAgKiB0eXBlcyBvciBmaWxlIGV4dGVuc2lvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEVnLjogYGltYWdlLyosYXBwbGljYXRpb24vcGRmLC5wc2RgXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBEcm9wem9uZSBpcyBgY2xpY2thYmxlYCB0aGlzIG9wdGlvbiB3aWxsIGFsc28gYmUgdXNlZCBhc1xuICAgICAgICAgKiBbYGFjY2VwdGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSFRNTC9FbGVtZW50L2lucHV0I2F0dHItYWNjZXB0KVxuICAgICAgICAgKiBwYXJhbWV0ZXIgb24gdGhlIGhpZGRlbiBmaWxlIGlucHV0IGFzIHdlbGwuXG4gICAgICAgICAqL1xuICAgICAgICBhY2NlcHRlZEZpbGVzOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAqKkRlcHJlY2F0ZWQhKipcbiAgICAgICAgICogVXNlIGFjY2VwdGVkRmlsZXMgaW5zdGVhZC5cbiAgICAgICAgICovXG4gICAgICAgIGFjY2VwdGVkTWltZVR5cGVzOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBmYWxzZSwgZmlsZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUgYnV0IHRoZSBxdWV1ZSB3aWxsIG5vdCBiZVxuICAgICAgICAgKiBwcm9jZXNzZWQgYXV0b21hdGljYWxseS5cbiAgICAgICAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBuZWVkIHNvbWUgYWRkaXRpb25hbCB1c2VyIGlucHV0IGJlZm9yZSBzZW5kaW5nXG4gICAgICAgICAqIGZpbGVzIChvciBpZiB5b3Ugd2FudCB3YW50IGFsbCBmaWxlcyBzZW50IGF0IG9uY2UpLlxuICAgICAgICAgKiBJZiB5b3UncmUgcmVhZHkgdG8gc2VuZCB0aGUgZmlsZSBzaW1wbHkgY2FsbCBgbXlEcm9wem9uZS5wcm9jZXNzUXVldWUoKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNlZSB0aGUgW2VucXVldWluZyBmaWxlIHVwbG9hZHNdKCNlbnF1ZXVpbmctZmlsZS11cGxvYWRzKSBkb2N1bWVudGF0aW9uXG4gICAgICAgICAqIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICBhdXRvUHJvY2Vzc1F1ZXVlOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBmYWxzZSwgZmlsZXMgYWRkZWQgdG8gdGhlIGRyb3B6b25lIHdpbGwgbm90IGJlIHF1ZXVlZCBieSBkZWZhdWx0LlxuICAgICAgICAgKiBZb3UnbGwgaGF2ZSB0byBjYWxsIGBlbnF1ZXVlRmlsZShmaWxlKWAgbWFudWFsbHkuXG4gICAgICAgICAqL1xuICAgICAgICBhdXRvUXVldWU6IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGB0cnVlYCwgdGhpcyB3aWxsIGFkZCBhIGxpbmsgdG8gZXZlcnkgZmlsZSBwcmV2aWV3IHRvIHJlbW92ZSBvciBjYW5jZWwgKGlmXG4gICAgICAgICAqIGFscmVhZHkgdXBsb2FkaW5nKSB0aGUgZmlsZS4gVGhlIGBkaWN0Q2FuY2VsVXBsb2FkYCwgYGRpY3RDYW5jZWxVcGxvYWRDb25maXJtYXRpb25gXG4gICAgICAgICAqIGFuZCBgZGljdFJlbW92ZUZpbGVgIG9wdGlvbnMgYXJlIHVzZWQgZm9yIHRoZSB3b3JkaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgYWRkUmVtb3ZlTGlua3M6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHdoZXJlIHRvIGRpc3BsYXkgdGhlIGZpbGUgcHJldmlld3Mg4oCTIGlmIGBudWxsYCB0aGVcbiAgICAgICAgICogRHJvcHpvbmUgZWxlbWVudCBpdHNlbGYgaXMgdXNlZC4gQ2FuIGJlIGEgcGxhaW4gYEhUTUxFbGVtZW50YCBvciBhIENTU1xuICAgICAgICAgKiBzZWxlY3Rvci4gVGhlIGVsZW1lbnQgc2hvdWxkIGhhdmUgdGhlIGBkcm9wem9uZS1wcmV2aWV3c2AgY2xhc3Mgc29cbiAgICAgICAgICogdGhlIHByZXZpZXdzIGFyZSBkaXNwbGF5ZWQgcHJvcGVybHkuXG4gICAgICAgICAqL1xuICAgICAgICBwcmV2aWV3c0NvbnRhaW5lcjogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBpcyB0aGUgZWxlbWVudCB0aGUgaGlkZGVuIGlucHV0IGZpZWxkICh3aGljaCBpcyB1c2VkIHdoZW4gY2xpY2tpbmcgb24gdGhlXG4gICAgICAgICAqIGRyb3B6b25lIHRvIHRyaWdnZXIgZmlsZSBzZWxlY3Rpb24pIHdpbGwgYmUgYXBwZW5kZWQgdG8uIFRoaXMgbWlnaHRcbiAgICAgICAgICogYmUgaW1wb3J0YW50IGluIGNhc2UgeW91IHVzZSBmcmFtZXdvcmtzIHRvIHN3aXRjaCB0aGUgY29udGVudCBvZiB5b3VyIHBhZ2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIENhbiBiZSBhIHNlbGVjdG9yIHN0cmluZywgb3IgYW4gZWxlbWVudCBkaXJlY3RseS5cbiAgICAgICAgICovXG4gICAgICAgIGhpZGRlbklucHV0Q29udGFpbmVyOiBcImJvZHlcIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgbnVsbCwgbm8gY2FwdHVyZSB0eXBlIHdpbGwgYmUgc3BlY2lmaWVkXG4gICAgICAgICAqIElmIGNhbWVyYSwgbW9iaWxlIGRldmljZXMgd2lsbCBza2lwIHRoZSBmaWxlIHNlbGVjdGlvbiBhbmQgY2hvb3NlIGNhbWVyYVxuICAgICAgICAgKiBJZiBtaWNyb3Bob25lLCBtb2JpbGUgZGV2aWNlcyB3aWxsIHNraXAgdGhlIGZpbGUgc2VsZWN0aW9uIGFuZCBjaG9vc2UgdGhlIG1pY3JvcGhvbmVcbiAgICAgICAgICogSWYgY2FtY29yZGVyLCBtb2JpbGUgZGV2aWNlcyB3aWxsIHNraXAgdGhlIGZpbGUgc2VsZWN0aW9uIGFuZCBjaG9vc2UgdGhlIGNhbWVyYSBpbiB2aWRlbyBtb2RlXG4gICAgICAgICAqIE9uIGFwcGxlIGRldmljZXMgbXVsdGlwbGUgbXVzdCBiZSBzZXQgdG8gZmFsc2UuICBBY2NlcHRlZEZpbGVzIG1heSBuZWVkIHRvXG4gICAgICAgICAqIGJlIHNldCB0byBhbiBhcHByb3ByaWF0ZSBtaW1lIHR5cGUgKGUuZy4gXCJpbWFnZS8qXCIsIFwiYXVkaW8vKlwiLCBvciBcInZpZGVvLypcIikuXG4gICAgICAgICAqL1xuICAgICAgICBjYXB0dXJlOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAqKkRlcHJlY2F0ZWQqKi4gVXNlIGByZW5hbWVGaWxlYCBpbnN0ZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgcmVuYW1lRmlsZW5hbWU6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGJlZm9yZSB0aGUgZmlsZSBpcyB1cGxvYWRlZCB0byB0aGUgc2VydmVyIGFuZCByZW5hbWVzIHRoZSBmaWxlLlxuICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGBGaWxlYCBhcyBhcmd1bWVudCBhbmQgY2FuIHVzZSB0aGUgYGZpbGUubmFtZWAuIFRoZSBhY3R1YWwgbmFtZSBvZiB0aGVcbiAgICAgICAgICogZmlsZSB0aGF0IGdldHMgdXNlZCBkdXJpbmcgdGhlIHVwbG9hZCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCBgZmlsZS51cGxvYWQuZmlsZW5hbWVgLlxuICAgICAgICAgKi9cbiAgICAgICAgcmVuYW1lRmlsZTogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYHRydWVgIHRoZSBmYWxsYmFjayB3aWxsIGJlIGZvcmNlZC4gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCB0byB0ZXN0IHlvdXIgc2VydmVyXG4gICAgICAgICAqIGltcGxlbWVudGF0aW9ucyBmaXJzdCBhbmQgbWFrZSBzdXJlIHRoYXQgZXZlcnl0aGluZyB3b3JrcyBhc1xuICAgICAgICAgKiBleHBlY3RlZCB3aXRob3V0IGRyb3B6b25lIGlmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zLCBhbmQgdG8gdGVzdFxuICAgICAgICAgKiBob3cgeW91ciBmYWxsYmFja3Mgd2lsbCBsb29rLlxuICAgICAgICAgKi9cbiAgICAgICAgZm9yY2VGYWxsYmFjazogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0ZXh0IHVzZWQgYmVmb3JlIGFueSBmaWxlcyBhcmUgZHJvcHBlZC5cbiAgICAgICAgICovXG4gICAgICAgIGRpY3REZWZhdWx0TWVzc2FnZTogXCJEcm9wIGZpbGVzIGhlcmUgdG8gdXBsb2FkXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0ZXh0IHRoYXQgcmVwbGFjZXMgdGhlIGRlZmF1bHQgbWVzc2FnZSB0ZXh0IGl0IHRoZSBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0RmFsbGJhY2tNZXNzYWdlOiBcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGRyYWcnbidkcm9wIGZpbGUgdXBsb2Fkcy5cIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRleHQgdGhhdCB3aWxsIGJlIGFkZGVkIGJlZm9yZSB0aGUgZmFsbGJhY2sgZm9ybS5cbiAgICAgICAgICogSWYgeW91IHByb3ZpZGUgYSAgZmFsbGJhY2sgZWxlbWVudCB5b3Vyc2VsZiwgb3IgaWYgdGhpcyBvcHRpb24gaXMgYG51bGxgIHRoaXMgd2lsbFxuICAgICAgICAgKiBiZSBpZ25vcmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZGljdEZhbGxiYWNrVGV4dDogXCJQbGVhc2UgdXNlIHRoZSBmYWxsYmFjayBmb3JtIGJlbG93IHRvIHVwbG9hZCB5b3VyIGZpbGVzIGxpa2UgaW4gdGhlIG9sZGVuIGRheXMuXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHRoZSBmaWxlc2l6ZSBpcyB0b28gYmlnLlxuICAgICAgICAgKiBge3tmaWxlc2l6ZX19YCBhbmQgYHt7bWF4RmlsZXNpemV9fWAgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSByZXNwZWN0aXZlIGNvbmZpZ3VyYXRpb24gdmFsdWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgZGljdEZpbGVUb29CaWc6IFwiRmlsZSBpcyB0b28gYmlnICh7e2ZpbGVzaXplfX1NaUIpLiBNYXggZmlsZXNpemU6IHt7bWF4RmlsZXNpemV9fU1pQi5cIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlIGZpbGUgZG9lc24ndCBtYXRjaCB0aGUgZmlsZSB0eXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgZGljdEludmFsaWRGaWxlVHlwZTogXCJZb3UgY2FuJ3QgdXBsb2FkIGZpbGVzIG9mIHRoaXMgdHlwZS5cIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlIHNlcnZlciByZXNwb25zZSB3YXMgaW52YWxpZC5cbiAgICAgICAgICogYHt7c3RhdHVzQ29kZX19YCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHNlcnZlcnMgc3RhdHVzIGNvZGUuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0UmVzcG9uc2VFcnJvcjogXCJTZXJ2ZXIgcmVzcG9uZGVkIHdpdGgge3tzdGF0dXNDb2RlfX0gY29kZS5cIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYGFkZFJlbW92ZUxpbmtzYCBpcyB0cnVlLCB0aGUgdGV4dCB0byBiZSB1c2VkIGZvciB0aGUgY2FuY2VsIHVwbG9hZCBsaW5rLlxuICAgICAgICAgKi9cbiAgICAgICAgZGljdENhbmNlbFVwbG9hZDogXCJDYW5jZWwgdXBsb2FkXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkIGlmIGFuIHVwbG9hZCB3YXMgbWFudWFsbHkgY2FuY2VsZWRcbiAgICAgICAgICovXG4gICAgICAgIGRpY3RVcGxvYWRDYW5jZWxlZDogXCJVcGxvYWQgY2FuY2VsZWQuXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGBhZGRSZW1vdmVMaW5rc2AgaXMgdHJ1ZSwgdGhlIHRleHQgdG8gYmUgdXNlZCBmb3IgY29uZmlybWF0aW9uIHdoZW4gY2FuY2VsbGluZyB1cGxvYWQuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0Q2FuY2VsVXBsb2FkQ29uZmlybWF0aW9uOiBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjYW5jZWwgdGhpcyB1cGxvYWQ/XCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGBhZGRSZW1vdmVMaW5rc2AgaXMgdHJ1ZSwgdGhlIHRleHQgdG8gYmUgdXNlZCB0byByZW1vdmUgYSBmaWxlLlxuICAgICAgICAgKi9cbiAgICAgICAgZGljdFJlbW92ZUZpbGU6IFwiUmVtb3ZlIGZpbGVcIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhpcyBpcyBub3QgbnVsbCwgdGhlbiB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIGJlZm9yZSByZW1vdmluZyBhIGZpbGUuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0UmVtb3ZlRmlsZUNvbmZpcm1hdGlvbjogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzcGxheWVkIGlmIGBtYXhGaWxlc2AgaXMgc3QgYW5kIGV4Y2VlZGVkLlxuICAgICAgICAgKiBUaGUgc3RyaW5nIGB7e21heEZpbGVzfX1gIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0TWF4RmlsZXNFeGNlZWRlZDogXCJZb3UgY2FuIG5vdCB1cGxvYWQgYW55IG1vcmUgZmlsZXMuXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyB5b3UgdG8gdHJhbnNsYXRlIHRoZSBkaWZmZXJlbnQgdW5pdHMuIFN0YXJ0aW5nIHdpdGggYHRiYCBmb3IgdGVyYWJ5dGVzIGFuZCBnb2luZyBkb3duIHRvXG4gICAgICAgICAqIGBiYCBmb3IgYnl0ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0RmlsZVNpemVVbml0czoge1xuICAgICAgICAgIHRiOiBcIlRCXCIsXG4gICAgICAgICAgZ2I6IFwiR0JcIixcbiAgICAgICAgICBtYjogXCJNQlwiLFxuICAgICAgICAgIGtiOiBcIktCXCIsXG4gICAgICAgICAgYjogXCJiXCJcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbGVkIHdoZW4gZHJvcHpvbmUgaW5pdGlhbGl6ZWRcbiAgICAgICAgICogWW91IGNhbiBhZGQgZXZlbnQgbGlzdGVuZXJzIGhlcmVcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7fSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FuIGJlIGFuICoqb2JqZWN0Kiogb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRyYW5zZmVyIHRvIHRoZSBzZXJ2ZXIsICoqb3IqKiBhIGBGdW5jdGlvbmBcbiAgICAgICAgICogdGhhdCBnZXRzIGludm9rZWQgd2l0aCB0aGUgYGZpbGVzYCwgYHhocmAgYW5kLCBpZiBpdCdzIGEgY2h1bmtlZCB1cGxvYWQsIGBjaHVua2AgYXJndW1lbnRzLiBJbiBjYXNlXG4gICAgICAgICAqIG9mIGEgZnVuY3Rpb24sIHRoaXMgbmVlZHMgdG8gcmV0dXJuIGEgbWFwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgZm9yIG5vcm1hbCB1cGxvYWRzLCBidXQgYWRkcyByZWxldmFudCBpbmZvcm1hdGlvbiBmb3JcbiAgICAgICAgICogY2h1bmtlZCB1cGxvYWRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGFkZGluZyBoaWRkZW4gaW5wdXQgZmllbGRzIGluIHRoZSBmb3JtIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICBwYXJhbXM6IGZ1bmN0aW9uIHBhcmFtcyhmaWxlcywgeGhyLCBjaHVuaykge1xuICAgICAgICAgIGlmIChjaHVuaykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZHp1dWlkOiBjaHVuay5maWxlLnVwbG9hZC51dWlkLFxuICAgICAgICAgICAgICBkemNodW5raW5kZXg6IGNodW5rLmluZGV4LFxuICAgICAgICAgICAgICBkenRvdGFsZmlsZXNpemU6IGNodW5rLmZpbGUuc2l6ZSxcbiAgICAgICAgICAgICAgZHpjaHVua3NpemU6IHRoaXMub3B0aW9ucy5jaHVua1NpemUsXG4gICAgICAgICAgICAgIGR6dG90YWxjaHVua2NvdW50OiBjaHVuay5maWxlLnVwbG9hZC50b3RhbENodW5rQ291bnQsXG4gICAgICAgICAgICAgIGR6Y2h1bmtieXRlb2Zmc2V0OiBjaHVuay5pbmRleCAqIHRoaXMub3B0aW9ucy5jaHVua1NpemVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgZ2V0cyBhIFtmaWxlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RPTS9GaWxlKVxuICAgICAgICAgKiBhbmQgYSBgZG9uZWAgZnVuY3Rpb24gYXMgcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGRvbmUgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgdGhlIGZpbGUgaXMgXCJhY2NlcHRlZFwiIGFuZCB3aWxsXG4gICAgICAgICAqIGJlIHByb2Nlc3NlZC4gSWYgeW91IHBhc3MgYW4gZXJyb3IgbWVzc2FnZSwgdGhlIGZpbGUgaXMgcmVqZWN0ZWQsIGFuZCB0aGUgZXJyb3JcbiAgICAgICAgICogbWVzc2FnZSB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlIGZpbGUgaXMgdG9vIGJpZyBvciBkb2Vzbid0IG1hdGNoIHRoZSBtaW1lIHR5cGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQoZmlsZSwgZG9uZSkge1xuICAgICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIGFsbCBjaHVua3MgaGF2ZSBiZWVuIHVwbG9hZGVkIGZvciBhIGZpbGUuXG4gICAgICAgICAqIEl0IGdldHMgdGhlIGZpbGUgZm9yIHdoaWNoIHRoZSBjaHVua3MgaGF2ZSBiZWVuIHVwbG9hZGVkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIsXG4gICAgICAgICAqIGFuZCB0aGUgYGRvbmVgIGZ1bmN0aW9uIGFzIHNlY29uZC4gYGRvbmUoKWAgbmVlZHMgdG8gYmUgaW52b2tlZCB3aGVuIGV2ZXJ5dGhpbmdcbiAgICAgICAgICogbmVlZGVkIHRvIGZpbmlzaCB0aGUgdXBsb2FkIHByb2Nlc3MgaXMgZG9uZS5cbiAgICAgICAgICovXG4gICAgICAgIGNodW5rc1VwbG9hZGVkOiBmdW5jdGlvbiBjaHVua3NVcGxvYWRlZChmaWxlLCBkb25lKSB7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGNhbGxlZCB3aGVuIHRoZSBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNob3dzIHRoZSBmYWxsYmFjayBpbnB1dCBmaWVsZCBhbmQgYWRkc1xuICAgICAgICAgKiBhIHRleHQuXG4gICAgICAgICAqL1xuICAgICAgICBmYWxsYmFjazogZnVuY3Rpb24gZmFsbGJhY2soKSB7XG4gICAgICAgICAgLy8gVGhpcyBjb2RlIHNob3VsZCBwYXNzIGluIElFNy4uLiA6KFxuICAgICAgICAgIHZhciBtZXNzYWdlRWxlbWVudDtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gXCJcIi5jb25jYXQodGhpcy5lbGVtZW50LmNsYXNzTmFtZSwgXCIgZHotYnJvd3Nlci1ub3Qtc3VwcG9ydGVkXCIpO1xuICAgICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWU7XG4gICAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMiA9IGZhbHNlO1xuICAgICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjIgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IHRoaXMuZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImRpdlwiKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMjsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IChfc3RlcDIgPSBfaXRlcmF0b3IyLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gdHJ1ZSkge1xuICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgICAgICAgaWYgKC8oXnwgKWR6LW1lc3NhZ2UoJHwgKS8udGVzdChjaGlsZC5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICBjaGlsZC5jbGFzc05hbWUgPSBcImR6LW1lc3NhZ2VcIjsgLy8gUmVtb3ZlcyB0aGUgJ2R6LWRlZmF1bHQnIGNsYXNzXG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yMiA9IGVycjtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiAmJiBfaXRlcmF0b3IyW1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBfaXRlcmF0b3IyW1wicmV0dXJuXCJdKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW1lc3NhZ2VFbGVtZW50KSB7XG4gICAgICAgICAgICBtZXNzYWdlRWxlbWVudCA9IERyb3B6b25lLmNyZWF0ZUVsZW1lbnQoXCI8ZGl2IGNsYXNzPVxcXCJkei1tZXNzYWdlXFxcIj48c3Bhbj48L3NwYW4+PC9kaXY+XCIpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKG1lc3NhZ2VFbGVtZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgc3BhbiA9IG1lc3NhZ2VFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic3BhblwiKVswXTtcblxuICAgICAgICAgIGlmIChzcGFuKSB7XG4gICAgICAgICAgICBpZiAoc3Bhbi50ZXh0Q29udGVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLm9wdGlvbnMuZGljdEZhbGxiYWNrTWVzc2FnZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3Bhbi5pbm5lclRleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBzcGFuLmlubmVyVGV4dCA9IHRoaXMub3B0aW9ucy5kaWN0RmFsbGJhY2tNZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5nZXRGYWxsYmFja0Zvcm0oKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgY2FsbGVkIHRvIGNhbGN1bGF0ZSB0aGUgdGh1bWJuYWlsIGRpbWVuc2lvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEl0IGdldHMgYGZpbGVgLCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCAoYm90aCBtYXkgYmUgYG51bGxgKSBhcyBwYXJhbWV0ZXJzIGFuZCBtdXN0IHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZzpcbiAgICAgICAgICpcbiAgICAgICAgICogIC0gYHNyY1dpZHRoYCAmIGBzcmNIZWlnaHRgIChyZXF1aXJlZClcbiAgICAgICAgICogIC0gYHRyZ1dpZHRoYCAmIGB0cmdIZWlnaHRgIChyZXF1aXJlZClcbiAgICAgICAgICogIC0gYHNyY1hgICYgYHNyY1lgIChvcHRpb25hbCwgZGVmYXVsdCBgMGApXG4gICAgICAgICAqICAtIGB0cmdYYCAmIGB0cmdZYCAob3B0aW9uYWwsIGRlZmF1bHQgYDBgKVxuICAgICAgICAgKlxuICAgICAgICAgKiBUaG9zZSB2YWx1ZXMgYXJlIGdvaW5nIHRvIGJlIHVzZWQgYnkgYGN0eC5kcmF3SW1hZ2UoKWAuXG4gICAgICAgICAqL1xuICAgICAgICByZXNpemU6IGZ1bmN0aW9uIHJlc2l6ZShmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QpIHtcbiAgICAgICAgICB2YXIgaW5mbyA9IHtcbiAgICAgICAgICAgIHNyY1g6IDAsXG4gICAgICAgICAgICBzcmNZOiAwLFxuICAgICAgICAgICAgc3JjV2lkdGg6IGZpbGUud2lkdGgsXG4gICAgICAgICAgICBzcmNIZWlnaHQ6IGZpbGUuaGVpZ2h0XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgc3JjUmF0aW8gPSBmaWxlLndpZHRoIC8gZmlsZS5oZWlnaHQ7IC8vIEF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlIGRpbWVuc2lvbnMgaWYgbm90IHNwZWNpZmllZFxuXG4gICAgICAgICAgaWYgKHdpZHRoID09IG51bGwgJiYgaGVpZ2h0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHdpZHRoID0gaW5mby5zcmNXaWR0aDtcbiAgICAgICAgICAgIGhlaWdodCA9IGluZm8uc3JjSGVpZ2h0O1xuICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPT0gbnVsbCkge1xuICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgKiBzcmNSYXRpbztcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlaWdodCA9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAvIHNyY1JhdGlvO1xuICAgICAgICAgIH0gLy8gTWFrZSBzdXJlIGltYWdlcyBhcmVuJ3QgdXBzY2FsZWRcblxuXG4gICAgICAgICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgaW5mby5zcmNXaWR0aCk7XG4gICAgICAgICAgaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCBpbmZvLnNyY0hlaWdodCk7XG4gICAgICAgICAgdmFyIHRyZ1JhdGlvID0gd2lkdGggLyBoZWlnaHQ7XG5cbiAgICAgICAgICBpZiAoaW5mby5zcmNXaWR0aCA+IHdpZHRoIHx8IGluZm8uc3JjSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAvLyBJbWFnZSBpcyBiaWdnZXIgYW5kIG5lZWRzIHJlc2NhbGluZ1xuICAgICAgICAgICAgaWYgKHJlc2l6ZU1ldGhvZCA9PT0gJ2Nyb3AnKSB7XG4gICAgICAgICAgICAgIGlmIChzcmNSYXRpbyA+IHRyZ1JhdGlvKSB7XG4gICAgICAgICAgICAgICAgaW5mby5zcmNIZWlnaHQgPSBmaWxlLmhlaWdodDtcbiAgICAgICAgICAgICAgICBpbmZvLnNyY1dpZHRoID0gaW5mby5zcmNIZWlnaHQgKiB0cmdSYXRpbztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmZvLnNyY1dpZHRoID0gZmlsZS53aWR0aDtcbiAgICAgICAgICAgICAgICBpbmZvLnNyY0hlaWdodCA9IGluZm8uc3JjV2lkdGggLyB0cmdSYXRpbztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNpemVNZXRob2QgPT09ICdjb250YWluJykge1xuICAgICAgICAgICAgICAvLyBNZXRob2QgJ2NvbnRhaW4nXG4gICAgICAgICAgICAgIGlmIChzcmNSYXRpbyA+IHRyZ1JhdGlvKSB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gd2lkdGggLyBzcmNSYXRpbztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHNyY1JhdGlvO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHJlc2l6ZU1ldGhvZCAnXCIuY29uY2F0KHJlc2l6ZU1ldGhvZCwgXCInXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbmZvLnNyY1ggPSAoZmlsZS53aWR0aCAtIGluZm8uc3JjV2lkdGgpIC8gMjtcbiAgICAgICAgICBpbmZvLnNyY1kgPSAoZmlsZS5oZWlnaHQgLSBpbmZvLnNyY0hlaWdodCkgLyAyO1xuICAgICAgICAgIGluZm8udHJnV2lkdGggPSB3aWR0aDtcbiAgICAgICAgICBpbmZvLnRyZ0hlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FuIGJlIHVzZWQgdG8gdHJhbnNmb3JtIHRoZSBmaWxlIChmb3IgZXhhbXBsZSwgcmVzaXplIGFuIGltYWdlIGlmIG5lY2Vzc2FyeSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZXMgYHJlc2l6ZVdpZHRoYCBhbmQgYHJlc2l6ZUhlaWdodGAgKGlmIHByb3ZpZGVkKSBhbmQgcmVzaXplc1xuICAgICAgICAgKiBpbWFnZXMgYWNjb3JkaW5nIHRvIHRob3NlIGRpbWVuc2lvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEdldHMgdGhlIGBmaWxlYCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCBhbmQgYSBgZG9uZSgpYCBmdW5jdGlvbiBhcyB0aGUgc2Vjb25kLCB0aGF0IG5lZWRzXG4gICAgICAgICAqIHRvIGJlIGludm9rZWQgd2l0aCB0aGUgZmlsZSB3aGVuIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lLlxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmb3JtRmlsZTogZnVuY3Rpb24gdHJhbnNmb3JtRmlsZShmaWxlLCBkb25lKSB7XG4gICAgICAgICAgaWYgKCh0aGlzLm9wdGlvbnMucmVzaXplV2lkdGggfHwgdGhpcy5vcHRpb25zLnJlc2l6ZUhlaWdodCkgJiYgZmlsZS50eXBlLm1hdGNoKC9pbWFnZS4qLykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZUltYWdlKGZpbGUsIHRoaXMub3B0aW9ucy5yZXNpemVXaWR0aCwgdGhpcy5vcHRpb25zLnJlc2l6ZUhlaWdodCwgdGhpcy5vcHRpb25zLnJlc2l6ZU1ldGhvZCwgZG9uZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKGZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgdGVtcGxhdGUgdXNlZCBmb3IgZWFjaCBkcm9wcGVkXG4gICAgICAgICAqIGZpbGUuIENoYW5nZSBpdCB0byBmdWxmaWxsIHlvdXIgbmVlZHMgYnV0IG1ha2Ugc3VyZSB0byBwcm9wZXJseVxuICAgICAgICAgKiBwcm92aWRlIGFsbCBlbGVtZW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgeW91IHdhbnQgdG8gdXNlIGFuIGFjdHVhbCBIVE1MIGVsZW1lbnQgaW5zdGVhZCBvZiBwcm92aWRpbmcgYSBTdHJpbmdcbiAgICAgICAgICogYXMgYSBjb25maWcgb3B0aW9uLCB5b3UgY291bGQgY3JlYXRlIGEgZGl2IHdpdGggdGhlIGlkIGB0cGxgLFxuICAgICAgICAgKiBwdXQgdGhlIHRlbXBsYXRlIGluc2lkZSBpdCBhbmQgcHJvdmlkZSB0aGUgZWxlbWVudCBsaWtlIHRoaXM6XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBkb2N1bWVudFxuICAgICAgICAgKiAgICAgICAucXVlcnlTZWxlY3RvcignI3RwbCcpXG4gICAgICAgICAqICAgICAgIC5pbm5lckhUTUxcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIHByZXZpZXdUZW1wbGF0ZTogXCI8ZGl2IGNsYXNzPVxcXCJkei1wcmV2aWV3IGR6LWZpbGUtcHJldmlld1xcXCI+XFxuICA8ZGl2IGNsYXNzPVxcXCJkei1pbWFnZVxcXCI+PGltZyBkYXRhLWR6LXRodW1ibmFpbCAvPjwvZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwiZHotZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImR6LXNpemVcXFwiPjxzcGFuIGRhdGEtZHotc2l6ZT48L3NwYW4+PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImR6LWZpbGVuYW1lXFxcIj48c3BhbiBkYXRhLWR6LW5hbWU+PC9zcGFuPjwvZGl2PlxcbiAgPC9kaXY+XFxuICA8ZGl2IGNsYXNzPVxcXCJkei1wcm9ncmVzc1xcXCI+PHNwYW4gY2xhc3M9XFxcImR6LXVwbG9hZFxcXCIgZGF0YS1kei11cGxvYWRwcm9ncmVzcz48L3NwYW4+PC9kaXY+XFxuICA8ZGl2IGNsYXNzPVxcXCJkei1lcnJvci1tZXNzYWdlXFxcIj48c3BhbiBkYXRhLWR6LWVycm9ybWVzc2FnZT48L3NwYW4+PC9kaXY+XFxuICA8ZGl2IGNsYXNzPVxcXCJkei1zdWNjZXNzLW1hcmtcXFwiPlxcbiAgICA8c3ZnIHdpZHRoPVxcXCI1NHB4XFxcIiBoZWlnaHQ9XFxcIjU0cHhcXFwiIHZpZXdCb3g9XFxcIjAgMCA1NCA1NFxcXCIgdmVyc2lvbj1cXFwiMS4xXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIj5cXG4gICAgICA8dGl0bGU+Q2hlY2s8L3RpdGxlPlxcbiAgICAgIDxnIHN0cm9rZT1cXFwibm9uZVxcXCIgc3Ryb2tlLXdpZHRoPVxcXCIxXFxcIiBmaWxsPVxcXCJub25lXFxcIiBmaWxsLXJ1bGU9XFxcImV2ZW5vZGRcXFwiPlxcbiAgICAgICAgPHBhdGggZD1cXFwiTTIzLjUsMzEuODQzMTQ1OCBMMTcuNTg1MjQxOSwyNS45MjgzODc3IEMxNi4wMjQ4MjUzLDI0LjM2Nzk3MTEgMTMuNDkxMDI5NCwyNC4zNjY4MzUgMTEuOTI4OTMyMiwyNS45Mjg5MzIyIEMxMC4zNzAwMTM2LDI3LjQ4Nzg1MDggMTAuMzY2NTkxMiwzMC4wMjM0NDU1IDExLjkyODM4NzcsMzEuNTg1MjQxOSBMMjAuNDE0NzU4MSw0MC4wNzE2MTIzIEMyMC41MTMzOTk5LDQwLjE3MDI1NDEgMjAuNjE1OTMxNSw0MC4yNjI2NjQ5IDIwLjcyMTg2MTUsNDAuMzQ4ODQzNSBDMjIuMjgzNTY2OSw0MS44NzI1NjUxIDI0Ljc5NDIzNCw0MS44NjI2MjAyIDI2LjM0NjE1NjQsNDAuMzEwNjk3OCBMNDMuMzEwNjk3OCwyMy4zNDYxNTY0IEM0NC44NzcxMDIxLDIxLjc3OTc1MjEgNDQuODc1ODA1NywxOS4yNDgzODg3IDQzLjMxMzcwODUsMTcuNjg2MjkxNSBDNDEuNzU0Nzg5OSwxNi4xMjczNzI5IDM5LjIxNzYwMzUsMTYuMTI1NTQyMiAzNy42NTM4NDM2LDE3LjY4OTMwMjIgTDIzLjUsMzEuODQzMTQ1OCBaIE0yNyw1MyBDNDEuMzU5NDAzNSw1MyA1Myw0MS4zNTk0MDM1IDUzLDI3IEM1MywxMi42NDA1OTY1IDQxLjM1OTQwMzUsMSAyNywxIEMxMi42NDA1OTY1LDEgMSwxMi42NDA1OTY1IDEsMjcgQzEsNDEuMzU5NDAzNSAxMi42NDA1OTY1LDUzIDI3LDUzIFpcXFwiIHN0cm9rZS1vcGFjaXR5PVxcXCIwLjE5ODc5NDE1OFxcXCIgc3Ryb2tlPVxcXCIjNzQ3NDc0XFxcIiBmaWxsLW9wYWNpdHk9XFxcIjAuODE2NTE5NDc1XFxcIiBmaWxsPVxcXCIjRkZGRkZGXFxcIj48L3BhdGg+XFxuICAgICAgPC9nPlxcbiAgICA8L3N2Zz5cXG4gIDwvZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwiZHotZXJyb3ItbWFya1xcXCI+XFxuICAgIDxzdmcgd2lkdGg9XFxcIjU0cHhcXFwiIGhlaWdodD1cXFwiNTRweFxcXCIgdmlld0JveD1cXFwiMCAwIDU0IDU0XFxcIiB2ZXJzaW9uPVxcXCIxLjFcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgeG1sbnM6eGxpbms9XFxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcXFwiPlxcbiAgICAgIDx0aXRsZT5FcnJvcjwvdGl0bGU+XFxuICAgICAgPGcgc3Ryb2tlPVxcXCJub25lXFxcIiBzdHJva2Utd2lkdGg9XFxcIjFcXFwiIGZpbGw9XFxcIm5vbmVcXFwiIGZpbGwtcnVsZT1cXFwiZXZlbm9kZFxcXCI+XFxuICAgICAgICA8ZyBzdHJva2U9XFxcIiM3NDc0NzRcXFwiIHN0cm9rZS1vcGFjaXR5PVxcXCIwLjE5ODc5NDE1OFxcXCIgZmlsbD1cXFwiI0ZGRkZGRlxcXCIgZmlsbC1vcGFjaXR5PVxcXCIwLjgxNjUxOTQ3NVxcXCI+XFxuICAgICAgICAgIDxwYXRoIGQ9XFxcIk0zMi42NTY4NTQyLDI5IEwzOC4zMTA2OTc4LDIzLjM0NjE1NjQgQzM5Ljg3NzEwMjEsMjEuNzc5NzUyMSAzOS44NzU4MDU3LDE5LjI0ODM4ODcgMzguMzEzNzA4NSwxNy42ODYyOTE1IEMzNi43NTQ3ODk5LDE2LjEyNzM3MjkgMzQuMjE3NjAzNSwxNi4xMjU1NDIyIDMyLjY1Mzg0MzYsMTcuNjg5MzAyMiBMMjcsMjMuMzQzMTQ1OCBMMjEuMzQ2MTU2NCwxNy42ODkzMDIyIEMxOS43ODIzOTY1LDE2LjEyNTU0MjIgMTcuMjQ1MjEwMSwxNi4xMjczNzI5IDE1LjY4NjI5MTUsMTcuNjg2MjkxNSBDMTQuMTI0MTk0MywxOS4yNDgzODg3IDE0LjEyMjg5NzksMjEuNzc5NzUyMSAxNS42ODkzMDIyLDIzLjM0NjE1NjQgTDIxLjM0MzE0NTgsMjkgTDE1LjY4OTMwMjIsMzQuNjUzODQzNiBDMTQuMTIyODk3OSwzNi4yMjAyNDc5IDE0LjEyNDE5NDMsMzguNzUxNjExMyAxNS42ODYyOTE1LDQwLjMxMzcwODUgQzE3LjI0NTIxMDEsNDEuODcyNjI3MSAxOS43ODIzOTY1LDQxLjg3NDQ1NzggMjEuMzQ2MTU2NCw0MC4zMTA2OTc4IEwyNywzNC42NTY4NTQyIEwzMi42NTM4NDM2LDQwLjMxMDY5NzggQzM0LjIxNzYwMzUsNDEuODc0NDU3OCAzNi43NTQ3ODk5LDQxLjg3MjYyNzEgMzguMzEzNzA4NSw0MC4zMTM3MDg1IEMzOS44NzU4MDU3LDM4Ljc1MTYxMTMgMzkuODc3MTAyMSwzNi4yMjAyNDc5IDM4LjMxMDY5NzgsMzQuNjUzODQzNiBMMzIuNjU2ODU0MiwyOSBaIE0yNyw1MyBDNDEuMzU5NDAzNSw1MyA1Myw0MS4zNTk0MDM1IDUzLDI3IEM1MywxMi42NDA1OTY1IDQxLjM1OTQwMzUsMSAyNywxIEMxMi42NDA1OTY1LDEgMSwxMi42NDA1OTY1IDEsMjcgQzEsNDEuMzU5NDAzNSAxMi42NDA1OTY1LDUzIDI3LDUzIFpcXFwiPjwvcGF0aD5cXG4gICAgICAgIDwvZz5cXG4gICAgICA8L2c+XFxuICAgIDwvc3ZnPlxcbiAgPC9kaXY+XFxuPC9kaXY+XCIsXG4gICAgICAgIC8vIEVORCBPUFRJT05TXG4gICAgICAgIC8vIChSZXF1aXJlZCBieSB0aGUgZHJvcHpvbmUgZG9jdW1lbnRhdGlvbiBwYXJzZXIpXG5cbiAgICAgICAgLypcbiAgICAgICAgIFRob3NlIGZ1bmN0aW9ucyByZWdpc3RlciB0aGVtc2VsdmVzIHRvIHRoZSBldmVudHMgb24gaW5pdCBhbmQgaGFuZGxlIGFsbFxuICAgICAgICAgdGhlIHVzZXIgaW50ZXJmYWNlIHNwZWNpZmljIHN0dWZmLiBPdmVyd3JpdGluZyB0aGVtIHdvbid0IGJyZWFrIHRoZSB1cGxvYWRcbiAgICAgICAgIGJ1dCBjYW4gYnJlYWsgdGhlIHdheSBpdCdzIGRpc3BsYXllZC5cbiAgICAgICAgIFlvdSBjYW4gb3ZlcndyaXRlIHRoZW0gaWYgeW91IGRvbid0IGxpa2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIElmIHlvdSBqdXN0XG4gICAgICAgICB3YW50IHRvIGFkZCBhbiBhZGRpdGlvbmFsIGV2ZW50IGhhbmRsZXIsIHJlZ2lzdGVyIGl0IG9uIHRoZSBkcm9wem9uZSBvYmplY3RcbiAgICAgICAgIGFuZCBkb24ndCBvdmVyd3JpdGUgdGhvc2Ugb3B0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIC8vIFRob3NlIGFyZSBzZWxmIGV4cGxhbmF0b3J5IGFuZCBzaW1wbHkgY29uY2VybiB0aGUgRHJhZ25Ecm9wLlxuICAgICAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKGUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJkei1kcmFnLWhvdmVyXCIpO1xuICAgICAgICB9LFxuICAgICAgICBkcmFnc3RhcnQ6IGZ1bmN0aW9uIGRyYWdzdGFydChlKSB7fSxcbiAgICAgICAgZHJhZ2VuZDogZnVuY3Rpb24gZHJhZ2VuZChlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiZHotZHJhZy1ob3ZlclwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2VudGVyOiBmdW5jdGlvbiBkcmFnZW50ZXIoZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LWRyYWctaG92ZXJcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGRyYWdvdmVyOiBmdW5jdGlvbiBkcmFnb3ZlcihlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotZHJhZy1ob3ZlclwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2xlYXZlOiBmdW5jdGlvbiBkcmFnbGVhdmUoZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImR6LWRyYWctaG92ZXJcIik7XG4gICAgICAgIH0sXG4gICAgICAgIHBhc3RlOiBmdW5jdGlvbiBwYXN0ZShlKSB7fSxcbiAgICAgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIHRoZXJlIGFyZSBubyBmaWxlcyBsZWZ0IGluIHRoZSBkcm9wem9uZSBhbnltb3JlLCBhbmQgdGhlXG4gICAgICAgIC8vIGRyb3B6b25lIHNob3VsZCBiZSBkaXNwbGF5ZWQgYXMgaWYgaW4gdGhlIGluaXRpYWwgc3RhdGUuXG4gICAgICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJkei1zdGFydGVkXCIpO1xuICAgICAgICB9LFxuICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIGZpbGUgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICAgIC8vIFJlY2VpdmVzIGBmaWxlYFxuICAgICAgICBhZGRlZGZpbGU6IGZ1bmN0aW9uIGFkZGVkZmlsZShmaWxlKSB7XG4gICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgICBpZiAodGhpcy5lbGVtZW50ID09PSB0aGlzLnByZXZpZXdzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LXN0YXJ0ZWRcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMucHJldmlld3NDb250YWluZXIpIHtcbiAgICAgICAgICAgIGZpbGUucHJldmlld0VsZW1lbnQgPSBEcm9wem9uZS5jcmVhdGVFbGVtZW50KHRoaXMub3B0aW9ucy5wcmV2aWV3VGVtcGxhdGUudHJpbSgpKTtcbiAgICAgICAgICAgIGZpbGUucHJldmlld1RlbXBsYXRlID0gZmlsZS5wcmV2aWV3RWxlbWVudDsgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuICAgICAgICAgICAgdGhpcy5wcmV2aWV3c0NvbnRhaW5lci5hcHBlbmRDaGlsZChmaWxlLnByZXZpZXdFbGVtZW50KTtcbiAgICAgICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IzID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IzID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gZmlsZS5wcmV2aWV3RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtZHotbmFtZV1cIilbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDM7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSAoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyA9IHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IF9zdGVwMy52YWx1ZTtcbiAgICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ID0gZmlsZS5uYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IzID0gZXJyO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zICYmIF9pdGVyYXRvcjNbXCJyZXR1cm5cIl0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yM1tcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IzKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCA9IHRydWU7XG4gICAgICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I0ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3I0ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I0ID0gZmlsZS5wcmV2aWV3RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtZHotc2l6ZV1cIilbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDQ7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgPSAoX3N0ZXA0ID0gX2l0ZXJhdG9yNC5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCA9IHRydWUpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gX3N0ZXA0LnZhbHVlO1xuICAgICAgICAgICAgICAgIG5vZGUuaW5uZXJIVE1MID0gdGhpcy5maWxlc2l6ZShmaWxlLnNpemUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3I0ID0gZXJyO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240ICYmIF9pdGVyYXRvcjRbXCJyZXR1cm5cIl0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yNFtcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I0KSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWRkUmVtb3ZlTGlua3MpIHtcbiAgICAgICAgICAgICAgZmlsZS5fcmVtb3ZlTGluayA9IERyb3B6b25lLmNyZWF0ZUVsZW1lbnQoXCI8YSBjbGFzcz1cXFwiZHotcmVtb3ZlXFxcIiBocmVmPVxcXCJqYXZhc2NyaXB0OnVuZGVmaW5lZDtcXFwiIGRhdGEtZHotcmVtb3ZlPlwiLmNvbmNhdCh0aGlzLm9wdGlvbnMuZGljdFJlbW92ZUZpbGUsIFwiPC9hPlwiKSk7XG4gICAgICAgICAgICAgIGZpbGUucHJldmlld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZmlsZS5fcmVtb3ZlTGluayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZW1vdmVGaWxlRXZlbnQgPSBmdW5jdGlvbiByZW1vdmVGaWxlRXZlbnQoZSkge1xuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgaWYgKGZpbGUuc3RhdHVzID09PSBEcm9wem9uZS5VUExPQURJTkcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRHJvcHpvbmUuY29uZmlybShfdGhpczIub3B0aW9ucy5kaWN0Q2FuY2VsVXBsb2FkQ29uZmlybWF0aW9uLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLnJlbW92ZUZpbGUoZmlsZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzMi5vcHRpb25zLmRpY3RSZW1vdmVGaWxlQ29uZmlybWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gRHJvcHpvbmUuY29uZmlybShfdGhpczIub3B0aW9ucy5kaWN0UmVtb3ZlRmlsZUNvbmZpcm1hdGlvbiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLnJlbW92ZUZpbGUoZmlsZSk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5yZW1vdmVGaWxlKGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb241ID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjUgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjUgPSBmaWxlLnByZXZpZXdFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1kei1yZW1vdmVdXCIpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA1OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb241ID0gKF9zdGVwNSA9IF9pdGVyYXRvcjUubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgPSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlbW92ZUxpbmsgPSBfc3RlcDUudmFsdWU7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTGluay5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlRmlsZUV2ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNSA9IHRydWU7XG4gICAgICAgICAgICAgIF9pdGVyYXRvckVycm9yNSA9IGVycjtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSAmJiBfaXRlcmF0b3I1W1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjVbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yNSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I1O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIGEgZmlsZSBpcyByZW1vdmVkLlxuICAgICAgICByZW1vdmVkZmlsZTogZnVuY3Rpb24gcmVtb3ZlZGZpbGUoZmlsZSkge1xuICAgICAgICAgIGlmIChmaWxlLnByZXZpZXdFbGVtZW50ICE9IG51bGwgJiYgZmlsZS5wcmV2aWV3RWxlbWVudC5wYXJlbnROb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZpbGUucHJldmlld0VsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmaWxlLnByZXZpZXdFbGVtZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlTWF4RmlsZXNSZWFjaGVkQ2xhc3MoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gQ2FsbGVkIHdoZW4gYSB0aHVtYm5haWwgaGFzIGJlZW4gZ2VuZXJhdGVkXG4gICAgICAgIC8vIFJlY2VpdmVzIGBmaWxlYCBhbmQgYGRhdGFVcmxgXG4gICAgICAgIHRodW1ibmFpbDogZnVuY3Rpb24gdGh1bWJuYWlsKGZpbGUsIGRhdGFVcmwpIHtcbiAgICAgICAgICBpZiAoZmlsZS5wcmV2aWV3RWxlbWVudCkge1xuICAgICAgICAgICAgZmlsZS5wcmV2aWV3RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiZHotZmlsZS1wcmV2aWV3XCIpO1xuICAgICAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjYgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjYgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjYgPSBmaWxlLnByZXZpZXdFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1kei10aHVtYm5haWxdXCIpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA2OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ID0gKF9zdGVwNiA9IF9pdGVyYXRvcjYubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjYgPSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRodW1ibmFpbEVsZW1lbnQgPSBfc3RlcDYudmFsdWU7XG4gICAgICAgICAgICAgICAgdGh1bWJuYWlsRWxlbWVudC5hbHQgPSBmaWxlLm5hbWU7XG4gICAgICAgICAgICAgICAgdGh1bWJuYWlsRWxlbWVudC5zcmMgPSBkYXRhVXJsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I2ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3I2ID0gZXJyO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ICYmIF9pdGVyYXRvcjZbXCJyZXR1cm5cIl0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yNltcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I2KSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpbGUucHJldmlld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LWltYWdlLXByZXZpZXdcIik7XG4gICAgICAgICAgICB9LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIENhbGxlZCB3aGVuZXZlciBhbiBlcnJvciBvY2N1cnNcbiAgICAgICAgLy8gUmVjZWl2ZXMgYGZpbGVgIGFuZCBgbWVzc2FnZWBcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIGVycm9yKGZpbGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgICBpZiAoZmlsZS5wcmV2aWV3RWxlbWVudCkge1xuICAgICAgICAgICAgZmlsZS5wcmV2aWV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotZXJyb3JcIik7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSAhPT0gXCJTdHJpbmdcIiAmJiBtZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yNyA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yNyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNyA9IGZpbGUucHJldmlld0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWR6LWVycm9ybWVzc2FnZV1cIilbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDc7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgPSAoX3N0ZXA3ID0gX2l0ZXJhdG9yNy5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNyA9IHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IF9zdGVwNy52YWx1ZTtcbiAgICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNyA9IHRydWU7XG4gICAgICAgICAgICAgIF9pdGVyYXRvckVycm9yNyA9IGVycjtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNyAmJiBfaXRlcmF0b3I3W1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjdbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yNykge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I3O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3JtdWx0aXBsZTogZnVuY3Rpb24gZXJyb3JtdWx0aXBsZSgpIHt9LFxuICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIGZpbGUgZ2V0cyBwcm9jZXNzZWQuIFNpbmNlIHRoZXJlIGlzIGEgY3VlLCBub3QgYWxsIGFkZGVkXG4gICAgICAgIC8vIGZpbGVzIGFyZSBwcm9jZXNzZWQgaW1tZWRpYXRlbHkuXG4gICAgICAgIC8vIFJlY2VpdmVzIGBmaWxlYFxuICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiBwcm9jZXNzaW5nKGZpbGUpIHtcbiAgICAgICAgICBpZiAoZmlsZS5wcmV2aWV3RWxlbWVudCkge1xuICAgICAgICAgICAgZmlsZS5wcmV2aWV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotcHJvY2Vzc2luZ1wiKTtcblxuICAgICAgICAgICAgaWYgKGZpbGUuX3JlbW92ZUxpbmspIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuX3JlbW92ZUxpbmsuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLmRpY3RDYW5jZWxVcGxvYWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwcm9jZXNzaW5nbXVsdGlwbGU6IGZ1bmN0aW9uIHByb2Nlc3NpbmdtdWx0aXBsZSgpIHt9LFxuICAgICAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgdGhlIHVwbG9hZCBwcm9ncmVzcyBnZXRzIHVwZGF0ZWQuXG4gICAgICAgIC8vIFJlY2VpdmVzIGBmaWxlYCwgYHByb2dyZXNzYCAocGVyY2VudGFnZSAwLTEwMCkgYW5kIGBieXRlc1NlbnRgLlxuICAgICAgICAvLyBUbyBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBvZiB0aGUgZmlsZSwgdXNlIGBmaWxlLnNpemVgXG4gICAgICAgIHVwbG9hZHByb2dyZXNzOiBmdW5jdGlvbiB1cGxvYWRwcm9ncmVzcyhmaWxlLCBwcm9ncmVzcywgYnl0ZXNTZW50KSB7XG4gICAgICAgICAgaWYgKGZpbGUucHJldmlld0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uOCA9IHRydWU7XG4gICAgICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I4ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3I4ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I4ID0gZmlsZS5wcmV2aWV3RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtZHotdXBsb2FkcHJvZ3Jlc3NdXCIpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA4OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb244ID0gKF9zdGVwOCA9IF9pdGVyYXRvcjgubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjggPSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBfc3RlcDgudmFsdWU7XG4gICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZSA9PT0gJ1BST0dSRVNTJyA/IG5vZGUudmFsdWUgPSBwcm9ncmVzcyA6IG5vZGUuc3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdChwcm9ncmVzcywgXCIlXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I4ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3I4ID0gZXJyO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb244ICYmIF9pdGVyYXRvcjhbXCJyZXR1cm5cIl0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yOFtcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I4KSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgdGhlIHRvdGFsIHVwbG9hZCBwcm9ncmVzcyBnZXRzIHVwZGF0ZWQuXG4gICAgICAgIC8vIENhbGxlZCB3aXRoIHRvdGFsVXBsb2FkUHJvZ3Jlc3MgKDAtMTAwKSwgdG90YWxCeXRlcyBhbmQgdG90YWxCeXRlc1NlbnRcbiAgICAgICAgdG90YWx1cGxvYWRwcm9ncmVzczogZnVuY3Rpb24gdG90YWx1cGxvYWRwcm9ncmVzcygpIHt9LFxuICAgICAgICAvLyBDYWxsZWQganVzdCBiZWZvcmUgdGhlIGZpbGUgaXMgc2VudC4gR2V0cyB0aGUgYHhocmAgb2JqZWN0IGFzIHNlY29uZFxuICAgICAgICAvLyBwYXJhbWV0ZXIsIHNvIHlvdSBjYW4gbW9kaWZ5IGl0IChmb3IgZXhhbXBsZSB0byBhZGQgYSBDU1JGIHRva2VuKSBhbmQgYVxuICAgICAgICAvLyBgZm9ybURhdGFgIG9iamVjdCB0byBhZGQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAgICAgICAgc2VuZGluZzogZnVuY3Rpb24gc2VuZGluZygpIHt9LFxuICAgICAgICBzZW5kaW5nbXVsdGlwbGU6IGZ1bmN0aW9uIHNlbmRpbmdtdWx0aXBsZSgpIHt9LFxuICAgICAgICAvLyBXaGVuIHRoZSBjb21wbGV0ZSB1cGxvYWQgaXMgZmluaXNoZWQgYW5kIHN1Y2Nlc3NmdWxcbiAgICAgICAgLy8gUmVjZWl2ZXMgYGZpbGVgXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIHN1Y2Nlc3MoZmlsZSkge1xuICAgICAgICAgIGlmIChmaWxlLnByZXZpZXdFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsZS5wcmV2aWV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotc3VjY2Vzc1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3NtdWx0aXBsZTogZnVuY3Rpb24gc3VjY2Vzc211bHRpcGxlKCkge30sXG4gICAgICAgIC8vIFdoZW4gdGhlIHVwbG9hZCBpcyBjYW5jZWxlZC5cbiAgICAgICAgY2FuY2VsZWQ6IGZ1bmN0aW9uIGNhbmNlbGVkKGZpbGUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KFwiZXJyb3JcIiwgZmlsZSwgdGhpcy5vcHRpb25zLmRpY3RVcGxvYWRDYW5jZWxlZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNhbmNlbGVkbXVsdGlwbGU6IGZ1bmN0aW9uIGNhbmNlbGVkbXVsdGlwbGUoKSB7fSxcbiAgICAgICAgLy8gV2hlbiB0aGUgdXBsb2FkIGlzIGZpbmlzaGVkLCBlaXRoZXIgd2l0aCBzdWNjZXNzIG9yIGFuIGVycm9yLlxuICAgICAgICAvLyBSZWNlaXZlcyBgZmlsZWBcbiAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKGZpbGUpIHtcbiAgICAgICAgICBpZiAoZmlsZS5fcmVtb3ZlTGluaykge1xuICAgICAgICAgICAgZmlsZS5fcmVtb3ZlTGluay5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMuZGljdFJlbW92ZUZpbGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpbGUucHJldmlld0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlLnByZXZpZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJkei1jb21wbGV0ZVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlbXVsdGlwbGU6IGZ1bmN0aW9uIGNvbXBsZXRlbXVsdGlwbGUoKSB7fSxcbiAgICAgICAgbWF4ZmlsZXNleGNlZWRlZDogZnVuY3Rpb24gbWF4ZmlsZXNleGNlZWRlZCgpIHt9LFxuICAgICAgICBtYXhmaWxlc3JlYWNoZWQ6IGZ1bmN0aW9uIG1heGZpbGVzcmVhY2hlZCgpIHt9LFxuICAgICAgICBxdWV1ZWNvbXBsZXRlOiBmdW5jdGlvbiBxdWV1ZWNvbXBsZXRlKCkge30sXG4gICAgICAgIGFkZGVkZmlsZXM6IGZ1bmN0aW9uIGFkZGVkZmlsZXMoKSB7fVxuICAgICAgfTtcbiAgICAgIHRoaXMucHJvdG90eXBlLl90aHVtYm5haWxRdWV1ZSA9IFtdO1xuICAgICAgdGhpcy5wcm90b3R5cGUuX3Byb2Nlc3NpbmdUaHVtYm5haWwgPSBmYWxzZTtcbiAgICB9IC8vIGdsb2JhbCB1dGlsaXR5XG5cbiAgfSwge1xuICAgIGtleTogXCJleHRlbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCkge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBvYmplY3RzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgb2JqZWN0c1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2kgPSAwLCBfb2JqZWN0cyA9IG9iamVjdHM7IF9pIDwgX29iamVjdHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBvYmplY3QgPSBfb2JqZWN0c1tfaV07XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIHZhciB2YWwgPSBvYmplY3Rba2V5XTtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIERyb3B6b25lKGVsLCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERyb3B6b25lKTtcblxuICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKERyb3B6b25lKS5jYWxsKHRoaXMpKTtcbiAgICB2YXIgZmFsbGJhY2ssIGxlZnQ7XG4gICAgX3RoaXMuZWxlbWVudCA9IGVsOyAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc2luY2UgdGhlIHZlcnNpb24gd2FzIGluIHRoZSBwcm90b3R5cGUgcHJldmlvdXNseVxuXG4gICAgX3RoaXMudmVyc2lvbiA9IERyb3B6b25lLnZlcnNpb247XG4gICAgX3RoaXMuZGVmYXVsdE9wdGlvbnMucHJldmlld1RlbXBsYXRlID0gX3RoaXMuZGVmYXVsdE9wdGlvbnMucHJldmlld1RlbXBsYXRlLnJlcGxhY2UoL1xcbiovZywgXCJcIik7XG4gICAgX3RoaXMuY2xpY2thYmxlRWxlbWVudHMgPSBbXTtcbiAgICBfdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICBfdGhpcy5maWxlcyA9IFtdOyAvLyBBbGwgZmlsZXNcblxuICAgIGlmICh0eXBlb2YgX3RoaXMuZWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgX3RoaXMuZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoX3RoaXMuZWxlbWVudCk7XG4gICAgfSAvLyBOb3QgY2hlY2tpbmcgaWYgaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQgb3IgRWxlbWVudCBzaW5jZSBJRTkgaXMgZXh0cmVtZWx5IHdlaXJkLlxuXG5cbiAgICBpZiAoIV90aGlzLmVsZW1lbnQgfHwgX3RoaXMuZWxlbWVudC5ub2RlVHlwZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRyb3B6b25lIGVsZW1lbnQuXCIpO1xuICAgIH1cblxuICAgIGlmIChfdGhpcy5lbGVtZW50LmRyb3B6b25lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEcm9wem9uZSBhbHJlYWR5IGF0dGFjaGVkLlwiKTtcbiAgICB9IC8vIE5vdyBhZGQgdGhpcyBkcm9wem9uZSB0byB0aGUgaW5zdGFuY2VzLlxuXG5cbiAgICBEcm9wem9uZS5pbnN0YW5jZXMucHVzaChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7IC8vIFB1dCB0aGUgZHJvcHpvbmUgaW5zaWRlIHRoZSBlbGVtZW50IGl0c2VsZi5cblxuICAgIF90aGlzLmVsZW1lbnQuZHJvcHpvbmUgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKTtcbiAgICB2YXIgZWxlbWVudE9wdGlvbnMgPSAobGVmdCA9IERyb3B6b25lLm9wdGlvbnNGb3JFbGVtZW50KF90aGlzLmVsZW1lbnQpKSAhPSBudWxsID8gbGVmdCA6IHt9O1xuICAgIF90aGlzLm9wdGlvbnMgPSBEcm9wem9uZS5leHRlbmQoe30sIF90aGlzLmRlZmF1bHRPcHRpb25zLCBlbGVtZW50T3B0aW9ucywgb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IHt9KTsgLy8gSWYgdGhlIGJyb3dzZXIgZmFpbGVkLCBqdXN0IGNhbGwgdGhlIGZhbGxiYWNrIGFuZCBsZWF2ZVxuXG4gICAgaWYgKF90aGlzLm9wdGlvbnMuZm9yY2VGYWxsYmFjayB8fCAhRHJvcHpvbmUuaXNCcm93c2VyU3VwcG9ydGVkKCkpIHtcbiAgICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3RoaXMub3B0aW9ucy5mYWxsYmFjay5jYWxsKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7XG4gICAgfSAvLyBAb3B0aW9ucy51cmwgPSBAZWxlbWVudC5nZXRBdHRyaWJ1dGUgXCJhY3Rpb25cIiB1bmxlc3MgQG9wdGlvbnMudXJsP1xuXG5cbiAgICBpZiAoX3RoaXMub3B0aW9ucy51cmwgPT0gbnVsbCkge1xuICAgICAgX3RoaXMub3B0aW9ucy51cmwgPSBfdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShcImFjdGlvblwiKTtcbiAgICB9XG5cbiAgICBpZiAoIV90aGlzLm9wdGlvbnMudXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBVUkwgcHJvdmlkZWQuXCIpO1xuICAgIH1cblxuICAgIGlmIChfdGhpcy5vcHRpb25zLmFjY2VwdGVkRmlsZXMgJiYgX3RoaXMub3B0aW9ucy5hY2NlcHRlZE1pbWVUeXBlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbid0IHByb3ZpZGUgYm90aCAnYWNjZXB0ZWRGaWxlcycgYW5kICdhY2NlcHRlZE1pbWVUeXBlcycuICdhY2NlcHRlZE1pbWVUeXBlcycgaXMgZGVwcmVjYXRlZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKF90aGlzLm9wdGlvbnMudXBsb2FkTXVsdGlwbGUgJiYgX3RoaXMub3B0aW9ucy5jaHVua2luZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNldCBib3RoOiB1cGxvYWRNdWx0aXBsZSBhbmQgY2h1bmtpbmcuJyk7XG4gICAgfSAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG5cbiAgICBpZiAoX3RoaXMub3B0aW9ucy5hY2NlcHRlZE1pbWVUeXBlcykge1xuICAgICAgX3RoaXMub3B0aW9ucy5hY2NlcHRlZEZpbGVzID0gX3RoaXMub3B0aW9ucy5hY2NlcHRlZE1pbWVUeXBlcztcbiAgICAgIGRlbGV0ZSBfdGhpcy5vcHRpb25zLmFjY2VwdGVkTWltZVR5cGVzO1xuICAgIH0gLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuXG4gICAgaWYgKF90aGlzLm9wdGlvbnMucmVuYW1lRmlsZW5hbWUgIT0gbnVsbCkge1xuICAgICAgX3RoaXMub3B0aW9ucy5yZW5hbWVGaWxlID0gZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLm9wdGlvbnMucmVuYW1lRmlsZW5hbWUuY2FsbChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgZmlsZS5uYW1lLCBmaWxlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgX3RoaXMub3B0aW9ucy5tZXRob2QgPSBfdGhpcy5vcHRpb25zLm1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuXG4gICAgaWYgKChmYWxsYmFjayA9IF90aGlzLmdldEV4aXN0aW5nRmFsbGJhY2soKSkgJiYgZmFsbGJhY2sucGFyZW50Tm9kZSkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBmYWxsYmFja1xuICAgICAgZmFsbGJhY2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmYWxsYmFjayk7XG4gICAgfSAvLyBEaXNwbGF5IHByZXZpZXdzIGluIHRoZSBwcmV2aWV3c0NvbnRhaW5lciBlbGVtZW50IG9yIHRoZSBEcm9wem9uZSBlbGVtZW50IHVubGVzcyBleHBsaWNpdGx5IHNldCB0byBmYWxzZVxuXG5cbiAgICBpZiAoX3RoaXMub3B0aW9ucy5wcmV2aWV3c0NvbnRhaW5lciAhPT0gZmFsc2UpIHtcbiAgICAgIGlmIChfdGhpcy5vcHRpb25zLnByZXZpZXdzQ29udGFpbmVyKSB7XG4gICAgICAgIF90aGlzLnByZXZpZXdzQ29udGFpbmVyID0gRHJvcHpvbmUuZ2V0RWxlbWVudChfdGhpcy5vcHRpb25zLnByZXZpZXdzQ29udGFpbmVyLCBcInByZXZpZXdzQ29udGFpbmVyXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMucHJldmlld3NDb250YWluZXIgPSBfdGhpcy5lbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfdGhpcy5vcHRpb25zLmNsaWNrYWJsZSkge1xuICAgICAgaWYgKF90aGlzLm9wdGlvbnMuY2xpY2thYmxlID09PSB0cnVlKSB7XG4gICAgICAgIF90aGlzLmNsaWNrYWJsZUVsZW1lbnRzID0gW190aGlzLmVsZW1lbnRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuY2xpY2thYmxlRWxlbWVudHMgPSBEcm9wem9uZS5nZXRFbGVtZW50cyhfdGhpcy5vcHRpb25zLmNsaWNrYWJsZSwgXCJjbGlja2FibGVcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3RoaXMuaW5pdCgpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9IC8vIFJldHVybnMgYWxsIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGFjY2VwdGVkXG5cblxuICBfY3JlYXRlQ2xhc3MoRHJvcHpvbmUsIFt7XG4gICAga2V5OiBcImdldEFjY2VwdGVkRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QWNjZXB0ZWRGaWxlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVzLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gZmlsZS5hY2NlcHRlZDtcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH0pO1xuICAgIH0gLy8gUmV0dXJucyBhbGwgZmlsZXMgdGhhdCBoYXZlIGJlZW4gcmVqZWN0ZWRcbiAgICAvLyBOb3Qgc3VyZSB3aGVuIHRoYXQncyBnb2luZyB0byBiZSB1c2VmdWwsIGJ1dCBhZGRlZCBmb3IgY29tcGxldGVuZXNzLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UmVqZWN0ZWRGaWxlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZWplY3RlZEZpbGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZXMuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiAhZmlsZS5hY2NlcHRlZDtcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRGaWxlc1dpdGhTdGF0dXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RmlsZXNXaXRoU3RhdHVzKHN0YXR1cykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZXMuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBmaWxlLnN0YXR1cyA9PT0gc3RhdHVzO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfSk7XG4gICAgfSAvLyBSZXR1cm5zIGFsbCBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgcXVldWVcblxuICB9LCB7XG4gICAga2V5OiBcImdldFF1ZXVlZEZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFF1ZXVlZEZpbGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsZXNXaXRoU3RhdHVzKERyb3B6b25lLlFVRVVFRCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFVwbG9hZGluZ0ZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFVwbG9hZGluZ0ZpbGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsZXNXaXRoU3RhdHVzKERyb3B6b25lLlVQTE9BRElORyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEFkZGVkRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QWRkZWRGaWxlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEZpbGVzV2l0aFN0YXR1cyhEcm9wem9uZS5BRERFRCk7XG4gICAgfSAvLyBGaWxlcyB0aGF0IGFyZSBlaXRoZXIgcXVldWVkIG9yIHVwbG9hZGluZ1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QWN0aXZlRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QWN0aXZlRmlsZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlcy5maWx0ZXIoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbGUuc3RhdHVzID09PSBEcm9wem9uZS5VUExPQURJTkcgfHwgZmlsZS5zdGF0dXMgPT09IERyb3B6b25lLlFVRVVFRDtcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH0pO1xuICAgIH0gLy8gVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiBEcm9wem9uZSBpcyBpbml0aWFsaXplZC4gWW91XG4gICAgLy8gY2FuIChhbmQgc2hvdWxkKSBzZXR1cCBldmVudCBsaXN0ZW5lcnMgaW5zaWRlIHRoaXMgZnVuY3Rpb24uXG5cbiAgfSwge1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgLy8gSW4gY2FzZSBpdCBpc24ndCBzZXQgYWxyZWFkeVxuICAgICAgaWYgKHRoaXMuZWxlbWVudC50YWdOYW1lID09PSBcImZvcm1cIikge1xuICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZW5jdHlwZVwiLCBcIm11bHRpcGFydC9mb3JtLWRhdGFcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZHJvcHpvbmVcIikgJiYgIXRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLmR6LW1lc3NhZ2VcIikpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKERyb3B6b25lLmNyZWF0ZUVsZW1lbnQoXCI8ZGl2IGNsYXNzPVxcXCJkei1kZWZhdWx0IGR6LW1lc3NhZ2VcXFwiPjxidXR0b24gY2xhc3M9XFxcImR6LWJ1dHRvblxcXCIgdHlwZT1cXFwiYnV0dG9uXFxcIj5cIi5jb25jYXQodGhpcy5vcHRpb25zLmRpY3REZWZhdWx0TWVzc2FnZSwgXCI8L2J1dHRvbj48L2Rpdj5cIikpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2xpY2thYmxlRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBzZXR1cEhpZGRlbkZpbGVJbnB1dCA9IGZ1bmN0aW9uIHNldHVwSGlkZGVuRmlsZUlucHV0KCkge1xuICAgICAgICAgIGlmIChfdGhpczMuaGlkZGVuRmlsZUlucHV0KSB7XG4gICAgICAgICAgICBfdGhpczMuaGlkZGVuRmlsZUlucHV0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoX3RoaXMzLmhpZGRlbkZpbGVJbnB1dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMzLmhpZGRlbkZpbGVJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcblxuICAgICAgICAgIF90aGlzMy5oaWRkZW5GaWxlSW5wdXQuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcImZpbGVcIik7XG5cbiAgICAgICAgICBpZiAoX3RoaXMzLm9wdGlvbnMubWF4RmlsZXMgPT09IG51bGwgfHwgX3RoaXMzLm9wdGlvbnMubWF4RmlsZXMgPiAxKSB7XG4gICAgICAgICAgICBfdGhpczMuaGlkZGVuRmlsZUlucHV0LnNldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIsIFwibXVsdGlwbGVcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMzLmhpZGRlbkZpbGVJbnB1dC5jbGFzc05hbWUgPSBcImR6LWhpZGRlbi1pbnB1dFwiO1xuXG4gICAgICAgICAgaWYgKF90aGlzMy5vcHRpb25zLmFjY2VwdGVkRmlsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIF90aGlzMy5oaWRkZW5GaWxlSW5wdXQuc2V0QXR0cmlidXRlKFwiYWNjZXB0XCIsIF90aGlzMy5vcHRpb25zLmFjY2VwdGVkRmlsZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfdGhpczMub3B0aW9ucy5jYXB0dXJlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBfdGhpczMuaGlkZGVuRmlsZUlucHV0LnNldEF0dHJpYnV0ZShcImNhcHR1cmVcIiwgX3RoaXMzLm9wdGlvbnMuY2FwdHVyZSk7XG4gICAgICAgICAgfSAvLyBOb3Qgc2V0dGluZyBgZGlzcGxheT1cIm5vbmVcImAgYmVjYXVzZSBzb21lIGJyb3dzZXJzIGRvbid0IGFjY2VwdCBjbGlja3NcbiAgICAgICAgICAvLyBvbiBlbGVtZW50cyB0aGF0IGFyZW4ndCBkaXNwbGF5ZWQuXG5cblxuICAgICAgICAgIF90aGlzMy5oaWRkZW5GaWxlSW5wdXQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgX3RoaXMzLmhpZGRlbkZpbGVJbnB1dC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgICBfdGhpczMuaGlkZGVuRmlsZUlucHV0LnN0eWxlLnRvcCA9IFwiMFwiO1xuICAgICAgICAgIF90aGlzMy5oaWRkZW5GaWxlSW5wdXQuc3R5bGUubGVmdCA9IFwiMFwiO1xuICAgICAgICAgIF90aGlzMy5oaWRkZW5GaWxlSW5wdXQuc3R5bGUuaGVpZ2h0ID0gXCIwXCI7XG4gICAgICAgICAgX3RoaXMzLmhpZGRlbkZpbGVJbnB1dC5zdHlsZS53aWR0aCA9IFwiMFwiO1xuICAgICAgICAgIERyb3B6b25lLmdldEVsZW1lbnQoX3RoaXMzLm9wdGlvbnMuaGlkZGVuSW5wdXRDb250YWluZXIsICdoaWRkZW5JbnB1dENvbnRhaW5lcicpLmFwcGVuZENoaWxkKF90aGlzMy5oaWRkZW5GaWxlSW5wdXQpO1xuICAgICAgICAgIHJldHVybiBfdGhpczMuaGlkZGVuRmlsZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZpbGVzID0gX3RoaXMzLmhpZGRlbkZpbGVJbnB1dC5maWxlcztcblxuICAgICAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjkgPSB0cnVlO1xuICAgICAgICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I5ID0gZmFsc2U7XG4gICAgICAgICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjkgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I5ID0gZmlsZXNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDk7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjkgPSAoX3N0ZXA5ID0gX2l0ZXJhdG9yOS5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uOSA9IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gX3N0ZXA5LnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICBfdGhpczMuYWRkRmlsZShmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yOSA9IHRydWU7XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3I5ID0gZXJyO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb245ICYmIF9pdGVyYXRvcjlbXCJyZXR1cm5cIl0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBfaXRlcmF0b3I5W1wicmV0dXJuXCJdKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I5O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpczMuZW1pdChcImFkZGVkZmlsZXNcIiwgZmlsZXMpO1xuXG4gICAgICAgICAgICByZXR1cm4gc2V0dXBIaWRkZW5GaWxlSW5wdXQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBzZXR1cEhpZGRlbkZpbGVJbnB1dCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLlVSTCA9IHdpbmRvdy5VUkwgIT09IG51bGwgPyB3aW5kb3cuVVJMIDogd2luZG93LndlYmtpdFVSTDsgLy8gU2V0dXAgYWxsIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgRHJvcHpvbmUgb2JqZWN0IGl0c2VsZi5cbiAgICAgIC8vIFRoZXkncmUgbm90IGluIEBzZXR1cEV2ZW50TGlzdGVuZXJzKCkgYmVjYXVzZSB0aGV5IHNob3VsZG4ndCBiZSByZW1vdmVkXG4gICAgICAvLyBhZ2FpbiB3aGVuIHRoZSBkcm9wem9uZSBnZXRzIGRpc2FibGVkLlxuXG4gICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjEwID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjEwID0gZmFsc2U7XG4gICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IxMCA9IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTAgPSB0aGlzLmV2ZW50c1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMTA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjEwID0gKF9zdGVwMTAgPSBfaXRlcmF0b3IxMC5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMTAgPSB0cnVlKSB7XG4gICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IF9zdGVwMTAudmFsdWU7XG4gICAgICAgICAgdGhpcy5vbihldmVudE5hbWUsIHRoaXMub3B0aW9uc1tldmVudE5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yMTAgPSB0cnVlO1xuICAgICAgICBfaXRlcmF0b3JFcnJvcjEwID0gZXJyO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xMCAmJiBfaXRlcmF0b3IxMFtcInJldHVyblwiXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IxMFtcInJldHVyblwiXSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IxMCkge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IxMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5vbihcInVwbG9hZHByb2dyZXNzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy51cGRhdGVUb3RhbFVwbG9hZFByb2dyZXNzKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMub24oXCJyZW1vdmVkZmlsZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczMudXBkYXRlVG90YWxVcGxvYWRQcm9ncmVzcygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm9uKFwiY2FuY2VsZWRcIiwgZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5lbWl0KFwiY29tcGxldGVcIiwgZmlsZSk7XG4gICAgICB9KTsgLy8gRW1pdCBhIGBxdWV1ZWNvbXBsZXRlYCBldmVudCBpZiBhbGwgZmlsZXMgZmluaXNoZWQgdXBsb2FkaW5nLlxuXG4gICAgICB0aGlzLm9uKFwiY29tcGxldGVcIiwgZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgaWYgKF90aGlzMy5nZXRBZGRlZEZpbGVzKCkubGVuZ3RoID09PSAwICYmIF90aGlzMy5nZXRVcGxvYWRpbmdGaWxlcygpLmxlbmd0aCA9PT0gMCAmJiBfdGhpczMuZ2V0UXVldWVkRmlsZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGRlZmVycmVkIHNvIHRoYXQgYHF1ZXVlY29tcGxldGVgIHJlYWxseSB0cmlnZ2VycyBhZnRlciBgY29tcGxldGVgXG4gICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5lbWl0KFwicXVldWVjb21wbGV0ZVwiKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBjb250YWluc0ZpbGVzID0gZnVuY3Rpb24gY29udGFpbnNGaWxlcyhlKSB7XG4gICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlci50eXBlcykge1xuICAgICAgICAgIC8vIEJlY2F1c2UgZS5kYXRhVHJhbnNmZXIudHlwZXMgaXMgYW4gT2JqZWN0IGluXG4gICAgICAgICAgLy8gSUUsIHdlIG5lZWQgdG8gaXRlcmF0ZSBsaWtlIHRoaXMgaW5zdGVhZCBvZlxuICAgICAgICAgIC8vIHVzaW5nIGUuZGF0YVRyYW5zZmVyLnR5cGVzLnNvbWUoKVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZS5kYXRhVHJhbnNmZXIudHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlci50eXBlc1tpXSA9PT0gXCJGaWxlc1wiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICB2YXIgbm9Qcm9wYWdhdGlvbiA9IGZ1bmN0aW9uIG5vUHJvcGFnYXRpb24oZSkge1xuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZmlsZXMsIHdlIGRvbid0IHdhbnQgdG8gc3RvcFxuICAgICAgICAvLyBwcm9wYWdhdGlvbiBzbyB3ZSBkb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlclxuICAgICAgICAvLyBkcmFnIGFuZCBkcm9wIGJlaGF2aW91ci5cbiAgICAgICAgaWYgKCFjb250YWluc0ZpbGVzKGUpKSByZXR1cm47XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBlLnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH07IC8vIENyZWF0ZSB0aGUgbGlzdGVuZXJzXG5cblxuICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbe1xuICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIFwiZHJhZ3N0YXJ0XCI6IGZ1bmN0aW9uIGRyYWdzdGFydChlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLmVtaXQoXCJkcmFnc3RhcnRcIiwgZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImRyYWdlbnRlclwiOiBmdW5jdGlvbiBkcmFnZW50ZXIoZSkge1xuICAgICAgICAgICAgbm9Qcm9wYWdhdGlvbihlKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMuZW1pdChcImRyYWdlbnRlclwiLCBlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZHJhZ292ZXJcIjogZnVuY3Rpb24gZHJhZ292ZXIoZSkge1xuICAgICAgICAgICAgLy8gTWFrZXMgaXQgcG9zc2libGUgdG8gZHJhZyBmaWxlcyBmcm9tIGNocm9tZSdzIGRvd25sb2FkIGJhclxuICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTUyNjQzMC9kcmFnLWFuZC1kcm9wLWZpbGUtdXBsb2Fkcy1mcm9tLWNocm9tZS1kb3dubG9hZHMtYmFyXG4gICAgICAgICAgICAvLyBUcnkgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTEgKFNDUklQVDY1NTM1IGV4Y2VwdGlvbilcbiAgICAgICAgICAgIHZhciBlZmN0O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlZmN0ID0gZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuXG4gICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnID09PSBlZmN0IHx8ICdsaW5rTW92ZScgPT09IGVmY3QgPyAnbW92ZScgOiAnY29weSc7XG4gICAgICAgICAgICBub1Byb3BhZ2F0aW9uKGUpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5lbWl0KFwiZHJhZ292ZXJcIiwgZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImRyYWdsZWF2ZVwiOiBmdW5jdGlvbiBkcmFnbGVhdmUoZSkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5lbWl0KFwiZHJhZ2xlYXZlXCIsIGUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJkcm9wXCI6IGZ1bmN0aW9uIGRyb3AoZSkge1xuICAgICAgICAgICAgbm9Qcm9wYWdhdGlvbihlKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMuZHJvcChlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZHJhZ2VuZFwiOiBmdW5jdGlvbiBkcmFnZW5kKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMuZW1pdChcImRyYWdlbmRcIiwgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFRoaXMgaXMgZGlzYWJsZWQgcmlnaHQgbm93LCBiZWNhdXNlIHRoZSBicm93c2VycyBkb24ndCBpbXBsZW1lbnQgaXQgcHJvcGVybHkuXG4gICAgICAgIC8vIFwicGFzdGVcIjogKGUpID0+XG4gICAgICAgIC8vICAgbm9Qcm9wYWdhdGlvbiBlXG4gICAgICAgIC8vICAgQHBhc3RlIGVcblxuICAgICAgfV07XG4gICAgICB0aGlzLmNsaWNrYWJsZUVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNsaWNrYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5saXN0ZW5lcnMucHVzaCh7XG4gICAgICAgICAgZWxlbWVudDogY2xpY2thYmxlRWxlbWVudCxcbiAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24gY2xpY2soZXZ0KSB7XG4gICAgICAgICAgICAgIC8vIE9ubHkgdGhlIGFjdHVhbCBkcm9wem9uZSBvciB0aGUgbWVzc2FnZSBlbGVtZW50IHNob3VsZCB0cmlnZ2VyIGZpbGUgc2VsZWN0aW9uXG4gICAgICAgICAgICAgIGlmIChjbGlja2FibGVFbGVtZW50ICE9PSBfdGhpczMuZWxlbWVudCB8fCBldnQudGFyZ2V0ID09PSBfdGhpczMuZWxlbWVudCB8fCBEcm9wem9uZS5lbGVtZW50SW5zaWRlKGV2dC50YXJnZXQsIF90aGlzMy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZHotbWVzc2FnZVwiKSkpIHtcbiAgICAgICAgICAgICAgICBfdGhpczMuaGlkZGVuRmlsZUlucHV0LmNsaWNrKCk7IC8vIEZvcndhcmQgdGhlIGNsaWNrXG5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmluaXQuY2FsbCh0aGlzKTtcbiAgICB9IC8vIE5vdCBmdWxseSB0ZXN0ZWQgeWV0XG5cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsRmlsZXModHJ1ZSk7XG5cbiAgICAgIGlmICh0aGlzLmhpZGRlbkZpbGVJbnB1dCAhPSBudWxsID8gdGhpcy5oaWRkZW5GaWxlSW5wdXQucGFyZW50Tm9kZSA6IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmhpZGRlbkZpbGVJbnB1dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuaGlkZGVuRmlsZUlucHV0KTtcbiAgICAgICAgdGhpcy5oaWRkZW5GaWxlSW5wdXQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBkZWxldGUgdGhpcy5lbGVtZW50LmRyb3B6b25lO1xuICAgICAgcmV0dXJuIERyb3B6b25lLmluc3RhbmNlcy5zcGxpY2UoRHJvcHpvbmUuaW5zdGFuY2VzLmluZGV4T2YodGhpcyksIDEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVUb3RhbFVwbG9hZFByb2dyZXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZVRvdGFsVXBsb2FkUHJvZ3Jlc3MoKSB7XG4gICAgICB2YXIgdG90YWxVcGxvYWRQcm9ncmVzcztcbiAgICAgIHZhciB0b3RhbEJ5dGVzU2VudCA9IDA7XG4gICAgICB2YXIgdG90YWxCeXRlcyA9IDA7XG4gICAgICB2YXIgYWN0aXZlRmlsZXMgPSB0aGlzLmdldEFjdGl2ZUZpbGVzKCk7XG5cbiAgICAgIGlmIChhY3RpdmVGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xMSA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjExID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjExID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTEgPSB0aGlzLmdldEFjdGl2ZUZpbGVzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDExOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xMSA9IChfc3RlcDExID0gX2l0ZXJhdG9yMTEubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjExID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGZpbGUgPSBfc3RlcDExLnZhbHVlO1xuICAgICAgICAgICAgdG90YWxCeXRlc1NlbnQgKz0gZmlsZS51cGxvYWQuYnl0ZXNTZW50O1xuICAgICAgICAgICAgdG90YWxCeXRlcyArPSBmaWxlLnVwbG9hZC50b3RhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMTEgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yMTEgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjExICYmIF9pdGVyYXRvcjExW1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yMTFbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMTEpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IxMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0b3RhbFVwbG9hZFByb2dyZXNzID0gMTAwICogdG90YWxCeXRlc1NlbnQgLyB0b3RhbEJ5dGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG90YWxVcGxvYWRQcm9ncmVzcyA9IDEwMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZW1pdChcInRvdGFsdXBsb2FkcHJvZ3Jlc3NcIiwgdG90YWxVcGxvYWRQcm9ncmVzcywgdG90YWxCeXRlcywgdG90YWxCeXRlc1NlbnQpO1xuICAgIH0gLy8gQG9wdGlvbnMucGFyYW1OYW1lIGNhbiBiZSBhIGZ1bmN0aW9uIHRha2luZyBvbmUgcGFyYW1ldGVyIHJhdGhlciB0aGFuIGEgc3RyaW5nLlxuICAgIC8vIEEgcGFyYW1ldGVyIG5hbWUgZm9yIGEgZmlsZSBpcyBvYnRhaW5lZCBzaW1wbHkgYnkgY2FsbGluZyB0aGlzIHdpdGggYW4gaW5kZXggbnVtYmVyLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldFBhcmFtTmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0UGFyYW1OYW1lKG4pIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnBhcmFtTmFtZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMucGFyYW1OYW1lKG4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHRoaXMub3B0aW9ucy5wYXJhbU5hbWUpLmNvbmNhdCh0aGlzLm9wdGlvbnMudXBsb2FkTXVsdGlwbGUgPyBcIltcIi5jb25jYXQobiwgXCJdXCIpIDogXCJcIik7XG4gICAgICB9XG4gICAgfSAvLyBJZiBAb3B0aW9ucy5yZW5hbWVGaWxlIGlzIGEgZnVuY3Rpb24sXG4gICAgLy8gdGhlIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byByZW5hbWUgdGhlIGZpbGUubmFtZSBiZWZvcmUgYXBwZW5kaW5nIGl0IHRvIHRoZSBmb3JtRGF0YVxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX3JlbmFtZUZpbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3JlbmFtZUZpbGUoZmlsZSkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMucmVuYW1lRmlsZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBmaWxlLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMucmVuYW1lRmlsZShmaWxlKTtcbiAgICB9IC8vIFJldHVybnMgYSBmb3JtIHRoYXQgY2FuIGJlIHVzZWQgYXMgZmFsbGJhY2sgaWYgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBEcmFnbkRyb3BcbiAgICAvL1xuICAgIC8vIElmIHRoZSBkcm9wem9uZSBpcyBhbHJlYWR5IGEgZm9ybSwgb25seSB0aGUgaW5wdXQgZmllbGQgYW5kIGJ1dHRvbiBhcmUgcmV0dXJuZWQuIE90aGVyd2lzZSBhIGNvbXBsZXRlIGZvcm0gZWxlbWVudCBpcyBwcm92aWRlZC5cbiAgICAvLyBUaGlzIGNvZGUgaGFzIHRvIHBhc3MgaW4gSUU3IDooXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRGYWxsYmFja0Zvcm1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RmFsbGJhY2tGb3JtKCkge1xuICAgICAgdmFyIGV4aXN0aW5nRmFsbGJhY2ssIGZvcm07XG5cbiAgICAgIGlmIChleGlzdGluZ0ZhbGxiYWNrID0gdGhpcy5nZXRFeGlzdGluZ0ZhbGxiYWNrKCkpIHtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nRmFsbGJhY2s7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWVsZHNTdHJpbmcgPSBcIjxkaXYgY2xhc3M9XFxcImR6LWZhbGxiYWNrXFxcIj5cIjtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaWN0RmFsbGJhY2tUZXh0KSB7XG4gICAgICAgIGZpZWxkc1N0cmluZyArPSBcIjxwPlwiLmNvbmNhdCh0aGlzLm9wdGlvbnMuZGljdEZhbGxiYWNrVGV4dCwgXCI8L3A+XCIpO1xuICAgICAgfVxuXG4gICAgICBmaWVsZHNTdHJpbmcgKz0gXCI8aW5wdXQgdHlwZT1cXFwiZmlsZVxcXCIgbmFtZT1cXFwiXCIuY29uY2F0KHRoaXMuX2dldFBhcmFtTmFtZSgwKSwgXCJcXFwiIFwiKS5jb25jYXQodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlID8gJ211bHRpcGxlPVwibXVsdGlwbGVcIicgOiB1bmRlZmluZWQsIFwiIC8+PGlucHV0IHR5cGU9XFxcInN1Ym1pdFxcXCIgdmFsdWU9XFxcIlVwbG9hZCFcXFwiPjwvZGl2PlwiKTtcbiAgICAgIHZhciBmaWVsZHMgPSBEcm9wem9uZS5jcmVhdGVFbGVtZW50KGZpZWxkc1N0cmluZyk7XG5cbiAgICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZSAhPT0gXCJGT1JNXCIpIHtcbiAgICAgICAgZm9ybSA9IERyb3B6b25lLmNyZWF0ZUVsZW1lbnQoXCI8Zm9ybSBhY3Rpb249XFxcIlwiLmNvbmNhdCh0aGlzLm9wdGlvbnMudXJsLCBcIlxcXCIgZW5jdHlwZT1cXFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVxcXCIgbWV0aG9kPVxcXCJcIikuY29uY2F0KHRoaXMub3B0aW9ucy5tZXRob2QsIFwiXFxcIj48L2Zvcm0+XCIpKTtcbiAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChmaWVsZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGVuY3R5cGUgYW5kIG1ldGhvZCBhdHRyaWJ1dGVzIGFyZSBzZXQgcHJvcGVybHlcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcImVuY3R5cGVcIiwgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwibWV0aG9kXCIsIHRoaXMub3B0aW9ucy5tZXRob2QpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybSAhPSBudWxsID8gZm9ybSA6IGZpZWxkcztcbiAgICB9IC8vIFJldHVybnMgdGhlIGZhbGxiYWNrIGVsZW1lbnRzIGlmIHRoZXkgZXhpc3QgYWxyZWFkeVxuICAgIC8vXG4gICAgLy8gVGhpcyBjb2RlIGhhcyB0byBwYXNzIGluIElFNyA6KFxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RXhpc3RpbmdGYWxsYmFja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFeGlzdGluZ0ZhbGxiYWNrKCkge1xuICAgICAgdmFyIGdldEZhbGxiYWNrID0gZnVuY3Rpb24gZ2V0RmFsbGJhY2soZWxlbWVudHMpIHtcbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xMiA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjEyID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjEyID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTIgPSBlbGVtZW50c1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMTI7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjEyID0gKF9zdGVwMTIgPSBfaXRlcmF0b3IxMi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMTIgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSBfc3RlcDEyLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoLyhefCApZmFsbGJhY2soJHwgKS8udGVzdChlbC5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMTIgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yMTIgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjEyICYmIF9pdGVyYXRvcjEyW1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yMTJbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMTIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIF9pMiA9IDAsIF9hcnIgPSBbXCJkaXZcIiwgXCJmb3JtXCJdOyBfaTIgPCBfYXJyLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgdmFyIHRhZ05hbWUgPSBfYXJyW19pMl07XG4gICAgICAgIHZhciBmYWxsYmFjaztcblxuICAgICAgICBpZiAoZmFsbGJhY2sgPSBnZXRGYWxsYmFjayh0aGlzLmVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBBY3RpdmF0ZXMgYWxsIGxpc3RlbmVycyBzdG9yZWQgaW4gQGxpc3RlbmVyc1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0dXBFdmVudExpc3RlbmVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzLm1hcChmdW5jdGlvbiAoZWxlbWVudExpc3RlbmVycykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIGV2ZW50IGluIGVsZW1lbnRMaXN0ZW5lcnMuZXZlbnRzKSB7XG4gICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBlbGVtZW50TGlzdGVuZXJzLmV2ZW50c1tldmVudF07XG4gICAgICAgICAgICByZXN1bHQucHVzaChlbGVtZW50TGlzdGVuZXJzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIGZhbHNlKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSgpO1xuICAgICAgfSk7XG4gICAgfSAvLyBEZWFjdGl2YXRlcyBhbGwgbGlzdGVuZXJzIHN0b3JlZCBpbiBAbGlzdGVuZXJzXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVFdmVudExpc3RlbmVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVycy5tYXAoZnVuY3Rpb24gKGVsZW1lbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBldmVudCBpbiBlbGVtZW50TGlzdGVuZXJzLmV2ZW50cykge1xuICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZWxlbWVudExpc3RlbmVycy5ldmVudHNbZXZlbnRdO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudExpc3RlbmVycy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBmYWxzZSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0oKTtcbiAgICAgIH0pO1xuICAgIH0gLy8gUmVtb3ZlcyBhbGwgZXZlbnQgbGlzdGVuZXJzIGFuZCBjYW5jZWxzIGFsbCBmaWxlcyBpbiB0aGUgcXVldWUgb3IgYmVpbmcgcHJvY2Vzc2VkLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzYWJsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHRoaXMuY2xpY2thYmxlRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiZHotY2xpY2thYmxlXCIpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVzLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gX3RoaXM0LmNhbmNlbFVwbG9hZChmaWxlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbmFibGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgICAgZGVsZXRlIHRoaXMuZGlzYWJsZWQ7XG4gICAgICB0aGlzLmNsaWNrYWJsZUVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LWNsaWNrYWJsZVwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIH0gLy8gUmV0dXJucyBhIG5pY2VseSBmb3JtYXR0ZWQgZmlsZXNpemVcblxuICB9LCB7XG4gICAga2V5OiBcImZpbGVzaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbGVzaXplKHNpemUpIHtcbiAgICAgIHZhciBzZWxlY3RlZFNpemUgPSAwO1xuICAgICAgdmFyIHNlbGVjdGVkVW5pdCA9IFwiYlwiO1xuXG4gICAgICBpZiAoc2l6ZSA+IDApIHtcbiAgICAgICAgdmFyIHVuaXRzID0gWyd0YicsICdnYicsICdtYicsICdrYicsICdiJ107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bml0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciB1bml0ID0gdW5pdHNbaV07XG4gICAgICAgICAgdmFyIGN1dG9mZiA9IE1hdGgucG93KHRoaXMub3B0aW9ucy5maWxlc2l6ZUJhc2UsIDQgLSBpKSAvIDEwO1xuXG4gICAgICAgICAgaWYgKHNpemUgPj0gY3V0b2ZmKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNpemUgPSBzaXplIC8gTWF0aC5wb3codGhpcy5vcHRpb25zLmZpbGVzaXplQmFzZSwgNCAtIGkpO1xuICAgICAgICAgICAgc2VsZWN0ZWRVbml0ID0gdW5pdDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkU2l6ZSA9IE1hdGgucm91bmQoMTAgKiBzZWxlY3RlZFNpemUpIC8gMTA7IC8vIEN1dHRpbmcgb2YgZGlnaXRzXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBcIjxzdHJvbmc+XCIuY29uY2F0KHNlbGVjdGVkU2l6ZSwgXCI8L3N0cm9uZz4gXCIpLmNvbmNhdCh0aGlzLm9wdGlvbnMuZGljdEZpbGVTaXplVW5pdHNbc2VsZWN0ZWRVbml0XSk7XG4gICAgfSAvLyBBZGRzIG9yIHJlbW92ZXMgdGhlIGBkei1tYXgtZmlsZXMtcmVhY2hlZGAgY2xhc3MgZnJvbSB0aGUgZm9ybS5cblxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVNYXhGaWxlc1JlYWNoZWRDbGFzc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlTWF4RmlsZXNSZWFjaGVkQ2xhc3MoKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm1heEZpbGVzICE9IG51bGwgJiYgdGhpcy5nZXRBY2NlcHRlZEZpbGVzKCkubGVuZ3RoID49IHRoaXMub3B0aW9ucy5tYXhGaWxlcykge1xuICAgICAgICBpZiAodGhpcy5nZXRBY2NlcHRlZEZpbGVzKCkubGVuZ3RoID09PSB0aGlzLm9wdGlvbnMubWF4RmlsZXMpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ21heGZpbGVzcmVhY2hlZCcsIHRoaXMuZmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotbWF4LWZpbGVzLXJlYWNoZWRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJkei1tYXgtZmlsZXMtcmVhY2hlZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZHJvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkcm9wKGUpIHtcbiAgICAgIGlmICghZS5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXQoXCJkcm9wXCIsIGUpOyAvLyBDb252ZXJ0IHRoZSBGaWxlTGlzdCB0byBhbiBBcnJheVxuICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIElFMTFcblxuICAgICAgdmFyIGZpbGVzID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZS5kYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZmlsZXNbaV0gPSBlLmRhdGFUcmFuc2Zlci5maWxlc1tpXTtcbiAgICAgIH0gLy8gRXZlbiBpZiBpdCdzIGEgZm9sZGVyLCBmaWxlcy5sZW5ndGggd2lsbCBjb250YWluIHRoZSBmb2xkZXJzLlxuXG5cbiAgICAgIGlmIChmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGl0ZW1zID0gZS5kYXRhVHJhbnNmZXIuaXRlbXM7XG5cbiAgICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCAmJiBpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5ICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGUgYnJvd3NlciBzdXBwb3J0cyBkcm9wcGluZyBvZiBmb2xkZXJzLCBzbyBoYW5kbGUgaXRlbXMgaW5zdGVhZCBvZiBmaWxlc1xuICAgICAgICAgIHRoaXMuX2FkZEZpbGVzRnJvbUl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUZpbGVzKGZpbGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXQoXCJhZGRlZGZpbGVzXCIsIGZpbGVzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFzdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFzdGUoZSkge1xuICAgICAgaWYgKF9fZ3VhcmRfXyhlICE9IG51bGwgPyBlLmNsaXBib2FyZERhdGEgOiB1bmRlZmluZWQsIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4Lml0ZW1zO1xuICAgICAgfSkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdChcInBhc3RlXCIsIGUpO1xuICAgICAgdmFyIGl0ZW1zID0gZS5jbGlwYm9hcmREYXRhLml0ZW1zO1xuXG4gICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRGaWxlc0Zyb21JdGVtcyhpdGVtcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZUZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUZpbGVzKGZpbGVzKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjEzID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjEzID0gZmFsc2U7XG4gICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IxMyA9IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTMgPSBmaWxlc1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMTM7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjEzID0gKF9zdGVwMTMgPSBfaXRlcmF0b3IxMy5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMTMgPSB0cnVlKSB7XG4gICAgICAgICAgdmFyIGZpbGUgPSBfc3RlcDEzLnZhbHVlO1xuICAgICAgICAgIHRoaXMuYWRkRmlsZShmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yMTMgPSB0cnVlO1xuICAgICAgICBfaXRlcmF0b3JFcnJvcjEzID0gZXJyO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xMyAmJiBfaXRlcmF0b3IxM1tcInJldHVyblwiXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IxM1tcInJldHVyblwiXSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IxMykge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IxMztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFdoZW4gYSBmb2xkZXIgaXMgZHJvcHBlZCAob3IgZmlsZXMgYXJlIHBhc3RlZCksIGl0ZW1zIG11c3QgYmUgaGFuZGxlZFxuICAgIC8vIGluc3RlYWQgb2YgZmlsZXMuXG5cbiAgfSwge1xuICAgIGtleTogXCJfYWRkRmlsZXNGcm9tSXRlbXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2FkZEZpbGVzRnJvbUl0ZW1zKGl0ZW1zKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjE0ID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMTQgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yMTQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IxNCA9IGl0ZW1zW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAxNDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMTQgPSAoX3N0ZXAxNCA9IF9pdGVyYXRvcjE0Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xNCA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gX3N0ZXAxNC52YWx1ZTtcbiAgICAgICAgICAgIHZhciBlbnRyeTtcblxuICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSAhPSBudWxsICYmIChlbnRyeSA9IGl0ZW0ud2Via2l0R2V0QXNFbnRyeSgpKSkge1xuICAgICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goX3RoaXM1LmFkZEZpbGUoaXRlbS5nZXRBc0ZpbGUoKSkpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgLy8gQXBwZW5kIGFsbCBmaWxlcyBmcm9tIHRoYXQgZGlyZWN0b3J5IHRvIGZpbGVzXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goX3RoaXM1Ll9hZGRGaWxlc0Zyb21EaXJlY3RvcnkoZW50cnksIGVudHJ5Lm5hbWUpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZ2V0QXNGaWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgaWYgKGl0ZW0ua2luZCA9PSBudWxsIHx8IGl0ZW0ua2luZCA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChfdGhpczUuYWRkRmlsZShpdGVtLmdldEFzRmlsZSgpKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMTQgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yMTQgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjE0ICYmIF9pdGVyYXRvcjE0W1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yMTRbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMTQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IxNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSgpO1xuICAgIH0gLy8gR29lcyB0aHJvdWdoIHRoZSBkaXJlY3RvcnksIGFuZCBhZGRzIGVhY2ggZmlsZSBpdCBmaW5kcyByZWN1cnNpdmVseVxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX2FkZEZpbGVzRnJvbURpcmVjdG9yeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfYWRkRmlsZXNGcm9tRGlyZWN0b3J5KGRpcmVjdG9yeSwgcGF0aCkge1xuICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICAgIHZhciBkaXJSZWFkZXIgPSBkaXJlY3RvcnkuY3JlYXRlUmVhZGVyKCk7XG5cbiAgICAgIHZhciBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiBlcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIF9fZ3VhcmRNZXRob2RfXyhjb25zb2xlLCAnbG9nJywgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICByZXR1cm4gby5sb2coZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciByZWFkRW50cmllcyA9IGZ1bmN0aW9uIHJlYWRFbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xNSA9IHRydWU7XG4gICAgICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IxNSA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yMTUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjE1ID0gZW50cmllc1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMTU7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjE1ID0gKF9zdGVwMTUgPSBfaXRlcmF0b3IxNS5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMTUgPSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gX3N0ZXAxNS52YWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgIGVudHJ5LmZpbGUoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzNi5vcHRpb25zLmlnbm9yZUhpZGRlbkZpbGVzICYmIGZpbGUubmFtZS5zdWJzdHJpbmcoMCwgMSkgPT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZpbGUuZnVsbFBhdGggPSBcIlwiLmNvbmNhdChwYXRoLCBcIi9cIikuY29uY2F0KGZpbGUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczYuYWRkRmlsZShmaWxlKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzNi5fYWRkRmlsZXNGcm9tRGlyZWN0b3J5KGVudHJ5LCBcIlwiLmNvbmNhdChwYXRoLCBcIi9cIikuY29uY2F0KGVudHJ5Lm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gLy8gUmVjdXJzaXZlbHkgY2FsbCByZWFkRW50cmllcygpIGFnYWluLCBzaW5jZSBicm93c2VyIG9ubHkgaGFuZGxlXG4gICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCAxMDAgZW50cmllcy5cbiAgICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGlyZWN0b3J5UmVhZGVyI3JlYWRFbnRyaWVzXG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjE1ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IxNSA9IGVycjtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMTUgJiYgX2l0ZXJhdG9yMTVbXCJyZXR1cm5cIl0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yMTVbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMTUpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yMTU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sIGVycm9ySGFuZGxlcik7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcmVhZEVudHJpZXMoKTtcbiAgICB9IC8vIElmIGBkb25lKClgIGlzIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50IHRoZSBmaWxlIGlzIGFjY2VwdGVkXG4gICAgLy8gSWYgeW91IGNhbGwgaXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlLCB0aGUgZmlsZSBpcyByZWplY3RlZFxuICAgIC8vIChUaGlzIGFsbG93cyBmb3IgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24pXG4gICAgLy9cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgZmlsZXNpemUsIGFuZCBpZiB0aGUgZmlsZS50eXBlIHBhc3NlcyB0aGVcbiAgICAvLyBgYWNjZXB0ZWRGaWxlc2AgY2hlY2suXG5cbiAgfSwge1xuICAgIGtleTogXCJhY2NlcHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWNjZXB0KGZpbGUsIGRvbmUpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubWF4RmlsZXNpemUgJiYgZmlsZS5zaXplID4gdGhpcy5vcHRpb25zLm1heEZpbGVzaXplICogMTAyNCAqIDEwMjQpIHtcbiAgICAgICAgZG9uZSh0aGlzLm9wdGlvbnMuZGljdEZpbGVUb29CaWcucmVwbGFjZShcInt7ZmlsZXNpemV9fVwiLCBNYXRoLnJvdW5kKGZpbGUuc2l6ZSAvIDEwMjQgLyAxMC4yNCkgLyAxMDApLnJlcGxhY2UoXCJ7e21heEZpbGVzaXplfX1cIiwgdGhpcy5vcHRpb25zLm1heEZpbGVzaXplKSk7XG4gICAgICB9IGVsc2UgaWYgKCFEcm9wem9uZS5pc1ZhbGlkRmlsZShmaWxlLCB0aGlzLm9wdGlvbnMuYWNjZXB0ZWRGaWxlcykpIHtcbiAgICAgICAgZG9uZSh0aGlzLm9wdGlvbnMuZGljdEludmFsaWRGaWxlVHlwZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5tYXhGaWxlcyAhPSBudWxsICYmIHRoaXMuZ2V0QWNjZXB0ZWRGaWxlcygpLmxlbmd0aCA+PSB0aGlzLm9wdGlvbnMubWF4RmlsZXMpIHtcbiAgICAgICAgZG9uZSh0aGlzLm9wdGlvbnMuZGljdE1heEZpbGVzRXhjZWVkZWQucmVwbGFjZShcInt7bWF4RmlsZXN9fVwiLCB0aGlzLm9wdGlvbnMubWF4RmlsZXMpKTtcbiAgICAgICAgdGhpcy5lbWl0KFwibWF4ZmlsZXNleGNlZWRlZFwiLCBmaWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5hY2NlcHQuY2FsbCh0aGlzLCBmaWxlLCBkb25lKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkRmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRGaWxlKGZpbGUpIHtcbiAgICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgICBmaWxlLnVwbG9hZCA9IHtcbiAgICAgICAgdXVpZDogRHJvcHpvbmUudXVpZHY0KCksXG4gICAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgICAvLyBTZXR0aW5nIHRoZSB0b3RhbCB1cGxvYWQgc2l6ZSB0byBmaWxlLnNpemUgZm9yIHRoZSBiZWdpbm5pbmdcbiAgICAgICAgLy8gSXQncyBhY3R1YWwgZGlmZmVyZW50IHRoYW4gdGhlIHNpemUgdG8gYmUgdHJhbnNtaXR0ZWQuXG4gICAgICAgIHRvdGFsOiBmaWxlLnNpemUsXG4gICAgICAgIGJ5dGVzU2VudDogMCxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuX3JlbmFtZUZpbGUoZmlsZSkgLy8gTm90IHNldHRpbmcgY2h1bmtpbmcgaW5mb3JtYXRpb24gaGVyZSwgYmVjYXVzZSB0aGUgYWN1dGFsIGRhdGEg4oCUIGFuZFxuICAgICAgICAvLyB0aHVzIHRoZSBjaHVua3Mg4oCUIG1pZ2h0IGNoYW5nZSBpZiBgb3B0aW9ucy50cmFuc2Zvcm1GaWxlYCBpcyBzZXRcbiAgICAgICAgLy8gYW5kIGRvZXMgc29tZXRoaW5nIHRvIHRoZSBkYXRhLlxuXG4gICAgICB9O1xuICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgZmlsZS5zdGF0dXMgPSBEcm9wem9uZS5BRERFRDtcbiAgICAgIHRoaXMuZW1pdChcImFkZGVkZmlsZVwiLCBmaWxlKTtcblxuICAgICAgdGhpcy5fZW5xdWV1ZVRodW1ibmFpbChmaWxlKTtcblxuICAgICAgdGhpcy5hY2NlcHQoZmlsZSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIGZpbGUuYWNjZXB0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgIF90aGlzNy5fZXJyb3JQcm9jZXNzaW5nKFtmaWxlXSwgZXJyb3IpOyAvLyBXaWxsIHNldCB0aGUgZmlsZS5zdGF0dXNcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbGUuYWNjZXB0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKF90aGlzNy5vcHRpb25zLmF1dG9RdWV1ZSkge1xuICAgICAgICAgICAgX3RoaXM3LmVucXVldWVGaWxlKGZpbGUpO1xuICAgICAgICAgIH0gLy8gV2lsbCBzZXQgLmFjY2VwdGVkID0gdHJ1ZVxuXG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczcuX3VwZGF0ZU1heEZpbGVzUmVhY2hlZENsYXNzKCk7XG4gICAgICB9KTtcbiAgICB9IC8vIFdyYXBwZXIgZm9yIGVucXVldWVGaWxlXG5cbiAgfSwge1xuICAgIGtleTogXCJlbnF1ZXVlRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5xdWV1ZUZpbGVzKGZpbGVzKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjE2ID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjE2ID0gZmFsc2U7XG4gICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IxNiA9IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTYgPSBmaWxlc1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMTY7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjE2ID0gKF9zdGVwMTYgPSBfaXRlcmF0b3IxNi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMTYgPSB0cnVlKSB7XG4gICAgICAgICAgdmFyIGZpbGUgPSBfc3RlcDE2LnZhbHVlO1xuICAgICAgICAgIHRoaXMuZW5xdWV1ZUZpbGUoZmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjE2ID0gdHJ1ZTtcbiAgICAgICAgX2l0ZXJhdG9yRXJyb3IxNiA9IGVycjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMTYgJiYgX2l0ZXJhdG9yMTZbXCJyZXR1cm5cIl0gIT0gbnVsbCkge1xuICAgICAgICAgICAgX2l0ZXJhdG9yMTZbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMTYpIHtcbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yMTY7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnF1ZXVlRmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnF1ZXVlRmlsZShmaWxlKSB7XG4gICAgICB2YXIgX3RoaXM4ID0gdGhpcztcblxuICAgICAgaWYgKGZpbGUuc3RhdHVzID09PSBEcm9wem9uZS5BRERFRCAmJiBmaWxlLmFjY2VwdGVkID09PSB0cnVlKSB7XG4gICAgICAgIGZpbGUuc3RhdHVzID0gRHJvcHpvbmUuUVVFVUVEO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b1Byb2Nlc3NRdWV1ZSkge1xuICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczgucHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgICAgfSwgMCk7IC8vIERlZmVycmluZyB0aGUgY2FsbFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGZpbGUgY2FuJ3QgYmUgcXVldWVkIGJlY2F1c2UgaXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgb3Igd2FzIHJlamVjdGVkLlwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2VucXVldWVUaHVtYm5haWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2VucXVldWVUaHVtYm5haWwoZmlsZSkge1xuICAgICAgdmFyIF90aGlzOSA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY3JlYXRlSW1hZ2VUaHVtYm5haWxzICYmIGZpbGUudHlwZS5tYXRjaCgvaW1hZ2UuKi8pICYmIGZpbGUuc2l6ZSA8PSB0aGlzLm9wdGlvbnMubWF4VGh1bWJuYWlsRmlsZXNpemUgKiAxMDI0ICogMTAyNCkge1xuICAgICAgICB0aGlzLl90aHVtYm5haWxRdWV1ZS5wdXNoKGZpbGUpO1xuXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXM5Ll9wcm9jZXNzVGh1bWJuYWlsUXVldWUoKTtcbiAgICAgICAgfSwgMCk7IC8vIERlZmVycmluZyB0aGUgY2FsbFxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcHJvY2Vzc1RodW1ibmFpbFF1ZXVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9wcm9jZXNzVGh1bWJuYWlsUXVldWUoKSB7XG4gICAgICB2YXIgX3RoaXMxMCA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nVGh1bWJuYWlsIHx8IHRoaXMuX3RodW1ibmFpbFF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Byb2Nlc3NpbmdUaHVtYm5haWwgPSB0cnVlO1xuXG4gICAgICB2YXIgZmlsZSA9IHRoaXMuX3RodW1ibmFpbFF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRodW1ibmFpbChmaWxlLCB0aGlzLm9wdGlvbnMudGh1bWJuYWlsV2lkdGgsIHRoaXMub3B0aW9ucy50aHVtYm5haWxIZWlnaHQsIHRoaXMub3B0aW9ucy50aHVtYm5haWxNZXRob2QsIHRydWUsIGZ1bmN0aW9uIChkYXRhVXJsKSB7XG4gICAgICAgIF90aGlzMTAuZW1pdChcInRodW1ibmFpbFwiLCBmaWxlLCBkYXRhVXJsKTtcblxuICAgICAgICBfdGhpczEwLl9wcm9jZXNzaW5nVGh1bWJuYWlsID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfdGhpczEwLl9wcm9jZXNzVGh1bWJuYWlsUXVldWUoKTtcbiAgICAgIH0pO1xuICAgIH0gLy8gQ2FuIGJlIGNhbGxlZCBieSB0aGUgdXNlciB0byByZW1vdmUgYSBmaWxlXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVGaWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUZpbGUoZmlsZSkge1xuICAgICAgaWYgKGZpbGUuc3RhdHVzID09PSBEcm9wem9uZS5VUExPQURJTkcpIHtcbiAgICAgICAgdGhpcy5jYW5jZWxVcGxvYWQoZmlsZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsZXMgPSB3aXRob3V0KHRoaXMuZmlsZXMsIGZpbGUpO1xuICAgICAgdGhpcy5lbWl0KFwicmVtb3ZlZGZpbGVcIiwgZmlsZSk7XG5cbiAgICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KFwicmVzZXRcIik7XG4gICAgICB9XG4gICAgfSAvLyBSZW1vdmVzIGFsbCBmaWxlcyB0aGF0IGFyZW4ndCBjdXJyZW50bHkgcHJvY2Vzc2VkIGZyb20gdGhlIGxpc3RcblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUFsbEZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUFsbEZpbGVzKGNhbmNlbElmTmVjZXNzYXJ5KSB7XG4gICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIGZpbGVzIHNpbmNlIHJlbW92ZUZpbGUoKSBjaGFuZ2VzIHRoZSBAZmlsZXMgYXJyYXkuXG4gICAgICBpZiAoY2FuY2VsSWZOZWNlc3NhcnkgPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxJZk5lY2Vzc2FyeSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjE3ID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjE3ID0gZmFsc2U7XG4gICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IxNyA9IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTcgPSB0aGlzLmZpbGVzLnNsaWNlKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDE3OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xNyA9IChfc3RlcDE3ID0gX2l0ZXJhdG9yMTcubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjE3ID0gdHJ1ZSkge1xuICAgICAgICAgIHZhciBmaWxlID0gX3N0ZXAxNy52YWx1ZTtcblxuICAgICAgICAgIGlmIChmaWxlLnN0YXR1cyAhPT0gRHJvcHpvbmUuVVBMT0FESU5HIHx8IGNhbmNlbElmTmVjZXNzYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZpbGUoZmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IxNyA9IHRydWU7XG4gICAgICAgIF9pdGVyYXRvckVycm9yMTcgPSBlcnI7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjE3ICYmIF9pdGVyYXRvcjE3W1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgIF9pdGVyYXRvcjE3W1wicmV0dXJuXCJdKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjE3KSB7XG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjE3O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIFJlc2l6ZXMgYW4gaW1hZ2UgYmVmb3JlIGl0IGdldHMgc2VudCB0byB0aGUgc2VydmVyLiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mXG4gICAgLy8gYG9wdGlvbnMudHJhbnNmb3JtRmlsZWAgaWYgYHJlc2l6ZVdpZHRoYCBvciBgcmVzaXplSGVpZ2h0YCBhcmUgc2V0LiBUaGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aXRoXG4gICAgLy8gdGhlIHJlc2l6ZWQgYmxvYi5cblxuICB9LCB7XG4gICAga2V5OiBcInJlc2l6ZUltYWdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZUltYWdlKGZpbGUsIHdpZHRoLCBoZWlnaHQsIHJlc2l6ZU1ldGhvZCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpczExID0gdGhpcztcblxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGh1bWJuYWlsKGZpbGUsIHdpZHRoLCBoZWlnaHQsIHJlc2l6ZU1ldGhvZCwgdHJ1ZSwgZnVuY3Rpb24gKGRhdGFVcmwsIGNhbnZhcykge1xuICAgICAgICBpZiAoY2FudmFzID09IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGUgaW1hZ2UgaGFzIG5vdCBiZWVuIHJlc2l6ZWRcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZmlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHJlc2l6ZU1pbWVUeXBlID0gX3RoaXMxMS5vcHRpb25zLnJlc2l6ZU1pbWVUeXBlO1xuXG4gICAgICAgICAgaWYgKHJlc2l6ZU1pbWVUeXBlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc2l6ZU1pbWVUeXBlID0gZmlsZS50eXBlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciByZXNpemVkRGF0YVVSTCA9IGNhbnZhcy50b0RhdGFVUkwocmVzaXplTWltZVR5cGUsIF90aGlzMTEub3B0aW9ucy5yZXNpemVRdWFsaXR5KTtcblxuICAgICAgICAgIGlmIChyZXNpemVNaW1lVHlwZSA9PT0gJ2ltYWdlL2pwZWcnIHx8IHJlc2l6ZU1pbWVUeXBlID09PSAnaW1hZ2UvanBnJykge1xuICAgICAgICAgICAgLyogQ29tbWVudGVkIG91dCBiZWNhdXNlIFJlc2l6ZSArIEV4aWYgKyBSb3RhdGlvbiBjb21ibyBicmVha3MgdGhlIE9yaWVudGF0aW9uXG4gICAgICAgICAgICAvKiBZb3UgZG8gbm90IHdhbnQgdG8gcmVzdG9yZSB1bmxlc3MgZXhpZiB1cGRhdGVkIGFmdGVyIHJvdGF0aW9uICovXG5cbiAgICAgICAgICAgIC8vIE5vdyBhZGQgdGhlIG9yaWdpbmFsIEVYSUYgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIC8vIHJlc2l6ZWREYXRhVVJMID0gRXhpZlJlc3RvcmUucmVzdG9yZShmaWxlLmRhdGFVUkwsIHJlc2l6ZWREYXRhVVJMKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soRHJvcHpvbmUuZGF0YVVSSXRvQmxvYihyZXNpemVkRGF0YVVSTCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlVGh1bWJuYWlsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZVRodW1ibmFpbChmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QsIGZpeE9yaWVudGF0aW9uLCBjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzMTIgPSB0aGlzO1xuXG4gICAgICB2YXIgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmaWxlLmRhdGFVUkwgPSBmaWxlUmVhZGVyLnJlc3VsdDsgLy8gRG9uJ3QgYm90aGVyIGNyZWF0aW5nIGEgdGh1bWJuYWlsIGZvciBTVkcgaW1hZ2VzIHNpbmNlIHRoZXkncmUgdmVjdG9yXG5cbiAgICAgICAgaWYgKGZpbGUudHlwZSA9PT0gXCJpbWFnZS9zdmcreG1sXCIpIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2FsbGJhY2soZmlsZVJlYWRlci5yZXN1bHQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMTIuY3JlYXRlVGh1bWJuYWlsRnJvbVVybChmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QsIGZpeE9yaWVudGF0aW9uLCBjYWxsYmFjayk7XG4gICAgICB9O1xuXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgfSAvLyBgbW9ja0ZpbGVgIG5lZWRzIHRvIGhhdmUgdGhlc2UgYXR0cmlidXRlczpcbiAgICAvLyBcbiAgICAvLyAgICAgeyBuYW1lOiAnbmFtZScsIHNpemU6IDEyMzQ1LCBpbWFnZVVybDogJycgfVxuICAgIC8vXG4gICAgLy8gYGNhbGxiYWNrYCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgaW1hZ2UgaGFzIGJlZW4gZG93bmxvYWRlZCBhbmQgZGlzcGxheWVkLlxuICAgIC8vIGBjcm9zc09yaWdpbmAgd2lsbCBiZSBhZGRlZCB0byB0aGUgYGltZ2AgdGFnIHdoZW4gYWNjZXNzaW5nIHRoZSBmaWxlLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzcGxheUV4aXN0aW5nRmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwbGF5RXhpc3RpbmdGaWxlKG1vY2tGaWxlLCBpbWFnZVVybCwgY2FsbGJhY2ssIGNyb3NzT3JpZ2luKSB7XG4gICAgICB2YXIgX3RoaXMxMyA9IHRoaXM7XG5cbiAgICAgIHZhciByZXNpemVUaHVtYm5haWwgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gICAgICB0aGlzLmVtaXQoXCJhZGRlZGZpbGVcIiwgbW9ja0ZpbGUpO1xuICAgICAgdGhpcy5lbWl0KFwiY29tcGxldGVcIiwgbW9ja0ZpbGUpO1xuXG4gICAgICBpZiAoIXJlc2l6ZVRodW1ibmFpbCkge1xuICAgICAgICB0aGlzLmVtaXQoXCJ0aHVtYm5haWxcIiwgbW9ja0ZpbGUsIGltYWdlVXJsKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9uRG9uZSA9IGZ1bmN0aW9uIG9uRG9uZSh0aHVtYm5haWwpIHtcbiAgICAgICAgICBfdGhpczEzLmVtaXQoJ3RodW1ibmFpbCcsIG1vY2tGaWxlLCB0aHVtYm5haWwpO1xuXG4gICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG1vY2tGaWxlLmRhdGFVUkwgPSBpbWFnZVVybDtcbiAgICAgICAgdGhpcy5jcmVhdGVUaHVtYm5haWxGcm9tVXJsKG1vY2tGaWxlLCB0aGlzLm9wdGlvbnMudGh1bWJuYWlsV2lkdGgsIHRoaXMub3B0aW9ucy50aHVtYm5haWxIZWlnaHQsIHRoaXMub3B0aW9ucy5yZXNpemVNZXRob2QsIHRoaXMub3B0aW9ucy5maXhPcmllbnRhdGlvbiwgb25Eb25lLCBjcm9zc09yaWdpbik7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVRodW1ibmFpbEZyb21VcmxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlVGh1bWJuYWlsRnJvbVVybChmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QsIGZpeE9yaWVudGF0aW9uLCBjYWxsYmFjaywgY3Jvc3NPcmlnaW4pIHtcbiAgICAgIHZhciBfdGhpczE0ID0gdGhpcztcblxuICAgICAgLy8gTm90IHVzaW5nIGBuZXcgSW1hZ2VgIGhlcmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBsYXRlc3QgQ2hyb21lIHZlcnNpb25zLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvL2Ryb3B6b25lL3B1bGwvMjI2XG4gICAgICB2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcblxuICAgICAgaWYgKGNyb3NzT3JpZ2luKSB7XG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luO1xuICAgICAgfVxuXG4gICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbG9hZEV4aWYgPSBmdW5jdGlvbiBsb2FkRXhpZihjYWxsYmFjaykge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygxKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIEVYSUYgIT09ICd1bmRlZmluZWQnICYmIEVYSUYgIT09IG51bGwgJiYgZml4T3JpZW50YXRpb24pIHtcbiAgICAgICAgICBsb2FkRXhpZiA9IGZ1bmN0aW9uIGxvYWRFeGlmKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gRVhJRi5nZXREYXRhKGltZywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soRVhJRi5nZXRUYWcodGhpcywgJ09yaWVudGF0aW9uJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2FkRXhpZihmdW5jdGlvbiAob3JpZW50YXRpb24pIHtcbiAgICAgICAgICBmaWxlLndpZHRoID0gaW1nLndpZHRoO1xuICAgICAgICAgIGZpbGUuaGVpZ2h0ID0gaW1nLmhlaWdodDtcblxuICAgICAgICAgIHZhciByZXNpemVJbmZvID0gX3RoaXMxNC5vcHRpb25zLnJlc2l6ZS5jYWxsKF90aGlzMTQsIGZpbGUsIHdpZHRoLCBoZWlnaHQsIHJlc2l6ZU1ldGhvZCk7XG5cbiAgICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgICBjYW52YXMud2lkdGggPSByZXNpemVJbmZvLnRyZ1dpZHRoO1xuICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSByZXNpemVJbmZvLnRyZ0hlaWdodDtcblxuICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA+IDQpIHtcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHJlc2l6ZUluZm8udHJnSGVpZ2h0O1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IHJlc2l6ZUluZm8udHJnV2lkdGg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dpdGNoIChvcmllbnRhdGlvbikge1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAvLyBob3Jpem9udGFsIGZsaXBcbiAgICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZShjYW52YXMud2lkdGgsIDApO1xuICAgICAgICAgICAgICBjdHguc2NhbGUoLTEsIDEpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAvLyAxODDCsCByb3RhdGUgbGVmdFxuICAgICAgICAgICAgICBjdHgudHJhbnNsYXRlKGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgICAgIGN0eC5yb3RhdGUoTWF0aC5QSSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIC8vIHZlcnRpY2FsIGZsaXBcbiAgICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZSgwLCBjYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgY3R4LnNjYWxlKDEsIC0xKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgLy8gdmVydGljYWwgZmxpcCArIDkwIHJvdGF0ZSByaWdodFxuICAgICAgICAgICAgICBjdHgucm90YXRlKDAuNSAqIE1hdGguUEkpO1xuICAgICAgICAgICAgICBjdHguc2NhbGUoMSwgLTEpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAvLyA5MMKwIHJvdGF0ZSByaWdodFxuICAgICAgICAgICAgICBjdHgucm90YXRlKDAuNSAqIE1hdGguUEkpO1xuICAgICAgICAgICAgICBjdHgudHJhbnNsYXRlKDAsIC1jYW52YXMud2lkdGgpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAvLyBob3Jpem9udGFsIGZsaXAgKyA5MCByb3RhdGUgcmlnaHRcbiAgICAgICAgICAgICAgY3R4LnJvdGF0ZSgwLjUgKiBNYXRoLlBJKTtcbiAgICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZShjYW52YXMuaGVpZ2h0LCAtY2FudmFzLndpZHRoKTtcbiAgICAgICAgICAgICAgY3R4LnNjYWxlKC0xLCAxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgLy8gOTDCsCByb3RhdGUgbGVmdFxuICAgICAgICAgICAgICBjdHgucm90YXRlKC0wLjUgKiBNYXRoLlBJKTtcbiAgICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZSgtY2FudmFzLmhlaWdodCwgMCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gLy8gVGhpcyBpcyBhIGJ1Z2ZpeCBmb3IgaU9TJyBzY2FsaW5nIGJ1Zy5cblxuXG4gICAgICAgICAgZHJhd0ltYWdlSU9TRml4KGN0eCwgaW1nLCByZXNpemVJbmZvLnNyY1ggIT0gbnVsbCA/IHJlc2l6ZUluZm8uc3JjWCA6IDAsIHJlc2l6ZUluZm8uc3JjWSAhPSBudWxsID8gcmVzaXplSW5mby5zcmNZIDogMCwgcmVzaXplSW5mby5zcmNXaWR0aCwgcmVzaXplSW5mby5zcmNIZWlnaHQsIHJlc2l6ZUluZm8udHJnWCAhPSBudWxsID8gcmVzaXplSW5mby50cmdYIDogMCwgcmVzaXplSW5mby50cmdZICE9IG51bGwgPyByZXNpemVJbmZvLnRyZ1kgOiAwLCByZXNpemVJbmZvLnRyZ1dpZHRoLCByZXNpemVJbmZvLnRyZ0hlaWdodCk7XG4gICAgICAgICAgdmFyIHRodW1ibmFpbCA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XG5cbiAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRodW1ibmFpbCwgY2FudmFzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSBjYWxsYmFjaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGltZy5zcmMgPSBmaWxlLmRhdGFVUkw7XG4gICAgfSAvLyBHb2VzIHRocm91Z2ggdGhlIHF1ZXVlIGFuZCBwcm9jZXNzZXMgZmlsZXMgaWYgdGhlcmUgYXJlbid0IHRvbyBtYW55IGFscmVhZHkuXG5cbiAgfSwge1xuICAgIGtleTogXCJwcm9jZXNzUXVldWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvY2Vzc1F1ZXVlKCkge1xuICAgICAgdmFyIHBhcmFsbGVsVXBsb2FkcyA9IHRoaXMub3B0aW9ucy5wYXJhbGxlbFVwbG9hZHM7XG4gICAgICB2YXIgcHJvY2Vzc2luZ0xlbmd0aCA9IHRoaXMuZ2V0VXBsb2FkaW5nRmlsZXMoKS5sZW5ndGg7XG4gICAgICB2YXIgaSA9IHByb2Nlc3NpbmdMZW5ndGg7IC8vIFRoZXJlIGFyZSBhbHJlYWR5IGF0IGxlYXN0IGFzIG1hbnkgZmlsZXMgdXBsb2FkaW5nIHRoYW4gc2hvdWxkIGJlXG5cbiAgICAgIGlmIChwcm9jZXNzaW5nTGVuZ3RoID49IHBhcmFsbGVsVXBsb2Fkcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBxdWV1ZWRGaWxlcyA9IHRoaXMuZ2V0UXVldWVkRmlsZXMoKTtcblxuICAgICAgaWYgKCEocXVldWVkRmlsZXMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlKSB7XG4gICAgICAgIC8vIFRoZSBmaWxlcyBzaG91bGQgYmUgdXBsb2FkZWQgaW4gb25lIHJlcXVlc3RcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0ZpbGVzKHF1ZXVlZEZpbGVzLnNsaWNlKDAsIHBhcmFsbGVsVXBsb2FkcyAtIHByb2Nlc3NpbmdMZW5ndGgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdoaWxlIChpIDwgcGFyYWxsZWxVcGxvYWRzKSB7XG4gICAgICAgICAgaWYgKCFxdWV1ZWRGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IC8vIE5vdGhpbmcgbGVmdCB0byBwcm9jZXNzXG5cblxuICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpbGUocXVldWVkRmlsZXMuc2hpZnQoKSk7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBXcmFwcGVyIGZvciBgcHJvY2Vzc0ZpbGVzYFxuXG4gIH0sIHtcbiAgICBrZXk6IFwicHJvY2Vzc0ZpbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvY2Vzc0ZpbGUoZmlsZSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0ZpbGVzKFtmaWxlXSk7XG4gICAgfSAvLyBMb2FkcyB0aGUgZmlsZSwgdGhlbiBjYWxscyBmaW5pc2hlZExvYWRpbmcoKVxuXG4gIH0sIHtcbiAgICBrZXk6IFwicHJvY2Vzc0ZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByb2Nlc3NGaWxlcyhmaWxlcykge1xuICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xOCA9IHRydWU7XG4gICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IxOCA9IGZhbHNlO1xuICAgICAgdmFyIF9pdGVyYXRvckVycm9yMTggPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjE4ID0gZmlsZXNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDE4OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xOCA9IChfc3RlcDE4ID0gX2l0ZXJhdG9yMTgubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjE4ID0gdHJ1ZSkge1xuICAgICAgICAgIHZhciBmaWxlID0gX3N0ZXAxOC52YWx1ZTtcbiAgICAgICAgICBmaWxlLnByb2Nlc3NpbmcgPSB0cnVlOyAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG4gICAgICAgICAgZmlsZS5zdGF0dXMgPSBEcm9wem9uZS5VUExPQURJTkc7XG4gICAgICAgICAgdGhpcy5lbWl0KFwicHJvY2Vzc2luZ1wiLCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yMTggPSB0cnVlO1xuICAgICAgICBfaXRlcmF0b3JFcnJvcjE4ID0gZXJyO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xOCAmJiBfaXRlcmF0b3IxOFtcInJldHVyblwiXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IxOFtcInJldHVyblwiXSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IxOCkge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IxODtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSkge1xuICAgICAgICB0aGlzLmVtaXQoXCJwcm9jZXNzaW5nbXVsdGlwbGVcIiwgZmlsZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy51cGxvYWRGaWxlcyhmaWxlcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRGaWxlc1dpdGhYaHJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldEZpbGVzV2l0aFhocih4aHIpIHtcbiAgICAgIHZhciBmaWxlcztcbiAgICAgIHJldHVybiBmaWxlcyA9IHRoaXMuZmlsZXMuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBmaWxlLnhociA9PT0geGhyO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfSk7XG4gICAgfSAvLyBDYW5jZWxzIHRoZSBmaWxlIHVwbG9hZCBhbmQgc2V0cyB0aGUgc3RhdHVzIHRvIENBTkNFTEVEXG4gICAgLy8gKippZioqIHRoZSBmaWxlIGlzIGFjdHVhbGx5IGJlaW5nIHVwbG9hZGVkLlxuICAgIC8vIElmIGl0J3Mgc3RpbGwgaW4gdGhlIHF1ZXVlLCB0aGUgZmlsZSBpcyBiZWluZyByZW1vdmVkIGZyb20gaXQgYW5kIHRoZSBzdGF0dXNcbiAgICAvLyBzZXQgdG8gQ0FOQ0VMRUQuXG5cbiAgfSwge1xuICAgIGtleTogXCJjYW5jZWxVcGxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuY2VsVXBsb2FkKGZpbGUpIHtcbiAgICAgIGlmIChmaWxlLnN0YXR1cyA9PT0gRHJvcHpvbmUuVVBMT0FESU5HKSB7XG4gICAgICAgIHZhciBncm91cGVkRmlsZXMgPSB0aGlzLl9nZXRGaWxlc1dpdGhYaHIoZmlsZS54aHIpO1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMTkgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IxOSA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IxOSA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjE5ID0gZ3JvdXBlZEZpbGVzW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAxOTsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMTkgPSAoX3N0ZXAxOSA9IF9pdGVyYXRvcjE5Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24xOSA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBncm91cGVkRmlsZSA9IF9zdGVwMTkudmFsdWU7XG4gICAgICAgICAgICBncm91cGVkRmlsZS5zdGF0dXMgPSBEcm9wem9uZS5DQU5DRUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMTkgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yMTkgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjE5ICYmIF9pdGVyYXRvcjE5W1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yMTlbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMTkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IxOTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGZpbGUueGhyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGZpbGUueGhyLmFib3J0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIwID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMjAgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yMjAgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IyMCA9IGdyb3VwZWRGaWxlc1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMjA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIwID0gKF9zdGVwMjAgPSBfaXRlcmF0b3IyMC5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjAgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgX2dyb3VwZWRGaWxlID0gX3N0ZXAyMC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImNhbmNlbGVkXCIsIF9ncm91cGVkRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjIwID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjIwID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yMCAmJiBfaXRlcmF0b3IyMFtcInJldHVyblwiXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjIwW1wicmV0dXJuXCJdKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjIwKSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yMjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMuZW1pdChcImNhbmNlbGVkbXVsdGlwbGVcIiwgZ3JvdXBlZEZpbGVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWxlLnN0YXR1cyA9PT0gRHJvcHpvbmUuQURERUQgfHwgZmlsZS5zdGF0dXMgPT09IERyb3B6b25lLlFVRVVFRCkge1xuICAgICAgICBmaWxlLnN0YXR1cyA9IERyb3B6b25lLkNBTkNFTEVEO1xuICAgICAgICB0aGlzLmVtaXQoXCJjYW5jZWxlZFwiLCBmaWxlKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KFwiY2FuY2VsZWRtdWx0aXBsZVwiLCBbZmlsZV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b1Byb2Nlc3NRdWV1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzb2x2ZU9wdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNvbHZlT3B0aW9uKG9wdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4zID4gMSA/IF9sZW4zIC0gMSA6IDApLCBfa2V5MyA9IDE7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgICAgICBhcmdzW19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBsb2FkRmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGxvYWRGaWxlKGZpbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwbG9hZEZpbGVzKFtmaWxlXSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwbG9hZEZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwbG9hZEZpbGVzKGZpbGVzKSB7XG4gICAgICB2YXIgX3RoaXMxNSA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX3RyYW5zZm9ybUZpbGVzKGZpbGVzLCBmdW5jdGlvbiAodHJhbnNmb3JtZWRGaWxlcykge1xuICAgICAgICBpZiAoX3RoaXMxNS5vcHRpb25zLmNodW5raW5nKSB7XG4gICAgICAgICAgLy8gQ2h1bmtpbmcgaXMgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCB3aXRoIGB1cGxvYWRNdWx0aXBsZWAgc28gd2Uga25vd1xuICAgICAgICAgIC8vIHRoYXQgdGhlcmUgaXMgb25seSBfX29uZV9fZmlsZS5cbiAgICAgICAgICB2YXIgdHJhbnNmb3JtZWRGaWxlID0gdHJhbnNmb3JtZWRGaWxlc1swXTtcbiAgICAgICAgICBmaWxlc1swXS51cGxvYWQuY2h1bmtlZCA9IF90aGlzMTUub3B0aW9ucy5jaHVua2luZyAmJiAoX3RoaXMxNS5vcHRpb25zLmZvcmNlQ2h1bmtpbmcgfHwgdHJhbnNmb3JtZWRGaWxlLnNpemUgPiBfdGhpczE1Lm9wdGlvbnMuY2h1bmtTaXplKTtcbiAgICAgICAgICBmaWxlc1swXS51cGxvYWQudG90YWxDaHVua0NvdW50ID0gTWF0aC5jZWlsKHRyYW5zZm9ybWVkRmlsZS5zaXplIC8gX3RoaXMxNS5vcHRpb25zLmNodW5rU2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXNbMF0udXBsb2FkLmNodW5rZWQpIHtcbiAgICAgICAgICAvLyBUaGlzIGZpbGUgc2hvdWxkIGJlIHNlbnQgaW4gY2h1bmtzIVxuICAgICAgICAgIC8vIElmIHRoZSBjaHVua2luZyBvcHRpb24gaXMgc2V0LCB3ZSAqKmtub3cqKiB0aGF0IHRoZXJlIGNhbiBvbmx5IGJlICoqb25lKiogZmlsZSwgc2luY2VcbiAgICAgICAgICAvLyB1cGxvYWRNdWx0aXBsZSBpcyBub3QgYWxsb3dlZCB3aXRoIHRoaXMgb3B0aW9uLlxuICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbMF07XG4gICAgICAgICAgdmFyIF90cmFuc2Zvcm1lZEZpbGUgPSB0cmFuc2Zvcm1lZEZpbGVzWzBdO1xuICAgICAgICAgIHZhciBzdGFydGVkQ2h1bmtDb3VudCA9IDA7XG4gICAgICAgICAgZmlsZS51cGxvYWQuY2h1bmtzID0gW107XG5cbiAgICAgICAgICB2YXIgaGFuZGxlTmV4dENodW5rID0gZnVuY3Rpb24gaGFuZGxlTmV4dENodW5rKCkge1xuICAgICAgICAgICAgdmFyIGNodW5rSW5kZXggPSAwOyAvLyBGaW5kIHRoZSBuZXh0IGl0ZW0gaW4gZmlsZS51cGxvYWQuY2h1bmtzIHRoYXQgaXMgbm90IGRlZmluZWQgeWV0LlxuXG4gICAgICAgICAgICB3aGlsZSAoZmlsZS51cGxvYWQuY2h1bmtzW2NodW5rSW5kZXhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgfSAvLyBUaGlzIG1lYW5zLCB0aGF0IGFsbCBjaHVua3MgaGF2ZSBhbHJlYWR5IGJlZW4gc3RhcnRlZC5cblxuXG4gICAgICAgICAgICBpZiAoY2h1bmtJbmRleCA+PSBmaWxlLnVwbG9hZC50b3RhbENodW5rQ291bnQpIHJldHVybjtcbiAgICAgICAgICAgIHN0YXJ0ZWRDaHVua0NvdW50Kys7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBjaHVua0luZGV4ICogX3RoaXMxNS5vcHRpb25zLmNodW5rU2l6ZTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBNYXRoLm1pbihzdGFydCArIF90aGlzMTUub3B0aW9ucy5jaHVua1NpemUsIGZpbGUuc2l6ZSk7XG4gICAgICAgICAgICB2YXIgZGF0YUJsb2NrID0ge1xuICAgICAgICAgICAgICBuYW1lOiBfdGhpczE1Ll9nZXRQYXJhbU5hbWUoMCksXG4gICAgICAgICAgICAgIGRhdGE6IF90cmFuc2Zvcm1lZEZpbGUud2Via2l0U2xpY2UgPyBfdHJhbnNmb3JtZWRGaWxlLndlYmtpdFNsaWNlKHN0YXJ0LCBlbmQpIDogX3RyYW5zZm9ybWVkRmlsZS5zbGljZShzdGFydCwgZW5kKSxcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGUudXBsb2FkLmZpbGVuYW1lLFxuICAgICAgICAgICAgICBjaHVua0luZGV4OiBjaHVua0luZGV4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZmlsZS51cGxvYWQuY2h1bmtzW2NodW5rSW5kZXhdID0ge1xuICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICBpbmRleDogY2h1bmtJbmRleCxcbiAgICAgICAgICAgICAgZGF0YUJsb2NrOiBkYXRhQmxvY2ssXG4gICAgICAgICAgICAgIC8vIEluIGNhc2Ugd2Ugd2FudCB0byByZXRyeS5cbiAgICAgICAgICAgICAgc3RhdHVzOiBEcm9wem9uZS5VUExPQURJTkcsXG4gICAgICAgICAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgICAgICAgICByZXRyaWVzOiAwIC8vIFRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBibG9jayBoYXMgYmVlbiByZXRyaWVkLlxuXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBfdGhpczE1Ll91cGxvYWREYXRhKGZpbGVzLCBbZGF0YUJsb2NrXSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGZpbGUudXBsb2FkLmZpbmlzaGVkQ2h1bmtVcGxvYWQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICAgIHZhciBhbGxGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBjaHVuay5zdGF0dXMgPSBEcm9wem9uZS5TVUNDRVNTOyAvLyBDbGVhciB0aGUgZGF0YSBmcm9tIHRoZSBjaHVua1xuXG4gICAgICAgICAgICBjaHVuay5kYXRhQmxvY2sgPSBudWxsOyAvLyBMZWF2aW5nIHRoaXMgcmVmZXJlbmNlIHRvIHhociBpbnRhY3QgaGVyZSB3aWxsIGNhdXNlIG1lbW9yeSBsZWFrcyBpbiBzb21lIGJyb3dzZXJzXG5cbiAgICAgICAgICAgIGNodW5rLnhociA9IG51bGw7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZS51cGxvYWQudG90YWxDaHVua0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKGZpbGUudXBsb2FkLmNodW5rc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU5leHRDaHVuaygpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGZpbGUudXBsb2FkLmNodW5rc1tpXS5zdGF0dXMgIT09IERyb3B6b25lLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgICBhbGxGaW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhbGxGaW5pc2hlZCkge1xuICAgICAgICAgICAgICBfdGhpczE1Lm9wdGlvbnMuY2h1bmtzVXBsb2FkZWQoZmlsZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzMTUuX2ZpbmlzaGVkKGZpbGVzLCAnJywgbnVsbCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoX3RoaXMxNS5vcHRpb25zLnBhcmFsbGVsQ2h1bmtVcGxvYWRzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGUudXBsb2FkLnRvdGFsQ2h1bmtDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGhhbmRsZU5leHRDaHVuaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVOZXh0Q2h1bmsoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGRhdGFCbG9ja3MgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGZpbGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgICAgIGRhdGFCbG9ja3NbX2kzXSA9IHtcbiAgICAgICAgICAgICAgbmFtZTogX3RoaXMxNS5fZ2V0UGFyYW1OYW1lKF9pMyksXG4gICAgICAgICAgICAgIGRhdGE6IHRyYW5zZm9ybWVkRmlsZXNbX2kzXSxcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVzW19pM10udXBsb2FkLmZpbGVuYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMTUuX3VwbG9hZERhdGEoZmlsZXMsIGRhdGFCbG9ja3MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IC8vLyBSZXR1cm5zIHRoZSByaWdodCBjaHVuayBmb3IgZ2l2ZW4gZmlsZSBhbmQgeGhyXG5cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0Q2h1bmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldENodW5rKGZpbGUsIHhocikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlLnVwbG9hZC50b3RhbENodW5rQ291bnQ7IGkrKykge1xuICAgICAgICBpZiAoZmlsZS51cGxvYWQuY2h1bmtzW2ldICE9PSB1bmRlZmluZWQgJiYgZmlsZS51cGxvYWQuY2h1bmtzW2ldLnhociA9PT0geGhyKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbGUudXBsb2FkLmNodW5rc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVGhpcyBmdW5jdGlvbiBhY3R1YWxseSB1cGxvYWRzIHRoZSBmaWxlKHMpIHRvIHRoZSBzZXJ2ZXIuXG4gICAgLy8gSWYgZGF0YUJsb2NrcyBjb250YWlucyB0aGUgYWN0dWFsIGRhdGEgdG8gdXBsb2FkIChtZWFuaW5nLCB0aGF0IHRoaXMgY291bGQgZWl0aGVyIGJlIHRyYW5zZm9ybWVkXG4gICAgLy8gZmlsZXMsIG9yIGluZGl2aWR1YWwgY2h1bmtzIGZvciBjaHVua2VkIHVwbG9hZCkuXG5cbiAgfSwge1xuICAgIGtleTogXCJfdXBsb2FkRGF0YVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBsb2FkRGF0YShmaWxlcywgZGF0YUJsb2Nrcykge1xuICAgICAgdmFyIF90aGlzMTYgPSB0aGlzO1xuXG4gICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7IC8vIFB1dCB0aGUgeGhyIG9iamVjdCBpbiB0aGUgZmlsZSBvYmplY3RzIHRvIGJlIGFibGUgdG8gcmVmZXJlbmNlIGl0IGxhdGVyLlxuXG4gICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIxID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjIxID0gZmFsc2U7XG4gICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IyMSA9IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMjEgPSBmaWxlc1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMjE7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIxID0gKF9zdGVwMjEgPSBfaXRlcmF0b3IyMS5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjEgPSB0cnVlKSB7XG4gICAgICAgICAgdmFyIGZpbGUgPSBfc3RlcDIxLnZhbHVlO1xuICAgICAgICAgIGZpbGUueGhyID0geGhyO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyMSA9IHRydWU7XG4gICAgICAgIF9pdGVyYXRvckVycm9yMjEgPSBlcnI7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIxICYmIF9pdGVyYXRvcjIxW1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgIF9pdGVyYXRvcjIxW1wicmV0dXJuXCJdKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjIxKSB7XG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjIxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZXNbMF0udXBsb2FkLmNodW5rZWQpIHtcbiAgICAgICAgLy8gUHV0IHRoZSB4aHIgb2JqZWN0IGluIHRoZSByaWdodCBjaHVuayBvYmplY3QsIHNvIGl0IGNhbiBiZSBhc3NvY2lhdGVkIGxhdGVyLCBhbmQgZm91bmQgd2l0aCBfZ2V0Q2h1bmtcbiAgICAgICAgZmlsZXNbMF0udXBsb2FkLmNodW5rc1tkYXRhQmxvY2tzWzBdLmNodW5rSW5kZXhdLnhociA9IHhocjtcbiAgICAgIH1cblxuICAgICAgdmFyIG1ldGhvZCA9IHRoaXMucmVzb2x2ZU9wdGlvbih0aGlzLm9wdGlvbnMubWV0aG9kLCBmaWxlcyk7XG4gICAgICB2YXIgdXJsID0gdGhpcy5yZXNvbHZlT3B0aW9uKHRoaXMub3B0aW9ucy51cmwsIGZpbGVzKTtcbiAgICAgIHhoci5vcGVuKG1ldGhvZCwgdXJsLCB0cnVlKTsgLy8gU2V0dGluZyB0aGUgdGltZW91dCBhZnRlciBvcGVuIGJlY2F1c2Ugb2YgSUUxMSBpc3N1ZTogaHR0cHM6Ly9naXRsYWIuY29tL21lbm8vZHJvcHpvbmUvaXNzdWVzLzhcblxuICAgICAgeGhyLnRpbWVvdXQgPSB0aGlzLnJlc29sdmVPcHRpb24odGhpcy5vcHRpb25zLnRpbWVvdXQsIGZpbGVzKTsgLy8gSGFzIHRvIGJlIGFmdGVyIGAub3BlbigpYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvL2Ryb3B6b25lL2lzc3Vlcy8xNzlcblxuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9ICEhdGhpcy5vcHRpb25zLndpdGhDcmVkZW50aWFscztcblxuICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzMTYuX2ZpbmlzaGVkVXBsb2FkaW5nKGZpbGVzLCB4aHIsIGUpO1xuICAgICAgfTtcblxuICAgICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMxNi5faGFuZGxlVXBsb2FkRXJyb3IoZmlsZXMsIHhociwgXCJSZXF1ZXN0IHRpbWVkb3V0IGFmdGVyIFwiLmNvbmNhdChfdGhpczE2Lm9wdGlvbnMudGltZW91dCwgXCIgc2Vjb25kc1wiKSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMxNi5faGFuZGxlVXBsb2FkRXJyb3IoZmlsZXMsIHhocik7XG4gICAgICB9OyAvLyBTb21lIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoZSAudXBsb2FkIHByb3BlcnR5XG5cblxuICAgICAgdmFyIHByb2dyZXNzT2JqID0geGhyLnVwbG9hZCAhPSBudWxsID8geGhyLnVwbG9hZCA6IHhocjtcblxuICAgICAgcHJvZ3Jlc3NPYmoub25wcm9ncmVzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBfdGhpczE2Ll91cGRhdGVGaWxlc1VwbG9hZFByb2dyZXNzKGZpbGVzLCB4aHIsIGUpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGhlYWRlcnMgPSB7XG4gICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBcIkNhY2hlLUNvbnRyb2xcIjogXCJuby1jYWNoZVwiLFxuICAgICAgICBcIlgtUmVxdWVzdGVkLVdpdGhcIjogXCJYTUxIdHRwUmVxdWVzdFwiXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgRHJvcHpvbmUuZXh0ZW5kKGhlYWRlcnMsIHRoaXMub3B0aW9ucy5oZWFkZXJzKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaGVhZGVyTmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgICAgIHZhciBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyTmFtZV07XG5cbiAgICAgICAgaWYgKGhlYWRlclZhbHVlKSB7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOyAvLyBBZGRpbmcgYWxsIEBvcHRpb25zIHBhcmFtZXRlcnNcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wYXJhbXMpIHtcbiAgICAgICAgdmFyIGFkZGl0aW9uYWxQYXJhbXMgPSB0aGlzLm9wdGlvbnMucGFyYW1zO1xuXG4gICAgICAgIGlmICh0eXBlb2YgYWRkaXRpb25hbFBhcmFtcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGFkZGl0aW9uYWxQYXJhbXMgPSBhZGRpdGlvbmFsUGFyYW1zLmNhbGwodGhpcywgZmlsZXMsIHhociwgZmlsZXNbMF0udXBsb2FkLmNodW5rZWQgPyB0aGlzLl9nZXRDaHVuayhmaWxlc1swXSwgeGhyKSA6IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIGFkZGl0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBhZGRpdGlvbmFsUGFyYW1zW2tleV07XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIExldCB0aGUgdXNlciBhZGQgYWRkaXRpb25hbCBkYXRhIGlmIG5lY2Vzc2FyeVxuXG5cbiAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjIgPSB0cnVlO1xuICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMjIgPSBmYWxzZTtcbiAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjIyID0gdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IyMiA9IGZpbGVzW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAyMjsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjIgPSAoX3N0ZXAyMiA9IF9pdGVyYXRvcjIyLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yMiA9IHRydWUpIHtcbiAgICAgICAgICB2YXIgX2ZpbGUgPSBfc3RlcDIyLnZhbHVlO1xuICAgICAgICAgIHRoaXMuZW1pdChcInNlbmRpbmdcIiwgX2ZpbGUsIHhociwgZm9ybURhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyMiA9IHRydWU7XG4gICAgICAgIF9pdGVyYXRvckVycm9yMjIgPSBlcnI7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIyICYmIF9pdGVyYXRvcjIyW1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgIF9pdGVyYXRvcjIyW1wicmV0dXJuXCJdKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjIyKSB7XG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjIyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuZW1pdChcInNlbmRpbmdtdWx0aXBsZVwiLCBmaWxlcywgeGhyLCBmb3JtRGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FkZEZvcm1FbGVtZW50RGF0YShmb3JtRGF0YSk7IC8vIEZpbmFsbHkgYWRkIHRoZSBmaWxlc1xuICAgICAgLy8gSGFzIHRvIGJlIGxhc3QgYmVjYXVzZSBzb21lIHNlcnZlcnMgKGVnOiBTMykgZXhwZWN0IHRoZSBmaWxlIHRvIGJlIHRoZSBsYXN0IHBhcmFtZXRlclxuXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZGF0YUJsb2NrID0gZGF0YUJsb2Nrc1tpXTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGRhdGFCbG9jay5uYW1lLCBkYXRhQmxvY2suZGF0YSwgZGF0YUJsb2NrLmZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdWJtaXRSZXF1ZXN0KHhociwgZm9ybURhdGEsIGZpbGVzKTtcbiAgICB9IC8vIFRyYW5zZm9ybXMgYWxsIGZpbGVzIHdpdGggdGhpcy5vcHRpb25zLnRyYW5zZm9ybUZpbGUgYW5kIGludm9rZXMgZG9uZSB3aXRoIHRoZSB0cmFuc2Zvcm1lZCBmaWxlcyB3aGVuIGRvbmUuXG5cbiAgfSwge1xuICAgIGtleTogXCJfdHJhbnNmb3JtRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3RyYW5zZm9ybUZpbGVzKGZpbGVzLCBkb25lKSB7XG4gICAgICB2YXIgX3RoaXMxNyA9IHRoaXM7XG5cbiAgICAgIHZhciB0cmFuc2Zvcm1lZEZpbGVzID0gW107IC8vIENsdW1zeSB3YXkgb2YgaGFuZGxpbmcgYXN5bmNocm9ub3VzIGNhbGxzLCB1bnRpbCBJIGdldCB0byBhZGQgYSBwcm9wZXIgRnV0dXJlIGxpYnJhcnkuXG5cbiAgICAgIHZhciBkb25lQ291bnRlciA9IDA7XG5cbiAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICAgICAgX3RoaXMxNy5vcHRpb25zLnRyYW5zZm9ybUZpbGUuY2FsbChfdGhpczE3LCBmaWxlc1tpXSwgZnVuY3Rpb24gKHRyYW5zZm9ybWVkRmlsZSkge1xuICAgICAgICAgIHRyYW5zZm9ybWVkRmlsZXNbaV0gPSB0cmFuc2Zvcm1lZEZpbGU7XG5cbiAgICAgICAgICBpZiAoKytkb25lQ291bnRlciA9PT0gZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkb25lKHRyYW5zZm9ybWVkRmlsZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIF9sb29wKGkpO1xuICAgICAgfVxuICAgIH0gLy8gVGFrZXMgY2FyZSBvZiBhZGRpbmcgb3RoZXIgaW5wdXQgZWxlbWVudHMgb2YgdGhlIGZvcm0gdG8gdGhlIEFKQVggcmVxdWVzdFxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX2FkZEZvcm1FbGVtZW50RGF0YVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfYWRkRm9ybUVsZW1lbnREYXRhKGZvcm1EYXRhKSB7XG4gICAgICAvLyBUYWtlIGNhcmUgb2Ygb3RoZXIgaW5wdXQgZWxlbWVudHNcbiAgICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZSA9PT0gXCJGT1JNXCIpIHtcbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yMyA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjIzID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjIzID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMjMgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcImlucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBidXR0b25cIilbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDIzOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yMyA9IChfc3RlcDIzID0gX2l0ZXJhdG9yMjMubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIzID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGlucHV0ID0gX3N0ZXAyMy52YWx1ZTtcbiAgICAgICAgICAgIHZhciBpbnB1dE5hbWUgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpO1xuICAgICAgICAgICAgdmFyIGlucHV0VHlwZSA9IGlucHV0LmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICBpZiAoaW5wdXRUeXBlKSBpbnB1dFR5cGUgPSBpbnB1dFR5cGUudG9Mb3dlckNhc2UoKTsgLy8gSWYgdGhlIGlucHV0IGRvZXNuJ3QgaGF2ZSBhIG5hbWUsIHdlIGNhbid0IHVzZSBpdC5cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dE5hbWUgPT09ICd1bmRlZmluZWQnIHx8IGlucHV0TmFtZSA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmIChpbnB1dC50YWdOYW1lID09PSBcIlNFTEVDVFwiICYmIGlucHV0Lmhhc0F0dHJpYnV0ZShcIm11bHRpcGxlXCIpKSB7XG4gICAgICAgICAgICAgIC8vIFBvc3NpYmx5IG11bHRpcGxlIHZhbHVlc1xuICAgICAgICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjI0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMjQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yMjQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IyNCA9IGlucHV0Lm9wdGlvbnNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDI0OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yNCA9IChfc3RlcDI0ID0gX2l0ZXJhdG9yMjQubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjI0ID0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbiA9IF9zdGVwMjQudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGlucHV0TmFtZSwgb3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMjQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIF9pdGVyYXRvckVycm9yMjQgPSBlcnI7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjI0ICYmIF9pdGVyYXRvcjI0W1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yMjRbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IyNDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlucHV0VHlwZSB8fCBpbnB1dFR5cGUgIT09IFwiY2hlY2tib3hcIiAmJiBpbnB1dFR5cGUgIT09IFwicmFkaW9cIiB8fCBpbnB1dC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChpbnB1dE5hbWUsIGlucHV0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMjMgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yMjMgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIzICYmIF9pdGVyYXRvcjIzW1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yMjNbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMjMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IyMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIEludm9rZWQgd2hlbiB0aGVyZSBpcyBuZXcgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gYWJvdXQgZ2l2ZW4gZmlsZXMuXG4gICAgLy8gSWYgZSBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdXBsb2FkIGlzIGZpbmlzaGVkLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZUZpbGVzVXBsb2FkUHJvZ3Jlc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZUZpbGVzVXBsb2FkUHJvZ3Jlc3MoZmlsZXMsIHhociwgZSkge1xuICAgICAgdmFyIHByb2dyZXNzO1xuXG4gICAgICBpZiAodHlwZW9mIGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHByb2dyZXNzID0gMTAwICogZS5sb2FkZWQgLyBlLnRvdGFsO1xuXG4gICAgICAgIGlmIChmaWxlc1swXS51cGxvYWQuY2h1bmtlZCkge1xuICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbMF07IC8vIFNpbmNlIHRoaXMgaXMgYSBjaHVua2VkIHVwbG9hZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGFwcHJvcHJpYXRlIGNodW5rIHByb2dyZXNzLlxuXG4gICAgICAgICAgdmFyIGNodW5rID0gdGhpcy5fZ2V0Q2h1bmsoZmlsZSwgeGhyKTtcblxuICAgICAgICAgIGNodW5rLnByb2dyZXNzID0gcHJvZ3Jlc3M7XG4gICAgICAgICAgY2h1bmsudG90YWwgPSBlLnRvdGFsO1xuICAgICAgICAgIGNodW5rLmJ5dGVzU2VudCA9IGUubG9hZGVkO1xuICAgICAgICAgIHZhciBmaWxlUHJvZ3Jlc3MgPSAwLFxuICAgICAgICAgICAgICBmaWxlVG90YWwsXG4gICAgICAgICAgICAgIGZpbGVCeXRlc1NlbnQ7XG4gICAgICAgICAgZmlsZS51cGxvYWQucHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgIGZpbGUudXBsb2FkLnRvdGFsID0gMDtcbiAgICAgICAgICBmaWxlLnVwbG9hZC5ieXRlc1NlbnQgPSAwO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlLnVwbG9hZC50b3RhbENodW5rQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZpbGUudXBsb2FkLmNodW5rc1tpXSAhPT0gdW5kZWZpbmVkICYmIGZpbGUudXBsb2FkLmNodW5rc1tpXS5wcm9ncmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGZpbGUudXBsb2FkLnByb2dyZXNzICs9IGZpbGUudXBsb2FkLmNodW5rc1tpXS5wcm9ncmVzcztcbiAgICAgICAgICAgICAgZmlsZS51cGxvYWQudG90YWwgKz0gZmlsZS51cGxvYWQuY2h1bmtzW2ldLnRvdGFsO1xuICAgICAgICAgICAgICBmaWxlLnVwbG9hZC5ieXRlc1NlbnQgKz0gZmlsZS51cGxvYWQuY2h1bmtzW2ldLmJ5dGVzU2VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWxlLnVwbG9hZC5wcm9ncmVzcyA9IGZpbGUudXBsb2FkLnByb2dyZXNzIC8gZmlsZS51cGxvYWQudG90YWxDaHVua0NvdW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjUgPSB0cnVlO1xuICAgICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjI1ID0gZmFsc2U7XG4gICAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yMjUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMjUgPSBmaWxlc1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMjU7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjI1ID0gKF9zdGVwMjUgPSBfaXRlcmF0b3IyNS5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjUgPSB0cnVlKSB7XG4gICAgICAgICAgICAgIHZhciBfZmlsZTIgPSBfc3RlcDI1LnZhbHVlO1xuICAgICAgICAgICAgICBfZmlsZTIudXBsb2FkLnByb2dyZXNzID0gcHJvZ3Jlc3M7XG4gICAgICAgICAgICAgIF9maWxlMi51cGxvYWQudG90YWwgPSBlLnRvdGFsO1xuICAgICAgICAgICAgICBfZmlsZTIudXBsb2FkLmJ5dGVzU2VudCA9IGUubG9hZGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyNSA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvcjI1ID0gZXJyO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yNSAmJiBfaXRlcmF0b3IyNVtcInJldHVyblwiXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yMjVbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMjUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI1O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yNiA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjI2ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjI2ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMjYgPSBmaWxlc1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMjY7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjI2ID0gKF9zdGVwMjYgPSBfaXRlcmF0b3IyNi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjYgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgX2ZpbGUzID0gX3N0ZXAyNi52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInVwbG9hZHByb2dyZXNzXCIsIF9maWxlMywgX2ZpbGUzLnVwbG9hZC5wcm9ncmVzcywgX2ZpbGUzLnVwbG9hZC5ieXRlc1NlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyNiA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3IyNiA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjYgJiYgX2l0ZXJhdG9yMjZbXCJyZXR1cm5cIl0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICBfaXRlcmF0b3IyNltcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IyNikge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGZpbGUgZmluaXNoZWQgdXBsb2FkaW5nXG4gICAgICAgIHZhciBhbGxGaWxlc0ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgcHJvZ3Jlc3MgPSAxMDA7XG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjcgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IyNyA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IyNyA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjI3ID0gZmlsZXNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDI3OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yNyA9IChfc3RlcDI3ID0gX2l0ZXJhdG9yMjcubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjI3ID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIF9maWxlNCA9IF9zdGVwMjcudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChfZmlsZTQudXBsb2FkLnByb2dyZXNzICE9PSAxMDAgfHwgX2ZpbGU0LnVwbG9hZC5ieXRlc1NlbnQgIT09IF9maWxlNC51cGxvYWQudG90YWwpIHtcbiAgICAgICAgICAgICAgYWxsRmlsZXNGaW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfZmlsZTQudXBsb2FkLnByb2dyZXNzID0gcHJvZ3Jlc3M7XG4gICAgICAgICAgICBfZmlsZTQudXBsb2FkLmJ5dGVzU2VudCA9IF9maWxlNC51cGxvYWQudG90YWw7XG4gICAgICAgICAgfSAvLyBOb3RoaW5nIHRvIGRvLCBhbGwgZmlsZXMgYWxyZWFkeSBhdCAxMDAlXG5cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyNyA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3IyNyA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjcgJiYgX2l0ZXJhdG9yMjdbXCJyZXR1cm5cIl0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICBfaXRlcmF0b3IyN1tcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IyNykge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhbGxGaWxlc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yOCA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjI4ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjI4ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMjggPSBmaWxlc1tTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMjg7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjI4ID0gKF9zdGVwMjggPSBfaXRlcmF0b3IyOC5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjggPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgX2ZpbGU1ID0gX3N0ZXAyOC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInVwbG9hZHByb2dyZXNzXCIsIF9maWxlNSwgcHJvZ3Jlc3MsIF9maWxlNS51cGxvYWQuYnl0ZXNTZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMjggPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yMjggPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjI4ICYmIF9pdGVyYXRvcjI4W1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yMjhbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMjgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IyODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2ZpbmlzaGVkVXBsb2FkaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9maW5pc2hlZFVwbG9hZGluZyhmaWxlcywgeGhyLCBlKSB7XG4gICAgICB2YXIgcmVzcG9uc2U7XG5cbiAgICAgIGlmIChmaWxlc1swXS5zdGF0dXMgPT09IERyb3B6b25lLkNBTkNFTEVEKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHhoci5yZXNwb25zZVR5cGUgIT09ICdhcnJheWJ1ZmZlcicgJiYgeGhyLnJlc3BvbnNlVHlwZSAhPT0gJ2Jsb2InKSB7XG4gICAgICAgIHJlc3BvbnNlID0geGhyLnJlc3BvbnNlVGV4dDtcblxuICAgICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKFwiY29udGVudC10eXBlXCIpICYmIH54aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJjb250ZW50LXR5cGVcIikuaW5kZXhPZihcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBcIkludmFsaWQgSlNPTiByZXNwb25zZSBmcm9tIHNlcnZlci5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXBkYXRlRmlsZXNVcGxvYWRQcm9ncmVzcyhmaWxlcyk7XG5cbiAgICAgIGlmICghKDIwMCA8PSB4aHIuc3RhdHVzICYmIHhoci5zdGF0dXMgPCAzMDApKSB7XG4gICAgICAgIHRoaXMuX2hhbmRsZVVwbG9hZEVycm9yKGZpbGVzLCB4aHIsIHJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaWxlc1swXS51cGxvYWQuY2h1bmtlZCkge1xuICAgICAgICAgIGZpbGVzWzBdLnVwbG9hZC5maW5pc2hlZENodW5rVXBsb2FkKHRoaXMuX2dldENodW5rKGZpbGVzWzBdLCB4aHIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9maW5pc2hlZChmaWxlcywgcmVzcG9uc2UsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9oYW5kbGVVcGxvYWRFcnJvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlVXBsb2FkRXJyb3IoZmlsZXMsIHhociwgcmVzcG9uc2UpIHtcbiAgICAgIGlmIChmaWxlc1swXS5zdGF0dXMgPT09IERyb3B6b25lLkNBTkNFTEVEKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVzWzBdLnVwbG9hZC5jaHVua2VkICYmIHRoaXMub3B0aW9ucy5yZXRyeUNodW5rcykge1xuICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLl9nZXRDaHVuayhmaWxlc1swXSwgeGhyKTtcblxuICAgICAgICBpZiAoY2h1bmsucmV0cmllcysrIDwgdGhpcy5vcHRpb25zLnJldHJ5Q2h1bmtzTGltaXQpIHtcbiAgICAgICAgICB0aGlzLl91cGxvYWREYXRhKGZpbGVzLCBbY2h1bmsuZGF0YUJsb2NrXSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdSZXRyaWVkIHRoaXMgY2h1bmsgdG9vIG9mdGVuLiBHaXZpbmcgdXAuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fZXJyb3JQcm9jZXNzaW5nKGZpbGVzLCByZXNwb25zZSB8fCB0aGlzLm9wdGlvbnMuZGljdFJlc3BvbnNlRXJyb3IucmVwbGFjZShcInt7c3RhdHVzQ29kZX19XCIsIHhoci5zdGF0dXMpLCB4aHIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdWJtaXRSZXF1ZXN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN1Ym1pdFJlcXVlc3QoeGhyLCBmb3JtRGF0YSwgZmlsZXMpIHtcbiAgICAgIHhoci5zZW5kKGZvcm1EYXRhKTtcbiAgICB9IC8vIENhbGxlZCBpbnRlcm5hbGx5IHdoZW4gcHJvY2Vzc2luZyBpcyBmaW5pc2hlZC5cbiAgICAvLyBJbmRpdmlkdWFsIGNhbGxiYWNrcyBoYXZlIHRvIGJlIGNhbGxlZCBpbiB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbnMuXG5cbiAgfSwge1xuICAgIGtleTogXCJfZmluaXNoZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2ZpbmlzaGVkKGZpbGVzLCByZXNwb25zZVRleHQsIGUpIHtcbiAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjkgPSB0cnVlO1xuICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMjkgPSBmYWxzZTtcbiAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjI5ID0gdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IyOSA9IGZpbGVzW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAyOTsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMjkgPSAoX3N0ZXAyOSA9IF9pdGVyYXRvcjI5Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yOSA9IHRydWUpIHtcbiAgICAgICAgICB2YXIgZmlsZSA9IF9zdGVwMjkudmFsdWU7XG4gICAgICAgICAgZmlsZS5zdGF0dXMgPSBEcm9wem9uZS5TVUNDRVNTO1xuICAgICAgICAgIHRoaXMuZW1pdChcInN1Y2Nlc3NcIiwgZmlsZSwgcmVzcG9uc2VUZXh0LCBlKTtcbiAgICAgICAgICB0aGlzLmVtaXQoXCJjb21wbGV0ZVwiLCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yMjkgPSB0cnVlO1xuICAgICAgICBfaXRlcmF0b3JFcnJvcjI5ID0gZXJyO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yOSAmJiBfaXRlcmF0b3IyOVtcInJldHVyblwiXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IyOVtcInJldHVyblwiXSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IyOSkge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IyOTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSkge1xuICAgICAgICB0aGlzLmVtaXQoXCJzdWNjZXNzbXVsdGlwbGVcIiwgZmlsZXMsIHJlc3BvbnNlVGV4dCwgZSk7XG4gICAgICAgIHRoaXMuZW1pdChcImNvbXBsZXRlbXVsdGlwbGVcIiwgZmlsZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Qcm9jZXNzUXVldWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgICB9XG4gICAgfSAvLyBDYWxsZWQgaW50ZXJuYWxseSB3aGVuIHByb2Nlc3NpbmcgaXMgZmluaXNoZWQuXG4gICAgLy8gSW5kaXZpZHVhbCBjYWxsYmFja3MgaGF2ZSB0byBiZSBjYWxsZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb25zLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX2Vycm9yUHJvY2Vzc2luZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZXJyb3JQcm9jZXNzaW5nKGZpbGVzLCBtZXNzYWdlLCB4aHIpIHtcbiAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMzAgPSB0cnVlO1xuICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMzAgPSBmYWxzZTtcbiAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjMwID0gdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IzMCA9IGZpbGVzW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAzMDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMzAgPSAoX3N0ZXAzMCA9IF9pdGVyYXRvcjMwLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zMCA9IHRydWUpIHtcbiAgICAgICAgICB2YXIgZmlsZSA9IF9zdGVwMzAudmFsdWU7XG4gICAgICAgICAgZmlsZS5zdGF0dXMgPSBEcm9wem9uZS5FUlJPUjtcbiAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBmaWxlLCBtZXNzYWdlLCB4aHIpO1xuICAgICAgICAgIHRoaXMuZW1pdChcImNvbXBsZXRlXCIsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IzMCA9IHRydWU7XG4gICAgICAgIF9pdGVyYXRvckVycm9yMzAgPSBlcnI7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMwICYmIF9pdGVyYXRvcjMwW1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgIF9pdGVyYXRvcjMwW1wicmV0dXJuXCJdKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjMwKSB7XG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjMwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImVycm9ybXVsdGlwbGVcIiwgZmlsZXMsIG1lc3NhZ2UsIHhocik7XG4gICAgICAgIHRoaXMuZW1pdChcImNvbXBsZXRlbXVsdGlwbGVcIiwgZmlsZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Qcm9jZXNzUXVldWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwidXVpZHY0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHV1aWR2NCgpIHtcbiAgICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCxcbiAgICAgICAgICAgIHYgPSBjID09PSAneCcgPyByIDogciAmIDB4MyB8IDB4ODtcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERyb3B6b25lO1xufShFbWl0dGVyKTtcblxuRHJvcHpvbmUuaW5pdENsYXNzKCk7XG5Ecm9wem9uZS52ZXJzaW9uID0gXCI1LjcuMVwiOyAvLyBUaGlzIGlzIGEgbWFwIG9mIG9wdGlvbnMgZm9yIHlvdXIgZGlmZmVyZW50IGRyb3B6b25lcy4gQWRkIGNvbmZpZ3VyYXRpb25zXG4vLyB0byB0aGlzIG9iamVjdCBmb3IgeW91ciBkaWZmZXJlbnQgZHJvcHpvbmUgZWxlbWVucy5cbi8vXG4vLyBFeGFtcGxlOlxuLy9cbi8vICAgICBEcm9wem9uZS5vcHRpb25zLm15RHJvcHpvbmVFbGVtZW50SWQgPSB7IG1heEZpbGVzaXplOiAxIH07XG4vL1xuLy8gVG8gZGlzYWJsZSBhdXRvRGlzY292ZXIgZm9yIGEgc3BlY2lmaWMgZWxlbWVudCwgeW91IGNhbiBzZXQgYGZhbHNlYCBhcyBhbiBvcHRpb246XG4vL1xuLy8gICAgIERyb3B6b25lLm9wdGlvbnMubXlEaXNhYmxlZEVsZW1lbnRJZCA9IGZhbHNlO1xuLy9cbi8vIEFuZCBpbiBodG1sOlxuLy9cbi8vICAgICA8Zm9ybSBhY3Rpb249XCIvdXBsb2FkXCIgaWQ9XCJteS1kcm9wem9uZS1lbGVtZW50LWlkXCIgY2xhc3M9XCJkcm9wem9uZVwiPjwvZm9ybT5cblxuRHJvcHpvbmUub3B0aW9ucyA9IHt9OyAvLyBSZXR1cm5zIHRoZSBvcHRpb25zIGZvciBhbiBlbGVtZW50IG9yIHVuZGVmaW5lZCBpZiBub25lIGF2YWlsYWJsZS5cblxuRHJvcHpvbmUub3B0aW9uc0ZvckVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAvLyBHZXQgdGhlIGBEcm9wem9uZS5vcHRpb25zLmVsZW1lbnRJZGAgZm9yIHRoaXMgZWxlbWVudCBpZiBpdCBleGlzdHNcbiAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICByZXR1cm4gRHJvcHpvbmUub3B0aW9uc1tjYW1lbGl6ZShlbGVtZW50LmdldEF0dHJpYnV0ZShcImlkXCIpKV07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTsgLy8gSG9sZHMgYSBsaXN0IG9mIGFsbCBkcm9wem9uZSBpbnN0YW5jZXNcblxuXG5Ecm9wem9uZS5pbnN0YW5jZXMgPSBbXTsgLy8gUmV0dXJucyB0aGUgZHJvcHpvbmUgZm9yIGdpdmVuIGVsZW1lbnQgaWYgYW55XG5cbkRyb3B6b25lLmZvckVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgfVxuXG4gIGlmICgoZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC5kcm9wem9uZSA6IHVuZGVmaW5lZCkgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIERyb3B6b25lIGZvdW5kIGZvciBnaXZlbiBlbGVtZW50LiBUaGlzIGlzIHByb2JhYmx5IGJlY2F1c2UgeW91J3JlIHRyeWluZyB0byBhY2Nlc3MgaXQgYmVmb3JlIERyb3B6b25lIGhhZCB0aGUgdGltZSB0byBpbml0aWFsaXplLiBVc2UgdGhlIGBpbml0YCBvcHRpb24gdG8gc2V0dXAgYW55IGFkZGl0aW9uYWwgb2JzZXJ2ZXJzIG9uIHlvdXIgRHJvcHpvbmUuXCIpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQuZHJvcHpvbmU7XG59OyAvLyBTZXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnQgRHJvcHpvbmUgdG8gYXV0b21hdGljYWxseSBmaW5kIGFuZCBhdHRhY2ggdG8gLmRyb3B6b25lIGVsZW1lbnRzLlxuXG5cbkRyb3B6b25lLmF1dG9EaXNjb3ZlciA9IHRydWU7IC8vIExvb2tzIGZvciBhbGwgLmRyb3B6b25lIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGEgZHJvcHpvbmUgZm9yIHRoZW1cblxuRHJvcHpvbmUuZGlzY292ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBkcm9wem9uZXM7XG5cbiAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICBkcm9wem9uZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmRyb3B6b25lXCIpO1xuICB9IGVsc2Uge1xuICAgIGRyb3B6b25lcyA9IFtdOyAvLyBJRSA6KFxuXG4gICAgdmFyIGNoZWNrRWxlbWVudHMgPSBmdW5jdGlvbiBjaGVja0VsZW1lbnRzKGVsZW1lbnRzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMzEgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IzMSA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IzMSA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMxID0gZWxlbWVudHNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDMxOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zMSA9IChfc3RlcDMxID0gX2l0ZXJhdG9yMzEubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMxID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGVsID0gX3N0ZXAzMS52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKC8oXnwgKWRyb3B6b25lKCR8ICkvLnRlc3QoZWwuY2xhc3NOYW1lKSkge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaChkcm9wem9uZXMucHVzaChlbCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMzEgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yMzEgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMxICYmIF9pdGVyYXRvcjMxW1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yMzFbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMzEpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IzMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSgpO1xuICAgIH07XG5cbiAgICBjaGVja0VsZW1lbnRzKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZGl2XCIpKTtcbiAgICBjaGVja0VsZW1lbnRzKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9ybVwiKSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMyID0gdHJ1ZTtcbiAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IzMiA9IGZhbHNlO1xuICAgIHZhciBfaXRlcmF0b3JFcnJvcjMyID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMyID0gZHJvcHpvbmVzW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAzMjsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMzIgPSAoX3N0ZXAzMiA9IF9pdGVyYXRvcjMyLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zMiA9IHRydWUpIHtcbiAgICAgICAgdmFyIGRyb3B6b25lID0gX3N0ZXAzMi52YWx1ZTtcblxuICAgICAgICAvLyBDcmVhdGUgYSBkcm9wem9uZSB1bmxlc3MgYXV0byBkaXNjb3ZlciBoYXMgYmVlbiBkaXNhYmxlZCBmb3Igc3BlY2lmaWMgZWxlbWVudFxuICAgICAgICBpZiAoRHJvcHpvbmUub3B0aW9uc0ZvckVsZW1lbnQoZHJvcHpvbmUpICE9PSBmYWxzZSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBEcm9wem9uZShkcm9wem9uZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9kaWRJdGVyYXRvckVycm9yMzIgPSB0cnVlO1xuICAgICAgX2l0ZXJhdG9yRXJyb3IzMiA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMzIgJiYgX2l0ZXJhdG9yMzJbXCJyZXR1cm5cIl0gIT0gbnVsbCkge1xuICAgICAgICAgIF9pdGVyYXRvcjMyW1wicmV0dXJuXCJdKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjMyKSB7XG4gICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IzMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0oKTtcbn07IC8vIFNpbmNlIHRoZSB3aG9sZSBEcmFnJ24nRHJvcCBBUEkgaXMgcHJldHR5IG5ldywgc29tZSBicm93c2VycyBpbXBsZW1lbnQgaXQsXG4vLyBidXQgbm90IGNvcnJlY3RseS5cbi8vIFNvIEkgY3JlYXRlZCBhIGJsYWNrbGlzdCBvZiB1c2VyQWdlbnRzLiBZZXMsIHllcy4gQnJvd3NlciBzbmlmZmluZywgSSBrbm93LlxuLy8gQnV0IHdoYXQgdG8gZG8gd2hlbiBicm93c2VycyAqdGhlb3JldGljYWxseSogc3VwcG9ydCBhbiBBUEksIGJ1dCBjcmFzaFxuLy8gd2hlbiB1c2luZyBpdC5cbi8vXG4vLyBUaGlzIGlzIGEgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb25zIHRlc3RlZCBhZ2FpbnN0IG5hdmlnYXRvci51c2VyQWdlbnRcbi8vXG4vLyAqKiBJdCBzaG91bGQgb25seSBiZSB1c2VkIG9uIGJyb3dzZXIgdGhhdCAqZG8qIHN1cHBvcnQgdGhlIEFQSSwgYnV0XG4vLyBpbmNvcnJlY3RseSAqKlxuLy9cblxuXG5Ecm9wem9uZS5ibGFja2xpc3RlZEJyb3dzZXJzID0gWy8vIFRoZSBtYWMgb3MgYW5kIHdpbmRvd3MgcGhvbmUgdmVyc2lvbiBvZiBvcGVyYSAxMiBzZWVtcyB0byBoYXZlIGEgcHJvYmxlbSB3aXRoIHRoZSBGaWxlIGRyYWcnbidkcm9wIEFQSS5cbi9vcGVyYS4qKE1hY2ludG9zaHxXaW5kb3dzIFBob25lKS4qdmVyc2lvblxcLzEyL2ldOyAvLyBDaGVja3MgaWYgdGhlIGJyb3dzZXIgaXMgc3VwcG9ydGVkXG5cbkRyb3B6b25lLmlzQnJvd3NlclN1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNhcGFibGVCcm93c2VyID0gdHJ1ZTtcblxuICBpZiAod2luZG93LkZpbGUgJiYgd2luZG93LkZpbGVSZWFkZXIgJiYgd2luZG93LkZpbGVMaXN0ICYmIHdpbmRvdy5CbG9iICYmIHdpbmRvdy5Gb3JtRGF0YSAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKSB7XG4gICAgaWYgKCEoXCJjbGFzc0xpc3RcIiBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKSkpIHtcbiAgICAgIGNhcGFibGVCcm93c2VyID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBBUEksIGJ1dCBtYXkgYmUgYmxhY2tsaXN0ZWQuXG4gICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMzID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjMzID0gZmFsc2U7XG4gICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IzMyA9IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMzMgPSBEcm9wem9uZS5ibGFja2xpc3RlZEJyb3dzZXJzW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAzMzsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMzMgPSAoX3N0ZXAzMyA9IF9pdGVyYXRvcjMzLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zMyA9IHRydWUpIHtcbiAgICAgICAgICB2YXIgcmVnZXggPSBfc3RlcDMzLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHJlZ2V4LnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgICAgICAgIGNhcGFibGVCcm93c2VyID0gZmFsc2U7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjMzID0gdHJ1ZTtcbiAgICAgICAgX2l0ZXJhdG9yRXJyb3IzMyA9IGVycjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMzMgJiYgX2l0ZXJhdG9yMzNbXCJyZXR1cm5cIl0gIT0gbnVsbCkge1xuICAgICAgICAgICAgX2l0ZXJhdG9yMzNbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMzMpIHtcbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yMzM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNhcGFibGVCcm93c2VyID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gY2FwYWJsZUJyb3dzZXI7XG59O1xuXG5Ecm9wem9uZS5kYXRhVVJJdG9CbG9iID0gZnVuY3Rpb24gKGRhdGFVUkkpIHtcbiAgLy8gY29udmVydCBiYXNlNjQgdG8gcmF3IGJpbmFyeSBkYXRhIGhlbGQgaW4gYSBzdHJpbmdcbiAgLy8gZG9lc24ndCBoYW5kbGUgVVJMRW5jb2RlZCBEYXRhVVJJcyAtIHNlZSBTTyBhbnN3ZXIgIzY4NTAyNzYgZm9yIGNvZGUgdGhhdCBkb2VzIHRoaXNcbiAgdmFyIGJ5dGVTdHJpbmcgPSBhdG9iKGRhdGFVUkkuc3BsaXQoJywnKVsxXSk7IC8vIHNlcGFyYXRlIG91dCB0aGUgbWltZSBjb21wb25lbnRcblxuICB2YXIgbWltZVN0cmluZyA9IGRhdGFVUkkuc3BsaXQoJywnKVswXS5zcGxpdCgnOicpWzFdLnNwbGl0KCc7JylbMF07IC8vIHdyaXRlIHRoZSBieXRlcyBvZiB0aGUgc3RyaW5nIHRvIGFuIEFycmF5QnVmZmVyXG5cbiAgdmFyIGFiID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmcubGVuZ3RoKTtcbiAgdmFyIGlhID0gbmV3IFVpbnQ4QXJyYXkoYWIpO1xuXG4gIGZvciAodmFyIGkgPSAwLCBlbmQgPSBieXRlU3RyaW5nLmxlbmd0aCwgYXNjID0gMCA8PSBlbmQ7IGFzYyA/IGkgPD0gZW5kIDogaSA+PSBlbmQ7IGFzYyA/IGkrKyA6IGktLSkge1xuICAgIGlhW2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICB9IC8vIHdyaXRlIHRoZSBBcnJheUJ1ZmZlciB0byBhIGJsb2JcblxuXG4gIHJldHVybiBuZXcgQmxvYihbYWJdLCB7XG4gICAgdHlwZTogbWltZVN0cmluZ1xuICB9KTtcbn07IC8vIFJldHVybnMgYW4gYXJyYXkgd2l0aG91dCB0aGUgcmVqZWN0ZWQgaXRlbVxuXG5cbnZhciB3aXRob3V0ID0gZnVuY3Rpb24gd2l0aG91dChsaXN0LCByZWplY3RlZEl0ZW0pIHtcbiAgcmV0dXJuIGxpc3QuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0gIT09IHJlamVjdGVkSXRlbTtcbiAgfSkubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH0pO1xufTsgLy8gYWJjLWRlZl9naGkgLT4gYWJjRGVmR2hpXG5cblxudmFyIGNhbWVsaXplID0gZnVuY3Rpb24gY2FtZWxpemUoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvW1xcLV9dKFxcdykvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIG1hdGNoLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn07IC8vIENyZWF0ZXMgYW4gZWxlbWVudCBmcm9tIHN0cmluZ1xuXG5cbkRyb3B6b25lLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBkaXYuaW5uZXJIVE1MID0gc3RyaW5nO1xuICByZXR1cm4gZGl2LmNoaWxkTm9kZXNbMF07XG59OyAvLyBUZXN0cyBpZiBnaXZlbiBlbGVtZW50IGlzIGluc2lkZSAob3Igc2ltcGx5IGlzKSB0aGUgY29udGFpbmVyXG5cblxuRHJvcHpvbmUuZWxlbWVudEluc2lkZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXIpIHtcbiAgaWYgKGVsZW1lbnQgPT09IGNvbnRhaW5lcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIENvZmZlZXNjcmlwdCBkb2Vzbid0IHN1cHBvcnQgZG8vd2hpbGUgbG9vcHNcblxuXG4gIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgaWYgKGVsZW1lbnQgPT09IGNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuRHJvcHpvbmUuZ2V0RWxlbWVudCA9IGZ1bmN0aW9uIChlbCwgbmFtZSkge1xuICB2YXIgZWxlbWVudDtcblxuICBpZiAodHlwZW9mIGVsID09PSBcInN0cmluZ1wiKSB7XG4gICAgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpO1xuICB9IGVsc2UgaWYgKGVsLm5vZGVUeXBlICE9IG51bGwpIHtcbiAgICBlbGVtZW50ID0gZWw7XG4gIH1cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBgXCIuY29uY2F0KG5hbWUsIFwiYCBvcHRpb24gcHJvdmlkZWQuIFBsZWFzZSBwcm92aWRlIGEgQ1NTIHNlbGVjdG9yIG9yIGEgcGxhaW4gSFRNTCBlbGVtZW50LlwiKSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbkRyb3B6b25lLmdldEVsZW1lbnRzID0gZnVuY3Rpb24gKGVscywgbmFtZSkge1xuICB2YXIgZWwsIGVsZW1lbnRzO1xuXG4gIGlmIChlbHMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIGVsZW1lbnRzID0gW107XG5cbiAgICB0cnkge1xuICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zNCA9IHRydWU7XG4gICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IzNCA9IGZhbHNlO1xuICAgICAgdmFyIF9pdGVyYXRvckVycm9yMzQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjM0ID0gZWxzW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAzNDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMzQgPSAoX3N0ZXAzNCA9IF9pdGVyYXRvcjM0Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zNCA9IHRydWUpIHtcbiAgICAgICAgICBlbCA9IF9zdGVwMzQudmFsdWU7XG4gICAgICAgICAgZWxlbWVudHMucHVzaCh0aGlzLmdldEVsZW1lbnQoZWwsIG5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yMzQgPSB0cnVlO1xuICAgICAgICBfaXRlcmF0b3JFcnJvcjM0ID0gZXJyO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zNCAmJiBfaXRlcmF0b3IzNFtcInJldHVyblwiXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IzNFtcInJldHVyblwiXSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IzNCkge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IzNDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlbGVtZW50cyA9IG51bGw7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICBlbGVtZW50cyA9IFtdO1xuICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMzUgPSB0cnVlO1xuICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjM1ID0gZmFsc2U7XG4gICAgdmFyIF9pdGVyYXRvckVycm9yMzUgPSB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMzUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGVscylbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDM1OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zNSA9IChfc3RlcDM1ID0gX2l0ZXJhdG9yMzUubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjM1ID0gdHJ1ZSkge1xuICAgICAgICBlbCA9IF9zdGVwMzUudmFsdWU7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IzNSA9IHRydWU7XG4gICAgICBfaXRlcmF0b3JFcnJvcjM1ID0gZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zNSAmJiBfaXRlcmF0b3IzNVtcInJldHVyblwiXSAhPSBudWxsKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMzVbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMzUpIHtcbiAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjM1O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGVscy5ub2RlVHlwZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudHMgPSBbZWxzXTtcbiAgfVxuXG4gIGlmIChlbGVtZW50cyA9PSBudWxsIHx8ICFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGBcIi5jb25jYXQobmFtZSwgXCJgIG9wdGlvbiBwcm92aWRlZC4gUGxlYXNlIHByb3ZpZGUgYSBDU1Mgc2VsZWN0b3IsIGEgcGxhaW4gSFRNTCBlbGVtZW50IG9yIGEgbGlzdCBvZiB0aG9zZS5cIikpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRzO1xufTsgLy8gQXNrcyB0aGUgdXNlciB0aGUgcXVlc3Rpb24gYW5kIGNhbGxzIGFjY2VwdGVkIG9yIHJlamVjdGVkIGFjY29yZGluZ2x5XG4vL1xuLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCB1c2VzIGB3aW5kb3cuY29uZmlybWAgYW5kIHRoZW4gY2FsbHMgdGhlXG4vLyBhcHByb3ByaWF0ZSBjYWxsYmFjay5cblxuXG5Ecm9wem9uZS5jb25maXJtID0gZnVuY3Rpb24gKHF1ZXN0aW9uLCBhY2NlcHRlZCwgcmVqZWN0ZWQpIHtcbiAgaWYgKHdpbmRvdy5jb25maXJtKHF1ZXN0aW9uKSkge1xuICAgIHJldHVybiBhY2NlcHRlZCgpO1xuICB9IGVsc2UgaWYgKHJlamVjdGVkICE9IG51bGwpIHtcbiAgICByZXR1cm4gcmVqZWN0ZWQoKTtcbiAgfVxufTsgLy8gVmFsaWRhdGVzIHRoZSBtaW1lIHR5cGUgbGlrZSB0aGlzOlxuLy9cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSFRNTC9FbGVtZW50L2lucHV0I2F0dHItYWNjZXB0XG5cblxuRHJvcHpvbmUuaXNWYWxpZEZpbGUgPSBmdW5jdGlvbiAoZmlsZSwgYWNjZXB0ZWRGaWxlcykge1xuICBpZiAoIWFjY2VwdGVkRmlsZXMpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiB0aGVyZSBhcmUgbm8gYWNjZXB0ZWQgbWltZSB0eXBlcywgaXQncyBPS1xuXG5cbiAgYWNjZXB0ZWRGaWxlcyA9IGFjY2VwdGVkRmlsZXMuc3BsaXQoXCIsXCIpO1xuICB2YXIgbWltZVR5cGUgPSBmaWxlLnR5cGU7XG4gIHZhciBiYXNlTWltZVR5cGUgPSBtaW1lVHlwZS5yZXBsYWNlKC9cXC8uKiQvLCBcIlwiKTtcbiAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zNiA9IHRydWU7XG4gIHZhciBfZGlkSXRlcmF0b3JFcnJvcjM2ID0gZmFsc2U7XG4gIHZhciBfaXRlcmF0b3JFcnJvcjM2ID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMzYgPSBhY2NlcHRlZEZpbGVzW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAzNjsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMzYgPSAoX3N0ZXAzNiA9IF9pdGVyYXRvcjM2Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zNiA9IHRydWUpIHtcbiAgICAgIHZhciB2YWxpZFR5cGUgPSBfc3RlcDM2LnZhbHVlO1xuICAgICAgdmFsaWRUeXBlID0gdmFsaWRUeXBlLnRyaW0oKTtcblxuICAgICAgaWYgKHZhbGlkVHlwZS5jaGFyQXQoMCkgPT09IFwiLlwiKSB7XG4gICAgICAgIGlmIChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHZhbGlkVHlwZS50b0xvd2VyQ2FzZSgpLCBmaWxlLm5hbWUubGVuZ3RoIC0gdmFsaWRUeXBlLmxlbmd0aCkgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoL1xcL1xcKiQvLnRlc3QodmFsaWRUeXBlKSkge1xuICAgICAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyBsaWtlIGEgaW1hZ2UvKiBtaW1lIHR5cGVcbiAgICAgICAgaWYgKGJhc2VNaW1lVHlwZSA9PT0gdmFsaWRUeXBlLnJlcGxhY2UoL1xcLy4qJC8sIFwiXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChtaW1lVHlwZSA9PT0gdmFsaWRUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kaWRJdGVyYXRvckVycm9yMzYgPSB0cnVlO1xuICAgIF9pdGVyYXRvckVycm9yMzYgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjM2ICYmIF9pdGVyYXRvcjM2W1wicmV0dXJuXCJdICE9IG51bGwpIHtcbiAgICAgICAgX2l0ZXJhdG9yMzZbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMzYpIHtcbiAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IzNjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59OyAvLyBBdWdtZW50IGpRdWVyeVxuXG5cbmlmICh0eXBlb2YgalF1ZXJ5ICE9PSAndW5kZWZpbmVkJyAmJiBqUXVlcnkgIT09IG51bGwpIHtcbiAgalF1ZXJ5LmZuLmRyb3B6b25lID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgRHJvcHpvbmUodGhpcywgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH07XG59XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUgIT09IG51bGwpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBEcm9wem9uZTtcbn0gZWxzZSB7XG4gIHdpbmRvdy5Ecm9wem9uZSA9IERyb3B6b25lO1xufSAvLyBEcm9wem9uZSBmaWxlIHN0YXR1cyBjb2Rlc1xuXG5cbkRyb3B6b25lLkFEREVEID0gXCJhZGRlZFwiO1xuRHJvcHpvbmUuUVVFVUVEID0gXCJxdWV1ZWRcIjsgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBOb3csIGlmIGEgZmlsZSBpcyBhY2NlcHRlZCwgaXQncyBlaXRoZXIgcXVldWVkXG4vLyBvciB1cGxvYWRpbmcuXG5cbkRyb3B6b25lLkFDQ0VQVEVEID0gRHJvcHpvbmUuUVVFVUVEO1xuRHJvcHpvbmUuVVBMT0FESU5HID0gXCJ1cGxvYWRpbmdcIjtcbkRyb3B6b25lLlBST0NFU1NJTkcgPSBEcm9wem9uZS5VUExPQURJTkc7IC8vIGFsaWFzXG5cbkRyb3B6b25lLkNBTkNFTEVEID0gXCJjYW5jZWxlZFwiO1xuRHJvcHpvbmUuRVJST1IgPSBcImVycm9yXCI7XG5Ecm9wem9uZS5TVUNDRVNTID0gXCJzdWNjZXNzXCI7XG4vKlxuXG4gQnVnZml4IGZvciBpT1MgNiBhbmQgN1xuIFNvdXJjZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTkyOTA5OS9odG1sNS1jYW52YXMtZHJhd2ltYWdlLXJhdGlvLWJ1Zy1pb3NcbiBiYXNlZCBvbiB0aGUgd29yayBvZiBodHRwczovL2dpdGh1Yi5jb20vc3RvbWl0YS9pb3MtaW1hZ2VmaWxlLW1lZ2FwaXhlbFxuXG4gKi9cbi8vIERldGVjdGluZyB2ZXJ0aWNhbCBzcXVhc2ggaW4gbG9hZGVkIGltYWdlLlxuLy8gRml4ZXMgYSBidWcgd2hpY2ggc3F1YXNoIGltYWdlIHZlcnRpY2FsbHkgd2hpbGUgZHJhd2luZyBpbnRvIGNhbnZhcyBmb3Igc29tZSBpbWFnZXMuXG4vLyBUaGlzIGlzIGEgYnVnIGluIGlPUzYgZGV2aWNlcy4gVGhpcyBmdW5jdGlvbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zdG9taXRhL2lvcy1pbWFnZWZpbGUtbWVnYXBpeGVsXG5cbnZhciBkZXRlY3RWZXJ0aWNhbFNxdWFzaCA9IGZ1bmN0aW9uIGRldGVjdFZlcnRpY2FsU3F1YXNoKGltZykge1xuICB2YXIgaXcgPSBpbWcubmF0dXJhbFdpZHRoO1xuICB2YXIgaWggPSBpbWcubmF0dXJhbEhlaWdodDtcbiAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIGNhbnZhcy53aWR0aCA9IDE7XG4gIGNhbnZhcy5oZWlnaHQgPSBpaDtcbiAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcblxuICB2YXIgX2N0eCRnZXRJbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDEsIDAsIDEsIGloKSxcbiAgICAgIGRhdGEgPSBfY3R4JGdldEltYWdlRGF0YS5kYXRhOyAvLyBzZWFyY2ggaW1hZ2UgZWRnZSBwaXhlbCBwb3NpdGlvbiBpbiBjYXNlIGl0IGlzIHNxdWFzaGVkIHZlcnRpY2FsbHkuXG5cblxuICB2YXIgc3kgPSAwO1xuICB2YXIgZXkgPSBpaDtcbiAgdmFyIHB5ID0gaWg7XG5cbiAgd2hpbGUgKHB5ID4gc3kpIHtcbiAgICB2YXIgYWxwaGEgPSBkYXRhWyhweSAtIDEpICogNCArIDNdO1xuXG4gICAgaWYgKGFscGhhID09PSAwKSB7XG4gICAgICBleSA9IHB5O1xuICAgIH0gZWxzZSB7XG4gICAgICBzeSA9IHB5O1xuICAgIH1cblxuICAgIHB5ID0gZXkgKyBzeSA+PiAxO1xuICB9XG5cbiAgdmFyIHJhdGlvID0gcHkgLyBpaDtcblxuICBpZiAocmF0aW8gPT09IDApIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmF0aW87XG4gIH1cbn07IC8vIEEgcmVwbGFjZW1lbnQgZm9yIGNvbnRleHQuZHJhd0ltYWdlXG4vLyAoYXJncyBhcmUgZm9yIHNvdXJjZSBhbmQgZGVzdGluYXRpb24pLlxuXG5cbnZhciBkcmF3SW1hZ2VJT1NGaXggPSBmdW5jdGlvbiBkcmF3SW1hZ2VJT1NGaXgoY3R4LCBpbWcsIHN4LCBzeSwgc3csIHNoLCBkeCwgZHksIGR3LCBkaCkge1xuICB2YXIgdmVydFNxdWFzaFJhdGlvID0gZGV0ZWN0VmVydGljYWxTcXVhc2goaW1nKTtcbiAgcmV0dXJuIGN0eC5kcmF3SW1hZ2UoaW1nLCBzeCwgc3ksIHN3LCBzaCwgZHgsIGR5LCBkdywgZGggLyB2ZXJ0U3F1YXNoUmF0aW8pO1xufTsgLy8gQmFzZWQgb24gTWluaWZ5SnBlZ1xuLy8gU291cmNlOiBodHRwOi8vd3d3LnBlcnJ5LmN6L2ZpbGVzL0V4aWZSZXN0b3Jlci5qc1xuLy8gaHR0cDovL2VsaWNvbi5ibG9nNTcuZmMyLmNvbS9ibG9nLWVudHJ5LTIwNi5odG1sXG5cblxudmFyIEV4aWZSZXN0b3JlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXhpZlJlc3RvcmUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEV4aWZSZXN0b3JlKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhFeGlmUmVzdG9yZSwgbnVsbCwgW3tcbiAgICBrZXk6IFwiaW5pdENsYXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRDbGFzcygpIHtcbiAgICAgIHRoaXMuS0VZX1NUUiA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuY29kZTY0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuY29kZTY0KGlucHV0KSB7XG4gICAgICB2YXIgb3V0cHV0ID0gJyc7XG4gICAgICB2YXIgY2hyMSA9IHVuZGVmaW5lZDtcbiAgICAgIHZhciBjaHIyID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGNocjMgPSAnJztcbiAgICAgIHZhciBlbmMxID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGVuYzIgPSB1bmRlZmluZWQ7XG4gICAgICB2YXIgZW5jMyA9IHVuZGVmaW5lZDtcbiAgICAgIHZhciBlbmM0ID0gJyc7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNocjEgPSBpbnB1dFtpKytdO1xuICAgICAgICBjaHIyID0gaW5wdXRbaSsrXTtcbiAgICAgICAgY2hyMyA9IGlucHV0W2krK107XG4gICAgICAgIGVuYzEgPSBjaHIxID4+IDI7XG4gICAgICAgIGVuYzIgPSAoY2hyMSAmIDMpIDw8IDQgfCBjaHIyID4+IDQ7XG4gICAgICAgIGVuYzMgPSAoY2hyMiAmIDE1KSA8PCAyIHwgY2hyMyA+PiA2O1xuICAgICAgICBlbmM0ID0gY2hyMyAmIDYzO1xuXG4gICAgICAgIGlmIChpc05hTihjaHIyKSkge1xuICAgICAgICAgIGVuYzMgPSBlbmM0ID0gNjQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOYU4oY2hyMykpIHtcbiAgICAgICAgICBlbmM0ID0gNjQ7XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQgPSBvdXRwdXQgKyB0aGlzLktFWV9TVFIuY2hhckF0KGVuYzEpICsgdGhpcy5LRVlfU1RSLmNoYXJBdChlbmMyKSArIHRoaXMuS0VZX1NUUi5jaGFyQXQoZW5jMykgKyB0aGlzLktFWV9TVFIuY2hhckF0KGVuYzQpO1xuICAgICAgICBjaHIxID0gY2hyMiA9IGNocjMgPSAnJztcbiAgICAgICAgZW5jMSA9IGVuYzIgPSBlbmMzID0gZW5jNCA9ICcnO1xuXG4gICAgICAgIGlmICghKGkgPCBpbnB1dC5sZW5ndGgpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzdG9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXN0b3JlKG9yaWdGaWxlQmFzZTY0LCByZXNpemVkRmlsZUJhc2U2NCkge1xuICAgICAgaWYgKCFvcmlnRmlsZUJhc2U2NC5tYXRjaCgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnKSkge1xuICAgICAgICByZXR1cm4gcmVzaXplZEZpbGVCYXNlNjQ7XG4gICAgICB9XG5cbiAgICAgIHZhciByYXdJbWFnZSA9IHRoaXMuZGVjb2RlNjQob3JpZ0ZpbGVCYXNlNjQucmVwbGFjZSgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnLCAnJykpO1xuICAgICAgdmFyIHNlZ21lbnRzID0gdGhpcy5zbGljZTJTZWdtZW50cyhyYXdJbWFnZSk7XG4gICAgICB2YXIgaW1hZ2UgPSB0aGlzLmV4aWZNYW5pcHVsYXRpb24ocmVzaXplZEZpbGVCYXNlNjQsIHNlZ21lbnRzKTtcbiAgICAgIHJldHVybiBcImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsXCIuY29uY2F0KHRoaXMuZW5jb2RlNjQoaW1hZ2UpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXhpZk1hbmlwdWxhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleGlmTWFuaXB1bGF0aW9uKHJlc2l6ZWRGaWxlQmFzZTY0LCBzZWdtZW50cykge1xuICAgICAgdmFyIGV4aWZBcnJheSA9IHRoaXMuZ2V0RXhpZkFycmF5KHNlZ21lbnRzKTtcbiAgICAgIHZhciBuZXdJbWFnZUFycmF5ID0gdGhpcy5pbnNlcnRFeGlmKHJlc2l6ZWRGaWxlQmFzZTY0LCBleGlmQXJyYXkpO1xuICAgICAgdmFyIGFCdWZmZXIgPSBuZXcgVWludDhBcnJheShuZXdJbWFnZUFycmF5KTtcbiAgICAgIHJldHVybiBhQnVmZmVyO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRFeGlmQXJyYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RXhpZkFycmF5KHNlZ21lbnRzKSB7XG4gICAgICB2YXIgc2VnID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIHggPSAwO1xuXG4gICAgICB3aGlsZSAoeCA8IHNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICBzZWcgPSBzZWdtZW50c1t4XTtcblxuICAgICAgICBpZiAoc2VnWzBdID09PSAyNTUgJiBzZWdbMV0gPT09IDIyNSkge1xuICAgICAgICAgIHJldHVybiBzZWc7XG4gICAgICAgIH1cblxuICAgICAgICB4Kys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0RXhpZlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRFeGlmKHJlc2l6ZWRGaWxlQmFzZTY0LCBleGlmQXJyYXkpIHtcbiAgICAgIHZhciBpbWFnZURhdGEgPSByZXNpemVkRmlsZUJhc2U2NC5yZXBsYWNlKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcsICcnKTtcbiAgICAgIHZhciBidWYgPSB0aGlzLmRlY29kZTY0KGltYWdlRGF0YSk7XG4gICAgICB2YXIgc2VwYXJhdGVQb2ludCA9IGJ1Zi5pbmRleE9mKDI1NSwgMyk7XG4gICAgICB2YXIgbWFlID0gYnVmLnNsaWNlKDAsIHNlcGFyYXRlUG9pbnQpO1xuICAgICAgdmFyIGF0byA9IGJ1Zi5zbGljZShzZXBhcmF0ZVBvaW50KTtcbiAgICAgIHZhciBhcnJheSA9IG1hZTtcbiAgICAgIGFycmF5ID0gYXJyYXkuY29uY2F0KGV4aWZBcnJheSk7XG4gICAgICBhcnJheSA9IGFycmF5LmNvbmNhdChhdG8pO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzbGljZTJTZWdtZW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzbGljZTJTZWdtZW50cyhyYXdJbWFnZUFycmF5KSB7XG4gICAgICB2YXIgaGVhZCA9IDA7XG4gICAgICB2YXIgc2VnbWVudHMgPSBbXTtcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGxlbmd0aDtcblxuICAgICAgICBpZiAocmF3SW1hZ2VBcnJheVtoZWFkXSA9PT0gMjU1ICYgcmF3SW1hZ2VBcnJheVtoZWFkICsgMV0gPT09IDIxOCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJhd0ltYWdlQXJyYXlbaGVhZF0gPT09IDI1NSAmIHJhd0ltYWdlQXJyYXlbaGVhZCArIDFdID09PSAyMTYpIHtcbiAgICAgICAgICBoZWFkICs9IDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGVuZ3RoID0gcmF3SW1hZ2VBcnJheVtoZWFkICsgMl0gKiAyNTYgKyByYXdJbWFnZUFycmF5W2hlYWQgKyAzXTtcbiAgICAgICAgICB2YXIgZW5kUG9pbnQgPSBoZWFkICsgbGVuZ3RoICsgMjtcbiAgICAgICAgICB2YXIgc2VnID0gcmF3SW1hZ2VBcnJheS5zbGljZShoZWFkLCBlbmRQb2ludCk7XG4gICAgICAgICAgc2VnbWVudHMucHVzaChzZWcpO1xuICAgICAgICAgIGhlYWQgPSBlbmRQb2ludDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoZWFkID4gcmF3SW1hZ2VBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VnbWVudHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlY29kZTY0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlY29kZTY0KGlucHV0KSB7XG4gICAgICB2YXIgb3V0cHV0ID0gJyc7XG4gICAgICB2YXIgY2hyMSA9IHVuZGVmaW5lZDtcbiAgICAgIHZhciBjaHIyID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGNocjMgPSAnJztcbiAgICAgIHZhciBlbmMxID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGVuYzIgPSB1bmRlZmluZWQ7XG4gICAgICB2YXIgZW5jMyA9IHVuZGVmaW5lZDtcbiAgICAgIHZhciBlbmM0ID0gJyc7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB2YXIgYnVmID0gW107IC8vIHJlbW92ZSBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgQS1aLCBhLXosIDAtOSwgKywgLywgb3IgPVxuXG4gICAgICB2YXIgYmFzZTY0dGVzdCA9IC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZztcblxuICAgICAgaWYgKGJhc2U2NHRlc3QuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdUaGVyZSB3ZXJlIGludmFsaWQgYmFzZTY0IGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0IHRleHQuXFxuVmFsaWQgYmFzZTY0IGNoYXJhY3RlcnMgYXJlIEEtWiwgYS16LCAwLTksIFxcJytcXCcsIFxcJy9cXCcsYW5kIFxcJz1cXCdcXG5FeHBlY3QgZXJyb3JzIGluIGRlY29kaW5nLicpO1xuICAgICAgfVxuXG4gICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXFw9XS9nLCAnJyk7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGVuYzEgPSB0aGlzLktFWV9TVFIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzIgPSB0aGlzLktFWV9TVFIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzMgPSB0aGlzLktFWV9TVFIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzQgPSB0aGlzLktFWV9TVFIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGNocjEgPSBlbmMxIDw8IDIgfCBlbmMyID4+IDQ7XG4gICAgICAgIGNocjIgPSAoZW5jMiAmIDE1KSA8PCA0IHwgZW5jMyA+PiAyO1xuICAgICAgICBjaHIzID0gKGVuYzMgJiAzKSA8PCA2IHwgZW5jNDtcbiAgICAgICAgYnVmLnB1c2goY2hyMSk7XG5cbiAgICAgICAgaWYgKGVuYzMgIT09IDY0KSB7XG4gICAgICAgICAgYnVmLnB1c2goY2hyMik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5jNCAhPT0gNjQpIHtcbiAgICAgICAgICBidWYucHVzaChjaHIzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNocjEgPSBjaHIyID0gY2hyMyA9ICcnO1xuICAgICAgICBlbmMxID0gZW5jMiA9IGVuYzMgPSBlbmM0ID0gJyc7XG5cbiAgICAgICAgaWYgKCEoaSA8IGlucHV0Lmxlbmd0aCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFeGlmUmVzdG9yZTtcbn0oKTtcblxuRXhpZlJlc3RvcmUuaW5pdENsYXNzKCk7XG4vKlxuICogY29udGVudGxvYWRlZC5qc1xuICpcbiAqIEF1dGhvcjogRGllZ28gUGVyaW5pIChkaWVnby5wZXJpbmkgYXQgZ21haWwuY29tKVxuICogU3VtbWFyeTogY3Jvc3MtYnJvd3NlciB3cmFwcGVyIGZvciBET01Db250ZW50TG9hZGVkXG4gKiBVcGRhdGVkOiAyMDEwMTAyMFxuICogTGljZW5zZTogTUlUXG4gKiBWZXJzaW9uOiAxLjJcbiAqXG4gKiBVUkw6XG4gKiBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vQ29udGVudExvYWRlZC9cbiAqIGh0dHA6Ly9qYXZhc2NyaXB0Lm53Ym94LmNvbS9Db250ZW50TG9hZGVkL01JVC1MSUNFTlNFXG4gKi9cbi8vIEB3aW4gd2luZG93IHJlZmVyZW5jZVxuLy8gQGZuIGZ1bmN0aW9uIHJlZmVyZW5jZVxuXG52YXIgY29udGVudExvYWRlZCA9IGZ1bmN0aW9uIGNvbnRlbnRMb2FkZWQod2luLCBmbikge1xuICB2YXIgZG9uZSA9IGZhbHNlO1xuICB2YXIgdG9wID0gdHJ1ZTtcbiAgdmFyIGRvYyA9IHdpbi5kb2N1bWVudDtcbiAgdmFyIHJvb3QgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICB2YXIgYWRkID0gZG9jLmFkZEV2ZW50TGlzdGVuZXIgPyBcImFkZEV2ZW50TGlzdGVuZXJcIiA6IFwiYXR0YWNoRXZlbnRcIjtcbiAgdmFyIHJlbSA9IGRvYy5hZGRFdmVudExpc3RlbmVyID8gXCJyZW1vdmVFdmVudExpc3RlbmVyXCIgOiBcImRldGFjaEV2ZW50XCI7XG4gIHZhciBwcmUgPSBkb2MuYWRkRXZlbnRMaXN0ZW5lciA/IFwiXCIgOiBcIm9uXCI7XG5cbiAgdmFyIGluaXQgPSBmdW5jdGlvbiBpbml0KGUpIHtcbiAgICBpZiAoZS50eXBlID09PSBcInJlYWR5c3RhdGVjaGFuZ2VcIiAmJiBkb2MucmVhZHlTdGF0ZSAhPT0gXCJjb21wbGV0ZVwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgKGUudHlwZSA9PT0gXCJsb2FkXCIgPyB3aW4gOiBkb2MpW3JlbV0ocHJlICsgZS50eXBlLCBpbml0LCBmYWxzZSk7XG5cbiAgICBpZiAoIWRvbmUgJiYgKGRvbmUgPSB0cnVlKSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwod2luLCBlLnR5cGUgfHwgZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBwb2xsID0gZnVuY3Rpb24gcG9sbCgpIHtcbiAgICB0cnkge1xuICAgICAgcm9vdC5kb1Njcm9sbChcImxlZnRcIik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0VGltZW91dChwb2xsLCA1MCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGluaXQoXCJwb2xsXCIpO1xuICB9O1xuXG4gIGlmIChkb2MucmVhZHlTdGF0ZSAhPT0gXCJjb21wbGV0ZVwiKSB7XG4gICAgaWYgKGRvYy5jcmVhdGVFdmVudE9iamVjdCAmJiByb290LmRvU2Nyb2xsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b3AgPSAhd2luLmZyYW1lRWxlbWVudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuXG4gICAgICBpZiAodG9wKSB7XG4gICAgICAgIHBvbGwoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkb2NbYWRkXShwcmUgKyBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgaW5pdCwgZmFsc2UpO1xuICAgIGRvY1thZGRdKHByZSArIFwicmVhZHlzdGF0ZWNoYW5nZVwiLCBpbml0LCBmYWxzZSk7XG4gICAgcmV0dXJuIHdpblthZGRdKHByZSArIFwibG9hZFwiLCBpbml0LCBmYWxzZSk7XG4gIH1cbn07IC8vIEFzIGEgc2luZ2xlIGZ1bmN0aW9uIHRvIGJlIGFibGUgdG8gd3JpdGUgdGVzdHMuXG5cblxuRHJvcHpvbmUuX2F1dG9EaXNjb3ZlckZ1bmN0aW9uID0gZnVuY3Rpb24gKCkge1xuICBpZiAoRHJvcHpvbmUuYXV0b0Rpc2NvdmVyKSB7XG4gICAgcmV0dXJuIERyb3B6b25lLmRpc2NvdmVyKCk7XG4gIH1cbn07XG5cbmNvbnRlbnRMb2FkZWQod2luZG93LCBEcm9wem9uZS5fYXV0b0Rpc2NvdmVyRnVuY3Rpb24pO1xuXG5mdW5jdGlvbiBfX2d1YXJkX18odmFsdWUsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCA/IHRyYW5zZm9ybSh2YWx1ZSkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIF9fZ3VhcmRNZXRob2RfXyhvYmosIG1ldGhvZE5hbWUsIHRyYW5zZm9ybSkge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmpbbWV0aG9kTmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtKG9iaiwgbWV0aG9kTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/dropzone/dist/dropzone.js\n"); - -/***/ }), - -/***/ "./node_modules/sortablejs/modular/sortable.esm.js": -/*!*********************************************************!*\ - !*** ./node_modules/sortablejs/modular/sortable.esm.js ***! - \*********************************************************/ -/*! exports provided: default, MultiDrag, Sortable, Swap */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MultiDrag\", function() { return MultiDragPlugin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Sortable\", function() { return Sortable; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Swap\", function() { return SwapPlugin; });\n/**!\n * Sortable 1.15.2\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.2\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = parent.parentNode);\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Sortable);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc29ydGFibGVqcy9tb2R1bGFyL3NvcnRhYmxlLmVzbS5qcz9hYTQ3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHNCQUFzQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixzQkFBc0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHVCQUF1QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDZCQUE2QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1GQUFtRjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsY0FBYyxPQUFPO0FBQ3JCLGNBQWMsT0FBTztBQUNyQixjQUFjLFlBQVk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRTtBQUNqRTtBQUNBLGVBQWU7QUFDZixzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLGVBQWU7QUFDZjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsT0FBTztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxlQUFlLFlBQVk7QUFDM0IsZUFBZSxPQUFPO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixlQUFlLEVBQUU7QUFDakIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEIsWUFBWSxtQkFBbUI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVksbUNBQW1DO0FBQy9DO0FBQ0E7QUFDQSx3RUFBd0UsYUFBYTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0EsdUVBQXVFO0FBQ3ZFO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsZ0JBQWdCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsaUNBQWlDO0FBQ2pDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsOEJBQThCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLFlBQVksVUFBVTtBQUN0QixZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVlLHVFQUFRLEVBQUM7QUFDOEMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc29ydGFibGVqcy9tb2R1bGFyL3NvcnRhYmxlLmVzbS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiFcbiAqIFNvcnRhYmxlIDEuMTUuMlxuICogQGF1dGhvclx0UnViYVhhICAgPHRyYXNoQHJ1YmF4YS5vcmc+XG4gKiBAYXV0aG9yXHRvd2VubSAgICA8b3dlbjIzMzU1QGdtYWlsLmNvbT5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkge1xuICAgICAgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KTtcbiAgICB9XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpO1xuICB2YXIga2V5LCBpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldO1xuICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG4gIHJldHVybiBhcnIyO1xufVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxudmFyIHZlcnNpb24gPSBcIjEuMTUuMlwiO1xuXG5mdW5jdGlvbiB1c2VyQWdlbnQocGF0dGVybikge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lm5hdmlnYXRvcikge1xuICAgIHJldHVybiAhISAvKkBfX1BVUkVfXyovbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaChwYXR0ZXJuKTtcbiAgfVxufVxudmFyIElFMTFPckxlc3MgPSB1c2VyQWdlbnQoLyg/OlRyaWRlbnQuKnJ2WyA6XT8xMVxcLnxtc2llfGllbW9iaWxlfFdpbmRvd3MgUGhvbmUpL2kpO1xudmFyIEVkZ2UgPSB1c2VyQWdlbnQoL0VkZ2UvaSk7XG52YXIgRmlyZUZveCA9IHVzZXJBZ2VudCgvZmlyZWZveC9pKTtcbnZhciBTYWZhcmkgPSB1c2VyQWdlbnQoL3NhZmFyaS9pKSAmJiAhdXNlckFnZW50KC9jaHJvbWUvaSkgJiYgIXVzZXJBZ2VudCgvYW5kcm9pZC9pKTtcbnZhciBJT1MgPSB1c2VyQWdlbnQoL2lQKGFkfG9kfGhvbmUpL2kpO1xudmFyIENocm9tZUZvckFuZHJvaWQgPSB1c2VyQWdlbnQoL2Nocm9tZS9pKSAmJiB1c2VyQWdlbnQoL2FuZHJvaWQvaSk7XG5cbnZhciBjYXB0dXJlTW9kZSA9IHtcbiAgY2FwdHVyZTogZmFsc2UsXG4gIHBhc3NpdmU6IGZhbHNlXG59O1xuZnVuY3Rpb24gb24oZWwsIGV2ZW50LCBmbikge1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgIUlFMTFPckxlc3MgJiYgY2FwdHVyZU1vZGUpO1xufVxuZnVuY3Rpb24gb2ZmKGVsLCBldmVudCwgZm4pIHtcbiAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgZm4sICFJRTExT3JMZXNzICYmIGNhcHR1cmVNb2RlKTtcbn1cbmZ1bmN0aW9uIG1hdGNoZXMoIC8qKkhUTUxFbGVtZW50Ki9lbCwgLyoqU3RyaW5nKi9zZWxlY3Rvcikge1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm47XG4gIHNlbGVjdG9yWzBdID09PSAnPicgJiYgKHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyaW5nKDEpKTtcbiAgaWYgKGVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChlbC5tYXRjaGVzKSB7XG4gICAgICAgIHJldHVybiBlbC5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwubXNNYXRjaGVzU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsLm1zTWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UGFyZW50T3JIb3N0KGVsKSB7XG4gIHJldHVybiBlbC5ob3N0ICYmIGVsICE9PSBkb2N1bWVudCAmJiBlbC5ob3N0Lm5vZGVUeXBlID8gZWwuaG9zdCA6IGVsLnBhcmVudE5vZGU7XG59XG5mdW5jdGlvbiBjbG9zZXN0KCAvKipIVE1MRWxlbWVudCovZWwsIC8qKlN0cmluZyovc2VsZWN0b3IsIC8qKkhUTUxFbGVtZW50Ki9jdHgsIGluY2x1ZGVDVFgpIHtcbiAgaWYgKGVsKSB7XG4gICAgY3R4ID0gY3R4IHx8IGRvY3VtZW50O1xuICAgIGRvIHtcbiAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsICYmIChzZWxlY3RvclswXSA9PT0gJz4nID8gZWwucGFyZW50Tm9kZSA9PT0gY3R4ICYmIG1hdGNoZXMoZWwsIHNlbGVjdG9yKSA6IG1hdGNoZXMoZWwsIHNlbGVjdG9yKSkgfHwgaW5jbHVkZUNUWCAmJiBlbCA9PT0gY3R4KSB7XG4gICAgICAgIHJldHVybiBlbDtcbiAgICAgIH1cbiAgICAgIGlmIChlbCA9PT0gY3R4KSBicmVhaztcbiAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgICB9IHdoaWxlIChlbCA9IGdldFBhcmVudE9ySG9zdChlbCkpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxudmFyIFJfU1BBQ0UgPSAvXFxzKy9nO1xuZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWwsIG5hbWUsIHN0YXRlKSB7XG4gIGlmIChlbCAmJiBuYW1lKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdCkge1xuICAgICAgZWwuY2xhc3NMaXN0W3N0YXRlID8gJ2FkZCcgOiAncmVtb3ZlJ10obmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjbGFzc05hbWUgPSAoJyAnICsgZWwuY2xhc3NOYW1lICsgJyAnKS5yZXBsYWNlKFJfU1BBQ0UsICcgJykucmVwbGFjZSgnICcgKyBuYW1lICsgJyAnLCAnICcpO1xuICAgICAgZWwuY2xhc3NOYW1lID0gKGNsYXNzTmFtZSArIChzdGF0ZSA/ICcgJyArIG5hbWUgOiAnJykpLnJlcGxhY2UoUl9TUEFDRSwgJyAnKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNzcyhlbCwgcHJvcCwgdmFsKSB7XG4gIHZhciBzdHlsZSA9IGVsICYmIGVsLnN0eWxlO1xuICBpZiAoc3R5bGUpIHtcbiAgICBpZiAodmFsID09PSB2b2lkIDApIHtcbiAgICAgIGlmIChkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgICAgIHZhbCA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsICcnKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwuY3VycmVudFN0eWxlKSB7XG4gICAgICAgIHZhbCA9IGVsLmN1cnJlbnRTdHlsZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wID09PSB2b2lkIDAgPyB2YWwgOiB2YWxbcHJvcF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKHByb3AgaW4gc3R5bGUpICYmIHByb3AuaW5kZXhPZignd2Via2l0JykgPT09IC0xKSB7XG4gICAgICAgIHByb3AgPSAnLXdlYmtpdC0nICsgcHJvcDtcbiAgICAgIH1cbiAgICAgIHN0eWxlW3Byb3BdID0gdmFsICsgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gJycgOiAncHgnKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hdHJpeChlbCwgc2VsZk9ubHkpIHtcbiAgdmFyIGFwcGxpZWRUcmFuc2Zvcm1zID0gJyc7XG4gIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgYXBwbGllZFRyYW5zZm9ybXMgPSBlbDtcbiAgfSBlbHNlIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdHJhbnNmb3JtID0gY3NzKGVsLCAndHJhbnNmb3JtJyk7XG4gICAgICBpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybSAhPT0gJ25vbmUnKSB7XG4gICAgICAgIGFwcGxpZWRUcmFuc2Zvcm1zID0gdHJhbnNmb3JtICsgJyAnICsgYXBwbGllZFRyYW5zZm9ybXM7XG4gICAgICB9XG4gICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG4gICAgfSB3aGlsZSAoIXNlbGZPbmx5ICYmIChlbCA9IGVsLnBhcmVudE5vZGUpKTtcbiAgfVxuICB2YXIgbWF0cml4Rm4gPSB3aW5kb3cuRE9NTWF0cml4IHx8IHdpbmRvdy5XZWJLaXRDU1NNYXRyaXggfHwgd2luZG93LkNTU01hdHJpeCB8fCB3aW5kb3cuTVNDU1NNYXRyaXg7XG4gIC8qanNoaW50IC1XMDU2ICovXG4gIHJldHVybiBtYXRyaXhGbiAmJiBuZXcgbWF0cml4Rm4oYXBwbGllZFRyYW5zZm9ybXMpO1xufVxuZnVuY3Rpb24gZmluZChjdHgsIHRhZ05hbWUsIGl0ZXJhdG9yKSB7XG4gIGlmIChjdHgpIHtcbiAgICB2YXIgbGlzdCA9IGN0eC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKSxcbiAgICAgIGkgPSAwLFxuICAgICAgbiA9IGxpc3QubGVuZ3RoO1xuICAgIGlmIChpdGVyYXRvcikge1xuICAgICAgZm9yICg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaXRlcmF0b3IobGlzdFtpXSwgaSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG4gIHJldHVybiBbXTtcbn1cbmZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSB7XG4gIHZhciBzY3JvbGxpbmdFbGVtZW50ID0gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudDtcbiAgaWYgKHNjcm9sbGluZ0VsZW1lbnQpIHtcbiAgICByZXR1cm4gc2Nyb2xsaW5nRWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG59XG5cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBcImJvdW5kaW5nIGNsaWVudCByZWN0XCIgb2YgZ2l2ZW4gZWxlbWVudFxyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgICAgICAgICAgICAgICAgIFRoZSBlbGVtZW50IHdob3NlIGJvdW5kaW5nQ2xpZW50UmVjdCBpcyB3YW50ZWRcclxuICogQHBhcmFtICB7W0Jvb2xlYW5dfSByZWxhdGl2ZVRvQ29udGFpbmluZ0Jsb2NrICBXaGV0aGVyIHRoZSByZWN0IHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgY29udGFpbmluZyBibG9jayBvZiAoaW5jbHVkaW5nKSB0aGUgY29udGFpbmVyXHJcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCAgV2hldGhlciB0aGUgcmVjdCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHJlbGF0aXZlIHBhcmVudCBvZiAoaW5jbHVkaW5nKSB0aGUgY29udGFpZW5yXHJcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gdW5kb1NjYWxlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgY29udGFpbmVyJ3Mgc2NhbGUoKSBzaG91bGQgYmUgdW5kb25lXHJcbiAqIEBwYXJhbSAge1tIVE1MRWxlbWVudF19IGNvbnRhaW5lciAgICAgICAgICAgICAgVGhlIHBhcmVudCB0aGUgZWxlbWVudCB3aWxsIGJlIHBsYWNlZCBpblxyXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBib3VuZGluZ0NsaWVudFJlY3Qgb2YgZWwsIHdpdGggc3BlY2lmaWVkIGFkanVzdG1lbnRzXHJcbiAqL1xuZnVuY3Rpb24gZ2V0UmVjdChlbCwgcmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jaywgcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCwgdW5kb1NjYWxlLCBjb250YWluZXIpIHtcbiAgaWYgKCFlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgJiYgZWwgIT09IHdpbmRvdykgcmV0dXJuO1xuICB2YXIgZWxSZWN0LCB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQsIGhlaWdodCwgd2lkdGg7XG4gIGlmIChlbCAhPT0gd2luZG93ICYmIGVsLnBhcmVudE5vZGUgJiYgZWwgIT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkge1xuICAgIGVsUmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRvcCA9IGVsUmVjdC50b3A7XG4gICAgbGVmdCA9IGVsUmVjdC5sZWZ0O1xuICAgIGJvdHRvbSA9IGVsUmVjdC5ib3R0b207XG4gICAgcmlnaHQgPSBlbFJlY3QucmlnaHQ7XG4gICAgaGVpZ2h0ID0gZWxSZWN0LmhlaWdodDtcbiAgICB3aWR0aCA9IGVsUmVjdC53aWR0aDtcbiAgfSBlbHNlIHtcbiAgICB0b3AgPSAwO1xuICAgIGxlZnQgPSAwO1xuICAgIGJvdHRvbSA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICByaWdodCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICB9XG4gIGlmICgocmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jayB8fCByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50KSAmJiBlbCAhPT0gd2luZG93KSB7XG4gICAgLy8gQWRqdXN0IGZvciB0cmFuc2xhdGUoKVxuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCBlbC5wYXJlbnROb2RlO1xuXG4gICAgLy8gc29sdmVzICMxMTIzIChzZWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNzk1MzgwNi82MDg4MzEyKVxuICAgIC8vIE5vdCBuZWVkZWQgb24gPD0gSUUxMVxuICAgIGlmICghSUUxMU9yTGVzcykge1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoY29udGFpbmVyICYmIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QgJiYgKGNzcyhjb250YWluZXIsICd0cmFuc2Zvcm0nKSAhPT0gJ25vbmUnIHx8IHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQgJiYgY3NzKGNvbnRhaW5lciwgJ3Bvc2l0aW9uJykgIT09ICdzdGF0aWMnKSkge1xuICAgICAgICAgIHZhciBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgLy8gU2V0IHJlbGF0aXZlIHRvIGVkZ2VzIG9mIHBhZGRpbmcgYm94IG9mIGNvbnRhaW5lclxuICAgICAgICAgIHRvcCAtPSBjb250YWluZXJSZWN0LnRvcCArIHBhcnNlSW50KGNzcyhjb250YWluZXIsICdib3JkZXItdG9wLXdpZHRoJykpO1xuICAgICAgICAgIGxlZnQgLT0gY29udGFpbmVyUmVjdC5sZWZ0ICsgcGFyc2VJbnQoY3NzKGNvbnRhaW5lciwgJ2JvcmRlci1sZWZ0LXdpZHRoJykpO1xuICAgICAgICAgIGJvdHRvbSA9IHRvcCArIGVsUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgcmlnaHQgPSBsZWZ0ICsgZWxSZWN0LndpZHRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgICAgIH0gd2hpbGUgKGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlKTtcbiAgICB9XG4gIH1cbiAgaWYgKHVuZG9TY2FsZSAmJiBlbCAhPT0gd2luZG93KSB7XG4gICAgLy8gQWRqdXN0IGZvciBzY2FsZSgpXG4gICAgdmFyIGVsTWF0cml4ID0gbWF0cml4KGNvbnRhaW5lciB8fCBlbCksXG4gICAgICBzY2FsZVggPSBlbE1hdHJpeCAmJiBlbE1hdHJpeC5hLFxuICAgICAgc2NhbGVZID0gZWxNYXRyaXggJiYgZWxNYXRyaXguZDtcbiAgICBpZiAoZWxNYXRyaXgpIHtcbiAgICAgIHRvcCAvPSBzY2FsZVk7XG4gICAgICBsZWZ0IC89IHNjYWxlWDtcbiAgICAgIHdpZHRoIC89IHNjYWxlWDtcbiAgICAgIGhlaWdodCAvPSBzY2FsZVk7XG4gICAgICBib3R0b20gPSB0b3AgKyBoZWlnaHQ7XG4gICAgICByaWdodCA9IGxlZnQgKyB3aWR0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b3A6IHRvcCxcbiAgICBsZWZ0OiBsZWZ0LFxuICAgIGJvdHRvbTogYm90dG9tLFxuICAgIHJpZ2h0OiByaWdodCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn1cblxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIHNpZGUgb2YgYW4gZWxlbWVudCBpcyBzY3JvbGxlZCBwYXN0IGEgc2lkZSBvZiBpdHMgcGFyZW50c1xyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gIGVsICAgICAgICAgICBUaGUgZWxlbWVudCB3aG8ncyBzaWRlIGJlaW5nIHNjcm9sbGVkIG91dCBvZiB2aWV3IGlzIGluIHF1ZXN0aW9uXHJcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgZWxTaWRlICAgICAgIFNpZGUgb2YgdGhlIGVsZW1lbnQgaW4gcXVlc3Rpb24gKCd0b3AnLCAnbGVmdCcsICdyaWdodCcsICdib3R0b20nKVxyXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgIHBhcmVudFNpZGUgICBTaWRlIG9mIHRoZSBwYXJlbnQgaW4gcXVlc3Rpb24gKCd0b3AnLCAnbGVmdCcsICdyaWdodCcsICdib3R0b20nKVxyXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICAgICAgICAgICAgICBUaGUgcGFyZW50IHNjcm9sbCBlbGVtZW50IHRoYXQgdGhlIGVsJ3Mgc2lkZSBpcyBzY3JvbGxlZCBwYXN0LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZWxlbWVudFxyXG4gKi9cbmZ1bmN0aW9uIGlzU2Nyb2xsZWRQYXN0KGVsLCBlbFNpZGUsIHBhcmVudFNpZGUpIHtcbiAgdmFyIHBhcmVudCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsLCB0cnVlKSxcbiAgICBlbFNpZGVWYWwgPSBnZXRSZWN0KGVsKVtlbFNpZGVdO1xuXG4gIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIHZhciBwYXJlbnRTaWRlVmFsID0gZ2V0UmVjdChwYXJlbnQpW3BhcmVudFNpZGVdLFxuICAgICAgdmlzaWJsZSA9IHZvaWQgMDtcbiAgICBpZiAocGFyZW50U2lkZSA9PT0gJ3RvcCcgfHwgcGFyZW50U2lkZSA9PT0gJ2xlZnQnKSB7XG4gICAgICB2aXNpYmxlID0gZWxTaWRlVmFsID49IHBhcmVudFNpZGVWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2libGUgPSBlbFNpZGVWYWwgPD0gcGFyZW50U2lkZVZhbDtcbiAgICB9XG4gICAgaWYgKCF2aXNpYmxlKSByZXR1cm4gcGFyZW50O1xuICAgIGlmIChwYXJlbnQgPT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkgYnJlYWs7XG4gICAgcGFyZW50ID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQocGFyZW50LCBmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcclxuICogR2V0cyBudGggY2hpbGQgb2YgZWwsIGlnbm9yaW5nIGhpZGRlbiBjaGlsZHJlbiwgc29ydGFibGUncyBlbGVtZW50cyAoZG9lcyBub3QgaWdub3JlIGNsb25lIGlmIGl0J3MgdmlzaWJsZSlcclxuICogYW5kIG5vbi1kcmFnZ2FibGUgZWxlbWVudHNcclxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgICAgIFRoZSBwYXJlbnQgZWxlbWVudFxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGNoaWxkTnVtICAgICAgVGhlIGluZGV4IG9mIHRoZSBjaGlsZFxyXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgICAgICAgUGFyZW50IFNvcnRhYmxlJ3Mgb3B0aW9uc1xyXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICAgICAgICAgVGhlIGNoaWxkIGF0IGluZGV4IGNoaWxkTnVtLCBvciBudWxsIGlmIG5vdCBmb3VuZFxyXG4gKi9cbmZ1bmN0aW9uIGdldENoaWxkKGVsLCBjaGlsZE51bSwgb3B0aW9ucywgaW5jbHVkZURyYWdFbCkge1xuICB2YXIgY3VycmVudENoaWxkID0gMCxcbiAgICBpID0gMCxcbiAgICBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuO1xuICB3aGlsZSAoaSA8IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGlmIChjaGlsZHJlbltpXS5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgY2hpbGRyZW5baV0gIT09IFNvcnRhYmxlLmdob3N0ICYmIChpbmNsdWRlRHJhZ0VsIHx8IGNoaWxkcmVuW2ldICE9PSBTb3J0YWJsZS5kcmFnZ2VkKSAmJiBjbG9zZXN0KGNoaWxkcmVuW2ldLCBvcHRpb25zLmRyYWdnYWJsZSwgZWwsIGZhbHNlKSkge1xuICAgICAgaWYgKGN1cnJlbnRDaGlsZCA9PT0gY2hpbGROdW0pIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2ldO1xuICAgICAgfVxuICAgICAgY3VycmVudENoaWxkKys7XG4gICAgfVxuICAgIGkrKztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXHJcbiAqIEdldHMgdGhlIGxhc3QgY2hpbGQgaW4gdGhlIGVsLCBpZ25vcmluZyBnaG9zdEVsIG9yIGludmlzaWJsZSBlbGVtZW50cyAoY2xvbmVzKVxyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgUGFyZW50IGVsZW1lbnRcclxuICogQHBhcmFtICB7c2VsZWN0b3J9IHNlbGVjdG9yICAgIEFueSBvdGhlciBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkXHJcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICBUaGUgbGFzdCBjaGlsZCwgaWdub3JpbmcgZ2hvc3RFbFxyXG4gKi9cbmZ1bmN0aW9uIGxhc3RDaGlsZChlbCwgc2VsZWN0b3IpIHtcbiAgdmFyIGxhc3QgPSBlbC5sYXN0RWxlbWVudENoaWxkO1xuICB3aGlsZSAobGFzdCAmJiAobGFzdCA9PT0gU29ydGFibGUuZ2hvc3QgfHwgY3NzKGxhc3QsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBzZWxlY3RvciAmJiAhbWF0Y2hlcyhsYXN0LCBzZWxlY3RvcikpKSB7XG4gICAgbGFzdCA9IGxhc3QucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgfVxuICByZXR1cm4gbGFzdCB8fCBudWxsO1xufVxuXG4vKipcclxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgYW4gZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudCBmb3IgYSBzZWxlY3RlZCBzZXQgb2ZcclxuICogZWxlbWVudHNcclxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsXHJcbiAqIEBwYXJhbSAge3NlbGVjdG9yfSBzZWxlY3RvclxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAqL1xuZnVuY3Rpb24gaW5kZXgoZWwsIHNlbGVjdG9yKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIGlmICghZWwgfHwgIWVsLnBhcmVudE5vZGUpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG4gIHdoaWxlIChlbCA9IGVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHtcbiAgICBpZiAoZWwubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gJ1RFTVBMQVRFJyAmJiBlbCAhPT0gU29ydGFibGUuY2xvbmUgJiYgKCFzZWxlY3RvciB8fCBtYXRjaGVzKGVsLCBzZWxlY3RvcikpKSB7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBnaXZlbiBlbGVtZW50LCBhZGRlZCB3aXRoIGFsbCB0aGUgc2Nyb2xsIG9mZnNldHMgb2YgcGFyZW50IGVsZW1lbnRzLlxyXG4gKiBUaGUgdmFsdWUgaXMgcmV0dXJuZWQgaW4gcmVhbCBwaXhlbHMuXHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbFxyXG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgICAgICAgT2Zmc2V0cyBpbiB0aGUgZm9ybWF0IG9mIFtsZWZ0LCB0b3BdXHJcbiAqL1xuZnVuY3Rpb24gZ2V0UmVsYXRpdmVTY3JvbGxPZmZzZXQoZWwpIHtcbiAgdmFyIG9mZnNldExlZnQgPSAwLFxuICAgIG9mZnNldFRvcCA9IDAsXG4gICAgd2luU2Nyb2xsZXIgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gIGlmIChlbCkge1xuICAgIGRvIHtcbiAgICAgIHZhciBlbE1hdHJpeCA9IG1hdHJpeChlbCksXG4gICAgICAgIHNjYWxlWCA9IGVsTWF0cml4LmEsXG4gICAgICAgIHNjYWxlWSA9IGVsTWF0cml4LmQ7XG4gICAgICBvZmZzZXRMZWZ0ICs9IGVsLnNjcm9sbExlZnQgKiBzY2FsZVg7XG4gICAgICBvZmZzZXRUb3AgKz0gZWwuc2Nyb2xsVG9wICogc2NhbGVZO1xuICAgIH0gd2hpbGUgKGVsICE9PSB3aW5TY3JvbGxlciAmJiAoZWwgPSBlbC5wYXJlbnROb2RlKSk7XG4gIH1cbiAgcmV0dXJuIFtvZmZzZXRMZWZ0LCBvZmZzZXRUb3BdO1xufVxuXG4vKipcclxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG9iamVjdCB3aXRoaW4gdGhlIGdpdmVuIGFycmF5XHJcbiAqIEBwYXJhbSAge0FycmF5fSBhcnIgICBBcnJheSB0aGF0IG1heSBvciBtYXkgbm90IGhvbGQgdGhlIG9iamVjdFxyXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9iaiAgQW4gb2JqZWN0IHRoYXQgaGFzIGEga2V5LXZhbHVlIHBhaXIgdW5pcXVlIHRvIGFuZCBpZGVudGljYWwgdG8gYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgb2JqZWN0IHlvdSB3YW50IHRvIGZpbmRcclxuICogQHJldHVybiB7TnVtYmVyfSAgICAgIFRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IGluIHRoZSBhcnJheSwgb3IgLTFcclxuICovXG5mdW5jdGlvbiBpbmRleE9mT2JqZWN0KGFyciwgb2JqKSB7XG4gIGZvciAodmFyIGkgaW4gYXJyKSB7XG4gICAgaWYgKCFhcnIuaGFzT3duUHJvcGVydHkoaSkpIGNvbnRpbnVlO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSAmJiBvYmpba2V5XSA9PT0gYXJyW2ldW2tleV0pIHJldHVybiBOdW1iZXIoaSk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cbmZ1bmN0aW9uIGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsLCBpbmNsdWRlU2VsZikge1xuICAvLyBza2lwIHRvIHdpbmRvd1xuICBpZiAoIWVsIHx8ICFlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHJldHVybiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gIHZhciBlbGVtID0gZWw7XG4gIHZhciBnb3RTZWxmID0gZmFsc2U7XG4gIGRvIHtcbiAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGdldCBlbGVtIGNzcyBpZiBpdCBpc24ndCBldmVuIG92ZXJmbG93aW5nIGluIHRoZSBmaXJzdCBwbGFjZSAocGVyZm9ybWFuY2UpXG4gICAgaWYgKGVsZW0uY2xpZW50V2lkdGggPCBlbGVtLnNjcm9sbFdpZHRoIHx8IGVsZW0uY2xpZW50SGVpZ2h0IDwgZWxlbS5zY3JvbGxIZWlnaHQpIHtcbiAgICAgIHZhciBlbGVtQ1NTID0gY3NzKGVsZW0pO1xuICAgICAgaWYgKGVsZW0uY2xpZW50V2lkdGggPCBlbGVtLnNjcm9sbFdpZHRoICYmIChlbGVtQ1NTLm92ZXJmbG93WCA9PSAnYXV0bycgfHwgZWxlbUNTUy5vdmVyZmxvd1ggPT0gJ3Njcm9sbCcpIHx8IGVsZW0uY2xpZW50SGVpZ2h0IDwgZWxlbS5zY3JvbGxIZWlnaHQgJiYgKGVsZW1DU1Mub3ZlcmZsb3dZID09ICdhdXRvJyB8fCBlbGVtQ1NTLm92ZXJmbG93WSA9PSAnc2Nyb2xsJykpIHtcbiAgICAgICAgaWYgKCFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCB8fCBlbGVtID09PSBkb2N1bWVudC5ib2R5KSByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgICAgICBpZiAoZ290U2VsZiB8fCBpbmNsdWRlU2VsZikgcmV0dXJuIGVsZW07XG4gICAgICAgIGdvdFNlbGYgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG4gIH0gd2hpbGUgKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpO1xuICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xufVxuZnVuY3Rpb24gZXh0ZW5kKGRzdCwgc3JjKSB7XG4gIGlmIChkc3QgJiYgc3JjKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGRzdFtrZXldID0gc3JjW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBkc3Q7XG59XG5mdW5jdGlvbiBpc1JlY3RFcXVhbChyZWN0MSwgcmVjdDIpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQocmVjdDEudG9wKSA9PT0gTWF0aC5yb3VuZChyZWN0Mi50b3ApICYmIE1hdGgucm91bmQocmVjdDEubGVmdCkgPT09IE1hdGgucm91bmQocmVjdDIubGVmdCkgJiYgTWF0aC5yb3VuZChyZWN0MS5oZWlnaHQpID09PSBNYXRoLnJvdW5kKHJlY3QyLmhlaWdodCkgJiYgTWF0aC5yb3VuZChyZWN0MS53aWR0aCkgPT09IE1hdGgucm91bmQocmVjdDIud2lkdGgpO1xufVxudmFyIF90aHJvdHRsZVRpbWVvdXQ7XG5mdW5jdGlvbiB0aHJvdHRsZShjYWxsYmFjaywgbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIV90aHJvdHRsZVRpbWVvdXQpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBfdGhpcyA9IHRoaXM7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChfdGhpcywgYXJnc1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjay5hcHBseShfdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICBfdGhyb3R0bGVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aHJvdHRsZVRpbWVvdXQgPSB2b2lkIDA7XG4gICAgICB9LCBtcyk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY2FuY2VsVGhyb3R0bGUoKSB7XG4gIGNsZWFyVGltZW91dChfdGhyb3R0bGVUaW1lb3V0KTtcbiAgX3Rocm90dGxlVGltZW91dCA9IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHNjcm9sbEJ5KGVsLCB4LCB5KSB7XG4gIGVsLnNjcm9sbExlZnQgKz0geDtcbiAgZWwuc2Nyb2xsVG9wICs9IHk7XG59XG5mdW5jdGlvbiBjbG9uZShlbCkge1xuICB2YXIgUG9seW1lciA9IHdpbmRvdy5Qb2x5bWVyO1xuICB2YXIgJCA9IHdpbmRvdy5qUXVlcnkgfHwgd2luZG93LlplcHRvO1xuICBpZiAoUG9seW1lciAmJiBQb2x5bWVyLmRvbSkge1xuICAgIHJldHVybiBQb2x5bWVyLmRvbShlbCkuY2xvbmVOb2RlKHRydWUpO1xuICB9IGVsc2UgaWYgKCQpIHtcbiAgICByZXR1cm4gJChlbCkuY2xvbmUodHJ1ZSlbMF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVsLmNsb25lTm9kZSh0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0UmVjdChlbCwgcmVjdCkge1xuICBjc3MoZWwsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuICBjc3MoZWwsICd0b3AnLCByZWN0LnRvcCk7XG4gIGNzcyhlbCwgJ2xlZnQnLCByZWN0LmxlZnQpO1xuICBjc3MoZWwsICd3aWR0aCcsIHJlY3Qud2lkdGgpO1xuICBjc3MoZWwsICdoZWlnaHQnLCByZWN0LmhlaWdodCk7XG59XG5mdW5jdGlvbiB1bnNldFJlY3QoZWwpIHtcbiAgY3NzKGVsLCAncG9zaXRpb24nLCAnJyk7XG4gIGNzcyhlbCwgJ3RvcCcsICcnKTtcbiAgY3NzKGVsLCAnbGVmdCcsICcnKTtcbiAgY3NzKGVsLCAnd2lkdGgnLCAnJyk7XG4gIGNzcyhlbCwgJ2hlaWdodCcsICcnKTtcbn1cbmZ1bmN0aW9uIGdldENoaWxkQ29udGFpbmluZ1JlY3RGcm9tRWxlbWVudChjb250YWluZXIsIG9wdGlvbnMsIGdob3N0RWwpIHtcbiAgdmFyIHJlY3QgPSB7fTtcbiAgQXJyYXkuZnJvbShjb250YWluZXIuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgdmFyIF9yZWN0JGxlZnQsIF9yZWN0JHRvcCwgX3JlY3QkcmlnaHQsIF9yZWN0JGJvdHRvbTtcbiAgICBpZiAoIWNsb3Nlc3QoY2hpbGQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBjb250YWluZXIsIGZhbHNlKSB8fCBjaGlsZC5hbmltYXRlZCB8fCBjaGlsZCA9PT0gZ2hvc3RFbCkgcmV0dXJuO1xuICAgIHZhciBjaGlsZFJlY3QgPSBnZXRSZWN0KGNoaWxkKTtcbiAgICByZWN0LmxlZnQgPSBNYXRoLm1pbigoX3JlY3QkbGVmdCA9IHJlY3QubGVmdCkgIT09IG51bGwgJiYgX3JlY3QkbGVmdCAhPT0gdm9pZCAwID8gX3JlY3QkbGVmdCA6IEluZmluaXR5LCBjaGlsZFJlY3QubGVmdCk7XG4gICAgcmVjdC50b3AgPSBNYXRoLm1pbigoX3JlY3QkdG9wID0gcmVjdC50b3ApICE9PSBudWxsICYmIF9yZWN0JHRvcCAhPT0gdm9pZCAwID8gX3JlY3QkdG9wIDogSW5maW5pdHksIGNoaWxkUmVjdC50b3ApO1xuICAgIHJlY3QucmlnaHQgPSBNYXRoLm1heCgoX3JlY3QkcmlnaHQgPSByZWN0LnJpZ2h0KSAhPT0gbnVsbCAmJiBfcmVjdCRyaWdodCAhPT0gdm9pZCAwID8gX3JlY3QkcmlnaHQgOiAtSW5maW5pdHksIGNoaWxkUmVjdC5yaWdodCk7XG4gICAgcmVjdC5ib3R0b20gPSBNYXRoLm1heCgoX3JlY3QkYm90dG9tID0gcmVjdC5ib3R0b20pICE9PSBudWxsICYmIF9yZWN0JGJvdHRvbSAhPT0gdm9pZCAwID8gX3JlY3QkYm90dG9tIDogLUluZmluaXR5LCBjaGlsZFJlY3QuYm90dG9tKTtcbiAgfSk7XG4gIHJlY3Qud2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0O1xuICByZWN0LmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxudmFyIGV4cGFuZG8gPSAnU29ydGFibGUnICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbmZ1bmN0aW9uIEFuaW1hdGlvblN0YXRlTWFuYWdlcigpIHtcbiAgdmFyIGFuaW1hdGlvblN0YXRlcyA9IFtdLFxuICAgIGFuaW1hdGlvbkNhbGxiYWNrSWQ7XG4gIHJldHVybiB7XG4gICAgY2FwdHVyZUFuaW1hdGlvblN0YXRlOiBmdW5jdGlvbiBjYXB0dXJlQW5pbWF0aW9uU3RhdGUoKSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMgPSBbXTtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFuaW1hdGlvbikgcmV0dXJuO1xuICAgICAgdmFyIGNoaWxkcmVuID0gW10uc2xpY2UuY2FsbCh0aGlzLmVsLmNoaWxkcmVuKTtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmIChjc3MoY2hpbGQsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBjaGlsZCA9PT0gU29ydGFibGUuZ2hvc3QpIHJldHVybjtcbiAgICAgICAgYW5pbWF0aW9uU3RhdGVzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogY2hpbGQsXG4gICAgICAgICAgcmVjdDogZ2V0UmVjdChjaGlsZClcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBmcm9tUmVjdCA9IF9vYmplY3RTcHJlYWQyKHt9LCBhbmltYXRpb25TdGF0ZXNbYW5pbWF0aW9uU3RhdGVzLmxlbmd0aCAtIDFdLnJlY3QpO1xuXG4gICAgICAgIC8vIElmIGFuaW1hdGluZzogY29tcGVuc2F0ZSBmb3IgY3VycmVudCBhbmltYXRpb25cbiAgICAgICAgaWYgKGNoaWxkLnRoaXNBbmltYXRpb25EdXJhdGlvbikge1xuICAgICAgICAgIHZhciBjaGlsZE1hdHJpeCA9IG1hdHJpeChjaGlsZCwgdHJ1ZSk7XG4gICAgICAgICAgaWYgKGNoaWxkTWF0cml4KSB7XG4gICAgICAgICAgICBmcm9tUmVjdC50b3AgLT0gY2hpbGRNYXRyaXguZjtcbiAgICAgICAgICAgIGZyb21SZWN0LmxlZnQgLT0gY2hpbGRNYXRyaXguZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGQuZnJvbVJlY3QgPSBmcm9tUmVjdDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgYWRkQW5pbWF0aW9uU3RhdGU6IGZ1bmN0aW9uIGFkZEFuaW1hdGlvblN0YXRlKHN0YXRlKSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMucHVzaChzdGF0ZSk7XG4gICAgfSxcbiAgICByZW1vdmVBbmltYXRpb25TdGF0ZTogZnVuY3Rpb24gcmVtb3ZlQW5pbWF0aW9uU3RhdGUodGFyZ2V0KSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMuc3BsaWNlKGluZGV4T2ZPYmplY3QoYW5pbWF0aW9uU3RhdGVzLCB7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgICB9KSwgMSk7XG4gICAgfSxcbiAgICBhbmltYXRlQWxsOiBmdW5jdGlvbiBhbmltYXRlQWxsKGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChhbmltYXRpb25DYWxsYmFja0lkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGFuaW1hdGluZyA9IGZhbHNlLFxuICAgICAgICBhbmltYXRpb25UaW1lID0gMDtcbiAgICAgIGFuaW1hdGlvblN0YXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgdGltZSA9IDAsXG4gICAgICAgICAgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0LFxuICAgICAgICAgIGZyb21SZWN0ID0gdGFyZ2V0LmZyb21SZWN0LFxuICAgICAgICAgIHRvUmVjdCA9IGdldFJlY3QodGFyZ2V0KSxcbiAgICAgICAgICBwcmV2RnJvbVJlY3QgPSB0YXJnZXQucHJldkZyb21SZWN0LFxuICAgICAgICAgIHByZXZUb1JlY3QgPSB0YXJnZXQucHJldlRvUmVjdCxcbiAgICAgICAgICBhbmltYXRpbmdSZWN0ID0gc3RhdGUucmVjdCxcbiAgICAgICAgICB0YXJnZXRNYXRyaXggPSBtYXRyaXgodGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgaWYgKHRhcmdldE1hdHJpeCkge1xuICAgICAgICAgIC8vIENvbXBlbnNhdGUgZm9yIGN1cnJlbnQgYW5pbWF0aW9uXG4gICAgICAgICAgdG9SZWN0LnRvcCAtPSB0YXJnZXRNYXRyaXguZjtcbiAgICAgICAgICB0b1JlY3QubGVmdCAtPSB0YXJnZXRNYXRyaXguZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQudG9SZWN0ID0gdG9SZWN0O1xuICAgICAgICBpZiAodGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbikge1xuICAgICAgICAgIC8vIENvdWxkIGFsc28gY2hlY2sgaWYgYW5pbWF0aW5nUmVjdCBpcyBiZXR3ZWVuIGZyb21SZWN0IGFuZCB0b1JlY3RcbiAgICAgICAgICBpZiAoaXNSZWN0RXF1YWwocHJldkZyb21SZWN0LCB0b1JlY3QpICYmICFpc1JlY3RFcXVhbChmcm9tUmVjdCwgdG9SZWN0KSAmJlxuICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbmltYXRpbmdSZWN0IGlzIG9uIGxpbmUgYmV0d2VlbiB0b1JlY3QgJiBmcm9tUmVjdFxuICAgICAgICAgIChhbmltYXRpbmdSZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKGFuaW1hdGluZ1JlY3QubGVmdCAtIHRvUmVjdC5sZWZ0KSA9PT0gKGZyb21SZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKGZyb21SZWN0LmxlZnQgLSB0b1JlY3QubGVmdCkpIHtcbiAgICAgICAgICAgIC8vIElmIHJldHVybmluZyB0byBzYW1lIHBsYWNlIGFzIHN0YXJ0ZWQgZnJvbSBhbmltYXRpb24gYW5kIG9uIHNhbWUgYXhpc1xuICAgICAgICAgICAgdGltZSA9IGNhbGN1bGF0ZVJlYWxUaW1lKGFuaW1hdGluZ1JlY3QsIHByZXZGcm9tUmVjdCwgcHJldlRvUmVjdCwgX3RoaXMub3B0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgZnJvbVJlY3QgIT0gdG9SZWN0OiBhbmltYXRlXG4gICAgICAgIGlmICghaXNSZWN0RXF1YWwodG9SZWN0LCBmcm9tUmVjdCkpIHtcbiAgICAgICAgICB0YXJnZXQucHJldkZyb21SZWN0ID0gZnJvbVJlY3Q7XG4gICAgICAgICAgdGFyZ2V0LnByZXZUb1JlY3QgPSB0b1JlY3Q7XG4gICAgICAgICAgaWYgKCF0aW1lKSB7XG4gICAgICAgICAgICB0aW1lID0gX3RoaXMub3B0aW9ucy5hbmltYXRpb247XG4gICAgICAgICAgfVxuICAgICAgICAgIF90aGlzLmFuaW1hdGUodGFyZ2V0LCBhbmltYXRpbmdSZWN0LCB0b1JlY3QsIHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgYW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBhbmltYXRpb25UaW1lID0gTWF0aC5tYXgoYW5pbWF0aW9uVGltZSwgdGltZSk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRhcmdldC5hbmltYXRpb25SZXNldFRpbWVyKTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0aW9uUmVzZXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGFyZ2V0LmFuaW1hdGlvblRpbWUgPSAwO1xuICAgICAgICAgICAgdGFyZ2V0LnByZXZGcm9tUmVjdCA9IG51bGw7XG4gICAgICAgICAgICB0YXJnZXQuZnJvbVJlY3QgPSBudWxsO1xuICAgICAgICAgICAgdGFyZ2V0LnByZXZUb1JlY3QgPSBudWxsO1xuICAgICAgICAgICAgdGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgfSwgdGltZSk7XG4gICAgICAgICAgdGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IHRpbWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2xlYXJUaW1lb3V0KGFuaW1hdGlvbkNhbGxiYWNrSWQpO1xuICAgICAgaWYgKCFhbmltYXRpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFuaW1hdGlvbkNhbGxiYWNrSWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgICB9LCBhbmltYXRpb25UaW1lKTtcbiAgICAgIH1cbiAgICAgIGFuaW1hdGlvblN0YXRlcyA9IFtdO1xuICAgIH0sXG4gICAgYW5pbWF0ZTogZnVuY3Rpb24gYW5pbWF0ZSh0YXJnZXQsIGN1cnJlbnRSZWN0LCB0b1JlY3QsIGR1cmF0aW9uKSB7XG4gICAgICBpZiAoZHVyYXRpb24pIHtcbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgICAgIHZhciBlbE1hdHJpeCA9IG1hdHJpeCh0aGlzLmVsKSxcbiAgICAgICAgICBzY2FsZVggPSBlbE1hdHJpeCAmJiBlbE1hdHJpeC5hLFxuICAgICAgICAgIHNjYWxlWSA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmQsXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IChjdXJyZW50UmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQpIC8gKHNjYWxlWCB8fCAxKSxcbiAgICAgICAgICB0cmFuc2xhdGVZID0gKGN1cnJlbnRSZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKHNjYWxlWSB8fCAxKTtcbiAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1ggPSAhIXRyYW5zbGF0ZVg7XG4gICAgICAgIHRhcmdldC5hbmltYXRpbmdZID0gISF0cmFuc2xhdGVZO1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZTNkKCcgKyB0cmFuc2xhdGVYICsgJ3B4LCcgKyB0cmFuc2xhdGVZICsgJ3B4LDApJyk7XG4gICAgICAgIHRoaXMuZm9yUmVwYWludER1bW15ID0gcmVwYWludCh0YXJnZXQpOyAvLyByZXBhaW50XG5cbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAndHJhbnNmb3JtICcgKyBkdXJhdGlvbiArICdtcycgKyAodGhpcy5vcHRpb25zLmVhc2luZyA/ICcgJyArIHRoaXMub3B0aW9ucy5lYXNpbmcgOiAnJykpO1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZTNkKDAsMCwwKScpO1xuICAgICAgICB0eXBlb2YgdGFyZ2V0LmFuaW1hdGVkID09PSAnbnVtYmVyJyAmJiBjbGVhclRpbWVvdXQodGFyZ2V0LmFuaW1hdGVkKTtcbiAgICAgICAgdGFyZ2V0LmFuaW1hdGVkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICcnKTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0aW5nWCA9IGZhbHNlO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpbmdZID0gZmFsc2U7XG4gICAgICAgIH0sIGR1cmF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiByZXBhaW50KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0Lm9mZnNldFdpZHRoO1xufVxuZnVuY3Rpb24gY2FsY3VsYXRlUmVhbFRpbWUoYW5pbWF0aW5nUmVjdCwgZnJvbVJlY3QsIHRvUmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGZyb21SZWN0LnRvcCAtIGFuaW1hdGluZ1JlY3QudG9wLCAyKSArIE1hdGgucG93KGZyb21SZWN0LmxlZnQgLSBhbmltYXRpbmdSZWN0LmxlZnQsIDIpKSAvIE1hdGguc3FydChNYXRoLnBvdyhmcm9tUmVjdC50b3AgLSB0b1JlY3QudG9wLCAyKSArIE1hdGgucG93KGZyb21SZWN0LmxlZnQgLSB0b1JlY3QubGVmdCwgMikpICogb3B0aW9ucy5hbmltYXRpb247XG59XG5cbnZhciBwbHVnaW5zID0gW107XG52YXIgZGVmYXVsdHMgPSB7XG4gIGluaXRpYWxpemVCeURlZmF1bHQ6IHRydWVcbn07XG52YXIgUGx1Z2luTWFuYWdlciA9IHtcbiAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KHBsdWdpbikge1xuICAgIC8vIFNldCBkZWZhdWx0IHN0YXRpYyBwcm9wZXJ0aWVzXG4gICAgZm9yICh2YXIgb3B0aW9uIGluIGRlZmF1bHRzKSB7XG4gICAgICBpZiAoZGVmYXVsdHMuaGFzT3duUHJvcGVydHkob3B0aW9uKSAmJiAhKG9wdGlvbiBpbiBwbHVnaW4pKSB7XG4gICAgICAgIHBsdWdpbltvcHRpb25dID0gZGVmYXVsdHNbb3B0aW9uXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAocC5wbHVnaW5OYW1lID09PSBwbHVnaW4ucGx1Z2luTmFtZSkge1xuICAgICAgICB0aHJvdyBcIlNvcnRhYmxlOiBDYW5ub3QgbW91bnQgcGx1Z2luIFwiLmNvbmNhdChwbHVnaW4ucGx1Z2luTmFtZSwgXCIgbW9yZSB0aGFuIG9uY2VcIik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gIH0sXG4gIHBsdWdpbkV2ZW50OiBmdW5jdGlvbiBwbHVnaW5FdmVudChldmVudE5hbWUsIHNvcnRhYmxlLCBldnQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMuZXZlbnRDYW5jZWxlZCA9IGZhbHNlO1xuICAgIGV2dC5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5ldmVudENhbmNlbGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIHZhciBldmVudE5hbWVHbG9iYWwgPSBldmVudE5hbWUgKyAnR2xvYmFsJztcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgaWYgKCFzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0pIHJldHVybjtcbiAgICAgIC8vIEZpcmUgZ2xvYmFsIGV2ZW50cyBpZiBpdCBleGlzdHMgaW4gdGhpcyBzb3J0YWJsZVxuICAgICAgaWYgKHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVHbG9iYWxdKSB7XG4gICAgICAgIHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVHbG9iYWxdKF9vYmplY3RTcHJlYWQyKHtcbiAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGVcbiAgICAgICAgfSwgZXZ0KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgZmlyZSBwbHVnaW4gZXZlbnQgaWYgcGx1Z2luIGlzIGVuYWJsZWQgaW4gdGhpcyBzb3J0YWJsZSxcbiAgICAgIC8vIGFuZCBwbHVnaW4gaGFzIGV2ZW50IGRlZmluZWRcbiAgICAgIGlmIChzb3J0YWJsZS5vcHRpb25zW3BsdWdpbi5wbHVnaW5OYW1lXSAmJiBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lXSkge1xuICAgICAgICBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lXShfb2JqZWN0U3ByZWFkMih7XG4gICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlXG4gICAgICAgIH0sIGV2dCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICBpbml0aWFsaXplUGx1Z2luczogZnVuY3Rpb24gaW5pdGlhbGl6ZVBsdWdpbnMoc29ydGFibGUsIGVsLCBkZWZhdWx0cywgb3B0aW9ucykge1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICB2YXIgcGx1Z2luTmFtZSA9IHBsdWdpbi5wbHVnaW5OYW1lO1xuICAgICAgaWYgKCFzb3J0YWJsZS5vcHRpb25zW3BsdWdpbk5hbWVdICYmICFwbHVnaW4uaW5pdGlhbGl6ZUJ5RGVmYXVsdCkgcmV0dXJuO1xuICAgICAgdmFyIGluaXRpYWxpemVkID0gbmV3IHBsdWdpbihzb3J0YWJsZSwgZWwsIHNvcnRhYmxlLm9wdGlvbnMpO1xuICAgICAgaW5pdGlhbGl6ZWQuc29ydGFibGUgPSBzb3J0YWJsZTtcbiAgICAgIGluaXRpYWxpemVkLm9wdGlvbnMgPSBzb3J0YWJsZS5vcHRpb25zO1xuICAgICAgc29ydGFibGVbcGx1Z2luTmFtZV0gPSBpbml0aWFsaXplZDtcblxuICAgICAgLy8gQWRkIGRlZmF1bHQgb3B0aW9ucyBmcm9tIHBsdWdpblxuICAgICAgX2V4dGVuZHMoZGVmYXVsdHMsIGluaXRpYWxpemVkLmRlZmF1bHRzKTtcbiAgICB9KTtcbiAgICBmb3IgKHZhciBvcHRpb24gaW4gc29ydGFibGUub3B0aW9ucykge1xuICAgICAgaWYgKCFzb3J0YWJsZS5vcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbikpIGNvbnRpbnVlO1xuICAgICAgdmFyIG1vZGlmaWVkID0gdGhpcy5tb2RpZnlPcHRpb24oc29ydGFibGUsIG9wdGlvbiwgc29ydGFibGUub3B0aW9uc1tvcHRpb25dKTtcbiAgICAgIGlmICh0eXBlb2YgbW9kaWZpZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvcnRhYmxlLm9wdGlvbnNbb3B0aW9uXSA9IG1vZGlmaWVkO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZ2V0RXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBnZXRFdmVudFByb3BlcnRpZXMobmFtZSwgc29ydGFibGUpIHtcbiAgICB2YXIgZXZlbnRQcm9wZXJ0aWVzID0ge307XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIGlmICh0eXBlb2YgcGx1Z2luLmV2ZW50UHJvcGVydGllcyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuICAgICAgX2V4dGVuZHMoZXZlbnRQcm9wZXJ0aWVzLCBwbHVnaW4uZXZlbnRQcm9wZXJ0aWVzLmNhbGwoc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdLCBuYW1lKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGV2ZW50UHJvcGVydGllcztcbiAgfSxcbiAgbW9kaWZ5T3B0aW9uOiBmdW5jdGlvbiBtb2RpZnlPcHRpb24oc29ydGFibGUsIG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIG1vZGlmaWVkVmFsdWU7XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIC8vIFBsdWdpbiBtdXN0IGV4aXN0IG9uIHRoZSBTb3J0YWJsZVxuICAgICAgaWYgKCFzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0pIHJldHVybjtcblxuICAgICAgLy8gSWYgc3RhdGljIG9wdGlvbiBsaXN0ZW5lciBleGlzdHMgZm9yIHRoaXMgb3B0aW9uLCBjYWxsIGluIHRoZSBjb250ZXh0IG9mIHRoZSBTb3J0YWJsZSdzIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luXG4gICAgICBpZiAocGx1Z2luLm9wdGlvbkxpc3RlbmVycyAmJiB0eXBlb2YgcGx1Z2luLm9wdGlvbkxpc3RlbmVyc1tuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtb2RpZmllZFZhbHVlID0gcGx1Z2luLm9wdGlvbkxpc3RlbmVyc1tuYW1lXS5jYWxsKHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtb2RpZmllZFZhbHVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KF9yZWYpIHtcbiAgdmFyIHNvcnRhYmxlID0gX3JlZi5zb3J0YWJsZSxcbiAgICByb290RWwgPSBfcmVmLnJvb3RFbCxcbiAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgIHRhcmdldEVsID0gX3JlZi50YXJnZXRFbCxcbiAgICBjbG9uZUVsID0gX3JlZi5jbG9uZUVsLFxuICAgIHRvRWwgPSBfcmVmLnRvRWwsXG4gICAgZnJvbUVsID0gX3JlZi5mcm9tRWwsXG4gICAgb2xkSW5kZXggPSBfcmVmLm9sZEluZGV4LFxuICAgIG5ld0luZGV4ID0gX3JlZi5uZXdJbmRleCxcbiAgICBvbGREcmFnZ2FibGVJbmRleCA9IF9yZWYub2xkRHJhZ2dhYmxlSW5kZXgsXG4gICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBfcmVmLm5ld0RyYWdnYWJsZUluZGV4LFxuICAgIG9yaWdpbmFsRXZlbnQgPSBfcmVmLm9yaWdpbmFsRXZlbnQsXG4gICAgcHV0U29ydGFibGUgPSBfcmVmLnB1dFNvcnRhYmxlLFxuICAgIGV4dHJhRXZlbnRQcm9wZXJ0aWVzID0gX3JlZi5leHRyYUV2ZW50UHJvcGVydGllcztcbiAgc29ydGFibGUgPSBzb3J0YWJsZSB8fCByb290RWwgJiYgcm9vdEVsW2V4cGFuZG9dO1xuICBpZiAoIXNvcnRhYmxlKSByZXR1cm47XG4gIHZhciBldnQsXG4gICAgb3B0aW9ucyA9IHNvcnRhYmxlLm9wdGlvbnMsXG4gICAgb25OYW1lID0gJ29uJyArIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cigxKTtcbiAgLy8gU3VwcG9ydCBmb3IgbmV3IEN1c3RvbUV2ZW50IGZlYXR1cmVcbiAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiAhSUUxMU9yTGVzcyAmJiAhRWRnZSkge1xuICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2dC5pbml0RXZlbnQobmFtZSwgdHJ1ZSwgdHJ1ZSk7XG4gIH1cbiAgZXZ0LnRvID0gdG9FbCB8fCByb290RWw7XG4gIGV2dC5mcm9tID0gZnJvbUVsIHx8IHJvb3RFbDtcbiAgZXZ0Lml0ZW0gPSB0YXJnZXRFbCB8fCByb290RWw7XG4gIGV2dC5jbG9uZSA9IGNsb25lRWw7XG4gIGV2dC5vbGRJbmRleCA9IG9sZEluZGV4O1xuICBldnQubmV3SW5kZXggPSBuZXdJbmRleDtcbiAgZXZ0Lm9sZERyYWdnYWJsZUluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXg7XG4gIGV2dC5uZXdEcmFnZ2FibGVJbmRleCA9IG5ld0RyYWdnYWJsZUluZGV4O1xuICBldnQub3JpZ2luYWxFdmVudCA9IG9yaWdpbmFsRXZlbnQ7XG4gIGV2dC5wdWxsTW9kZSA9IHB1dFNvcnRhYmxlID8gcHV0U29ydGFibGUubGFzdFB1dE1vZGUgOiB1bmRlZmluZWQ7XG4gIHZhciBhbGxFdmVudFByb3BlcnRpZXMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgZXh0cmFFdmVudFByb3BlcnRpZXMpLCBQbHVnaW5NYW5hZ2VyLmdldEV2ZW50UHJvcGVydGllcyhuYW1lLCBzb3J0YWJsZSkpO1xuICBmb3IgKHZhciBvcHRpb24gaW4gYWxsRXZlbnRQcm9wZXJ0aWVzKSB7XG4gICAgZXZ0W29wdGlvbl0gPSBhbGxFdmVudFByb3BlcnRpZXNbb3B0aW9uXTtcbiAgfVxuICBpZiAocm9vdEVsKSB7XG4gICAgcm9vdEVsLmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgfVxuICBpZiAob3B0aW9uc1tvbk5hbWVdKSB7XG4gICAgb3B0aW9uc1tvbk5hbWVdLmNhbGwoc29ydGFibGUsIGV2dCk7XG4gIH1cbn1cblxudmFyIF9leGNsdWRlZCA9IFtcImV2dFwiXTtcbnZhciBwbHVnaW5FdmVudCA9IGZ1bmN0aW9uIHBsdWdpbkV2ZW50KGV2ZW50TmFtZSwgc29ydGFibGUpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9LFxuICAgIG9yaWdpbmFsRXZlbnQgPSBfcmVmLmV2dCxcbiAgICBkYXRhID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gIFBsdWdpbk1hbmFnZXIucGx1Z2luRXZlbnQuYmluZChTb3J0YWJsZSkoZXZlbnROYW1lLCBzb3J0YWJsZSwgX29iamVjdFNwcmVhZDIoe1xuICAgIGRyYWdFbDogZHJhZ0VsLFxuICAgIHBhcmVudEVsOiBwYXJlbnRFbCxcbiAgICBnaG9zdEVsOiBnaG9zdEVsLFxuICAgIHJvb3RFbDogcm9vdEVsLFxuICAgIG5leHRFbDogbmV4dEVsLFxuICAgIGxhc3REb3duRWw6IGxhc3REb3duRWwsXG4gICAgY2xvbmVFbDogY2xvbmVFbCxcbiAgICBjbG9uZUhpZGRlbjogY2xvbmVIaWRkZW4sXG4gICAgZHJhZ1N0YXJ0ZWQ6IG1vdmVkLFxuICAgIHB1dFNvcnRhYmxlOiBwdXRTb3J0YWJsZSxcbiAgICBhY3RpdmVTb3J0YWJsZTogU29ydGFibGUuYWN0aXZlLFxuICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnQsXG4gICAgb2xkSW5kZXg6IG9sZEluZGV4LFxuICAgIG9sZERyYWdnYWJsZUluZGV4OiBvbGREcmFnZ2FibGVJbmRleCxcbiAgICBuZXdJbmRleDogbmV3SW5kZXgsXG4gICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4LFxuICAgIGhpZGVHaG9zdEZvclRhcmdldDogX2hpZGVHaG9zdEZvclRhcmdldCxcbiAgICB1bmhpZGVHaG9zdEZvclRhcmdldDogX3VuaGlkZUdob3N0Rm9yVGFyZ2V0LFxuICAgIGNsb25lTm93SGlkZGVuOiBmdW5jdGlvbiBjbG9uZU5vd0hpZGRlbigpIHtcbiAgICAgIGNsb25lSGlkZGVuID0gdHJ1ZTtcbiAgICB9LFxuICAgIGNsb25lTm93U2hvd246IGZ1bmN0aW9uIGNsb25lTm93U2hvd24oKSB7XG4gICAgICBjbG9uZUhpZGRlbiA9IGZhbHNlO1xuICAgIH0sXG4gICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50OiBmdW5jdGlvbiBkaXNwYXRjaFNvcnRhYmxlRXZlbnQobmFtZSkge1xuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgZGF0YSkpO1xufTtcbmZ1bmN0aW9uIF9kaXNwYXRjaEV2ZW50KGluZm8pIHtcbiAgZGlzcGF0Y2hFdmVudChfb2JqZWN0U3ByZWFkMih7XG4gICAgcHV0U29ydGFibGU6IHB1dFNvcnRhYmxlLFxuICAgIGNsb25lRWw6IGNsb25lRWwsXG4gICAgdGFyZ2V0RWw6IGRyYWdFbCxcbiAgICByb290RWw6IHJvb3RFbCxcbiAgICBvbGRJbmRleDogb2xkSW5kZXgsXG4gICAgb2xkRHJhZ2dhYmxlSW5kZXg6IG9sZERyYWdnYWJsZUluZGV4LFxuICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICBuZXdEcmFnZ2FibGVJbmRleDogbmV3RHJhZ2dhYmxlSW5kZXhcbiAgfSwgaW5mbykpO1xufVxudmFyIGRyYWdFbCxcbiAgcGFyZW50RWwsXG4gIGdob3N0RWwsXG4gIHJvb3RFbCxcbiAgbmV4dEVsLFxuICBsYXN0RG93bkVsLFxuICBjbG9uZUVsLFxuICBjbG9uZUhpZGRlbixcbiAgb2xkSW5kZXgsXG4gIG5ld0luZGV4LFxuICBvbGREcmFnZ2FibGVJbmRleCxcbiAgbmV3RHJhZ2dhYmxlSW5kZXgsXG4gIGFjdGl2ZUdyb3VwLFxuICBwdXRTb3J0YWJsZSxcbiAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlLFxuICBpZ25vcmVOZXh0Q2xpY2sgPSBmYWxzZSxcbiAgc29ydGFibGVzID0gW10sXG4gIHRhcEV2dCxcbiAgdG91Y2hFdnQsXG4gIGxhc3REeCxcbiAgbGFzdER5LFxuICB0YXBEaXN0YW5jZUxlZnQsXG4gIHRhcERpc3RhbmNlVG9wLFxuICBtb3ZlZCxcbiAgbGFzdFRhcmdldCxcbiAgbGFzdERpcmVjdGlvbixcbiAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2UsXG4gIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSBmYWxzZSxcbiAgdGFyZ2V0TW92ZURpc3RhbmNlLFxuICAvLyBGb3IgcG9zaXRpb25pbmcgZ2hvc3QgYWJzb2x1dGVseVxuICBnaG9zdFJlbGF0aXZlUGFyZW50LFxuICBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbCA9IFtdLFxuICAvLyAobGVmdCwgdG9wKVxuXG4gIF9zaWxlbnQgPSBmYWxzZSxcbiAgc2F2ZWRJbnB1dENoZWNrZWQgPSBbXTtcblxuLyoqIEBjb25zdCAqL1xudmFyIGRvY3VtZW50RXhpc3RzID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyxcbiAgUG9zaXRpb25HaG9zdEFic29sdXRlbHkgPSBJT1MsXG4gIENTU0Zsb2F0UHJvcGVydHkgPSBFZGdlIHx8IElFMTFPckxlc3MgPyAnY3NzRmxvYXQnIDogJ2Zsb2F0JyxcbiAgLy8gVGhpcyB3aWxsIG5vdCBwYXNzIGZvciBJRTksIGJlY2F1c2UgSUU5IERuRCBvbmx5IHdvcmtzIG9uIGFuY2hvcnNcbiAgc3VwcG9ydERyYWdnYWJsZSA9IGRvY3VtZW50RXhpc3RzICYmICFDaHJvbWVGb3JBbmRyb2lkICYmICFJT1MgJiYgJ2RyYWdnYWJsZScgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gIHN1cHBvcnRDc3NQb2ludGVyRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghZG9jdW1lbnRFeGlzdHMpIHJldHVybjtcbiAgICAvLyBmYWxzZSB3aGVuIDw9IElFMTFcbiAgICBpZiAoSUUxMU9yTGVzcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd4Jyk7XG4gICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdwb2ludGVyLWV2ZW50czphdXRvJztcbiAgICByZXR1cm4gZWwuc3R5bGUucG9pbnRlckV2ZW50cyA9PT0gJ2F1dG8nO1xuICB9KCksXG4gIF9kZXRlY3REaXJlY3Rpb24gPSBmdW5jdGlvbiBfZGV0ZWN0RGlyZWN0aW9uKGVsLCBvcHRpb25zKSB7XG4gICAgdmFyIGVsQ1NTID0gY3NzKGVsKSxcbiAgICAgIGVsV2lkdGggPSBwYXJzZUludChlbENTUy53aWR0aCkgLSBwYXJzZUludChlbENTUy5wYWRkaW5nTGVmdCkgLSBwYXJzZUludChlbENTUy5wYWRkaW5nUmlnaHQpIC0gcGFyc2VJbnQoZWxDU1MuYm9yZGVyTGVmdFdpZHRoKSAtIHBhcnNlSW50KGVsQ1NTLmJvcmRlclJpZ2h0V2lkdGgpLFxuICAgICAgY2hpbGQxID0gZ2V0Q2hpbGQoZWwsIDAsIG9wdGlvbnMpLFxuICAgICAgY2hpbGQyID0gZ2V0Q2hpbGQoZWwsIDEsIG9wdGlvbnMpLFxuICAgICAgZmlyc3RDaGlsZENTUyA9IGNoaWxkMSAmJiBjc3MoY2hpbGQxKSxcbiAgICAgIHNlY29uZENoaWxkQ1NTID0gY2hpbGQyICYmIGNzcyhjaGlsZDIpLFxuICAgICAgZmlyc3RDaGlsZFdpZHRoID0gZmlyc3RDaGlsZENTUyAmJiBwYXJzZUludChmaXJzdENoaWxkQ1NTLm1hcmdpbkxlZnQpICsgcGFyc2VJbnQoZmlyc3RDaGlsZENTUy5tYXJnaW5SaWdodCkgKyBnZXRSZWN0KGNoaWxkMSkud2lkdGgsXG4gICAgICBzZWNvbmRDaGlsZFdpZHRoID0gc2Vjb25kQ2hpbGRDU1MgJiYgcGFyc2VJbnQoc2Vjb25kQ2hpbGRDU1MubWFyZ2luTGVmdCkgKyBwYXJzZUludChzZWNvbmRDaGlsZENTUy5tYXJnaW5SaWdodCkgKyBnZXRSZWN0KGNoaWxkMikud2lkdGg7XG4gICAgaWYgKGVsQ1NTLmRpc3BsYXkgPT09ICdmbGV4Jykge1xuICAgICAgcmV0dXJuIGVsQ1NTLmZsZXhEaXJlY3Rpb24gPT09ICdjb2x1bW4nIHx8IGVsQ1NTLmZsZXhEaXJlY3Rpb24gPT09ICdjb2x1bW4tcmV2ZXJzZScgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgIH1cbiAgICBpZiAoZWxDU1MuZGlzcGxheSA9PT0gJ2dyaWQnKSB7XG4gICAgICByZXR1cm4gZWxDU1MuZ3JpZFRlbXBsYXRlQ29sdW1ucy5zcGxpdCgnICcpLmxlbmd0aCA8PSAxID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICB9XG4gICAgaWYgKGNoaWxkMSAmJiBmaXJzdENoaWxkQ1NTW1wiZmxvYXRcIl0gJiYgZmlyc3RDaGlsZENTU1tcImZsb2F0XCJdICE9PSAnbm9uZScpIHtcbiAgICAgIHZhciB0b3VjaGluZ1NpZGVDaGlsZDIgPSBmaXJzdENoaWxkQ1NTW1wiZmxvYXRcIl0gPT09ICdsZWZ0JyA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICByZXR1cm4gY2hpbGQyICYmIChzZWNvbmRDaGlsZENTUy5jbGVhciA9PT0gJ2JvdGgnIHx8IHNlY29uZENoaWxkQ1NTLmNsZWFyID09PSB0b3VjaGluZ1NpZGVDaGlsZDIpID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkMSAmJiAoZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAnYmxvY2snIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ2ZsZXgnIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ3RhYmxlJyB8fCBmaXJzdENoaWxkQ1NTLmRpc3BsYXkgPT09ICdncmlkJyB8fCBmaXJzdENoaWxkV2lkdGggPj0gZWxXaWR0aCAmJiBlbENTU1tDU1NGbG9hdFByb3BlcnR5XSA9PT0gJ25vbmUnIHx8IGNoaWxkMiAmJiBlbENTU1tDU1NGbG9hdFByb3BlcnR5XSA9PT0gJ25vbmUnICYmIGZpcnN0Q2hpbGRXaWR0aCArIHNlY29uZENoaWxkV2lkdGggPiBlbFdpZHRoKSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gIH0sXG4gIF9kcmFnRWxJblJvd0NvbHVtbiA9IGZ1bmN0aW9uIF9kcmFnRWxJblJvd0NvbHVtbihkcmFnUmVjdCwgdGFyZ2V0UmVjdCwgdmVydGljYWwpIHtcbiAgICB2YXIgZHJhZ0VsUzFPcHAgPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LmxlZnQgOiBkcmFnUmVjdC50b3AsXG4gICAgICBkcmFnRWxTMk9wcCA9IHZlcnRpY2FsID8gZHJhZ1JlY3QucmlnaHQgOiBkcmFnUmVjdC5ib3R0b20sXG4gICAgICBkcmFnRWxPcHBMZW5ndGggPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LndpZHRoIDogZHJhZ1JlY3QuaGVpZ2h0LFxuICAgICAgdGFyZ2V0UzFPcHAgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QubGVmdCA6IHRhcmdldFJlY3QudG9wLFxuICAgICAgdGFyZ2V0UzJPcHAgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QucmlnaHQgOiB0YXJnZXRSZWN0LmJvdHRvbSxcbiAgICAgIHRhcmdldE9wcExlbmd0aCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC53aWR0aCA6IHRhcmdldFJlY3QuaGVpZ2h0O1xuICAgIHJldHVybiBkcmFnRWxTMU9wcCA9PT0gdGFyZ2V0UzFPcHAgfHwgZHJhZ0VsUzJPcHAgPT09IHRhcmdldFMyT3BwIHx8IGRyYWdFbFMxT3BwICsgZHJhZ0VsT3BwTGVuZ3RoIC8gMiA9PT0gdGFyZ2V0UzFPcHAgKyB0YXJnZXRPcHBMZW5ndGggLyAyO1xuICB9LFxuICAvKipcclxuICAgKiBEZXRlY3RzIGZpcnN0IG5lYXJlc3QgZW1wdHkgc29ydGFibGUgdG8gWCBhbmQgWSBwb3NpdGlvbiB1c2luZyBlbXB0eUluc2VydFRocmVzaG9sZC5cclxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggICAgICBYIHBvc2l0aW9uXHJcbiAgICogQHBhcmFtICB7TnVtYmVyfSB5ICAgICAgWSBwb3NpdGlvblxyXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgIEVsZW1lbnQgb2YgdGhlIGZpcnN0IGZvdW5kIG5lYXJlc3QgU29ydGFibGVcclxuICAgKi9cbiAgX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlID0gZnVuY3Rpb24gX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlKHgsIHkpIHtcbiAgICB2YXIgcmV0O1xuICAgIHNvcnRhYmxlcy5zb21lKGZ1bmN0aW9uIChzb3J0YWJsZSkge1xuICAgICAgdmFyIHRocmVzaG9sZCA9IHNvcnRhYmxlW2V4cGFuZG9dLm9wdGlvbnMuZW1wdHlJbnNlcnRUaHJlc2hvbGQ7XG4gICAgICBpZiAoIXRocmVzaG9sZCB8fCBsYXN0Q2hpbGQoc29ydGFibGUpKSByZXR1cm47XG4gICAgICB2YXIgcmVjdCA9IGdldFJlY3Qoc29ydGFibGUpLFxuICAgICAgICBpbnNpZGVIb3Jpem9udGFsbHkgPSB4ID49IHJlY3QubGVmdCAtIHRocmVzaG9sZCAmJiB4IDw9IHJlY3QucmlnaHQgKyB0aHJlc2hvbGQsXG4gICAgICAgIGluc2lkZVZlcnRpY2FsbHkgPSB5ID49IHJlY3QudG9wIC0gdGhyZXNob2xkICYmIHkgPD0gcmVjdC5ib3R0b20gKyB0aHJlc2hvbGQ7XG4gICAgICBpZiAoaW5zaWRlSG9yaXpvbnRhbGx5ICYmIGluc2lkZVZlcnRpY2FsbHkpIHtcbiAgICAgICAgcmV0dXJuIHJldCA9IHNvcnRhYmxlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXQ7XG4gIH0sXG4gIF9wcmVwYXJlR3JvdXAgPSBmdW5jdGlvbiBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpIHtcbiAgICBmdW5jdGlvbiB0b0ZuKHZhbHVlLCBwdWxsKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHRvLCBmcm9tLCBkcmFnRWwsIGV2dCkge1xuICAgICAgICB2YXIgc2FtZUdyb3VwID0gdG8ub3B0aW9ucy5ncm91cC5uYW1lICYmIGZyb20ub3B0aW9ucy5ncm91cC5uYW1lICYmIHRvLm9wdGlvbnMuZ3JvdXAubmFtZSA9PT0gZnJvbS5vcHRpb25zLmdyb3VwLm5hbWU7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIChwdWxsIHx8IHNhbWVHcm91cCkpIHtcbiAgICAgICAgICAvLyBEZWZhdWx0IHB1bGwgdmFsdWVcbiAgICAgICAgICAvLyBEZWZhdWx0IHB1bGwgYW5kIHB1dCB2YWx1ZSBpZiBzYW1lIGdyb3VwXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAocHVsbCAmJiB2YWx1ZSA9PT0gJ2Nsb25lJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gdG9Gbih2YWx1ZSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpLCBwdWxsKSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBvdGhlckdyb3VwID0gKHB1bGwgPyB0byA6IGZyb20pLm9wdGlvbnMuZ3JvdXAubmFtZTtcbiAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSA9PT0gb3RoZXJHcm91cCB8fCB2YWx1ZS5qb2luICYmIHZhbHVlLmluZGV4T2Yob3RoZXJHcm91cCkgPiAtMTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIGdyb3VwID0ge307XG4gICAgdmFyIG9yaWdpbmFsR3JvdXAgPSBvcHRpb25zLmdyb3VwO1xuICAgIGlmICghb3JpZ2luYWxHcm91cCB8fCBfdHlwZW9mKG9yaWdpbmFsR3JvdXApICE9ICdvYmplY3QnKSB7XG4gICAgICBvcmlnaW5hbEdyb3VwID0ge1xuICAgICAgICBuYW1lOiBvcmlnaW5hbEdyb3VwXG4gICAgICB9O1xuICAgIH1cbiAgICBncm91cC5uYW1lID0gb3JpZ2luYWxHcm91cC5uYW1lO1xuICAgIGdyb3VwLmNoZWNrUHVsbCA9IHRvRm4ob3JpZ2luYWxHcm91cC5wdWxsLCB0cnVlKTtcbiAgICBncm91cC5jaGVja1B1dCA9IHRvRm4ob3JpZ2luYWxHcm91cC5wdXQpO1xuICAgIGdyb3VwLnJldmVydENsb25lID0gb3JpZ2luYWxHcm91cC5yZXZlcnRDbG9uZTtcbiAgICBvcHRpb25zLmdyb3VwID0gZ3JvdXA7XG4gIH0sXG4gIF9oaWRlR2hvc3RGb3JUYXJnZXQgPSBmdW5jdGlvbiBfaGlkZUdob3N0Rm9yVGFyZ2V0KCkge1xuICAgIGlmICghc3VwcG9ydENzc1BvaW50ZXJFdmVudHMgJiYgZ2hvc3RFbCkge1xuICAgICAgY3NzKGdob3N0RWwsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICB9XG4gIH0sXG4gIF91bmhpZGVHaG9zdEZvclRhcmdldCA9IGZ1bmN0aW9uIF91bmhpZGVHaG9zdEZvclRhcmdldCgpIHtcbiAgICBpZiAoIXN1cHBvcnRDc3NQb2ludGVyRXZlbnRzICYmIGdob3N0RWwpIHtcbiAgICAgIGNzcyhnaG9zdEVsLCAnZGlzcGxheScsICcnKTtcbiAgICB9XG4gIH07XG5cbi8vICMxMTg0IGZpeCAtIFByZXZlbnQgY2xpY2sgZXZlbnQgb24gZmFsbGJhY2sgaWYgZHJhZ2dlZCBidXQgaXRlbSBub3QgY2hhbmdlZCBwb3NpdGlvblxuaWYgKGRvY3VtZW50RXhpc3RzICYmICFDaHJvbWVGb3JBbmRyb2lkKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGlmIChpZ25vcmVOZXh0Q2xpY2spIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbiAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICYmIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIGlnbm9yZU5leHRDbGljayA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG59XG52YXIgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQgPSBmdW5jdGlvbiBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudChldnQpIHtcbiAgaWYgKGRyYWdFbCkge1xuICAgIGV2dCA9IGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQ7XG4gICAgdmFyIG5lYXJlc3QgPSBfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcbiAgICBpZiAobmVhcmVzdCkge1xuICAgICAgLy8gQ3JlYXRlIGltaXRhdGlvbiBldmVudFxuICAgICAgdmFyIGV2ZW50ID0ge307XG4gICAgICBmb3IgKHZhciBpIGluIGV2dCkge1xuICAgICAgICBpZiAoZXZ0Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgZXZlbnRbaV0gPSBldnRbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGV2ZW50LnRhcmdldCA9IGV2ZW50LnJvb3RFbCA9IG5lYXJlc3Q7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCA9IHZvaWQgMDtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IHZvaWQgMDtcbiAgICAgIG5lYXJlc3RbZXhwYW5kb10uX29uRHJhZ092ZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxufTtcbnZhciBfY2hlY2tPdXRzaWRlVGFyZ2V0RWwgPSBmdW5jdGlvbiBfY2hlY2tPdXRzaWRlVGFyZ2V0RWwoZXZ0KSB7XG4gIGlmIChkcmFnRWwpIHtcbiAgICBkcmFnRWwucGFyZW50Tm9kZVtleHBhbmRvXS5faXNPdXRzaWRlVGhpc0VsKGV2dC50YXJnZXQpO1xuICB9XG59O1xuXG4vKipcclxuICogQGNsYXNzICBTb3J0YWJsZVxyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gIGVsXHJcbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgW29wdGlvbnNdXHJcbiAqL1xuZnVuY3Rpb24gU29ydGFibGUoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKCEoZWwgJiYgZWwubm9kZVR5cGUgJiYgZWwubm9kZVR5cGUgPT09IDEpKSB7XG4gICAgdGhyb3cgXCJTb3J0YWJsZTogYGVsYCBtdXN0IGJlIGFuIEhUTUxFbGVtZW50LCBub3QgXCIuY29uY2F0KHt9LnRvU3RyaW5nLmNhbGwoZWwpKTtcbiAgfVxuICB0aGlzLmVsID0gZWw7IC8vIHJvb3QgZWxlbWVudFxuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID0gX2V4dGVuZHMoe30sIG9wdGlvbnMpO1xuXG4gIC8vIEV4cG9ydCBpbnN0YW5jZVxuICBlbFtleHBhbmRvXSA9IHRoaXM7XG4gIHZhciBkZWZhdWx0cyA9IHtcbiAgICBncm91cDogbnVsbCxcbiAgICBzb3J0OiB0cnVlLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBzdG9yZTogbnVsbCxcbiAgICBoYW5kbGU6IG51bGwsXG4gICAgZHJhZ2dhYmxlOiAvXlt1b11sJC9pLnRlc3QoZWwubm9kZU5hbWUpID8gJz5saScgOiAnPionLFxuICAgIHN3YXBUaHJlc2hvbGQ6IDEsXG4gICAgLy8gcGVyY2VudGFnZTsgMCA8PSB4IDw9IDFcbiAgICBpbnZlcnRTd2FwOiBmYWxzZSxcbiAgICAvLyBpbnZlcnQgYWx3YXlzXG4gICAgaW52ZXJ0ZWRTd2FwVGhyZXNob2xkOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHRvIHNhbWUgYXMgc3dhcFRocmVzaG9sZCBpZiBkZWZhdWx0XG4gICAgcmVtb3ZlQ2xvbmVPbkhpZGU6IHRydWUsXG4gICAgZGlyZWN0aW9uOiBmdW5jdGlvbiBkaXJlY3Rpb24oKSB7XG4gICAgICByZXR1cm4gX2RldGVjdERpcmVjdGlvbihlbCwgdGhpcy5vcHRpb25zKTtcbiAgICB9LFxuICAgIGdob3N0Q2xhc3M6ICdzb3J0YWJsZS1naG9zdCcsXG4gICAgY2hvc2VuQ2xhc3M6ICdzb3J0YWJsZS1jaG9zZW4nLFxuICAgIGRyYWdDbGFzczogJ3NvcnRhYmxlLWRyYWcnLFxuICAgIGlnbm9yZTogJ2EsIGltZycsXG4gICAgZmlsdGVyOiBudWxsLFxuICAgIHByZXZlbnRPbkZpbHRlcjogdHJ1ZSxcbiAgICBhbmltYXRpb246IDAsXG4gICAgZWFzaW5nOiBudWxsLFxuICAgIHNldERhdGE6IGZ1bmN0aW9uIHNldERhdGEoZGF0YVRyYW5zZmVyLCBkcmFnRWwpIHtcbiAgICAgIGRhdGFUcmFuc2Zlci5zZXREYXRhKCdUZXh0JywgZHJhZ0VsLnRleHRDb250ZW50KTtcbiAgICB9LFxuICAgIGRyb3BCdWJibGU6IGZhbHNlLFxuICAgIGRyYWdvdmVyQnViYmxlOiBmYWxzZSxcbiAgICBkYXRhSWRBdHRyOiAnZGF0YS1pZCcsXG4gICAgZGVsYXk6IDAsXG4gICAgZGVsYXlPblRvdWNoT25seTogZmFsc2UsXG4gICAgdG91Y2hTdGFydFRocmVzaG9sZDogKE51bWJlci5wYXJzZUludCA/IE51bWJlciA6IHdpbmRvdykucGFyc2VJbnQod2luZG93LmRldmljZVBpeGVsUmF0aW8sIDEwKSB8fCAxLFxuICAgIGZvcmNlRmFsbGJhY2s6IGZhbHNlLFxuICAgIGZhbGxiYWNrQ2xhc3M6ICdzb3J0YWJsZS1mYWxsYmFjaycsXG4gICAgZmFsbGJhY2tPbkJvZHk6IGZhbHNlLFxuICAgIGZhbGxiYWNrVG9sZXJhbmNlOiAwLFxuICAgIGZhbGxiYWNrT2Zmc2V0OiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH0sXG4gICAgc3VwcG9ydFBvaW50ZXI6IFNvcnRhYmxlLnN1cHBvcnRQb2ludGVyICE9PSBmYWxzZSAmJiAnUG9pbnRlckV2ZW50JyBpbiB3aW5kb3cgJiYgIVNhZmFyaSxcbiAgICBlbXB0eUluc2VydFRocmVzaG9sZDogNVxuICB9O1xuICBQbHVnaW5NYW5hZ2VyLmluaXRpYWxpemVQbHVnaW5zKHRoaXMsIGVsLCBkZWZhdWx0cyk7XG5cbiAgLy8gU2V0IGRlZmF1bHQgb3B0aW9uc1xuICBmb3IgKHZhciBuYW1lIGluIGRlZmF1bHRzKSB7XG4gICAgIShuYW1lIGluIG9wdGlvbnMpICYmIChvcHRpb25zW25hbWVdID0gZGVmYXVsdHNbbmFtZV0pO1xuICB9XG4gIF9wcmVwYXJlR3JvdXAob3B0aW9ucyk7XG5cbiAgLy8gQmluZCBhbGwgcHJpdmF0ZSBtZXRob2RzXG4gIGZvciAodmFyIGZuIGluIHRoaXMpIHtcbiAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgZHJhZyBtb2RlXG4gIHRoaXMubmF0aXZlRHJhZ2dhYmxlID0gb3B0aW9ucy5mb3JjZUZhbGxiYWNrID8gZmFsc2UgOiBzdXBwb3J0RHJhZ2dhYmxlO1xuICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAvLyBUb3VjaCBzdGFydCB0aHJlc2hvbGQgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbmF0aXZlIGRyYWdzdGFydCB0aHJlc2hvbGRcbiAgICB0aGlzLm9wdGlvbnMudG91Y2hTdGFydFRocmVzaG9sZCA9IDE7XG4gIH1cblxuICAvLyBCaW5kIGV2ZW50c1xuICBpZiAob3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgIG9uKGVsLCAncG9pbnRlcmRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgfSBlbHNlIHtcbiAgICBvbihlbCwgJ21vdXNlZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgIG9uKGVsLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVGFwU3RhcnQpO1xuICB9XG4gIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgIG9uKGVsLCAnZHJhZ292ZXInLCB0aGlzKTtcbiAgICBvbihlbCwgJ2RyYWdlbnRlcicsIHRoaXMpO1xuICB9XG4gIHNvcnRhYmxlcy5wdXNoKHRoaXMuZWwpO1xuXG4gIC8vIFJlc3RvcmUgc29ydGluZ1xuICBvcHRpb25zLnN0b3JlICYmIG9wdGlvbnMuc3RvcmUuZ2V0ICYmIHRoaXMuc29ydChvcHRpb25zLnN0b3JlLmdldCh0aGlzKSB8fCBbXSk7XG5cbiAgLy8gQWRkIGFuaW1hdGlvbiBzdGF0ZSBtYW5hZ2VyXG4gIF9leHRlbmRzKHRoaXMsIEFuaW1hdGlvblN0YXRlTWFuYWdlcigpKTtcbn1cblNvcnRhYmxlLnByb3RvdHlwZSA9IC8qKiBAbGVuZHMgU29ydGFibGUucHJvdG90eXBlICove1xuICBjb25zdHJ1Y3RvcjogU29ydGFibGUsXG4gIF9pc091dHNpZGVUaGlzRWw6IGZ1bmN0aW9uIF9pc091dHNpZGVUaGlzRWwodGFyZ2V0KSB7XG4gICAgaWYgKCF0aGlzLmVsLmNvbnRhaW5zKHRhcmdldCkgJiYgdGFyZ2V0ICE9PSB0aGlzLmVsKSB7XG4gICAgICBsYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICB9XG4gIH0sXG4gIF9nZXREaXJlY3Rpb246IGZ1bmN0aW9uIF9nZXREaXJlY3Rpb24oZXZ0LCB0YXJnZXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMub3B0aW9ucy5kaXJlY3Rpb24gPT09ICdmdW5jdGlvbicgPyB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uLmNhbGwodGhpcywgZXZ0LCB0YXJnZXQsIGRyYWdFbCkgOiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICB9LFxuICBfb25UYXBTdGFydDogZnVuY3Rpb24gX29uVGFwU3RhcnQoIC8qKiBFdmVudHxUb3VjaEV2ZW50ICovZXZ0KSB7XG4gICAgaWYgKCFldnQuY2FuY2VsYWJsZSkgcmV0dXJuO1xuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICBlbCA9IHRoaXMuZWwsXG4gICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgcHJldmVudE9uRmlsdGVyID0gb3B0aW9ucy5wcmV2ZW50T25GaWx0ZXIsXG4gICAgICB0eXBlID0gZXZ0LnR5cGUsXG4gICAgICB0b3VjaCA9IGV2dC50b3VjaGVzICYmIGV2dC50b3VjaGVzWzBdIHx8IGV2dC5wb2ludGVyVHlwZSAmJiBldnQucG9pbnRlclR5cGUgPT09ICd0b3VjaCcgJiYgZXZ0LFxuICAgICAgdGFyZ2V0ID0gKHRvdWNoIHx8IGV2dCkudGFyZ2V0LFxuICAgICAgb3JpZ2luYWxUYXJnZXQgPSBldnQudGFyZ2V0LnNoYWRvd1Jvb3QgJiYgKGV2dC5wYXRoICYmIGV2dC5wYXRoWzBdIHx8IGV2dC5jb21wb3NlZFBhdGggJiYgZXZ0LmNvbXBvc2VkUGF0aCgpWzBdKSB8fCB0YXJnZXQsXG4gICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICBfc2F2ZUlucHV0Q2hlY2tlZFN0YXRlKGVsKTtcblxuICAgIC8vIERvbid0IHRyaWdnZXIgc3RhcnQgZXZlbnQgd2hlbiBhbiBlbGVtZW50IGlzIGJlZW4gZHJhZ2dlZCwgb3RoZXJ3aXNlIHRoZSBldnQub2xkaW5kZXggYWx3YXlzIHdyb25nIHdoZW4gc2V0IG9wdGlvbi5ncm91cC5cbiAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgvbW91c2Vkb3dufHBvaW50ZXJkb3duLy50ZXN0KHR5cGUpICYmIGV2dC5idXR0b24gIT09IDAgfHwgb3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuOyAvLyBvbmx5IGxlZnQgYnV0dG9uIGFuZCBlbmFibGVkXG4gICAgfVxuXG4gICAgLy8gY2FuY2VsIGRuZCBpZiBvcmlnaW5hbCB0YXJnZXQgaXMgY29udGVudCBlZGl0YWJsZVxuICAgIGlmIChvcmlnaW5hbFRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNhZmFyaSBpZ25vcmVzIGZ1cnRoZXIgZXZlbnQgaGFuZGxpbmcgYWZ0ZXIgbW91c2Vkb3duXG4gICAgaWYgKCF0aGlzLm5hdGl2ZURyYWdnYWJsZSAmJiBTYWZhcmkgJiYgdGFyZ2V0ICYmIHRhcmdldC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdTRUxFQ1QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRhcmdldCA9IGNsb3Nlc3QodGFyZ2V0LCBvcHRpb25zLmRyYWdnYWJsZSwgZWwsIGZhbHNlKTtcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5hbmltYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobGFzdERvd25FbCA9PT0gdGFyZ2V0KSB7XG4gICAgICAvLyBJZ25vcmluZyBkdXBsaWNhdGUgYGRvd25gXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XG4gICAgb2xkSW5kZXggPSBpbmRleCh0YXJnZXQpO1xuICAgIG9sZERyYWdnYWJsZUluZGV4ID0gaW5kZXgodGFyZ2V0LCBvcHRpb25zLmRyYWdnYWJsZSk7XG5cbiAgICAvLyBDaGVjayBmaWx0ZXJcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGZpbHRlci5jYWxsKHRoaXMsIGV2dCwgdGFyZ2V0LCB0aGlzKSkge1xuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgIHJvb3RFbDogb3JpZ2luYWxUYXJnZXQsXG4gICAgICAgICAgbmFtZTogJ2ZpbHRlcicsXG4gICAgICAgICAgdGFyZ2V0RWw6IHRhcmdldCxcbiAgICAgICAgICB0b0VsOiBlbCxcbiAgICAgICAgICBmcm9tRWw6IGVsXG4gICAgICAgIH0pO1xuICAgICAgICBwbHVnaW5FdmVudCgnZmlsdGVyJywgX3RoaXMsIHtcbiAgICAgICAgICBldnQ6IGV2dFxuICAgICAgICB9KTtcbiAgICAgICAgcHJldmVudE9uRmlsdGVyICYmIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47IC8vIGNhbmNlbCBkbmRcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpbHRlcikge1xuICAgICAgZmlsdGVyID0gZmlsdGVyLnNwbGl0KCcsJykuc29tZShmdW5jdGlvbiAoY3JpdGVyaWEpIHtcbiAgICAgICAgY3JpdGVyaWEgPSBjbG9zZXN0KG9yaWdpbmFsVGFyZ2V0LCBjcml0ZXJpYS50cmltKCksIGVsLCBmYWxzZSk7XG4gICAgICAgIGlmIChjcml0ZXJpYSkge1xuICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiBfdGhpcyxcbiAgICAgICAgICAgIHJvb3RFbDogY3JpdGVyaWEsXG4gICAgICAgICAgICBuYW1lOiAnZmlsdGVyJyxcbiAgICAgICAgICAgIHRhcmdldEVsOiB0YXJnZXQsXG4gICAgICAgICAgICBmcm9tRWw6IGVsLFxuICAgICAgICAgICAgdG9FbDogZWxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwbHVnaW5FdmVudCgnZmlsdGVyJywgX3RoaXMsIHtcbiAgICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICBwcmV2ZW50T25GaWx0ZXIgJiYgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjsgLy8gY2FuY2VsIGRuZFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYW5kbGUgJiYgIWNsb3Nlc3Qob3JpZ2luYWxUYXJnZXQsIG9wdGlvbnMuaGFuZGxlLCBlbCwgZmFsc2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBgZHJhZ3N0YXJ0YFxuICAgIHRoaXMuX3ByZXBhcmVEcmFnU3RhcnQoZXZ0LCB0b3VjaCwgdGFyZ2V0KTtcbiAgfSxcbiAgX3ByZXBhcmVEcmFnU3RhcnQ6IGZ1bmN0aW9uIF9wcmVwYXJlRHJhZ1N0YXJ0KCAvKiogRXZlbnQgKi9ldnQsIC8qKiBUb3VjaCAqL3RvdWNoLCAvKiogSFRNTEVsZW1lbnQgKi90YXJnZXQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzLFxuICAgICAgZWwgPSBfdGhpcy5lbCxcbiAgICAgIG9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLFxuICAgICAgb3duZXJEb2N1bWVudCA9IGVsLm93bmVyRG9jdW1lbnQsXG4gICAgICBkcmFnU3RhcnRGbjtcbiAgICBpZiAodGFyZ2V0ICYmICFkcmFnRWwgJiYgdGFyZ2V0LnBhcmVudE5vZGUgPT09IGVsKSB7XG4gICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICByb290RWwgPSBlbDtcbiAgICAgIGRyYWdFbCA9IHRhcmdldDtcbiAgICAgIHBhcmVudEVsID0gZHJhZ0VsLnBhcmVudE5vZGU7XG4gICAgICBuZXh0RWwgPSBkcmFnRWwubmV4dFNpYmxpbmc7XG4gICAgICBsYXN0RG93bkVsID0gdGFyZ2V0O1xuICAgICAgYWN0aXZlR3JvdXAgPSBvcHRpb25zLmdyb3VwO1xuICAgICAgU29ydGFibGUuZHJhZ2dlZCA9IGRyYWdFbDtcbiAgICAgIHRhcEV2dCA9IHtcbiAgICAgICAgdGFyZ2V0OiBkcmFnRWwsXG4gICAgICAgIGNsaWVudFg6ICh0b3VjaCB8fCBldnQpLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6ICh0b3VjaCB8fCBldnQpLmNsaWVudFlcbiAgICAgIH07XG4gICAgICB0YXBEaXN0YW5jZUxlZnQgPSB0YXBFdnQuY2xpZW50WCAtIGRyYWdSZWN0LmxlZnQ7XG4gICAgICB0YXBEaXN0YW5jZVRvcCA9IHRhcEV2dC5jbGllbnRZIC0gZHJhZ1JlY3QudG9wO1xuICAgICAgdGhpcy5fbGFzdFggPSAodG91Y2ggfHwgZXZ0KS5jbGllbnRYO1xuICAgICAgdGhpcy5fbGFzdFkgPSAodG91Y2ggfHwgZXZ0KS5jbGllbnRZO1xuICAgICAgZHJhZ0VsLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJ2FsbCc7XG4gICAgICBkcmFnU3RhcnRGbiA9IGZ1bmN0aW9uIGRyYWdTdGFydEZuKCkge1xuICAgICAgICBwbHVnaW5FdmVudCgnZGVsYXlFbmRlZCcsIF90aGlzLCB7XG4gICAgICAgICAgZXZ0OiBldnRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgX3RoaXMuX29uRHJvcCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxheWVkIGRyYWcgaGFzIGJlZW4gdHJpZ2dlcmVkXG4gICAgICAgIC8vIHdlIGNhbiByZS1lbmFibGUgdGhlIGV2ZW50czogdG91Y2htb3ZlL21vdXNlbW92ZVxuICAgICAgICBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCk7XG4gICAgICAgIGlmICghRmlyZUZveCAmJiBfdGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgICBkcmFnRWwuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50czogZHJhZ3N0YXJ0L2RyYWdlbmRcbiAgICAgICAgX3RoaXMuX3RyaWdnZXJEcmFnU3RhcnQoZXZ0LCB0b3VjaCk7XG5cbiAgICAgICAgLy8gRHJhZyBzdGFydCBldmVudFxuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgIG5hbWU6ICdjaG9vc2UnLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaG9zZW4gaXRlbVxuICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuY2hvc2VuQ2xhc3MsIHRydWUpO1xuICAgICAgfTtcblxuICAgICAgLy8gRGlzYWJsZSBcImRyYWdnYWJsZVwiXG4gICAgICBvcHRpb25zLmlnbm9yZS5zcGxpdCgnLCcpLmZvckVhY2goZnVuY3Rpb24gKGNyaXRlcmlhKSB7XG4gICAgICAgIGZpbmQoZHJhZ0VsLCBjcml0ZXJpYS50cmltKCksIF9kaXNhYmxlRHJhZ2dhYmxlKTtcbiAgICAgIH0pO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ2RyYWdvdmVyJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ21vdXNlbW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaG1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoZW5kJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCBfdGhpcy5fb25Ecm9wKTtcblxuICAgICAgLy8gTWFrZSBkcmFnRWwgZHJhZ2dhYmxlIChtdXN0IGJlIGJlZm9yZSBkZWxheSBmb3IgRmlyZUZveClcbiAgICAgIGlmIChGaXJlRm94ICYmIHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50b3VjaFN0YXJ0VGhyZXNob2xkID0gNDtcbiAgICAgICAgZHJhZ0VsLmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBwbHVnaW5FdmVudCgnZGVsYXlTdGFydCcsIHRoaXMsIHtcbiAgICAgICAgZXZ0OiBldnRcbiAgICAgIH0pO1xuXG4gICAgICAvLyBEZWxheSBpcyBpbXBvc3NpYmxlIGZvciBuYXRpdmUgRG5EIGluIEVkZ2Ugb3IgSUVcbiAgICAgIGlmIChvcHRpb25zLmRlbGF5ICYmICghb3B0aW9ucy5kZWxheU9uVG91Y2hPbmx5IHx8IHRvdWNoKSAmJiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlIHx8ICEoRWRnZSB8fCBJRTExT3JMZXNzKSkpIHtcbiAgICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgICB0aGlzLl9vbkRyb3AoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgbW92ZXMgdGhlIHBvaW50ZXIgb3IgbGV0IGdvIHRoZSBjbGljayBvciB0b3VjaFxuICAgICAgICAvLyBiZWZvcmUgdGhlIGRlbGF5IGhhcyBiZWVuIHJlYWNoZWQ6XG4gICAgICAgIC8vIGRpc2FibGUgdGhlIGRlbGF5ZWQgZHJhZ1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCBfdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBvcHRpb25zLnN1cHBvcnRQb2ludGVyICYmIG9uKG93bmVyRG9jdW1lbnQsICdwb2ludGVybW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBfdGhpcy5fZHJhZ1N0YXJ0VGltZXIgPSBzZXRUaW1lb3V0KGRyYWdTdGFydEZuLCBvcHRpb25zLmRlbGF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdTdGFydEZuKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBfZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyOiBmdW5jdGlvbiBfZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKCAvKiogVG91Y2hFdmVudHxQb2ludGVyRXZlbnQgKiovZSkge1xuICAgIHZhciB0b3VjaCA9IGUudG91Y2hlcyA/IGUudG91Y2hlc1swXSA6IGU7XG4gICAgaWYgKE1hdGgubWF4KE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLl9sYXN0WCksIE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLl9sYXN0WSkpID49IE1hdGguZmxvb3IodGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgLyAodGhpcy5uYXRpdmVEcmFnZ2FibGUgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkpKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcoKTtcbiAgICB9XG4gIH0sXG4gIF9kaXNhYmxlRGVsYXllZERyYWc6IGZ1bmN0aW9uIF9kaXNhYmxlRGVsYXllZERyYWcoKSB7XG4gICAgZHJhZ0VsICYmIF9kaXNhYmxlRHJhZ2dhYmxlKGRyYWdFbCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2RyYWdTdGFydFRpbWVyKTtcbiAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWdFdmVudHMoKTtcbiAgfSxcbiAgX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50czogZnVuY3Rpb24gX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHRoaXMuZWwub3duZXJEb2N1bWVudDtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gIH0sXG4gIF90cmlnZ2VyRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfdHJpZ2dlckRyYWdTdGFydCggLyoqIEV2ZW50ICovZXZ0LCAvKiogVG91Y2ggKi90b3VjaCkge1xuICAgIHRvdWNoID0gdG91Y2ggfHwgZXZ0LnBvaW50ZXJUeXBlID09ICd0b3VjaCcgJiYgZXZ0O1xuICAgIGlmICghdGhpcy5uYXRpdmVEcmFnZ2FibGUgfHwgdG91Y2gpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH0gZWxzZSBpZiAodG91Y2gpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbihkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb24oZHJhZ0VsLCAnZHJhZ2VuZCcsIHRoaXMpO1xuICAgICAgb24ocm9vdEVsLCAnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikge1xuICAgICAgICAvLyBUaW1lb3V0IG5lY2Nlc3NhcnkgZm9yIElFOVxuICAgICAgICBfbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHt9XG4gIH0sXG4gIF9kcmFnU3RhcnRlZDogZnVuY3Rpb24gX2RyYWdTdGFydGVkKGZhbGxiYWNrLCBldnQpIHtcbiAgICBhd2FpdGluZ0RyYWdTdGFydGVkID0gZmFsc2U7XG4gICAgaWYgKHJvb3RFbCAmJiBkcmFnRWwpIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdkcmFnU3RhcnRlZCcsIHRoaXMsIHtcbiAgICAgICAgZXZ0OiBldnRcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAnZHJhZ292ZXInLCBfY2hlY2tPdXRzaWRlVGFyZ2V0RWwpO1xuICAgICAgfVxuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIC8vIEFwcGx5IGVmZmVjdFxuICAgICAgIWZhbGxiYWNrICYmIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIGZhbHNlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5naG9zdENsYXNzLCB0cnVlKTtcbiAgICAgIFNvcnRhYmxlLmFjdGl2ZSA9IHRoaXM7XG4gICAgICBmYWxsYmFjayAmJiB0aGlzLl9hcHBlbmRHaG9zdCgpO1xuXG4gICAgICAvLyBEcmFnIHN0YXJ0IGV2ZW50XG4gICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICBuYW1lOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9udWxsaW5nKCk7XG4gICAgfVxuICB9LFxuICBfZW11bGF0ZURyYWdPdmVyOiBmdW5jdGlvbiBfZW11bGF0ZURyYWdPdmVyKCkge1xuICAgIGlmICh0b3VjaEV2dCkge1xuICAgICAgdGhpcy5fbGFzdFggPSB0b3VjaEV2dC5jbGllbnRYO1xuICAgICAgdGhpcy5fbGFzdFkgPSB0b3VjaEV2dC5jbGllbnRZO1xuICAgICAgX2hpZGVHaG9zdEZvclRhcmdldCgpO1xuICAgICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQodG91Y2hFdnQuY2xpZW50WCwgdG91Y2hFdnQuY2xpZW50WSk7XG4gICAgICB2YXIgcGFyZW50ID0gdGFyZ2V0O1xuICAgICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQuc2hhZG93Um9vdCkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHRvdWNoRXZ0LmNsaWVudFgsIHRvdWNoRXZ0LmNsaWVudFkpO1xuICAgICAgICBpZiAodGFyZ2V0ID09PSBwYXJlbnQpIGJyZWFrO1xuICAgICAgICBwYXJlbnQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICBkcmFnRWwucGFyZW50Tm9kZVtleHBhbmRvXS5faXNPdXRzaWRlVGhpc0VsKHRhcmdldCk7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAocGFyZW50W2V4cGFuZG9dKSB7XG4gICAgICAgICAgICB2YXIgaW5zZXJ0ZWQgPSB2b2lkIDA7XG4gICAgICAgICAgICBpbnNlcnRlZCA9IHBhcmVudFtleHBhbmRvXS5fb25EcmFnT3Zlcih7XG4gICAgICAgICAgICAgIGNsaWVudFg6IHRvdWNoRXZ0LmNsaWVudFgsXG4gICAgICAgICAgICAgIGNsaWVudFk6IHRvdWNoRXZ0LmNsaWVudFksXG4gICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICByb290RWw6IHBhcmVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0ZWQgJiYgIXRoaXMub3B0aW9ucy5kcmFnb3ZlckJ1YmJsZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGFyZ2V0ID0gcGFyZW50OyAvLyBzdG9yZSBsYXN0IGVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovIHdoaWxlIChwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSk7XG4gICAgICB9XG4gICAgICBfdW5oaWRlR2hvc3RGb3JUYXJnZXQoKTtcbiAgICB9XG4gIH0sXG4gIF9vblRvdWNoTW92ZTogZnVuY3Rpb24gX29uVG91Y2hNb3ZlKCAvKipUb3VjaEV2ZW50Ki9ldnQpIHtcbiAgICBpZiAodGFwRXZ0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZmFsbGJhY2tUb2xlcmFuY2UgPSBvcHRpb25zLmZhbGxiYWNrVG9sZXJhbmNlLFxuICAgICAgICBmYWxsYmFja09mZnNldCA9IG9wdGlvbnMuZmFsbGJhY2tPZmZzZXQsXG4gICAgICAgIHRvdWNoID0gZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCxcbiAgICAgICAgZ2hvc3RNYXRyaXggPSBnaG9zdEVsICYmIG1hdHJpeChnaG9zdEVsLCB0cnVlKSxcbiAgICAgICAgc2NhbGVYID0gZ2hvc3RFbCAmJiBnaG9zdE1hdHJpeCAmJiBnaG9zdE1hdHJpeC5hLFxuICAgICAgICBzY2FsZVkgPSBnaG9zdEVsICYmIGdob3N0TWF0cml4ICYmIGdob3N0TWF0cml4LmQsXG4gICAgICAgIHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID0gUG9zaXRpb25HaG9zdEFic29sdXRlbHkgJiYgZ2hvc3RSZWxhdGl2ZVBhcmVudCAmJiBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChnaG9zdFJlbGF0aXZlUGFyZW50KSxcbiAgICAgICAgZHggPSAodG91Y2guY2xpZW50WCAtIHRhcEV2dC5jbGllbnRYICsgZmFsbGJhY2tPZmZzZXQueCkgLyAoc2NhbGVYIHx8IDEpICsgKHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID8gcmVsYXRpdmVTY3JvbGxPZmZzZXRbMF0gLSBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbFswXSA6IDApIC8gKHNjYWxlWCB8fCAxKSxcbiAgICAgICAgZHkgPSAodG91Y2guY2xpZW50WSAtIHRhcEV2dC5jbGllbnRZICsgZmFsbGJhY2tPZmZzZXQueSkgLyAoc2NhbGVZIHx8IDEpICsgKHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID8gcmVsYXRpdmVTY3JvbGxPZmZzZXRbMV0gLSBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbFsxXSA6IDApIC8gKHNjYWxlWSB8fCAxKTtcblxuICAgICAgLy8gb25seSBzZXQgdGhlIHN0YXR1cyB0byBkcmFnZ2luZywgd2hlbiB3ZSBhcmUgYWN0dWFsbHkgZHJhZ2dpbmdcbiAgICAgIGlmICghU29ydGFibGUuYWN0aXZlICYmICFhd2FpdGluZ0RyYWdTdGFydGVkKSB7XG4gICAgICAgIGlmIChmYWxsYmFja1RvbGVyYW5jZSAmJiBNYXRoLm1heChNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy5fbGFzdFgpLCBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy5fbGFzdFkpKSA8IGZhbGxiYWNrVG9sZXJhbmNlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29uRHJhZ1N0YXJ0KGV2dCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoZ2hvc3RFbCkge1xuICAgICAgICBpZiAoZ2hvc3RNYXRyaXgpIHtcbiAgICAgICAgICBnaG9zdE1hdHJpeC5lICs9IGR4IC0gKGxhc3REeCB8fCAwKTtcbiAgICAgICAgICBnaG9zdE1hdHJpeC5mICs9IGR5IC0gKGxhc3REeSB8fCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnaG9zdE1hdHJpeCA9IHtcbiAgICAgICAgICAgIGE6IDEsXG4gICAgICAgICAgICBiOiAwLFxuICAgICAgICAgICAgYzogMCxcbiAgICAgICAgICAgIGQ6IDEsXG4gICAgICAgICAgICBlOiBkeCxcbiAgICAgICAgICAgIGY6IGR5XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3NzTWF0cml4ID0gXCJtYXRyaXgoXCIuY29uY2F0KGdob3N0TWF0cml4LmEsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguYiwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5jLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmQsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguZSwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5mLCBcIilcIik7XG4gICAgICAgIGNzcyhnaG9zdEVsLCAnd2Via2l0VHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICdtb3pUcmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgJ21zVHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBsYXN0RHggPSBkeDtcbiAgICAgICAgbGFzdER5ID0gZHk7XG4gICAgICAgIHRvdWNoRXZ0ID0gdG91Y2g7XG4gICAgICB9XG4gICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sXG4gIF9hcHBlbmRHaG9zdDogZnVuY3Rpb24gX2FwcGVuZEdob3N0KCkge1xuICAgIC8vIEJ1ZyBpZiB1c2luZyBzY2FsZSgpOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNjM3MDU4XG4gICAgLy8gTm90IGJlaW5nIGFkanVzdGVkIGZvclxuICAgIGlmICghZ2hvc3RFbCkge1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMub3B0aW9ucy5mYWxsYmFja09uQm9keSA/IGRvY3VtZW50LmJvZHkgOiByb290RWwsXG4gICAgICAgIHJlY3QgPSBnZXRSZWN0KGRyYWdFbCwgdHJ1ZSwgUG9zaXRpb25HaG9zdEFic29sdXRlbHksIHRydWUsIGNvbnRhaW5lciksXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIC8vIFBvc2l0aW9uIGFic29sdXRlbHlcbiAgICAgIGlmIChQb3NpdGlvbkdob3N0QWJzb2x1dGVseSkge1xuICAgICAgICAvLyBHZXQgcmVsYXRpdmVseSBwb3NpdGlvbmVkIHBhcmVudFxuICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50ID0gY29udGFpbmVyO1xuICAgICAgICB3aGlsZSAoY3NzKGdob3N0UmVsYXRpdmVQYXJlbnQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJyAmJiBjc3MoZ2hvc3RSZWxhdGl2ZVBhcmVudCwgJ3RyYW5zZm9ybScpID09PSAnbm9uZScgJiYgZ2hvc3RSZWxhdGl2ZVBhcmVudCAhPT0gZG9jdW1lbnQpIHtcbiAgICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50ID0gZ2hvc3RSZWxhdGl2ZVBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmIGdob3N0UmVsYXRpdmVQYXJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgIGlmIChnaG9zdFJlbGF0aXZlUGFyZW50ID09PSBkb2N1bWVudCkgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAgICAgICByZWN0LnRvcCArPSBnaG9zdFJlbGF0aXZlUGFyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICByZWN0LmxlZnQgKz0gZ2hvc3RSZWxhdGl2ZVBhcmVudC5zY3JvbGxMZWZ0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudEluaXRpYWxTY3JvbGwgPSBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChnaG9zdFJlbGF0aXZlUGFyZW50KTtcbiAgICAgIH1cbiAgICAgIGdob3N0RWwgPSBkcmFnRWwuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgdG9nZ2xlQ2xhc3MoZ2hvc3RFbCwgb3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG4gICAgICB0b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmZhbGxiYWNrQ2xhc3MsIHRydWUpO1xuICAgICAgdG9nZ2xlQ2xhc3MoZ2hvc3RFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIHRydWUpO1xuICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2l0aW9uJywgJycpO1xuICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ2JveC1zaXppbmcnLCAnYm9yZGVyLWJveCcpO1xuICAgICAgY3NzKGdob3N0RWwsICdtYXJnaW4nLCAwKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAndG9wJywgcmVjdC50b3ApO1xuICAgICAgY3NzKGdob3N0RWwsICdsZWZ0JywgcmVjdC5sZWZ0KTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnd2lkdGgnLCByZWN0LndpZHRoKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnaGVpZ2h0JywgcmVjdC5oZWlnaHQpO1xuICAgICAgY3NzKGdob3N0RWwsICdvcGFjaXR5JywgJzAuOCcpO1xuICAgICAgY3NzKGdob3N0RWwsICdwb3NpdGlvbicsIFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5ID8gJ2Fic29sdXRlJyA6ICdmaXhlZCcpO1xuICAgICAgY3NzKGdob3N0RWwsICd6SW5kZXgnLCAnMTAwMDAwJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3BvaW50ZXJFdmVudHMnLCAnbm9uZScpO1xuICAgICAgU29ydGFibGUuZ2hvc3QgPSBnaG9zdEVsO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGdob3N0RWwpO1xuXG4gICAgICAvLyBTZXQgdHJhbnNmb3JtLW9yaWdpblxuICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0tb3JpZ2luJywgdGFwRGlzdGFuY2VMZWZ0IC8gcGFyc2VJbnQoZ2hvc3RFbC5zdHlsZS53aWR0aCkgKiAxMDAgKyAnJSAnICsgdGFwRGlzdGFuY2VUb3AgLyBwYXJzZUludChnaG9zdEVsLnN0eWxlLmhlaWdodCkgKiAxMDAgKyAnJScpO1xuICAgIH1cbiAgfSxcbiAgX29uRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfb25EcmFnU3RhcnQoIC8qKkV2ZW50Ki9ldnQsIC8qKmJvb2xlYW4qL2ZhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgZGF0YVRyYW5zZmVyID0gZXZ0LmRhdGFUcmFuc2ZlcjtcbiAgICB2YXIgb3B0aW9ucyA9IF90aGlzLm9wdGlvbnM7XG4gICAgcGx1Z2luRXZlbnQoJ2RyYWdTdGFydCcsIHRoaXMsIHtcbiAgICAgIGV2dDogZXZ0XG4gICAgfSk7XG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIHRoaXMuX29uRHJvcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwbHVnaW5FdmVudCgnc2V0dXBDbG9uZScsIHRoaXMpO1xuICAgIGlmICghU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgY2xvbmVFbCA9IGNsb25lKGRyYWdFbCk7XG4gICAgICBjbG9uZUVsLnJlbW92ZUF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgY2xvbmVFbC5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgIGNsb25lRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnJztcbiAgICAgIHRoaXMuX2hpZGVDbG9uZSgpO1xuICAgICAgdG9nZ2xlQ2xhc3MoY2xvbmVFbCwgdGhpcy5vcHRpb25zLmNob3NlbkNsYXNzLCBmYWxzZSk7XG4gICAgICBTb3J0YWJsZS5jbG9uZSA9IGNsb25lRWw7XG4gICAgfVxuXG4gICAgLy8gIzExNDM6IElGcmFtZSBzdXBwb3J0IHdvcmthcm91bmRcbiAgICBfdGhpcy5jbG9uZUlkID0gX25leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdjbG9uZScsIF90aGlzKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm47XG4gICAgICBpZiAoIV90aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUpIHtcbiAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShjbG9uZUVsLCBkcmFnRWwpO1xuICAgICAgfVxuICAgICAgX3RoaXMuX2hpZGVDbG9uZSgpO1xuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgIG5hbWU6ICdjbG9uZSdcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgICFmYWxsYmFjayAmJiB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCB0cnVlKTtcblxuICAgIC8vIFNldCBwcm9wZXIgZHJvcCBldmVudHNcbiAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgIGlnbm9yZU5leHRDbGljayA9IHRydWU7XG4gICAgICBfdGhpcy5fbG9vcElkID0gc2V0SW50ZXJ2YWwoX3RoaXMuX2VtdWxhdGVEcmFnT3ZlciwgNTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVbmRvIHdoYXQgd2FzIHNldCBpbiBfcHJlcGFyZURyYWdTdGFydCBiZWZvcmUgZHJhZyBzdGFydGVkXG4gICAgICBvZmYoZG9jdW1lbnQsICdtb3VzZXVwJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaGVuZCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIGlmIChkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XG4gICAgICAgIG9wdGlvbnMuc2V0RGF0YSAmJiBvcHRpb25zLnNldERhdGEuY2FsbChfdGhpcywgZGF0YVRyYW5zZmVyLCBkcmFnRWwpO1xuICAgICAgfVxuICAgICAgb24oZG9jdW1lbnQsICdkcm9wJywgX3RoaXMpO1xuXG4gICAgICAvLyAjMTI3NiBmaXg6XG4gICAgICBjc3MoZHJhZ0VsLCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZVooMCknKTtcbiAgICB9XG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgX3RoaXMuX2RyYWdTdGFydElkID0gX25leHRUaWNrKF90aGlzLl9kcmFnU3RhcnRlZC5iaW5kKF90aGlzLCBmYWxsYmFjaywgZXZ0KSk7XG4gICAgb24oZG9jdW1lbnQsICdzZWxlY3RzdGFydCcsIF90aGlzKTtcbiAgICBtb3ZlZCA9IHRydWU7XG4gICAgaWYgKFNhZmFyaSkge1xuICAgICAgY3NzKGRvY3VtZW50LmJvZHksICd1c2VyLXNlbGVjdCcsICdub25lJyk7XG4gICAgfVxuICB9LFxuICAvLyBSZXR1cm5zIHRydWUgLSBpZiBubyBmdXJ0aGVyIGFjdGlvbiBpcyBuZWVkZWQgKGVpdGhlciBpbnNlcnRlZCBvciBhbm90aGVyIGNvbmRpdGlvbilcbiAgX29uRHJhZ092ZXI6IGZ1bmN0aW9uIF9vbkRyYWdPdmVyKCAvKipFdmVudCovZXZ0KSB7XG4gICAgdmFyIGVsID0gdGhpcy5lbCxcbiAgICAgIHRhcmdldCA9IGV2dC50YXJnZXQsXG4gICAgICBkcmFnUmVjdCxcbiAgICAgIHRhcmdldFJlY3QsXG4gICAgICByZXZlcnQsXG4gICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgZ3JvdXAgPSBvcHRpb25zLmdyb3VwLFxuICAgICAgYWN0aXZlU29ydGFibGUgPSBTb3J0YWJsZS5hY3RpdmUsXG4gICAgICBpc093bmVyID0gYWN0aXZlR3JvdXAgPT09IGdyb3VwLFxuICAgICAgY2FuU29ydCA9IG9wdGlvbnMuc29ydCxcbiAgICAgIGZyb21Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IGFjdGl2ZVNvcnRhYmxlLFxuICAgICAgdmVydGljYWwsXG4gICAgICBfdGhpcyA9IHRoaXMsXG4gICAgICBjb21wbGV0ZWRGaXJlZCA9IGZhbHNlO1xuICAgIGlmIChfc2lsZW50KSByZXR1cm47XG4gICAgZnVuY3Rpb24gZHJhZ092ZXJFdmVudChuYW1lLCBleHRyYSkge1xuICAgICAgcGx1Z2luRXZlbnQobmFtZSwgX3RoaXMsIF9vYmplY3RTcHJlYWQyKHtcbiAgICAgICAgZXZ0OiBldnQsXG4gICAgICAgIGlzT3duZXI6IGlzT3duZXIsXG4gICAgICAgIGF4aXM6IHZlcnRpY2FsID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJyxcbiAgICAgICAgcmV2ZXJ0OiByZXZlcnQsXG4gICAgICAgIGRyYWdSZWN0OiBkcmFnUmVjdCxcbiAgICAgICAgdGFyZ2V0UmVjdDogdGFyZ2V0UmVjdCxcbiAgICAgICAgY2FuU29ydDogY2FuU29ydCxcbiAgICAgICAgZnJvbVNvcnRhYmxlOiBmcm9tU29ydGFibGUsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBjb21wbGV0ZWQ6IGNvbXBsZXRlZCxcbiAgICAgICAgb25Nb3ZlOiBmdW5jdGlvbiBvbk1vdmUodGFyZ2V0LCBhZnRlcikge1xuICAgICAgICAgIHJldHVybiBfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgZ2V0UmVjdCh0YXJnZXQpLCBldnQsIGFmdGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hhbmdlZDogY2hhbmdlZFxuICAgICAgfSwgZXh0cmEpKTtcbiAgICB9XG5cbiAgICAvLyBDYXB0dXJlIGFuaW1hdGlvbiBzdGF0ZVxuICAgIGZ1bmN0aW9uIGNhcHR1cmUoKSB7XG4gICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlckFuaW1hdGlvbkNhcHR1cmUnKTtcbiAgICAgIF90aGlzLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgaWYgKF90aGlzICE9PSBmcm9tU29ydGFibGUpIHtcbiAgICAgICAgZnJvbVNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBpbnZvY2F0aW9uIHdoZW4gZHJhZ0VsIGlzIGluc2VydGVkIChvciBjb21wbGV0ZWQpXG4gICAgZnVuY3Rpb24gY29tcGxldGVkKGluc2VydGlvbikge1xuICAgICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXJDb21wbGV0ZWQnLCB7XG4gICAgICAgIGluc2VydGlvbjogaW5zZXJ0aW9uXG4gICAgICB9KTtcbiAgICAgIGlmIChpbnNlcnRpb24pIHtcbiAgICAgICAgLy8gQ2xvbmVzIG11c3QgYmUgaGlkZGVuIGJlZm9yZSBmb2xkaW5nIGFuaW1hdGlvbiB0byBjYXB0dXJlIGRyYWdSZWN0QWJzb2x1dGUgcHJvcGVybHlcbiAgICAgICAgaWYgKGlzT3duZXIpIHtcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5faGlkZUNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShfdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF90aGlzICE9PSBmcm9tU29ydGFibGUpIHtcbiAgICAgICAgICAvLyBTZXQgZ2hvc3QgY2xhc3MgdG8gbmV3IHNvcnRhYmxlJ3MgZ2hvc3QgY2xhc3NcbiAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIHB1dFNvcnRhYmxlID8gcHV0U29ydGFibGUub3B0aW9ucy5naG9zdENsYXNzIDogYWN0aXZlU29ydGFibGUub3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmdob3N0Q2xhc3MsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwdXRTb3J0YWJsZSAhPT0gX3RoaXMgJiYgX3RoaXMgIT09IFNvcnRhYmxlLmFjdGl2ZSkge1xuICAgICAgICAgIHB1dFNvcnRhYmxlID0gX3RoaXM7XG4gICAgICAgIH0gZWxzZSBpZiAoX3RoaXMgPT09IFNvcnRhYmxlLmFjdGl2ZSAmJiBwdXRTb3J0YWJsZSkge1xuICAgICAgICAgIHB1dFNvcnRhYmxlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuaW1hdGlvblxuICAgICAgICBpZiAoZnJvbVNvcnRhYmxlID09PSBfdGhpcykge1xuICAgICAgICAgIF90aGlzLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9IHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5hbmltYXRlQWxsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlckFuaW1hdGlvbkNvbXBsZXRlJyk7XG4gICAgICAgICAgX3RoaXMuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChfdGhpcyAhPT0gZnJvbVNvcnRhYmxlKSB7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgICBmcm9tU29ydGFibGUuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOdWxsIGxhc3RUYXJnZXQgaWYgaXQgaXMgbm90IGluc2lkZSBhIHByZXZpb3VzbHkgc3dhcHBlZCBlbGVtZW50XG4gICAgICBpZiAodGFyZ2V0ID09PSBkcmFnRWwgJiYgIWRyYWdFbC5hbmltYXRlZCB8fCB0YXJnZXQgPT09IGVsICYmICF0YXJnZXQuYW5pbWF0ZWQpIHtcbiAgICAgICAgbGFzdFRhcmdldCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIG5vIGJ1YmJsaW5nIGFuZCBub3QgZmFsbGJhY2tcbiAgICAgIGlmICghb3B0aW9ucy5kcmFnb3ZlckJ1YmJsZSAmJiAhZXZ0LnJvb3RFbCAmJiB0YXJnZXQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwoZXZ0LnRhcmdldCk7XG5cbiAgICAgICAgLy8gRG8gbm90IGRldGVjdCBmb3IgZW1wdHkgaW5zZXJ0IGlmIGFscmVhZHkgaW5zZXJ0ZWRcbiAgICAgICAgIWluc2VydGlvbiAmJiBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudChldnQpO1xuICAgICAgfVxuICAgICAgIW9wdGlvbnMuZHJhZ292ZXJCdWJibGUgJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbiAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm4gY29tcGxldGVkRmlyZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIENhbGwgd2hlbiBkcmFnRWwgaGFzIGJlZW4gaW5zZXJ0ZWRcbiAgICBmdW5jdGlvbiBjaGFuZ2VkKCkge1xuICAgICAgbmV3SW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICBuYW1lOiAnY2hhbmdlJyxcbiAgICAgICAgdG9FbDogZWwsXG4gICAgICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4LFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZXZ0LnByZXZlbnREZWZhdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICB0YXJnZXQgPSBjbG9zZXN0KHRhcmdldCwgb3B0aW9ucy5kcmFnZ2FibGUsIGVsLCB0cnVlKTtcbiAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlcicpO1xuICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm4gY29tcGxldGVkRmlyZWQ7XG4gICAgaWYgKGRyYWdFbC5jb250YWlucyhldnQudGFyZ2V0KSB8fCB0YXJnZXQuYW5pbWF0ZWQgJiYgdGFyZ2V0LmFuaW1hdGluZ1ggJiYgdGFyZ2V0LmFuaW1hdGluZ1kgfHwgX3RoaXMuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID09PSB0YXJnZXQpIHtcbiAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgIH1cbiAgICBpZ25vcmVOZXh0Q2xpY2sgPSBmYWxzZTtcbiAgICBpZiAoYWN0aXZlU29ydGFibGUgJiYgIW9wdGlvbnMuZGlzYWJsZWQgJiYgKGlzT3duZXIgPyBjYW5Tb3J0IHx8IChyZXZlcnQgPSBwYXJlbnRFbCAhPT0gcm9vdEVsKSAvLyBSZXZlcnRpbmcgaXRlbSBpbnRvIHRoZSBvcmlnaW5hbCBsaXN0XG4gICAgOiBwdXRTb3J0YWJsZSA9PT0gdGhpcyB8fCAodGhpcy5sYXN0UHV0TW9kZSA9IGFjdGl2ZUdyb3VwLmNoZWNrUHVsbCh0aGlzLCBhY3RpdmVTb3J0YWJsZSwgZHJhZ0VsLCBldnQpKSAmJiBncm91cC5jaGVja1B1dCh0aGlzLCBhY3RpdmVTb3J0YWJsZSwgZHJhZ0VsLCBldnQpKSkge1xuICAgICAgdmVydGljYWwgPSB0aGlzLl9nZXREaXJlY3Rpb24oZXZ0LCB0YXJnZXQpID09PSAndmVydGljYWwnO1xuICAgICAgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCk7XG4gICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlclZhbGlkJyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuIGNvbXBsZXRlZEZpcmVkO1xuICAgICAgaWYgKHJldmVydCkge1xuICAgICAgICBwYXJlbnRFbCA9IHJvb3RFbDsgLy8gYWN0dWFsaXphdGlvblxuICAgICAgICBjYXB0dXJlKCk7XG4gICAgICAgIHRoaXMuX2hpZGVDbG9uZSgpO1xuICAgICAgICBkcmFnT3ZlckV2ZW50KCdyZXZlcnQnKTtcbiAgICAgICAgaWYgKCFTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgaWYgKG5leHRFbCkge1xuICAgICAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShkcmFnRWwsIG5leHRFbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGxldGVkKHRydWUpO1xuICAgICAgfVxuICAgICAgdmFyIGVsTGFzdENoaWxkID0gbGFzdENoaWxkKGVsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG4gICAgICBpZiAoIWVsTGFzdENoaWxkIHx8IF9naG9zdElzTGFzdChldnQsIHZlcnRpY2FsLCB0aGlzKSAmJiAhZWxMYXN0Q2hpbGQuYW5pbWF0ZWQpIHtcbiAgICAgICAgLy8gSW5zZXJ0IHRvIGVuZCBvZiBsaXN0XG5cbiAgICAgICAgLy8gSWYgYWxyZWFkeSBhdCBlbmQgb2YgbGlzdDogRG8gbm90IGluc2VydFxuICAgICAgICBpZiAoZWxMYXN0Q2hpbGQgPT09IGRyYWdFbCkge1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBsYXN0IGVsZW1lbnQsIGl0IGlzIHRoZSB0YXJnZXRcbiAgICAgICAgaWYgKGVsTGFzdENoaWxkICYmIGVsID09PSBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0ID0gZWxMYXN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCBldnQsICEhdGFyZ2V0KSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjYXB0dXJlKCk7XG4gICAgICAgICAgaWYgKGVsTGFzdENoaWxkICYmIGVsTGFzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAvLyB0aGUgbGFzdCBkcmFnZ2FibGUgZWxlbWVudCBpcyBub3QgdGhlIGxhc3Qgbm9kZVxuICAgICAgICAgICAgZWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgZWxMYXN0Q2hpbGQubmV4dFNpYmxpbmcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJlbnRFbCA9IGVsOyAvLyBhY3R1YWxpemF0aW9uXG5cbiAgICAgICAgICBjaGFuZ2VkKCk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbExhc3RDaGlsZCAmJiBfZ2hvc3RJc0ZpcnN0KGV2dCwgdmVydGljYWwsIHRoaXMpKSB7XG4gICAgICAgIC8vIEluc2VydCB0byBzdGFydCBvZiBsaXN0XG4gICAgICAgIHZhciBmaXJzdENoaWxkID0gZ2V0Q2hpbGQoZWwsIDAsIG9wdGlvbnMsIHRydWUpO1xuICAgICAgICBpZiAoZmlyc3RDaGlsZCA9PT0gZHJhZ0VsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gZmlyc3RDaGlsZDtcbiAgICAgICAgdGFyZ2V0UmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgICAgaWYgKF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCBldnQsIGZhbHNlKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjYXB0dXJlKCk7XG4gICAgICAgICAgZWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgZmlyc3RDaGlsZCk7XG4gICAgICAgICAgcGFyZW50RWwgPSBlbDsgLy8gYWN0dWFsaXphdGlvblxuXG4gICAgICAgICAgY2hhbmdlZCgpO1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LnBhcmVudE5vZGUgPT09IGVsKSB7XG4gICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSAwLFxuICAgICAgICAgIHRhcmdldEJlZm9yZUZpcnN0U3dhcCxcbiAgICAgICAgICBkaWZmZXJlbnRMZXZlbCA9IGRyYWdFbC5wYXJlbnROb2RlICE9PSBlbCxcbiAgICAgICAgICBkaWZmZXJlbnRSb3dDb2wgPSAhX2RyYWdFbEluUm93Q29sdW1uKGRyYWdFbC5hbmltYXRlZCAmJiBkcmFnRWwudG9SZWN0IHx8IGRyYWdSZWN0LCB0YXJnZXQuYW5pbWF0ZWQgJiYgdGFyZ2V0LnRvUmVjdCB8fCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCksXG4gICAgICAgICAgc2lkZTEgPSB2ZXJ0aWNhbCA/ICd0b3AnIDogJ2xlZnQnLFxuICAgICAgICAgIHNjcm9sbGVkUGFzdFRvcCA9IGlzU2Nyb2xsZWRQYXN0KHRhcmdldCwgJ3RvcCcsICd0b3AnKSB8fCBpc1Njcm9sbGVkUGFzdChkcmFnRWwsICd0b3AnLCAndG9wJyksXG4gICAgICAgICAgc2Nyb2xsQmVmb3JlID0gc2Nyb2xsZWRQYXN0VG9wID8gc2Nyb2xsZWRQYXN0VG9wLnNjcm9sbFRvcCA6IHZvaWQgMDtcbiAgICAgICAgaWYgKGxhc3RUYXJnZXQgIT09IHRhcmdldCkge1xuICAgICAgICAgIHRhcmdldEJlZm9yZUZpcnN0U3dhcCA9IHRhcmdldFJlY3Rbc2lkZTFdO1xuICAgICAgICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IGZhbHNlO1xuICAgICAgICAgIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSAhZGlmZmVyZW50Um93Q29sICYmIG9wdGlvbnMuaW52ZXJ0U3dhcCB8fCBkaWZmZXJlbnRMZXZlbDtcbiAgICAgICAgfVxuICAgICAgICBkaXJlY3Rpb24gPSBfZ2V0U3dhcERpcmVjdGlvbihldnQsIHRhcmdldCwgdGFyZ2V0UmVjdCwgdmVydGljYWwsIGRpZmZlcmVudFJvd0NvbCA/IDEgOiBvcHRpb25zLnN3YXBUaHJlc2hvbGQsIG9wdGlvbnMuaW52ZXJ0ZWRTd2FwVGhyZXNob2xkID09IG51bGwgPyBvcHRpb25zLnN3YXBUaHJlc2hvbGQgOiBvcHRpb25zLmludmVydGVkU3dhcFRocmVzaG9sZCwgaXNDaXJjdW1zdGFudGlhbEludmVydCwgbGFzdFRhcmdldCA9PT0gdGFyZ2V0KTtcbiAgICAgICAgdmFyIHNpYmxpbmc7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0YXJnZXQgaXMgYmVzaWRlIGRyYWdFbCBpbiByZXNwZWN0aXZlIGRpcmVjdGlvbiAoaWdub3JpbmcgaGlkZGVuIGVsZW1lbnRzKVxuICAgICAgICAgIHZhciBkcmFnSW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGRyYWdJbmRleCAtPSBkaXJlY3Rpb247XG4gICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50RWwuY2hpbGRyZW5bZHJhZ0luZGV4XTtcbiAgICAgICAgICB9IHdoaWxlIChzaWJsaW5nICYmIChjc3Moc2libGluZywgJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8IHNpYmxpbmcgPT09IGdob3N0RWwpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBkcmFnRWwgaXMgYWxyZWFkeSBiZXNpZGUgdGFyZ2V0OiBEbyBub3QgaW5zZXJ0XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IDAgfHwgc2libGluZyA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgbGFzdERpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgICAgdmFyIG5leHRTaWJsaW5nID0gdGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyxcbiAgICAgICAgICBhZnRlciA9IGZhbHNlO1xuICAgICAgICBhZnRlciA9IGRpcmVjdGlvbiA9PT0gMTtcbiAgICAgICAgdmFyIG1vdmVWZWN0b3IgPSBfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgdGFyZ2V0UmVjdCwgZXZ0LCBhZnRlcik7XG4gICAgICAgIGlmIChtb3ZlVmVjdG9yICE9PSBmYWxzZSkge1xuICAgICAgICAgIGlmIChtb3ZlVmVjdG9yID09PSAxIHx8IG1vdmVWZWN0b3IgPT09IC0xKSB7XG4gICAgICAgICAgICBhZnRlciA9IG1vdmVWZWN0b3IgPT09IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9zaWxlbnQgPSB0cnVlO1xuICAgICAgICAgIHNldFRpbWVvdXQoX3Vuc2lsZW50LCAzMCk7XG4gICAgICAgICAgY2FwdHVyZSgpO1xuICAgICAgICAgIGlmIChhZnRlciAmJiAhbmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkcmFnRWwsIGFmdGVyID8gbmV4dFNpYmxpbmcgOiB0YXJnZXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVuZG8gY2hyb21lJ3Mgc2Nyb2xsIGFkanVzdG1lbnQgKGhhcyBubyBlZmZlY3Qgb24gb3RoZXIgYnJvd3NlcnMpXG4gICAgICAgICAgaWYgKHNjcm9sbGVkUGFzdFRvcCkge1xuICAgICAgICAgICAgc2Nyb2xsQnkoc2Nyb2xsZWRQYXN0VG9wLCAwLCBzY3JvbGxCZWZvcmUgLSBzY3JvbGxlZFBhc3RUb3Auc2Nyb2xsVG9wKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50RWwgPSBkcmFnRWwucGFyZW50Tm9kZTsgLy8gYWN0dWFsaXphdGlvblxuXG4gICAgICAgICAgLy8gbXVzdCBiZSBkb25lIGJlZm9yZSBhbmltYXRpb25cbiAgICAgICAgICBpZiAodGFyZ2V0QmVmb3JlRmlyc3RTd2FwICE9PSB1bmRlZmluZWQgJiYgIWlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQpIHtcbiAgICAgICAgICAgIHRhcmdldE1vdmVEaXN0YW5jZSA9IE1hdGguYWJzKHRhcmdldEJlZm9yZUZpcnN0U3dhcCAtIGdldFJlY3QodGFyZ2V0KVtzaWRlMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGFuZ2VkKCk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVsLmNvbnRhaW5zKGRyYWdFbCkpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgX2lnbm9yZVdoaWxlQW5pbWF0aW5nOiBudWxsLFxuICBfb2ZmTW92ZUV2ZW50czogZnVuY3Rpb24gX29mZk1vdmVFdmVudHMoKSB7XG4gICAgb2ZmKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICBvZmYoZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICBvZmYoZG9jdW1lbnQsICdkcmFnb3ZlcicsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICBvZmYoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICB9LFxuICBfb2ZmVXBFdmVudHM6IGZ1bmN0aW9uIF9vZmZVcEV2ZW50cygpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHRoaXMuZWwub3duZXJEb2N1bWVudDtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAncG9pbnRlcnVwJywgdGhpcy5fb25Ecm9wKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgdGhpcy5fb25Ecm9wKTtcbiAgICBvZmYoZG9jdW1lbnQsICdzZWxlY3RzdGFydCcsIHRoaXMpO1xuICB9LFxuICBfb25Ecm9wOiBmdW5jdGlvbiBfb25Ecm9wKCAvKipFdmVudCovZXZ0KSB7XG4gICAgdmFyIGVsID0gdGhpcy5lbCxcbiAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBkcmFnZ2VkIGVsZW1lbnQgd2l0aGluIGl0cyBwYXJlbnRcbiAgICBuZXdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG4gICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICBwbHVnaW5FdmVudCgnZHJvcCcsIHRoaXMsIHtcbiAgICAgIGV2dDogZXZ0XG4gICAgfSk7XG4gICAgcGFyZW50RWwgPSBkcmFnRWwgJiYgZHJhZ0VsLnBhcmVudE5vZGU7XG5cbiAgICAvLyBHZXQgYWdhaW4gYWZ0ZXIgcGx1Z2luIGV2ZW50XG4gICAgbmV3SW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gaW5kZXgoZHJhZ0VsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIHRoaXMuX251bGxpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSBmYWxzZTtcbiAgICBwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggPSBmYWxzZTtcbiAgICBjbGVhckludGVydmFsKHRoaXMuX2xvb3BJZCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2RyYWdTdGFydFRpbWVyKTtcbiAgICBfY2FuY2VsTmV4dFRpY2sodGhpcy5jbG9uZUlkKTtcbiAgICBfY2FuY2VsTmV4dFRpY2sodGhpcy5fZHJhZ1N0YXJ0SWQpO1xuXG4gICAgLy8gVW5iaW5kIGV2ZW50c1xuICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgb2ZmKGRvY3VtZW50LCAnZHJvcCcsIHRoaXMpO1xuICAgICAgb2ZmKGVsLCAnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIH1cbiAgICB0aGlzLl9vZmZNb3ZlRXZlbnRzKCk7XG4gICAgdGhpcy5fb2ZmVXBFdmVudHMoKTtcbiAgICBpZiAoU2FmYXJpKSB7XG4gICAgICBjc3MoZG9jdW1lbnQuYm9keSwgJ3VzZXItc2VsZWN0JywgJycpO1xuICAgIH1cbiAgICBjc3MoZHJhZ0VsLCAndHJhbnNmb3JtJywgJycpO1xuICAgIGlmIChldnQpIHtcbiAgICAgIGlmIChtb3ZlZCkge1xuICAgICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgIW9wdGlvbnMuZHJvcEJ1YmJsZSAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBnaG9zdEVsICYmIGdob3N0RWwucGFyZW50Tm9kZSAmJiBnaG9zdEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZ2hvc3RFbCk7XG4gICAgICBpZiAocm9vdEVsID09PSBwYXJlbnRFbCB8fCBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSAhPT0gJ2Nsb25lJykge1xuICAgICAgICAvLyBSZW1vdmUgY2xvbmUocylcbiAgICAgICAgY2xvbmVFbCAmJiBjbG9uZUVsLnBhcmVudE5vZGUgJiYgY2xvbmVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lRWwpO1xuICAgICAgfVxuICAgICAgaWYgKGRyYWdFbCkge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgICBvZmYoZHJhZ0VsLCAnZHJhZ2VuZCcsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIF9kaXNhYmxlRHJhZ2dhYmxlKGRyYWdFbCk7XG4gICAgICAgIGRyYWdFbC5zdHlsZVsnd2lsbC1jaGFuZ2UnXSA9ICcnO1xuXG4gICAgICAgIC8vIFJlbW92ZSBjbGFzc2VzXG4gICAgICAgIC8vIGdob3N0Q2xhc3MgaXMgYWRkZWQgaW4gZHJhZ1N0YXJ0ZWRcbiAgICAgICAgaWYgKG1vdmVkICYmICFhd2FpdGluZ0RyYWdTdGFydGVkKSB7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBwdXRTb3J0YWJsZSA/IHB1dFNvcnRhYmxlLm9wdGlvbnMuZ2hvc3RDbGFzcyA6IHRoaXMub3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTtcblxuICAgICAgICAvLyBEcmFnIHN0b3AgZXZlbnRcbiAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgIG5hbWU6ICd1bmNob29zZScsXG4gICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgbmV3SW5kZXg6IG51bGwsXG4gICAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG51bGwsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocm9vdEVsICE9PSBwYXJlbnRFbCkge1xuICAgICAgICAgIGlmIChuZXdJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAvLyBBZGQgZXZlbnRcbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgcm9vdEVsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgbmFtZTogJ2FkZCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBmcm9tRWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGV2ZW50XG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICBuYW1lOiAncmVtb3ZlJyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGRyYWcgZnJvbSBvbmUgbGlzdCBhbmQgZHJvcCBpbnRvIGFub3RoZXJcbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgcm9vdEVsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgbmFtZTogJ3NvcnQnLFxuICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgZnJvbUVsOiByb290RWwsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICBuYW1lOiAnc29ydCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5zYXZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ICE9PSBvbGRJbmRleCkge1xuICAgICAgICAgICAgaWYgKG5ld0luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgLy8gZHJhZyAmIGRyb3Agd2l0aGluIHRoZSBzYW1lIGxpc3RcbiAgICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICAgIG5hbWU6ICd1cGRhdGUnLFxuICAgICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdzb3J0JyxcbiAgICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChTb3J0YWJsZS5hY3RpdmUpIHtcbiAgICAgICAgICAvKiBqc2hpbnQgZXFudWxsOnRydWUgKi9cbiAgICAgICAgICBpZiAobmV3SW5kZXggPT0gbnVsbCB8fCBuZXdJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIG5ld0luZGV4ID0gb2xkSW5kZXg7XG4gICAgICAgICAgICBuZXdEcmFnZ2FibGVJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgIG5hbWU6ICdlbmQnLFxuICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFNhdmUgc29ydGluZ1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX251bGxpbmcoKTtcbiAgfSxcbiAgX251bGxpbmc6IGZ1bmN0aW9uIF9udWxsaW5nKCkge1xuICAgIHBsdWdpbkV2ZW50KCdudWxsaW5nJywgdGhpcyk7XG4gICAgcm9vdEVsID0gZHJhZ0VsID0gcGFyZW50RWwgPSBnaG9zdEVsID0gbmV4dEVsID0gY2xvbmVFbCA9IGxhc3REb3duRWwgPSBjbG9uZUhpZGRlbiA9IHRhcEV2dCA9IHRvdWNoRXZ0ID0gbW92ZWQgPSBuZXdJbmRleCA9IG5ld0RyYWdnYWJsZUluZGV4ID0gb2xkSW5kZXggPSBvbGREcmFnZ2FibGVJbmRleCA9IGxhc3RUYXJnZXQgPSBsYXN0RGlyZWN0aW9uID0gcHV0U29ydGFibGUgPSBhY3RpdmVHcm91cCA9IFNvcnRhYmxlLmRyYWdnZWQgPSBTb3J0YWJsZS5naG9zdCA9IFNvcnRhYmxlLmNsb25lID0gU29ydGFibGUuYWN0aXZlID0gbnVsbDtcbiAgICBzYXZlZElucHV0Q2hlY2tlZC5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgZWwuY2hlY2tlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgc2F2ZWRJbnB1dENoZWNrZWQubGVuZ3RoID0gbGFzdER4ID0gbGFzdER5ID0gMDtcbiAgfSxcbiAgaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KCAvKipFdmVudCovZXZ0KSB7XG4gICAgc3dpdGNoIChldnQudHlwZSkge1xuICAgICAgY2FzZSAnZHJvcCc6XG4gICAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgICAgdGhpcy5fb25Ecm9wKGV2dCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICAgICAgaWYgKGRyYWdFbCkge1xuICAgICAgICAgIHRoaXMuX29uRHJhZ092ZXIoZXZ0KTtcbiAgICAgICAgICBfZ2xvYmFsRHJhZ092ZXIoZXZ0KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbGVjdHN0YXJ0JzpcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSxcbiAgLyoqXHJcbiAgICogU2VyaWFsaXplcyB0aGUgaXRlbSBpbnRvIGFuIGFycmF5IG9mIHN0cmluZy5cclxuICAgKiBAcmV0dXJucyB7U3RyaW5nW119XHJcbiAgICovXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgdmFyIG9yZGVyID0gW10sXG4gICAgICBlbCxcbiAgICAgIGNoaWxkcmVuID0gdGhpcy5lbC5jaGlsZHJlbixcbiAgICAgIGkgPSAwLFxuICAgICAgbiA9IGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgZm9yICg7IGkgPCBuOyBpKyspIHtcbiAgICAgIGVsID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoY2xvc2VzdChlbCwgb3B0aW9ucy5kcmFnZ2FibGUsIHRoaXMuZWwsIGZhbHNlKSkge1xuICAgICAgICBvcmRlci5wdXNoKGVsLmdldEF0dHJpYnV0ZShvcHRpb25zLmRhdGFJZEF0dHIpIHx8IF9nZW5lcmF0ZUlkKGVsKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcmRlcjtcbiAgfSxcbiAgLyoqXHJcbiAgICogU29ydHMgdGhlIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgYXJyYXkuXHJcbiAgICogQHBhcmFtICB7U3RyaW5nW119ICBvcmRlciAgb3JkZXIgb2YgdGhlIGl0ZW1zXHJcbiAgICovXG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQob3JkZXIsIHVzZUFuaW1hdGlvbikge1xuICAgIHZhciBpdGVtcyA9IHt9LFxuICAgICAgcm9vdEVsID0gdGhpcy5lbDtcbiAgICB0aGlzLnRvQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCwgaSkge1xuICAgICAgdmFyIGVsID0gcm9vdEVsLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKGNsb3Nlc3QoZWwsIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUsIHJvb3RFbCwgZmFsc2UpKSB7XG4gICAgICAgIGl0ZW1zW2lkXSA9IGVsO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICAgIHVzZUFuaW1hdGlvbiAmJiB0aGlzLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIG9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoaXRlbXNbaWRdKSB7XG4gICAgICAgIHJvb3RFbC5yZW1vdmVDaGlsZChpdGVtc1tpZF0pO1xuICAgICAgICByb290RWwuYXBwZW5kQ2hpbGQoaXRlbXNbaWRdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1c2VBbmltYXRpb24gJiYgdGhpcy5hbmltYXRlQWxsKCk7XG4gIH0sXG4gIC8qKlxyXG4gICAqIFNhdmUgdGhlIGN1cnJlbnQgc29ydGluZ1xyXG4gICAqL1xuICBzYXZlOiBmdW5jdGlvbiBzYXZlKCkge1xuICAgIHZhciBzdG9yZSA9IHRoaXMub3B0aW9ucy5zdG9yZTtcbiAgICBzdG9yZSAmJiBzdG9yZS5zZXQgJiYgc3RvcmUuc2V0KHRoaXMpO1xuICB9LFxuICAvKipcclxuICAgKiBGb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQsIGdldCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yIGJ5IHRlc3RpbmcgdGhlIGVsZW1lbnQgaXRzZWxmIGFuZCB0cmF2ZXJzaW5nIHVwIHRocm91Z2ggaXRzIGFuY2VzdG9ycyBpbiB0aGUgRE9NIHRyZWUuXHJcbiAgICogQHBhcmFtICAge0hUTUxFbGVtZW50fSAgZWxcclxuICAgKiBAcGFyYW0gICB7U3RyaW5nfSAgICAgICBbc2VsZWN0b3JdICBkZWZhdWx0OiBgb3B0aW9ucy5kcmFnZ2FibGVgXHJcbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9XHJcbiAgICovXG4gIGNsb3Nlc3Q6IGZ1bmN0aW9uIGNsb3Nlc3QkMShlbCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbCwgc2VsZWN0b3IgfHwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSwgdGhpcy5lbCwgZmFsc2UpO1xuICB9LFxuICAvKipcclxuICAgKiBTZXQvZ2V0IG9wdGlvblxyXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcclxuICAgKiBAcGFyYW0gICB7Kn0gICAgICBbdmFsdWVdXHJcbiAgICogQHJldHVybnMgeyp9XHJcbiAgICovXG4gIG9wdGlvbjogZnVuY3Rpb24gb3B0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiBvcHRpb25zW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbW9kaWZpZWRWYWx1ZSA9IFBsdWdpbk1hbmFnZXIubW9kaWZ5T3B0aW9uKHRoaXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgIGlmICh0eXBlb2YgbW9kaWZpZWRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb3B0aW9uc1tuYW1lXSA9IG1vZGlmaWVkVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zW25hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAobmFtZSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLyoqXHJcbiAgICogRGVzdHJveVxyXG4gICAqL1xuICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIHBsdWdpbkV2ZW50KCdkZXN0cm95JywgdGhpcyk7XG4gICAgdmFyIGVsID0gdGhpcy5lbDtcbiAgICBlbFtleHBhbmRvXSA9IG51bGw7XG4gICAgb2ZmKGVsLCAnbW91c2Vkb3duJywgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgb2ZmKGVsLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgIG9mZihlbCwgJ3BvaW50ZXJkb3duJywgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICBvZmYoZWwsICdkcmFnb3ZlcicsIHRoaXMpO1xuICAgICAgb2ZmKGVsLCAnZHJhZ2VudGVyJywgdGhpcyk7XG4gICAgfVxuICAgIC8vIFJlbW92ZSBkcmFnZ2FibGUgYXR0cmlidXRlc1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZWwucXVlcnlTZWxlY3RvckFsbCgnW2RyYWdnYWJsZV0nKSwgZnVuY3Rpb24gKGVsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpO1xuICAgIH0pO1xuICAgIHRoaXMuX29uRHJvcCgpO1xuICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpO1xuICAgIHNvcnRhYmxlcy5zcGxpY2Uoc29ydGFibGVzLmluZGV4T2YodGhpcy5lbCksIDEpO1xuICAgIHRoaXMuZWwgPSBlbCA9IG51bGw7XG4gIH0sXG4gIF9oaWRlQ2xvbmU6IGZ1bmN0aW9uIF9oaWRlQ2xvbmUoKSB7XG4gICAgaWYgKCFjbG9uZUhpZGRlbikge1xuICAgICAgcGx1Z2luRXZlbnQoJ2hpZGVDbG9uZScsIHRoaXMpO1xuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybjtcbiAgICAgIGNzcyhjbG9uZUVsLCAnZGlzcGxheScsICdub25lJyk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlICYmIGNsb25lRWwucGFyZW50Tm9kZSkge1xuICAgICAgICBjbG9uZUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmVFbCk7XG4gICAgICB9XG4gICAgICBjbG9uZUhpZGRlbiA9IHRydWU7XG4gICAgfVxuICB9LFxuICBfc2hvd0Nsb25lOiBmdW5jdGlvbiBfc2hvd0Nsb25lKHB1dFNvcnRhYmxlKSB7XG4gICAgaWYgKHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlICE9PSAnY2xvbmUnKSB7XG4gICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNsb25lSGlkZGVuKSB7XG4gICAgICBwbHVnaW5FdmVudCgnc2hvd0Nsb25lJywgdGhpcyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuO1xuXG4gICAgICAvLyBzaG93IGNsb25lIGF0IGRyYWdFbCBvciBvcmlnaW5hbCBwb3NpdGlvblxuICAgICAgaWYgKGRyYWdFbC5wYXJlbnROb2RlID09IHJvb3RFbCAmJiAhdGhpcy5vcHRpb25zLmdyb3VwLnJldmVydENsb25lKSB7XG4gICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmVFbCwgZHJhZ0VsKTtcbiAgICAgIH0gZWxzZSBpZiAobmV4dEVsKSB7XG4gICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmVFbCwgbmV4dEVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChjbG9uZUVsKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JvdXAucmV2ZXJ0Q2xvbmUpIHtcbiAgICAgICAgdGhpcy5hbmltYXRlKGRyYWdFbCwgY2xvbmVFbCk7XG4gICAgICB9XG4gICAgICBjc3MoY2xvbmVFbCwgJ2Rpc3BsYXknLCAnJyk7XG4gICAgICBjbG9uZUhpZGRlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxufTtcbmZ1bmN0aW9uIF9nbG9iYWxEcmFnT3ZlciggLyoqRXZlbnQqL2V2dCkge1xuICBpZiAoZXZ0LmRhdGFUcmFuc2Zlcikge1xuICAgIGV2dC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcbiAgfVxuICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbn1cbmZ1bmN0aW9uIF9vbk1vdmUoZnJvbUVsLCB0b0VsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXRFbCwgdGFyZ2V0UmVjdCwgb3JpZ2luYWxFdmVudCwgd2lsbEluc2VydEFmdGVyKSB7XG4gIHZhciBldnQsXG4gICAgc29ydGFibGUgPSBmcm9tRWxbZXhwYW5kb10sXG4gICAgb25Nb3ZlRm4gPSBzb3J0YWJsZS5vcHRpb25zLm9uTW92ZSxcbiAgICByZXRWYWw7XG4gIC8vIFN1cHBvcnQgZm9yIG5ldyBDdXN0b21FdmVudCBmZWF0dXJlXG4gIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgIUlFMTFPckxlc3MgJiYgIUVkZ2UpIHtcbiAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ21vdmUnLCB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2dC5pbml0RXZlbnQoJ21vdmUnLCB0cnVlLCB0cnVlKTtcbiAgfVxuICBldnQudG8gPSB0b0VsO1xuICBldnQuZnJvbSA9IGZyb21FbDtcbiAgZXZ0LmRyYWdnZWQgPSBkcmFnRWw7XG4gIGV2dC5kcmFnZ2VkUmVjdCA9IGRyYWdSZWN0O1xuICBldnQucmVsYXRlZCA9IHRhcmdldEVsIHx8IHRvRWw7XG4gIGV2dC5yZWxhdGVkUmVjdCA9IHRhcmdldFJlY3QgfHwgZ2V0UmVjdCh0b0VsKTtcbiAgZXZ0LndpbGxJbnNlcnRBZnRlciA9IHdpbGxJbnNlcnRBZnRlcjtcbiAgZXZ0Lm9yaWdpbmFsRXZlbnQgPSBvcmlnaW5hbEV2ZW50O1xuICBmcm9tRWwuZGlzcGF0Y2hFdmVudChldnQpO1xuICBpZiAob25Nb3ZlRm4pIHtcbiAgICByZXRWYWwgPSBvbk1vdmVGbi5jYWxsKHNvcnRhYmxlLCBldnQsIG9yaWdpbmFsRXZlbnQpO1xuICB9XG4gIHJldHVybiByZXRWYWw7XG59XG5mdW5jdGlvbiBfZGlzYWJsZURyYWdnYWJsZShlbCkge1xuICBlbC5kcmFnZ2FibGUgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIF91bnNpbGVudCgpIHtcbiAgX3NpbGVudCA9IGZhbHNlO1xufVxuZnVuY3Rpb24gX2dob3N0SXNGaXJzdChldnQsIHZlcnRpY2FsLCBzb3J0YWJsZSkge1xuICB2YXIgZmlyc3RFbFJlY3QgPSBnZXRSZWN0KGdldENoaWxkKHNvcnRhYmxlLmVsLCAwLCBzb3J0YWJsZS5vcHRpb25zLCB0cnVlKSk7XG4gIHZhciBjaGlsZENvbnRhaW5pbmdSZWN0ID0gZ2V0Q2hpbGRDb250YWluaW5nUmVjdEZyb21FbGVtZW50KHNvcnRhYmxlLmVsLCBzb3J0YWJsZS5vcHRpb25zLCBnaG9zdEVsKTtcbiAgdmFyIHNwYWNlciA9IDEwO1xuICByZXR1cm4gdmVydGljYWwgPyBldnQuY2xpZW50WCA8IGNoaWxkQ29udGFpbmluZ1JlY3QubGVmdCAtIHNwYWNlciB8fCBldnQuY2xpZW50WSA8IGZpcnN0RWxSZWN0LnRvcCAmJiBldnQuY2xpZW50WCA8IGZpcnN0RWxSZWN0LnJpZ2h0IDogZXZ0LmNsaWVudFkgPCBjaGlsZENvbnRhaW5pbmdSZWN0LnRvcCAtIHNwYWNlciB8fCBldnQuY2xpZW50WSA8IGZpcnN0RWxSZWN0LmJvdHRvbSAmJiBldnQuY2xpZW50WCA8IGZpcnN0RWxSZWN0LmxlZnQ7XG59XG5mdW5jdGlvbiBfZ2hvc3RJc0xhc3QoZXZ0LCB2ZXJ0aWNhbCwgc29ydGFibGUpIHtcbiAgdmFyIGxhc3RFbFJlY3QgPSBnZXRSZWN0KGxhc3RDaGlsZChzb3J0YWJsZS5lbCwgc29ydGFibGUub3B0aW9ucy5kcmFnZ2FibGUpKTtcbiAgdmFyIGNoaWxkQ29udGFpbmluZ1JlY3QgPSBnZXRDaGlsZENvbnRhaW5pbmdSZWN0RnJvbUVsZW1lbnQoc29ydGFibGUuZWwsIHNvcnRhYmxlLm9wdGlvbnMsIGdob3N0RWwpO1xuICB2YXIgc3BhY2VyID0gMTA7XG4gIHJldHVybiB2ZXJ0aWNhbCA/IGV2dC5jbGllbnRYID4gY2hpbGRDb250YWluaW5nUmVjdC5yaWdodCArIHNwYWNlciB8fCBldnQuY2xpZW50WSA+IGxhc3RFbFJlY3QuYm90dG9tICYmIGV2dC5jbGllbnRYID4gbGFzdEVsUmVjdC5sZWZ0IDogZXZ0LmNsaWVudFkgPiBjaGlsZENvbnRhaW5pbmdSZWN0LmJvdHRvbSArIHNwYWNlciB8fCBldnQuY2xpZW50WCA+IGxhc3RFbFJlY3QucmlnaHQgJiYgZXZ0LmNsaWVudFkgPiBsYXN0RWxSZWN0LnRvcDtcbn1cbmZ1bmN0aW9uIF9nZXRTd2FwRGlyZWN0aW9uKGV2dCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCwgc3dhcFRocmVzaG9sZCwgaW52ZXJ0ZWRTd2FwVGhyZXNob2xkLCBpbnZlcnRTd2FwLCBpc0xhc3RUYXJnZXQpIHtcbiAgdmFyIG1vdXNlT25BeGlzID0gdmVydGljYWwgPyBldnQuY2xpZW50WSA6IGV2dC5jbGllbnRYLFxuICAgIHRhcmdldExlbmd0aCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5oZWlnaHQgOiB0YXJnZXRSZWN0LndpZHRoLFxuICAgIHRhcmdldFMxID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LnRvcCA6IHRhcmdldFJlY3QubGVmdCxcbiAgICB0YXJnZXRTMiA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5ib3R0b20gOiB0YXJnZXRSZWN0LnJpZ2h0LFxuICAgIGludmVydCA9IGZhbHNlO1xuICBpZiAoIWludmVydFN3YXApIHtcbiAgICAvLyBOZXZlciBpbnZlcnQgb3IgY3JlYXRlIGRyYWdFbCBzaGFkb3cgd2hlbiB0YXJnZXQgbW92ZW1lbmV0IGNhdXNlcyBtb3VzZSB0byBtb3ZlIHBhc3QgdGhlIGVuZCBvZiByZWd1bGFyIHN3YXBUaHJlc2hvbGRcbiAgICBpZiAoaXNMYXN0VGFyZ2V0ICYmIHRhcmdldE1vdmVEaXN0YW5jZSA8IHRhcmdldExlbmd0aCAqIHN3YXBUaHJlc2hvbGQpIHtcbiAgICAgIC8vIG11bHRpcGxpZWQgb25seSBieSBzd2FwVGhyZXNob2xkIGJlY2F1c2UgbW91c2Ugd2lsbCBhbHJlYWR5IGJlIGluc2lkZSB0YXJnZXQgYnkgKDEgLSB0aHJlc2hvbGQpICogdGFyZ2V0TGVuZ3RoIC8gMlxuICAgICAgLy8gY2hlY2sgaWYgcGFzdCBmaXJzdCBpbnZlcnQgdGhyZXNob2xkIG9uIHNpZGUgb3Bwb3NpdGUgb2YgbGFzdERpcmVjdGlvblxuICAgICAgaWYgKCFwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggJiYgKGxhc3REaXJlY3Rpb24gPT09IDEgPyBtb3VzZU9uQXhpcyA+IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMiA6IG1vdXNlT25BeGlzIDwgdGFyZ2V0UzIgLSB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyKSkge1xuICAgICAgICAvLyBwYXN0IGZpcnN0IGludmVydCB0aHJlc2hvbGQsIGRvIG5vdCByZXN0cmljdCBpbnZlcnRlZCB0aHJlc2hvbGQgdG8gZHJhZ0VsIHNoYWRvd1xuICAgICAgICBwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXN0Rmlyc3RJbnZlcnRUaHJlc2gpIHtcbiAgICAgICAgLy8gZHJhZ0VsIHNoYWRvdyAodGFyZ2V0IG1vdmUgZGlzdGFuY2Ugc2hhZG93KVxuICAgICAgICBpZiAobGFzdERpcmVjdGlvbiA9PT0gMSA/IG1vdXNlT25BeGlzIDwgdGFyZ2V0UzEgKyB0YXJnZXRNb3ZlRGlzdGFuY2UgLy8gb3ZlciBkcmFnRWwgc2hhZG93XG4gICAgICAgIDogbW91c2VPbkF4aXMgPiB0YXJnZXRTMiAtIHRhcmdldE1vdmVEaXN0YW5jZSkge1xuICAgICAgICAgIHJldHVybiAtbGFzdERpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW52ZXJ0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVndWxhclxuICAgICAgaWYgKG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggKiAoMSAtIHN3YXBUaHJlc2hvbGQpIC8gMiAmJiBtb3VzZU9uQXhpcyA8IHRhcmdldFMyIC0gdGFyZ2V0TGVuZ3RoICogKDEgLSBzd2FwVGhyZXNob2xkKSAvIDIpIHtcbiAgICAgICAgcmV0dXJuIF9nZXRJbnNlcnREaXJlY3Rpb24odGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaW52ZXJ0ID0gaW52ZXJ0IHx8IGludmVydFN3YXA7XG4gIGlmIChpbnZlcnQpIHtcbiAgICAvLyBJbnZlcnQgb2YgcmVndWxhclxuICAgIGlmIChtb3VzZU9uQXhpcyA8IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMiB8fCBtb3VzZU9uQXhpcyA+IHRhcmdldFMyIC0gdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMikge1xuICAgICAgcmV0dXJuIG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggLyAyID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLyoqXHJcbiAqIEdldHMgdGhlIGRpcmVjdGlvbiBkcmFnRWwgbXVzdCBiZSBzd2FwcGVkIHJlbGF0aXZlIHRvIHRhcmdldCBpbiBvcmRlciB0byBtYWtlIGl0XHJcbiAqIHNlZW0gdGhhdCBkcmFnRWwgaGFzIGJlZW4gXCJpbnNlcnRlZFwiIGludG8gdGhhdCBlbGVtZW50J3MgcG9zaXRpb25cclxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IHRhcmdldCAgICAgICBUaGUgdGFyZ2V0IHdob3NlIHBvc2l0aW9uIGRyYWdFbCBpcyBiZWluZyBpbnNlcnRlZCBhdFxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkcmFnRWwgbXVzdCBiZSBzd2FwcGVkXHJcbiAqL1xuZnVuY3Rpb24gX2dldEluc2VydERpcmVjdGlvbih0YXJnZXQpIHtcbiAgaWYgKGluZGV4KGRyYWdFbCkgPCBpbmRleCh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG5cbi8qKlxyXG4gKiBHZW5lcmF0ZSBpZFxyXG4gKiBAcGFyYW0gICB7SFRNTEVsZW1lbnR9IGVsXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuZnVuY3Rpb24gX2dlbmVyYXRlSWQoZWwpIHtcbiAgdmFyIHN0ciA9IGVsLnRhZ05hbWUgKyBlbC5jbGFzc05hbWUgKyBlbC5zcmMgKyBlbC5ocmVmICsgZWwudGV4dENvbnRlbnQsXG4gICAgaSA9IHN0ci5sZW5ndGgsXG4gICAgc3VtID0gMDtcbiAgd2hpbGUgKGktLSkge1xuICAgIHN1bSArPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gc3VtLnRvU3RyaW5nKDM2KTtcbn1cbmZ1bmN0aW9uIF9zYXZlSW5wdXRDaGVja2VkU3RhdGUocm9vdCkge1xuICBzYXZlZElucHV0Q2hlY2tlZC5sZW5ndGggPSAwO1xuICB2YXIgaW5wdXRzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTtcbiAgdmFyIGlkeCA9IGlucHV0cy5sZW5ndGg7XG4gIHdoaWxlIChpZHgtLSkge1xuICAgIHZhciBlbCA9IGlucHV0c1tpZHhdO1xuICAgIGVsLmNoZWNrZWQgJiYgc2F2ZWRJbnB1dENoZWNrZWQucHVzaChlbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIF9uZXh0VGljayhmbikge1xuICByZXR1cm4gc2V0VGltZW91dChmbiwgMCk7XG59XG5mdW5jdGlvbiBfY2FuY2VsTmV4dFRpY2soaWQpIHtcbiAgcmV0dXJuIGNsZWFyVGltZW91dChpZCk7XG59XG5cbi8vIEZpeGVkICM5NzM6XG5pZiAoZG9jdW1lbnRFeGlzdHMpIHtcbiAgb24oZG9jdW1lbnQsICd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgaWYgKChTb3J0YWJsZS5hY3RpdmUgfHwgYXdhaXRpbmdEcmFnU3RhcnRlZCkgJiYgZXZ0LmNhbmNlbGFibGUpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIEV4cG9ydCB1dGlsc1xuU29ydGFibGUudXRpbHMgPSB7XG4gIG9uOiBvbixcbiAgb2ZmOiBvZmYsXG4gIGNzczogY3NzLFxuICBmaW5kOiBmaW5kLFxuICBpczogZnVuY3Rpb24gaXMoZWwsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuICEhY2xvc2VzdChlbCwgc2VsZWN0b3IsIGVsLCBmYWxzZSk7XG4gIH0sXG4gIGV4dGVuZDogZXh0ZW5kLFxuICB0aHJvdHRsZTogdGhyb3R0bGUsXG4gIGNsb3Nlc3Q6IGNsb3Nlc3QsXG4gIHRvZ2dsZUNsYXNzOiB0b2dnbGVDbGFzcyxcbiAgY2xvbmU6IGNsb25lLFxuICBpbmRleDogaW5kZXgsXG4gIG5leHRUaWNrOiBfbmV4dFRpY2ssXG4gIGNhbmNlbE5leHRUaWNrOiBfY2FuY2VsTmV4dFRpY2ssXG4gIGRldGVjdERpcmVjdGlvbjogX2RldGVjdERpcmVjdGlvbixcbiAgZ2V0Q2hpbGQ6IGdldENoaWxkXG59O1xuXG4vKipcclxuICogR2V0IHRoZSBTb3J0YWJsZSBpbnN0YW5jZSBvZiBhbiBlbGVtZW50XHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50XHJcbiAqIEByZXR1cm4ge1NvcnRhYmxlfHVuZGVmaW5lZH0gICAgICAgICBUaGUgaW5zdGFuY2Ugb2YgU29ydGFibGVcclxuICovXG5Tb3J0YWJsZS5nZXQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudFtleHBhbmRvXTtcbn07XG5cbi8qKlxyXG4gKiBNb3VudCBhIHBsdWdpbiB0byBTb3J0YWJsZVxyXG4gKiBAcGFyYW0gIHsuLi5Tb3J0YWJsZVBsdWdpbnxTb3J0YWJsZVBsdWdpbltdfSBwbHVnaW5zICAgICAgIFBsdWdpbnMgYmVpbmcgbW91bnRlZFxyXG4gKi9cblNvcnRhYmxlLm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcGx1Z2lucyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBwbHVnaW5zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIGlmIChwbHVnaW5zWzBdLmNvbnN0cnVjdG9yID09PSBBcnJheSkgcGx1Z2lucyA9IHBsdWdpbnNbMF07XG4gIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgaWYgKCFwbHVnaW4ucHJvdG90eXBlIHx8ICFwbHVnaW4ucHJvdG90eXBlLmNvbnN0cnVjdG9yKSB7XG4gICAgICB0aHJvdyBcIlNvcnRhYmxlOiBNb3VudGVkIHBsdWdpbiBtdXN0IGJlIGEgY29uc3RydWN0b3IgZnVuY3Rpb24sIG5vdCBcIi5jb25jYXQoe30udG9TdHJpbmcuY2FsbChwbHVnaW4pKTtcbiAgICB9XG4gICAgaWYgKHBsdWdpbi51dGlscykgU29ydGFibGUudXRpbHMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgU29ydGFibGUudXRpbHMpLCBwbHVnaW4udXRpbHMpO1xuICAgIFBsdWdpbk1hbmFnZXIubW91bnQocGx1Z2luKTtcbiAgfSk7XG59O1xuXG4vKipcclxuICogQ3JlYXRlIHNvcnRhYmxlIGluc3RhbmNlXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9ICBlbFxyXG4gKiBAcGFyYW0ge09iamVjdH0gICAgICBbb3B0aW9uc11cclxuICovXG5Tb3J0YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBTb3J0YWJsZShlbCwgb3B0aW9ucyk7XG59O1xuXG4vLyBFeHBvcnRcblNvcnRhYmxlLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG52YXIgYXV0b1Njcm9sbHMgPSBbXSxcbiAgc2Nyb2xsRWwsXG4gIHNjcm9sbFJvb3RFbCxcbiAgc2Nyb2xsaW5nID0gZmFsc2UsXG4gIGxhc3RBdXRvU2Nyb2xsWCxcbiAgbGFzdEF1dG9TY3JvbGxZLFxuICB0b3VjaEV2dCQxLFxuICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbDtcbmZ1bmN0aW9uIEF1dG9TY3JvbGxQbHVnaW4oKSB7XG4gIGZ1bmN0aW9uIEF1dG9TY3JvbGwoKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIHNjcm9sbDogdHJ1ZSxcbiAgICAgIGZvcmNlQXV0b1Njcm9sbEZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIHNjcm9sbFNlbnNpdGl2aXR5OiAzMCxcbiAgICAgIHNjcm9sbFNwZWVkOiAxMCxcbiAgICAgIGJ1YmJsZVNjcm9sbDogdHJ1ZVxuICAgIH07XG5cbiAgICAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcbiAgICBmb3IgKHZhciBmbiBpbiB0aGlzKSB7XG4gICAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgQXV0b1Njcm9sbC5wcm90b3R5cGUgPSB7XG4gICAgZHJhZ1N0YXJ0ZWQ6IGZ1bmN0aW9uIGRyYWdTdGFydGVkKF9yZWYpIHtcbiAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gX3JlZi5vcmlnaW5hbEV2ZW50O1xuICAgICAgaWYgKHRoaXMuc29ydGFibGUubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAnZHJhZ292ZXInLCB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbEV2ZW50LnRvdWNoZXMpIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb24oZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckNvbXBsZXRlZDogZnVuY3Rpb24gZHJhZ092ZXJDb21wbGV0ZWQoX3JlZjIpIHtcbiAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gX3JlZjIub3JpZ2luYWxFdmVudDtcbiAgICAgIC8vIEZvciB3aGVuIGJ1YmJsaW5nIGlzIGNhbmNlbGVkIGFuZCB1c2luZyBmYWxsYmFjayAoZmFsbGJhY2sgJ3RvdWNobW92ZScgYWx3YXlzIHJlYWNoZWQpXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5kcmFnT3ZlckJ1YmJsZSAmJiAhb3JpZ2luYWxFdmVudC5yb290RWwpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlQXV0b1Njcm9sbChvcmlnaW5hbEV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyb3A6IGZ1bmN0aW9uIGRyb3AoKSB7XG4gICAgICBpZiAodGhpcy5zb3J0YWJsZS5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAnZHJhZ292ZXInLCB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgIH1cbiAgICAgIGNsZWFyUG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwoKTtcbiAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgIGNhbmNlbFRocm90dGxlKCk7XG4gICAgfSxcbiAgICBudWxsaW5nOiBmdW5jdGlvbiBudWxsaW5nKCkge1xuICAgICAgdG91Y2hFdnQkMSA9IHNjcm9sbFJvb3RFbCA9IHNjcm9sbEVsID0gc2Nyb2xsaW5nID0gcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgPSBsYXN0QXV0b1Njcm9sbFggPSBsYXN0QXV0b1Njcm9sbFkgPSBudWxsO1xuICAgICAgYXV0b1Njcm9sbHMubGVuZ3RoID0gMDtcbiAgICB9LFxuICAgIF9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGw6IGZ1bmN0aW9uIF9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwoZXZ0KSB7XG4gICAgICB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKGV2dCwgdHJ1ZSk7XG4gICAgfSxcbiAgICBfaGFuZGxlQXV0b1Njcm9sbDogZnVuY3Rpb24gX2hhbmRsZUF1dG9TY3JvbGwoZXZ0LCBmYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHZhciB4ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFgsXG4gICAgICAgIHkgPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WSxcbiAgICAgICAgZWxlbSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgICB0b3VjaEV2dCQxID0gZXZ0O1xuXG4gICAgICAvLyBJRSBkb2VzIG5vdCBzZWVtIHRvIGhhdmUgbmF0aXZlIGF1dG9zY3JvbGwsXG4gICAgICAvLyBFZGdlJ3MgYXV0b3Njcm9sbCBzZWVtcyB0b28gY29uZGl0aW9uYWwsXG4gICAgICAvLyBNQUNPUyBTYWZhcmkgZG9lcyBub3QgaGF2ZSBhdXRvc2Nyb2xsLFxuICAgICAgLy8gRmlyZWZveCBhbmQgQ2hyb21lIGFyZSBnb29kXG4gICAgICBpZiAoZmFsbGJhY2sgfHwgdGhpcy5vcHRpb25zLmZvcmNlQXV0b1Njcm9sbEZhbGxiYWNrIHx8IEVkZ2UgfHwgSUUxMU9yTGVzcyB8fCBTYWZhcmkpIHtcbiAgICAgICAgYXV0b1Njcm9sbChldnQsIHRoaXMub3B0aW9ucywgZWxlbSwgZmFsbGJhY2spO1xuXG4gICAgICAgIC8vIExpc3RlbmVyIGZvciBwb2ludGVyIGVsZW1lbnQgY2hhbmdlXG4gICAgICAgIHZhciBvZ0VsZW1TY3JvbGxlciA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsZW0sIHRydWUpO1xuICAgICAgICBpZiAoc2Nyb2xsaW5nICYmICghcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgfHwgeCAhPT0gbGFzdEF1dG9TY3JvbGxYIHx8IHkgIT09IGxhc3RBdXRvU2Nyb2xsWSkpIHtcbiAgICAgICAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCAmJiBjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKCk7XG4gICAgICAgICAgLy8gRGV0ZWN0IGZvciBwb2ludGVyIGVsZW0gY2hhbmdlLCBlbXVsYXRpbmcgbmF0aXZlIERuRCBiZWhhdmlvdXJcbiAgICAgICAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuZXdFbGVtID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAobmV3RWxlbSAhPT0gb2dFbGVtU2Nyb2xsZXIpIHtcbiAgICAgICAgICAgICAgb2dFbGVtU2Nyb2xsZXIgPSBuZXdFbGVtO1xuICAgICAgICAgICAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdXRvU2Nyb2xsKGV2dCwgX3RoaXMub3B0aW9ucywgbmV3RWxlbSwgZmFsbGJhY2spO1xuICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgICBsYXN0QXV0b1Njcm9sbFggPSB4O1xuICAgICAgICAgIGxhc3RBdXRvU2Nyb2xsWSA9IHk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIERuRCBpcyBlbmFibGVkIChhbmQgYnJvd3NlciBoYXMgZ29vZCBhdXRvc2Nyb2xsaW5nKSwgZmlyc3QgYXV0b3Njcm9sbCB3aWxsIGFscmVhZHkgc2Nyb2xsLCBzbyBnZXQgcGFyZW50IGF1dG9zY3JvbGwgb2YgZmlyc3QgYXV0b3Njcm9sbFxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idWJibGVTY3JvbGwgfHwgZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgdHJ1ZSkgPT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkge1xuICAgICAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXV0b1Njcm9sbChldnQsIHRoaXMub3B0aW9ucywgZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgZmFsc2UpLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gX2V4dGVuZHMoQXV0b1Njcm9sbCwge1xuICAgIHBsdWdpbk5hbWU6ICdzY3JvbGwnLFxuICAgIGluaXRpYWxpemVCeURlZmF1bHQ6IHRydWVcbiAgfSk7XG59XG5mdW5jdGlvbiBjbGVhckF1dG9TY3JvbGxzKCkge1xuICBhdXRvU2Nyb2xscy5mb3JFYWNoKGZ1bmN0aW9uIChhdXRvU2Nyb2xsKSB7XG4gICAgY2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsLnBpZCk7XG4gIH0pO1xuICBhdXRvU2Nyb2xscyA9IFtdO1xufVxuZnVuY3Rpb24gY2xlYXJQb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCgpIHtcbiAgY2xlYXJJbnRlcnZhbChwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCk7XG59XG52YXIgYXV0b1Njcm9sbCA9IHRocm90dGxlKGZ1bmN0aW9uIChldnQsIG9wdGlvbnMsIHJvb3RFbCwgaXNGYWxsYmFjaykge1xuICAvLyBCdWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTUyMVxuICBpZiAoIW9wdGlvbnMuc2Nyb2xsKSByZXR1cm47XG4gIHZhciB4ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFgsXG4gICAgeSA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRZLFxuICAgIHNlbnMgPSBvcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5LFxuICAgIHNwZWVkID0gb3B0aW9ucy5zY3JvbGxTcGVlZCxcbiAgICB3aW5TY3JvbGxlciA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgdmFyIHNjcm9sbFRoaXNJbnN0YW5jZSA9IGZhbHNlLFxuICAgIHNjcm9sbEN1c3RvbUZuO1xuXG4gIC8vIE5ldyBzY3JvbGwgcm9vdCwgc2V0IHNjcm9sbEVsXG4gIGlmIChzY3JvbGxSb290RWwgIT09IHJvb3RFbCkge1xuICAgIHNjcm9sbFJvb3RFbCA9IHJvb3RFbDtcbiAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgc2Nyb2xsRWwgPSBvcHRpb25zLnNjcm9sbDtcbiAgICBzY3JvbGxDdXN0b21GbiA9IG9wdGlvbnMuc2Nyb2xsRm47XG4gICAgaWYgKHNjcm9sbEVsID09PSB0cnVlKSB7XG4gICAgICBzY3JvbGxFbCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KHJvb3RFbCwgdHJ1ZSk7XG4gICAgfVxuICB9XG4gIHZhciBsYXllcnNPdXQgPSAwO1xuICB2YXIgY3VycmVudFBhcmVudCA9IHNjcm9sbEVsO1xuICBkbyB7XG4gICAgdmFyIGVsID0gY3VycmVudFBhcmVudCxcbiAgICAgIHJlY3QgPSBnZXRSZWN0KGVsKSxcbiAgICAgIHRvcCA9IHJlY3QudG9wLFxuICAgICAgYm90dG9tID0gcmVjdC5ib3R0b20sXG4gICAgICBsZWZ0ID0gcmVjdC5sZWZ0LFxuICAgICAgcmlnaHQgPSByZWN0LnJpZ2h0LFxuICAgICAgd2lkdGggPSByZWN0LndpZHRoLFxuICAgICAgaGVpZ2h0ID0gcmVjdC5oZWlnaHQsXG4gICAgICBjYW5TY3JvbGxYID0gdm9pZCAwLFxuICAgICAgY2FuU2Nyb2xsWSA9IHZvaWQgMCxcbiAgICAgIHNjcm9sbFdpZHRoID0gZWwuc2Nyb2xsV2lkdGgsXG4gICAgICBzY3JvbGxIZWlnaHQgPSBlbC5zY3JvbGxIZWlnaHQsXG4gICAgICBlbENTUyA9IGNzcyhlbCksXG4gICAgICBzY3JvbGxQb3NYID0gZWwuc2Nyb2xsTGVmdCxcbiAgICAgIHNjcm9sbFBvc1kgPSBlbC5zY3JvbGxUb3A7XG4gICAgaWYgKGVsID09PSB3aW5TY3JvbGxlcikge1xuICAgICAgY2FuU2Nyb2xsWCA9IHdpZHRoIDwgc2Nyb2xsV2lkdGggJiYgKGVsQ1NTLm92ZXJmbG93WCA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WCA9PT0gJ3Njcm9sbCcgfHwgZWxDU1Mub3ZlcmZsb3dYID09PSAndmlzaWJsZScpO1xuICAgICAgY2FuU2Nyb2xsWSA9IGhlaWdodCA8IHNjcm9sbEhlaWdodCAmJiAoZWxDU1Mub3ZlcmZsb3dZID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dZID09PSAnc2Nyb2xsJyB8fCBlbENTUy5vdmVyZmxvd1kgPT09ICd2aXNpYmxlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhblNjcm9sbFggPSB3aWR0aCA8IHNjcm9sbFdpZHRoICYmIChlbENTUy5vdmVyZmxvd1ggPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1ggPT09ICdzY3JvbGwnKTtcbiAgICAgIGNhblNjcm9sbFkgPSBoZWlnaHQgPCBzY3JvbGxIZWlnaHQgJiYgKGVsQ1NTLm92ZXJmbG93WSA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WSA9PT0gJ3Njcm9sbCcpO1xuICAgIH1cbiAgICB2YXIgdnggPSBjYW5TY3JvbGxYICYmIChNYXRoLmFicyhyaWdodCAtIHgpIDw9IHNlbnMgJiYgc2Nyb2xsUG9zWCArIHdpZHRoIDwgc2Nyb2xsV2lkdGgpIC0gKE1hdGguYWJzKGxlZnQgLSB4KSA8PSBzZW5zICYmICEhc2Nyb2xsUG9zWCk7XG4gICAgdmFyIHZ5ID0gY2FuU2Nyb2xsWSAmJiAoTWF0aC5hYnMoYm90dG9tIC0geSkgPD0gc2VucyAmJiBzY3JvbGxQb3NZICsgaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0KSAtIChNYXRoLmFicyh0b3AgLSB5KSA8PSBzZW5zICYmICEhc2Nyb2xsUG9zWSk7XG4gICAgaWYgKCFhdXRvU2Nyb2xsc1tsYXllcnNPdXRdKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBsYXllcnNPdXQ7IGkrKykge1xuICAgICAgICBpZiAoIWF1dG9TY3JvbGxzW2ldKSB7XG4gICAgICAgICAgYXV0b1Njcm9sbHNbaV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eCAhPSB2eCB8fCBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ5ICE9IHZ5IHx8IGF1dG9TY3JvbGxzW2xheWVyc091dF0uZWwgIT09IGVsKSB7XG4gICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLmVsID0gZWw7XG4gICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ4ID0gdng7XG4gICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ5ID0gdnk7XG4gICAgICBjbGVhckludGVydmFsKGF1dG9TY3JvbGxzW2xheWVyc091dF0ucGlkKTtcbiAgICAgIGlmICh2eCAhPSAwIHx8IHZ5ICE9IDApIHtcbiAgICAgICAgc2Nyb2xsVGhpc0luc3RhbmNlID0gdHJ1ZTtcbiAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOnRydWUgKi9cbiAgICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5waWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gZW11bGF0ZSBkcmFnIG92ZXIgZHVyaW5nIGF1dG9zY3JvbGwgKGZhbGxiYWNrKSwgZW11bGF0aW5nIG5hdGl2ZSBEbkQgYmVoYXZpb3VyXG4gICAgICAgICAgaWYgKGlzRmFsbGJhY2sgJiYgdGhpcy5sYXllciA9PT0gMCkge1xuICAgICAgICAgICAgU29ydGFibGUuYWN0aXZlLl9vblRvdWNoTW92ZSh0b3VjaEV2dCQxKTsgLy8gVG8gbW92ZSBnaG9zdCBpZiBpdCBpcyBwb3NpdGlvbmVkIGFic29sdXRlbHlcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHNjcm9sbE9mZnNldFkgPSBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eSA/IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ5ICogc3BlZWQgOiAwO1xuICAgICAgICAgIHZhciBzY3JvbGxPZmZzZXRYID0gYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0udnggPyBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eCAqIHNwZWVkIDogMDtcbiAgICAgICAgICBpZiAodHlwZW9mIHNjcm9sbEN1c3RvbUZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAoc2Nyb2xsQ3VzdG9tRm4uY2FsbChTb3J0YWJsZS5kcmFnZ2VkLnBhcmVudE5vZGVbZXhwYW5kb10sIHNjcm9sbE9mZnNldFgsIHNjcm9sbE9mZnNldFksIGV2dCwgdG91Y2hFdnQkMSwgYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0uZWwpICE9PSAnY29udGludWUnKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2Nyb2xsQnkoYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0uZWwsIHNjcm9sbE9mZnNldFgsIHNjcm9sbE9mZnNldFkpO1xuICAgICAgICB9LmJpbmQoe1xuICAgICAgICAgIGxheWVyOiBsYXllcnNPdXRcbiAgICAgICAgfSksIDI0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGF5ZXJzT3V0Kys7XG4gIH0gd2hpbGUgKG9wdGlvbnMuYnViYmxlU2Nyb2xsICYmIGN1cnJlbnRQYXJlbnQgIT09IHdpblNjcm9sbGVyICYmIChjdXJyZW50UGFyZW50ID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoY3VycmVudFBhcmVudCwgZmFsc2UpKSk7XG4gIHNjcm9sbGluZyA9IHNjcm9sbFRoaXNJbnN0YW5jZTsgLy8gaW4gY2FzZSBhbm90aGVyIGZ1bmN0aW9uIGNhdGNoZXMgc2Nyb2xsaW5nIGFzIGZhbHNlIGluIGJldHdlZW4gd2hlbiBpdCBpcyBub3Rcbn0sIDMwKTtcblxudmFyIGRyb3AgPSBmdW5jdGlvbiBkcm9wKF9yZWYpIHtcbiAgdmFyIG9yaWdpbmFsRXZlbnQgPSBfcmVmLm9yaWdpbmFsRXZlbnQsXG4gICAgcHV0U29ydGFibGUgPSBfcmVmLnB1dFNvcnRhYmxlLFxuICAgIGRyYWdFbCA9IF9yZWYuZHJhZ0VsLFxuICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZi5hY3RpdmVTb3J0YWJsZSxcbiAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQgPSBfcmVmLmRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICBoaWRlR2hvc3RGb3JUYXJnZXQgPSBfcmVmLmhpZGVHaG9zdEZvclRhcmdldCxcbiAgICB1bmhpZGVHaG9zdEZvclRhcmdldCA9IF9yZWYudW5oaWRlR2hvc3RGb3JUYXJnZXQ7XG4gIGlmICghb3JpZ2luYWxFdmVudCkgcmV0dXJuO1xuICB2YXIgdG9Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IGFjdGl2ZVNvcnRhYmxlO1xuICBoaWRlR2hvc3RGb3JUYXJnZXQoKTtcbiAgdmFyIHRvdWNoID0gb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBvcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA/IG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBvcmlnaW5hbEV2ZW50O1xuICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZKTtcbiAgdW5oaWRlR2hvc3RGb3JUYXJnZXQoKTtcbiAgaWYgKHRvU29ydGFibGUgJiYgIXRvU29ydGFibGUuZWwuY29udGFpbnModGFyZ2V0KSkge1xuICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCgnc3BpbGwnKTtcbiAgICB0aGlzLm9uU3BpbGwoe1xuICAgICAgZHJhZ0VsOiBkcmFnRWwsXG4gICAgICBwdXRTb3J0YWJsZTogcHV0U29ydGFibGVcbiAgICB9KTtcbiAgfVxufTtcbmZ1bmN0aW9uIFJldmVydCgpIHt9XG5SZXZlcnQucHJvdG90eXBlID0ge1xuICBzdGFydEluZGV4OiBudWxsLFxuICBkcmFnU3RhcnQ6IGZ1bmN0aW9uIGRyYWdTdGFydChfcmVmMikge1xuICAgIHZhciBvbGREcmFnZ2FibGVJbmRleCA9IF9yZWYyLm9sZERyYWdnYWJsZUluZGV4O1xuICAgIHRoaXMuc3RhcnRJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4O1xuICB9LFxuICBvblNwaWxsOiBmdW5jdGlvbiBvblNwaWxsKF9yZWYzKSB7XG4gICAgdmFyIGRyYWdFbCA9IF9yZWYzLmRyYWdFbCxcbiAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjMucHV0U29ydGFibGU7XG4gICAgdGhpcy5zb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICBpZiAocHV0U29ydGFibGUpIHtcbiAgICAgIHB1dFNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIH1cbiAgICB2YXIgbmV4dFNpYmxpbmcgPSBnZXRDaGlsZCh0aGlzLnNvcnRhYmxlLmVsLCB0aGlzLnN0YXJ0SW5kZXgsIHRoaXMub3B0aW9ucyk7XG4gICAgaWYgKG5leHRTaWJsaW5nKSB7XG4gICAgICB0aGlzLnNvcnRhYmxlLmVsLmluc2VydEJlZm9yZShkcmFnRWwsIG5leHRTaWJsaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zb3J0YWJsZS5lbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgIH1cbiAgICB0aGlzLnNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICBpZiAocHV0U29ydGFibGUpIHtcbiAgICAgIHB1dFNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICB9XG4gIH0sXG4gIGRyb3A6IGRyb3Bcbn07XG5fZXh0ZW5kcyhSZXZlcnQsIHtcbiAgcGx1Z2luTmFtZTogJ3JldmVydE9uU3BpbGwnXG59KTtcbmZ1bmN0aW9uIFJlbW92ZSgpIHt9XG5SZW1vdmUucHJvdG90eXBlID0ge1xuICBvblNwaWxsOiBmdW5jdGlvbiBvblNwaWxsKF9yZWY0KSB7XG4gICAgdmFyIGRyYWdFbCA9IF9yZWY0LmRyYWdFbCxcbiAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjQucHV0U29ydGFibGU7XG4gICAgdmFyIHBhcmVudFNvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgdGhpcy5zb3J0YWJsZTtcbiAgICBwYXJlbnRTb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICBkcmFnRWwucGFyZW50Tm9kZSAmJiBkcmFnRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkcmFnRWwpO1xuICAgIHBhcmVudFNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgfSxcbiAgZHJvcDogZHJvcFxufTtcbl9leHRlbmRzKFJlbW92ZSwge1xuICBwbHVnaW5OYW1lOiAncmVtb3ZlT25TcGlsbCdcbn0pO1xuXG52YXIgbGFzdFN3YXBFbDtcbmZ1bmN0aW9uIFN3YXBQbHVnaW4oKSB7XG4gIGZ1bmN0aW9uIFN3YXAoKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIHN3YXBDbGFzczogJ3NvcnRhYmxlLXN3YXAtaGlnaGxpZ2h0J1xuICAgIH07XG4gIH1cbiAgU3dhcC5wcm90b3R5cGUgPSB7XG4gICAgZHJhZ1N0YXJ0OiBmdW5jdGlvbiBkcmFnU3RhcnQoX3JlZikge1xuICAgICAgdmFyIGRyYWdFbCA9IF9yZWYuZHJhZ0VsO1xuICAgICAgbGFzdFN3YXBFbCA9IGRyYWdFbDtcbiAgICB9LFxuICAgIGRyYWdPdmVyVmFsaWQ6IGZ1bmN0aW9uIGRyYWdPdmVyVmFsaWQoX3JlZjIpIHtcbiAgICAgIHZhciBjb21wbGV0ZWQgPSBfcmVmMi5jb21wbGV0ZWQsXG4gICAgICAgIHRhcmdldCA9IF9yZWYyLnRhcmdldCxcbiAgICAgICAgb25Nb3ZlID0gX3JlZjIub25Nb3ZlLFxuICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYyLmFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICBjaGFuZ2VkID0gX3JlZjIuY2hhbmdlZCxcbiAgICAgICAgY2FuY2VsID0gX3JlZjIuY2FuY2VsO1xuICAgICAgaWYgKCFhY3RpdmVTb3J0YWJsZS5vcHRpb25zLnN3YXApIHJldHVybjtcbiAgICAgIHZhciBlbCA9IHRoaXMuc29ydGFibGUuZWwsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gZWwpIHtcbiAgICAgICAgdmFyIHByZXZTd2FwRWwgPSBsYXN0U3dhcEVsO1xuICAgICAgICBpZiAob25Nb3ZlKHRhcmdldCkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3ModGFyZ2V0LCBvcHRpb25zLnN3YXBDbGFzcywgdHJ1ZSk7XG4gICAgICAgICAgbGFzdFN3YXBFbCA9IHRhcmdldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0U3dhcEVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldlN3YXBFbCAmJiBwcmV2U3dhcEVsICE9PSBsYXN0U3dhcEVsKSB7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3MocHJldlN3YXBFbCwgb3B0aW9ucy5zd2FwQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2hhbmdlZCgpO1xuICAgICAgY29tcGxldGVkKHRydWUpO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKF9yZWYzKSB7XG4gICAgICB2YXIgYWN0aXZlU29ydGFibGUgPSBfcmVmMy5hY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgcHV0U29ydGFibGUgPSBfcmVmMy5wdXRTb3J0YWJsZSxcbiAgICAgICAgZHJhZ0VsID0gX3JlZjMuZHJhZ0VsO1xuICAgICAgdmFyIHRvU29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCB0aGlzLnNvcnRhYmxlO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBsYXN0U3dhcEVsICYmIHRvZ2dsZUNsYXNzKGxhc3RTd2FwRWwsIG9wdGlvbnMuc3dhcENsYXNzLCBmYWxzZSk7XG4gICAgICBpZiAobGFzdFN3YXBFbCAmJiAob3B0aW9ucy5zd2FwIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLm9wdGlvbnMuc3dhcCkpIHtcbiAgICAgICAgaWYgKGRyYWdFbCAhPT0gbGFzdFN3YXBFbCkge1xuICAgICAgICAgIHRvU29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgICAgICAgaWYgKHRvU29ydGFibGUgIT09IGFjdGl2ZVNvcnRhYmxlKSBhY3RpdmVTb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgICBzd2FwTm9kZXMoZHJhZ0VsLCBsYXN0U3dhcEVsKTtcbiAgICAgICAgICB0b1NvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgICBpZiAodG9Tb3J0YWJsZSAhPT0gYWN0aXZlU29ydGFibGUpIGFjdGl2ZVNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbnVsbGluZzogZnVuY3Rpb24gbnVsbGluZygpIHtcbiAgICAgIGxhc3RTd2FwRWwgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzKFN3YXAsIHtcbiAgICBwbHVnaW5OYW1lOiAnc3dhcCcsXG4gICAgZXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBldmVudFByb3BlcnRpZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzd2FwSXRlbTogbGFzdFN3YXBFbFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gc3dhcE5vZGVzKG4xLCBuMikge1xuICB2YXIgcDEgPSBuMS5wYXJlbnROb2RlLFxuICAgIHAyID0gbjIucGFyZW50Tm9kZSxcbiAgICBpMSxcbiAgICBpMjtcbiAgaWYgKCFwMSB8fCAhcDIgfHwgcDEuaXNFcXVhbE5vZGUobjIpIHx8IHAyLmlzRXF1YWxOb2RlKG4xKSkgcmV0dXJuO1xuICBpMSA9IGluZGV4KG4xKTtcbiAgaTIgPSBpbmRleChuMik7XG4gIGlmIChwMS5pc0VxdWFsTm9kZShwMikgJiYgaTEgPCBpMikge1xuICAgIGkyKys7XG4gIH1cbiAgcDEuaW5zZXJ0QmVmb3JlKG4yLCBwMS5jaGlsZHJlbltpMV0pO1xuICBwMi5pbnNlcnRCZWZvcmUobjEsIHAyLmNoaWxkcmVuW2kyXSk7XG59XG5cbnZhciBtdWx0aURyYWdFbGVtZW50cyA9IFtdLFxuICBtdWx0aURyYWdDbG9uZXMgPSBbXSxcbiAgbGFzdE11bHRpRHJhZ1NlbGVjdCxcbiAgLy8gZm9yIHNlbGVjdGlvbiB3aXRoIG1vZGlmaWVyIGtleSBkb3duIChTSElGVClcbiAgbXVsdGlEcmFnU29ydGFibGUsXG4gIGluaXRpYWxGb2xkaW5nID0gZmFsc2UsXG4gIC8vIEluaXRpYWwgbXVsdGktZHJhZyBmb2xkIHdoZW4gZHJhZyBzdGFydGVkXG4gIGZvbGRpbmcgPSBmYWxzZSxcbiAgLy8gRm9sZGluZyBhbnkgb3RoZXIgdGltZVxuICBkcmFnU3RhcnRlZCA9IGZhbHNlLFxuICBkcmFnRWwkMSxcbiAgY2xvbmVzRnJvbVJlY3QsXG4gIGNsb25lc0hpZGRlbjtcbmZ1bmN0aW9uIE11bHRpRHJhZ1BsdWdpbigpIHtcbiAgZnVuY3Rpb24gTXVsdGlEcmFnKHNvcnRhYmxlKSB7XG4gICAgLy8gQmluZCBhbGwgcHJpdmF0ZSBtZXRob2RzXG4gICAgZm9yICh2YXIgZm4gaW4gdGhpcykge1xuICAgICAgaWYgKGZuLmNoYXJBdCgwKSA9PT0gJ18nICYmIHR5cGVvZiB0aGlzW2ZuXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghc29ydGFibGUub3B0aW9ucy5hdm9pZEltcGxpY2l0RGVzZWxlY3QpIHtcbiAgICAgIGlmIChzb3J0YWJsZS5vcHRpb25zLnN1cHBvcnRQb2ludGVyKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAncG9pbnRlcnVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgICBvbihkb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBvbihkb2N1bWVudCwgJ2tleWRvd24nLCB0aGlzLl9jaGVja0tleURvd24pO1xuICAgIG9uKGRvY3VtZW50LCAna2V5dXAnLCB0aGlzLl9jaGVja0tleVVwKTtcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgc2VsZWN0ZWRDbGFzczogJ3NvcnRhYmxlLXNlbGVjdGVkJyxcbiAgICAgIG11bHRpRHJhZ0tleTogbnVsbCxcbiAgICAgIGF2b2lkSW1wbGljaXREZXNlbGVjdDogZmFsc2UsXG4gICAgICBzZXREYXRhOiBmdW5jdGlvbiBzZXREYXRhKGRhdGFUcmFuc2ZlciwgZHJhZ0VsKSB7XG4gICAgICAgIHZhciBkYXRhID0gJyc7XG4gICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggJiYgbXVsdGlEcmFnU29ydGFibGUgPT09IHNvcnRhYmxlKSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCwgaSkge1xuICAgICAgICAgICAgZGF0YSArPSAoIWkgPyAnJyA6ICcsICcpICsgbXVsdGlEcmFnRWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhID0gZHJhZ0VsLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGRhdGFUcmFuc2Zlci5zZXREYXRhKCdUZXh0JywgZGF0YSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBNdWx0aURyYWcucHJvdG90eXBlID0ge1xuICAgIG11bHRpRHJhZ0tleURvd246IGZhbHNlLFxuICAgIGlzTXVsdGlEcmFnOiBmYWxzZSxcbiAgICBkZWxheVN0YXJ0R2xvYmFsOiBmdW5jdGlvbiBkZWxheVN0YXJ0R2xvYmFsKF9yZWYpIHtcbiAgICAgIHZhciBkcmFnZ2VkID0gX3JlZi5kcmFnRWw7XG4gICAgICBkcmFnRWwkMSA9IGRyYWdnZWQ7XG4gICAgfSxcbiAgICBkZWxheUVuZGVkOiBmdW5jdGlvbiBkZWxheUVuZGVkKCkge1xuICAgICAgdGhpcy5pc011bHRpRHJhZyA9IH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKTtcbiAgICB9LFxuICAgIHNldHVwQ2xvbmU6IGZ1bmN0aW9uIHNldHVwQ2xvbmUoX3JlZjIpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYyLnNvcnRhYmxlLFxuICAgICAgICBjYW5jZWwgPSBfcmVmMi5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzLnB1c2goY2xvbmUobXVsdGlEcmFnRWxlbWVudHNbaV0pKTtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzW2ldLnNvcnRhYmxlSW5kZXggPSBtdWx0aURyYWdFbGVtZW50c1tpXS5zb3J0YWJsZUluZGV4O1xuICAgICAgICBtdWx0aURyYWdDbG9uZXNbaV0uZHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lc1tpXS5zdHlsZVsnd2lsbC1jaGFuZ2UnXSA9ICcnO1xuICAgICAgICB0b2dnbGVDbGFzcyhtdWx0aURyYWdDbG9uZXNbaV0sIHRoaXMub3B0aW9ucy5zZWxlY3RlZENsYXNzLCBmYWxzZSk7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzW2ldID09PSBkcmFnRWwkMSAmJiB0b2dnbGVDbGFzcyhtdWx0aURyYWdDbG9uZXNbaV0sIHRoaXMub3B0aW9ucy5jaG9zZW5DbGFzcywgZmFsc2UpO1xuICAgICAgfVxuICAgICAgc29ydGFibGUuX2hpZGVDbG9uZSgpO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBjbG9uZTogZnVuY3Rpb24gY2xvbmUoX3JlZjMpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYzLnNvcnRhYmxlLFxuICAgICAgICByb290RWwgPSBfcmVmMy5yb290RWwsXG4gICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCA9IF9yZWYzLmRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICAgICAgY2FuY2VsID0gX3JlZjMuY2FuY2VsO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSkge1xuICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoICYmIG11bHRpRHJhZ1NvcnRhYmxlID09PSBzb3J0YWJsZSkge1xuICAgICAgICAgIGluc2VydE11bHRpRHJhZ0Nsb25lcyh0cnVlLCByb290RWwpO1xuICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCgnY2xvbmUnKTtcbiAgICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgc2hvd0Nsb25lOiBmdW5jdGlvbiBzaG93Q2xvbmUoX3JlZjQpIHtcbiAgICAgIHZhciBjbG9uZU5vd1Nob3duID0gX3JlZjQuY2xvbmVOb3dTaG93bixcbiAgICAgICAgcm9vdEVsID0gX3JlZjQucm9vdEVsLFxuICAgICAgICBjYW5jZWwgPSBfcmVmNC5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIGluc2VydE11bHRpRHJhZ0Nsb25lcyhmYWxzZSwgcm9vdEVsKTtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICBjc3MoY2xvbmUsICdkaXNwbGF5JywgJycpO1xuICAgICAgfSk7XG4gICAgICBjbG9uZU5vd1Nob3duKCk7XG4gICAgICBjbG9uZXNIaWRkZW4gPSBmYWxzZTtcbiAgICAgIGNhbmNlbCgpO1xuICAgIH0sXG4gICAgaGlkZUNsb25lOiBmdW5jdGlvbiBoaWRlQ2xvbmUoX3JlZjUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmNS5zb3J0YWJsZSxcbiAgICAgICAgY2xvbmVOb3dIaWRkZW4gPSBfcmVmNS5jbG9uZU5vd0hpZGRlbixcbiAgICAgICAgY2FuY2VsID0gX3JlZjUuY2FuY2VsO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG4gICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgY3NzKGNsb25lLCAnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlICYmIGNsb25lLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBjbG9uZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbG9uZU5vd0hpZGRlbigpO1xuICAgICAgY2xvbmVzSGlkZGVuID0gdHJ1ZTtcbiAgICAgIGNhbmNlbCgpO1xuICAgIH0sXG4gICAgZHJhZ1N0YXJ0R2xvYmFsOiBmdW5jdGlvbiBkcmFnU3RhcnRHbG9iYWwoX3JlZjYpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWY2LnNvcnRhYmxlO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnICYmIG11bHRpRHJhZ1NvcnRhYmxlKSB7XG4gICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlLm11bHRpRHJhZy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcbiAgICAgIH1cbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4ID0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gU29ydCBtdWx0aS1kcmFnIGVsZW1lbnRzXG4gICAgICBtdWx0aURyYWdFbGVtZW50cyA9IG11bHRpRHJhZ0VsZW1lbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEuc29ydGFibGVJbmRleCAtIGIuc29ydGFibGVJbmRleDtcbiAgICAgIH0pO1xuICAgICAgZHJhZ1N0YXJ0ZWQgPSB0cnVlO1xuICAgIH0sXG4gICAgZHJhZ1N0YXJ0ZWQ6IGZ1bmN0aW9uIGRyYWdTdGFydGVkKF9yZWY3KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWY3LnNvcnRhYmxlO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNvcnQpIHtcbiAgICAgICAgLy8gQ2FwdHVyZSByZWN0cyxcbiAgICAgICAgLy8gaGlkZSBtdWx0aSBkcmFnIGVsZW1lbnRzIChieSBwb3NpdGlvbmluZyB0aGVtIGFic29sdXRlKSxcbiAgICAgICAgLy8gc2V0IG11bHRpIGRyYWcgZWxlbWVudHMgcmVjdHMgdG8gZHJhZ1JlY3QsXG4gICAgICAgIC8vIHNob3cgbXVsdGkgZHJhZyBlbGVtZW50cyxcbiAgICAgICAgLy8gYW5pbWF0ZSB0byByZWN0cyxcbiAgICAgICAgLy8gdW5zZXQgcmVjdHMgJiByZW1vdmUgZnJvbSBET01cblxuICAgICAgICBzb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICAgICAgICAgIGNzcyhtdWx0aURyYWdFbGVtZW50LCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCQxLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgICAgICAgICBzZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQsIGRyYWdSZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgICBpbml0aWFsRm9sZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNvcnRhYmxlLmFuaW1hdGVBbGwoZnVuY3Rpb24gKCkge1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIGluaXRpYWxGb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgYWxsIGF1eGlsaWFyeSBtdWx0aWRyYWcgaXRlbXMgZnJvbSBlbCwgaWYgc29ydGluZyBlbmFibGVkXG4gICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5zb3J0KSB7XG4gICAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBkcmFnT3ZlcjogZnVuY3Rpb24gZHJhZ092ZXIoX3JlZjgpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBfcmVmOC50YXJnZXQsXG4gICAgICAgIGNvbXBsZXRlZCA9IF9yZWY4LmNvbXBsZXRlZCxcbiAgICAgICAgY2FuY2VsID0gX3JlZjguY2FuY2VsO1xuICAgICAgaWYgKGZvbGRpbmcgJiYgfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YodGFyZ2V0KSkge1xuICAgICAgICBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJldmVydDogZnVuY3Rpb24gcmV2ZXJ0KF9yZWY5KSB7XG4gICAgICB2YXIgZnJvbVNvcnRhYmxlID0gX3JlZjkuZnJvbVNvcnRhYmxlLFxuICAgICAgICByb290RWwgPSBfcmVmOS5yb290RWwsXG4gICAgICAgIHNvcnRhYmxlID0gX3JlZjkuc29ydGFibGUsXG4gICAgICAgIGRyYWdSZWN0ID0gX3JlZjkuZHJhZ1JlY3Q7XG4gICAgICBpZiAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBTZXR1cCB1bmZvbGQgYW5pbWF0aW9uXG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICBzb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICB0YXJnZXQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgICByZWN0OiBmb2xkaW5nID8gZ2V0UmVjdChtdWx0aURyYWdFbGVtZW50KSA6IGRyYWdSZWN0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdW5zZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQuZnJvbVJlY3QgPSBkcmFnUmVjdDtcbiAgICAgICAgICBmcm9tU29ydGFibGUucmVtb3ZlQW5pbWF0aW9uU3RhdGUobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIGluc2VydE11bHRpRHJhZ0VsZW1lbnRzKCF0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUsIHJvb3RFbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckNvbXBsZXRlZDogZnVuY3Rpb24gZHJhZ092ZXJDb21wbGV0ZWQoX3JlZjEwKSB7XG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmMTAuc29ydGFibGUsXG4gICAgICAgIGlzT3duZXIgPSBfcmVmMTAuaXNPd25lcixcbiAgICAgICAgaW5zZXJ0aW9uID0gX3JlZjEwLmluc2VydGlvbixcbiAgICAgICAgYWN0aXZlU29ydGFibGUgPSBfcmVmMTAuYWN0aXZlU29ydGFibGUsXG4gICAgICAgIHBhcmVudEVsID0gX3JlZjEwLnBhcmVudEVsLFxuICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYxMC5wdXRTb3J0YWJsZTtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgaWYgKGluc2VydGlvbikge1xuICAgICAgICAvLyBDbG9uZXMgbXVzdCBiZSBoaWRkZW4gYmVmb3JlIGZvbGRpbmcgYW5pbWF0aW9uIHRvIGNhcHR1cmUgZHJhZ1JlY3RBYnNvbHV0ZSBwcm9wZXJseVxuICAgICAgICBpZiAoaXNPd25lcikge1xuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9oaWRlQ2xvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpbml0aWFsRm9sZGluZyA9IGZhbHNlO1xuICAgICAgICAvLyBJZiBsZWF2aW5nIHNvcnQ6ZmFsc2Ugcm9vdCwgb3IgYWxyZWFkeSBmb2xkaW5nIC0gRm9sZCB0byBuZXcgbG9jYXRpb25cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0aW9uICYmIG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEgJiYgKGZvbGRpbmcgfHwgIWlzT3duZXIgJiYgIWFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuc29ydCAmJiAhcHV0U29ydGFibGUpKSB7XG4gICAgICAgICAgLy8gRm9sZDogU2V0IGFsbCBtdWx0aSBkcmFnIGVsZW1lbnRzJ3MgcmVjdHMgdG8gZHJhZ0VsJ3MgcmVjdCB3aGVuIG11bHRpLWRyYWcgZWxlbWVudHMgYXJlIGludmlzaWJsZVxuICAgICAgICAgIHZhciBkcmFnUmVjdEFic29sdXRlID0gZ2V0UmVjdChkcmFnRWwkMSwgZmFsc2UsIHRydWUsIHRydWUpO1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgICAgICAgICAgc2V0UmVjdChtdWx0aURyYWdFbGVtZW50LCBkcmFnUmVjdEFic29sdXRlKTtcblxuICAgICAgICAgICAgLy8gTW92ZSBlbGVtZW50KHMpIHRvIGVuZCBvZiBwYXJlbnRFbCBzbyB0aGF0IGl0IGRvZXMgbm90IGludGVyZmVyZSB3aXRoIG11bHRpLWRyYWcgY2xvbmVzIGluc2VydGlvbiBpZiB0aGV5IGFyZSBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gd2hpbGUgZm9sZGluZywgYW5kIHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUgdGhlbSBhZ2FpbiBiZWNhdXNlIG9sZCBzb3J0YWJsZSB3aWxsIG5vIGxvbmdlciBiZSBmcm9tU29ydGFibGVcbiAgICAgICAgICAgIHBhcmVudEVsLmFwcGVuZENoaWxkKG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvbGRpbmcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xvbmVzIG11c3QgYmUgc2hvd24gKGFuZCBjaGVjayB0byByZW1vdmUgbXVsdGkgZHJhZ3MpIGFmdGVyIGZvbGRpbmcgd2hlbiBpbnRlcmZlcmluZyBtdWx0aURyYWdFbGVtZW50cyBhcmUgbW92ZWQgb3V0XG4gICAgICAgIGlmICghaXNPd25lcikge1xuICAgICAgICAgIC8vIE9ubHkgcmVtb3ZlIGlmIG5vdCBmb2xkaW5nIChmb2xkaW5nIHdpbGwgcmVtb3ZlIHRoZW0gYW55d2F5cylcbiAgICAgICAgICBpZiAoIWZvbGRpbmcpIHtcbiAgICAgICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgY2xvbmVzSGlkZGVuQmVmb3JlID0gY2xvbmVzSGlkZGVuO1xuICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShzb3J0YWJsZSk7XG5cbiAgICAgICAgICAgIC8vIFVuZm9sZCBhbmltYXRpb24gZm9yIGNsb25lcyBpZiBzaG93aW5nIGZyb20gaGlkZGVuXG4gICAgICAgICAgICBpZiAoYWN0aXZlU29ydGFibGUub3B0aW9ucy5hbmltYXRpb24gJiYgIWNsb25lc0hpZGRlbiAmJiBjbG9uZXNIaWRkZW5CZWZvcmUpIHtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuYWRkQW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBjbG9uZSxcbiAgICAgICAgICAgICAgICAgIHJlY3Q6IGNsb25lc0Zyb21SZWN0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2xvbmUuZnJvbVJlY3QgPSBjbG9uZXNGcm9tUmVjdDtcbiAgICAgICAgICAgICAgICBjbG9uZS50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShzb3J0YWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckFuaW1hdGlvbkNhcHR1cmU6IGZ1bmN0aW9uIGRyYWdPdmVyQW5pbWF0aW9uQ2FwdHVyZShfcmVmMTEpIHtcbiAgICAgIHZhciBkcmFnUmVjdCA9IF9yZWYxMS5kcmFnUmVjdCxcbiAgICAgICAgaXNPd25lciA9IF9yZWYxMS5pc093bmVyLFxuICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYxMS5hY3RpdmVTb3J0YWJsZTtcbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudC50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgfSk7XG4gICAgICBpZiAoYWN0aXZlU29ydGFibGUub3B0aW9ucy5hbmltYXRpb24gJiYgIWlzT3duZXIgJiYgYWN0aXZlU29ydGFibGUubXVsdGlEcmFnLmlzTXVsdGlEcmFnKSB7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0ID0gX2V4dGVuZHMoe30sIGRyYWdSZWN0KTtcbiAgICAgICAgdmFyIGRyYWdNYXRyaXggPSBtYXRyaXgoZHJhZ0VsJDEsIHRydWUpO1xuICAgICAgICBjbG9uZXNGcm9tUmVjdC50b3AgLT0gZHJhZ01hdHJpeC5mO1xuICAgICAgICBjbG9uZXNGcm9tUmVjdC5sZWZ0IC09IGRyYWdNYXRyaXguZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGU6IGZ1bmN0aW9uIGRyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGUoKSB7XG4gICAgICBpZiAoZm9sZGluZykge1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKF9yZWYxMikge1xuICAgICAgdmFyIGV2dCA9IF9yZWYxMi5vcmlnaW5hbEV2ZW50LFxuICAgICAgICByb290RWwgPSBfcmVmMTIucm9vdEVsLFxuICAgICAgICBwYXJlbnRFbCA9IF9yZWYxMi5wYXJlbnRFbCxcbiAgICAgICAgc29ydGFibGUgPSBfcmVmMTIuc29ydGFibGUsXG4gICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCA9IF9yZWYxMi5kaXNwYXRjaFNvcnRhYmxlRXZlbnQsXG4gICAgICAgIG9sZEluZGV4ID0gX3JlZjEyLm9sZEluZGV4LFxuICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYxMi5wdXRTb3J0YWJsZTtcbiAgICAgIHZhciB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgdGhpcy5zb3J0YWJsZTtcbiAgICAgIGlmICghZXZ0KSByZXR1cm47XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnRFbC5jaGlsZHJlbjtcblxuICAgICAgLy8gTXVsdGktZHJhZyBzZWxlY3Rpb25cbiAgICAgIGlmICghZHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubXVsdGlEcmFnS2V5ICYmICF0aGlzLm11bHRpRHJhZ0tleURvd24pIHtcbiAgICAgICAgICB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCQxLCBvcHRpb25zLnNlbGVjdGVkQ2xhc3MsICF+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSkpO1xuICAgICAgICBpZiAoIX5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKSkge1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnB1c2goZHJhZ0VsJDEpO1xuICAgICAgICAgIGRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlLFxuICAgICAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgICAgICBuYW1lOiAnc2VsZWN0JyxcbiAgICAgICAgICAgIHRhcmdldEVsOiBkcmFnRWwkMSxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gTW9kaWZpZXIgYWN0aXZhdGVkLCBzZWxlY3QgZnJvbSBsYXN0IHRvIGRyYWdFbFxuICAgICAgICAgIGlmIChldnQuc2hpZnRLZXkgJiYgbGFzdE11bHRpRHJhZ1NlbGVjdCAmJiBzb3J0YWJsZS5lbC5jb250YWlucyhsYXN0TXVsdGlEcmFnU2VsZWN0KSkge1xuICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IGluZGV4KGxhc3RNdWx0aURyYWdTZWxlY3QpLFxuICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleChkcmFnRWwkMSk7XG4gICAgICAgICAgICBpZiAofmxhc3RJbmRleCAmJiB+Y3VycmVudEluZGV4ICYmIGxhc3RJbmRleCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgICAgICAgIC8vIE11c3QgaW5jbHVkZSBsYXN0TXVsdGlEcmFnU2VsZWN0IChzZWxlY3QgaXQpLCBpbiBjYXNlIG1vZGlmaWVkIHNlbGVjdGlvbiBmcm9tIG5vIHNlbGVjdGlvblxuICAgICAgICAgICAgICAvLyAoYnV0IHByZXZpb3VzIHNlbGVjdGlvbiBleGlzdGVkKVxuICAgICAgICAgICAgICB2YXIgbiwgaTtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgIGkgPSBsYXN0SW5kZXg7XG4gICAgICAgICAgICAgICAgbiA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gY3VycmVudEluZGV4O1xuICAgICAgICAgICAgICAgIG4gPSBsYXN0SW5kZXggKyAxO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZvciAoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGNoaWxkcmVuW2ldKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgdG9nZ2xlQ2xhc3MoY2hpbGRyZW5baV0sIG9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICByb290RWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgICAgdGFyZ2V0RWw6IGNoaWxkcmVuW2ldLFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdE11bHRpRHJhZ1NlbGVjdCA9IGRyYWdFbCQxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHRvU29ydGFibGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc3BsaWNlKG11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpLCAxKTtcbiAgICAgICAgICBsYXN0TXVsdGlEcmFnU2VsZWN0ID0gbnVsbDtcbiAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICAgICAgbmFtZTogJ2Rlc2VsZWN0JyxcbiAgICAgICAgICAgIHRhcmdldEVsOiBkcmFnRWwkMSxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE11bHRpLWRyYWcgZHJvcFxuICAgICAgaWYgKGRyYWdTdGFydGVkICYmIHRoaXMuaXNNdWx0aURyYWcpIHtcbiAgICAgICAgZm9sZGluZyA9IGZhbHNlO1xuICAgICAgICAvLyBEbyBub3QgXCJ1bmZvbGRcIiBhZnRlciBhcm91bmQgZHJhZ0VsIGlmIHJldmVydGVkXG4gICAgICAgIGlmICgocGFyZW50RWxbZXhwYW5kb10ub3B0aW9ucy5zb3J0IHx8IHBhcmVudEVsICE9PSByb290RWwpICYmIG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCQxKSxcbiAgICAgICAgICAgIG11bHRpRHJhZ0luZGV4ID0gaW5kZXgoZHJhZ0VsJDEsICc6bm90KC4nICsgdGhpcy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MgKyAnKScpO1xuICAgICAgICAgIGlmICghaW5pdGlhbEZvbGRpbmcgJiYgb3B0aW9ucy5hbmltYXRpb24pIGRyYWdFbCQxLnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgdG9Tb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgICBpZiAoIWluaXRpYWxGb2xkaW5nKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgZHJhZ0VsJDEuZnJvbVJlY3QgPSBkcmFnUmVjdDtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCAhPT0gZHJhZ0VsJDEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciByZWN0ID0gZm9sZGluZyA/IGdldFJlY3QobXVsdGlEcmFnRWxlbWVudCkgOiBkcmFnUmVjdDtcbiAgICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQuZnJvbVJlY3QgPSByZWN0O1xuXG4gICAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHVuZm9sZCBhbmltYXRpb25cbiAgICAgICAgICAgICAgICAgIHRvU29ydGFibGUuYWRkQW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Q6IHJlY3RcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE11bHRpIGRyYWcgZWxlbWVudHMgYXJlIG5vdCBuZWNlc3NhcmlseSByZW1vdmVkIGZyb20gdGhlIERPTSBvbiBkcm9wLCBzbyB0byByZWluc2VydFxuICAgICAgICAgICAgLy8gcHJvcGVybHkgdGhleSBtdXN0IGFsbCBiZSByZW1vdmVkXG4gICAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5bbXVsdGlEcmFnSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50RWwuaW5zZXJ0QmVmb3JlKG11bHRpRHJhZ0VsZW1lbnQsIGNoaWxkcmVuW211bHRpRHJhZ0luZGV4XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbXVsdGlEcmFnSW5kZXgrKztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBJZiBpbml0aWFsIGZvbGRpbmcgaXMgZG9uZSwgdGhlIGVsZW1lbnRzIG1heSBoYXZlIGNoYW5nZWQgcG9zaXRpb24gYmVjYXVzZSB0aGV5IGFyZSBub3dcbiAgICAgICAgICAgIC8vIHVuZm9sZGluZyBhcm91bmQgZHJhZ0VsLCBldmVuIHRob3VnaCBkcmFnRWwgbWF5IG5vdCBoYXZlIGhpcyBpbmRleCBjaGFuZ2VkLCBzbyB1cGRhdGUgZXZlbnRcbiAgICAgICAgICAgIC8vIG11c3QgYmUgZmlyZWQgaGVyZSBhcyBTb3J0YWJsZSB3aWxsIG5vdC5cbiAgICAgICAgICAgIGlmIChvbGRJbmRleCA9PT0gaW5kZXgoZHJhZ0VsJDEpKSB7XG4gICAgICAgICAgICAgIHZhciB1cGRhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggIT09IGluZGV4KG11bHRpRHJhZ0VsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICB1cGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoJ3VwZGF0ZScpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCgnc29ydCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTXVzdCBiZSBkb25lIGFmdGVyIGNhcHR1cmluZyBpbmRpdmlkdWFsIHJlY3RzIChzY3JvbGwgYmFyKVxuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHVuc2V0UmVjdChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0b1NvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHRvU29ydGFibGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBjbG9uZXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAocm9vdEVsID09PSBwYXJlbnRFbCB8fCBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSAhPT0gJ2Nsb25lJykge1xuICAgICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICBjbG9uZS5wYXJlbnROb2RlICYmIGNsb25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG51bGxpbmdHbG9iYWw6IGZ1bmN0aW9uIG51bGxpbmdHbG9iYWwoKSB7XG4gICAgICB0aGlzLmlzTXVsdGlEcmFnID0gZHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5sZW5ndGggPSAwO1xuICAgIH0sXG4gICAgZGVzdHJveUdsb2JhbDogZnVuY3Rpb24gZGVzdHJveUdsb2JhbCgpIHtcbiAgICAgIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG4gICAgICBvZmYoZG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvZmYoZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvZmYoZG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5fY2hlY2tLZXlEb3duKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ2tleXVwJywgdGhpcy5fY2hlY2tLZXlVcCk7XG4gICAgfSxcbiAgICBfZGVzZWxlY3RNdWx0aURyYWc6IGZ1bmN0aW9uIF9kZXNlbGVjdE11bHRpRHJhZyhldnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZHJhZ1N0YXJ0ZWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZHJhZ1N0YXJ0ZWQpIHJldHVybjtcblxuICAgICAgLy8gT25seSBkZXNlbGVjdCBpZiBzZWxlY3Rpb24gaXMgaW4gdGhpcyBzb3J0YWJsZVxuICAgICAgaWYgKG11bHRpRHJhZ1NvcnRhYmxlICE9PSB0aGlzLnNvcnRhYmxlKSByZXR1cm47XG5cbiAgICAgIC8vIE9ubHkgZGVzZWxlY3QgaWYgdGFyZ2V0IGlzIG5vdCBpdGVtIGluIHRoaXMgc29ydGFibGVcbiAgICAgIGlmIChldnQgJiYgY2xvc2VzdChldnQudGFyZ2V0LCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLnNvcnRhYmxlLmVsLCBmYWxzZSkpIHJldHVybjtcblxuICAgICAgLy8gT25seSBkZXNlbGVjdCBpZiBsZWZ0IGNsaWNrXG4gICAgICBpZiAoZXZ0ICYmIGV2dC5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIHdoaWxlIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGVsID0gbXVsdGlEcmFnRWxlbWVudHNbMF07XG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5zaGlmdCgpO1xuICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZTogdGhpcy5zb3J0YWJsZSxcbiAgICAgICAgICByb290RWw6IHRoaXMuc29ydGFibGUuZWwsXG4gICAgICAgICAgbmFtZTogJ2Rlc2VsZWN0JyxcbiAgICAgICAgICB0YXJnZXRFbDogZWwsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgX2NoZWNrS2V5RG93bjogZnVuY3Rpb24gX2NoZWNrS2V5RG93bihldnQpIHtcbiAgICAgIGlmIChldnQua2V5ID09PSB0aGlzLm9wdGlvbnMubXVsdGlEcmFnS2V5KSB7XG4gICAgICAgIHRoaXMubXVsdGlEcmFnS2V5RG93biA9IHRydWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBfY2hlY2tLZXlVcDogZnVuY3Rpb24gX2NoZWNrS2V5VXAoZXZ0KSB7XG4gICAgICBpZiAoZXZ0LmtleSA9PT0gdGhpcy5vcHRpb25zLm11bHRpRHJhZ0tleSkge1xuICAgICAgICB0aGlzLm11bHRpRHJhZ0tleURvd24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcyhNdWx0aURyYWcsIHtcbiAgICAvLyBTdGF0aWMgbWV0aG9kcyAmIHByb3BlcnRpZXNcbiAgICBwbHVnaW5OYW1lOiAnbXVsdGlEcmFnJyxcbiAgICB1dGlsczoge1xuICAgICAgLyoqXHJcbiAgICAgICAqIFNlbGVjdHMgdGhlIHByb3ZpZGVkIG11bHRpLWRyYWcgaXRlbVxyXG4gICAgICAgKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgVGhlIGVsZW1lbnQgdG8gYmUgc2VsZWN0ZWRcclxuICAgICAgICovXG4gICAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChlbCkge1xuICAgICAgICB2YXIgc29ydGFibGUgPSBlbC5wYXJlbnROb2RlW2V4cGFuZG9dO1xuICAgICAgICBpZiAoIXNvcnRhYmxlIHx8ICFzb3J0YWJsZS5vcHRpb25zLm11bHRpRHJhZyB8fCB+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihlbCkpIHJldHVybjtcbiAgICAgICAgaWYgKG11bHRpRHJhZ1NvcnRhYmxlICYmIG11bHRpRHJhZ1NvcnRhYmxlICE9PSBzb3J0YWJsZSkge1xuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlLm11bHRpRHJhZy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHNvcnRhYmxlO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCBzb3J0YWJsZS5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIHRydWUpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5wdXNoKGVsKTtcbiAgICAgIH0sXG4gICAgICAvKipcclxuICAgICAgICogRGVzZWxlY3RzIHRoZSBwcm92aWRlZCBtdWx0aS1kcmFnIGl0ZW1cclxuICAgICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgIFRoZSBlbGVtZW50IHRvIGJlIGRlc2VsZWN0ZWRcclxuICAgICAgICovXG4gICAgICBkZXNlbGVjdDogZnVuY3Rpb24gZGVzZWxlY3QoZWwpIHtcbiAgICAgICAgdmFyIHNvcnRhYmxlID0gZWwucGFyZW50Tm9kZVtleHBhbmRvXSxcbiAgICAgICAgICBpbmRleCA9IG11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZWwpO1xuICAgICAgICBpZiAoIXNvcnRhYmxlIHx8ICFzb3J0YWJsZS5vcHRpb25zLm11bHRpRHJhZyB8fCAhfmluZGV4KSByZXR1cm47XG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCBzb3J0YWJsZS5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV2ZW50UHJvcGVydGllczogZnVuY3Rpb24gZXZlbnRQcm9wZXJ0aWVzKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG4gICAgICB2YXIgb2xkSW5kaWNpZXMgPSBbXSxcbiAgICAgICAgbmV3SW5kaWNpZXMgPSBbXTtcbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgb2xkSW5kaWNpZXMucHVzaCh7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICBpbmRleDogbXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG11bHRpRHJhZ0VsZW1lbnRzIHdpbGwgYWxyZWFkeSBiZSBzb3J0ZWQgaWYgZm9sZGluZ1xuICAgICAgICB2YXIgbmV3SW5kZXg7XG4gICAgICAgIGlmIChmb2xkaW5nICYmIG11bHRpRHJhZ0VsZW1lbnQgIT09IGRyYWdFbCQxKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChmb2xkaW5nKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50LCAnOm5vdCguJyArIF90aGlzMy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MgKyAnKScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3SW5kaWNpZXMucHVzaCh7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICBpbmRleDogbmV3SW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGl0ZW1zOiBfdG9Db25zdW1hYmxlQXJyYXkobXVsdGlEcmFnRWxlbWVudHMpLFxuICAgICAgICBjbG9uZXM6IFtdLmNvbmNhdChtdWx0aURyYWdDbG9uZXMpLFxuICAgICAgICBvbGRJbmRpY2llczogb2xkSW5kaWNpZXMsXG4gICAgICAgIG5ld0luZGljaWVzOiBuZXdJbmRpY2llc1xuICAgICAgfTtcbiAgICB9LFxuICAgIG9wdGlvbkxpc3RlbmVyczoge1xuICAgICAgbXVsdGlEcmFnS2V5OiBmdW5jdGlvbiBtdWx0aURyYWdLZXkoa2V5KSB7XG4gICAgICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoa2V5ID09PSAnY3RybCcpIHtcbiAgICAgICAgICBrZXkgPSAnQ29udHJvbCc7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGluc2VydE11bHRpRHJhZ0VsZW1lbnRzKGNsb25lc0luc2VydGVkLCByb290RWwpIHtcbiAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCwgaSkge1xuICAgIHZhciB0YXJnZXQgPSByb290RWwuY2hpbGRyZW5bbXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4ICsgKGNsb25lc0luc2VydGVkID8gTnVtYmVyKGkpIDogMCldO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUobXVsdGlEcmFnRWxlbWVudCwgdGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxyXG4gKiBJbnNlcnQgbXVsdGktZHJhZyBjbG9uZXNcclxuICogQHBhcmFtICB7W0Jvb2xlYW5dfSBlbGVtZW50c0luc2VydGVkICBXaGV0aGVyIHRoZSBtdWx0aS1kcmFnIGVsZW1lbnRzIGFyZSBpbnNlcnRlZFxyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gcm9vdEVsXHJcbiAqL1xuZnVuY3Rpb24gaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKGVsZW1lbnRzSW5zZXJ0ZWQsIHJvb3RFbCkge1xuICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUsIGkpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcm9vdEVsLmNoaWxkcmVuW2Nsb25lLnNvcnRhYmxlSW5kZXggKyAoZWxlbWVudHNJbnNlcnRlZCA/IE51bWJlcihpKSA6IDApXTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lLCB0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByb290RWwuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpIHtcbiAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgIG11bHRpRHJhZ0VsZW1lbnQucGFyZW50Tm9kZSAmJiBtdWx0aURyYWdFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gIH0pO1xufVxuXG5Tb3J0YWJsZS5tb3VudChuZXcgQXV0b1Njcm9sbFBsdWdpbigpKTtcblNvcnRhYmxlLm1vdW50KFJlbW92ZSwgUmV2ZXJ0KTtcblxuZXhwb3J0IGRlZmF1bHQgU29ydGFibGU7XG5leHBvcnQgeyBNdWx0aURyYWdQbHVnaW4gYXMgTXVsdGlEcmFnLCBTb3J0YWJsZSwgU3dhcFBsdWdpbiBhcyBTd2FwIH07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/sortablejs/modular/sortable.esm.js\n"); - -/***/ }), - -/***/ "./node_modules/webpack/buildin/global.js": -/*!***********************************!*\ - !*** (webpack)/buildin/global.js ***! - \***********************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2NkMDAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7O0FBRTVDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9nbG9iYWwuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/global.js\n"); - -/***/ }), - -/***/ "./node_modules/webpack/buildin/module.js": -/*!***********************************!*\ - !*** (webpack)/buildin/module.js ***! - \***********************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2NlZDIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRpZiAoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XG5cdH1cblx0cmV0dXJuIG1vZHVsZTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/module.js\n"); - -/***/ }) - -}]); \ No newline at end of file +"use strict";(self.webpackChunkgrav_plugin_form=self.webpackChunkgrav_plugin_form||[]).push([["vendor"],{"./node_modules/dropzone/dist/dropzone.js":(e,t,n)=>{function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function o(e,t){return!t||"object"!==i(t)&&"function"!=typeof t?a(e):t}function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e,t){return l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},l(e,t)}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){for(var n=0;n1?n-1:0),o=1;o
'),this.element.appendChild(e));var s=e.getElementsByTagName("span")[0];return s&&(null!=s.textContent?s.textContent=this.options.dictFallbackMessage:null!=s.innerText&&(s.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,i){var o={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},r=e.width/e.height;null==t&&null==n?(t=o.srcWidth,n=o.srcHeight):null==t?t=n*r:null==n&&(n=t/r);var a=(t=Math.min(t,o.srcWidth))/(n=Math.min(n,o.srcHeight));if(o.srcWidth>t||o.srcHeight>n)if("crop"===i)r>a?(o.srcHeight=e.height,o.srcWidth=o.srcHeight*a):(o.srcWidth=e.width,o.srcHeight=o.srcWidth/a);else{if("contain"!==i)throw new Error("Unknown resizeMethod '".concat(i,"'"));r>a?n=t/r:t=n*r}return o.srcX=(e.width-o.srcWidth)/2,o.srcY=(e.height-o.srcHeight)/2,o.trgWidth=t,o.trgHeight=n,o},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
\n
\n
\n
\n
\n
\n
\n
\n
\n \n Check\n \n \n \n \n
\n
\n \n Error\n \n \n \n \n \n \n
\n
',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var n=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer){e.previewElement=t.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var i=!0,o=!1,r=void 0;try{for(var a,l=e.previewElement.querySelectorAll("[data-dz-name]")[Symbol.iterator]();!(i=(a=l.next()).done);i=!0){var s=a.value;s.textContent=e.name}}catch(e){o=!0,r=e}finally{try{i||null==l.return||l.return()}finally{if(o)throw r}}var u=!0,c=!1,d=void 0;try{for(var h,p=e.previewElement.querySelectorAll("[data-dz-size]")[Symbol.iterator]();!(u=(h=p.next()).done);u=!0)(s=h.value).innerHTML=this.filesize(e.size)}catch(e){c=!0,d=e}finally{try{u||null==p.return||p.return()}finally{if(c)throw d}}this.options.addRemoveLinks&&(e._removeLink=t.createElement(''.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var f=function(i){return i.preventDefault(),i.stopPropagation(),e.status===t.UPLOADING?t.confirm(n.options.dictCancelUploadConfirmation,(function(){return n.removeFile(e)})):n.options.dictRemoveFileConfirmation?t.confirm(n.options.dictRemoveFileConfirmation,(function(){return n.removeFile(e)})):n.removeFile(e)},v=!0,m=!1,g=void 0;try{for(var y,b=e.previewElement.querySelectorAll("[data-dz-remove]")[Symbol.iterator]();!(v=(y=b.next()).done);v=!0){y.value.addEventListener("click",f)}}catch(e){m=!0,g=e}finally{try{v||null==b.return||b.return()}finally{if(m)throw g}}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n=!0,i=!1,o=void 0;try{for(var r,a=e.previewElement.querySelectorAll("[data-dz-thumbnail]")[Symbol.iterator]();!(n=(r=a.next()).done);n=!0){var l=r.value;l.alt=e.name,l.src=t}}catch(e){i=!0,o=e}finally{try{n||null==a.return||a.return()}finally{if(i)throw o}}return setTimeout((function(){return e.previewElement.classList.add("dz-image-preview")}),1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"String"!=typeof t&&t.error&&(t=t.error);var n=!0,i=!1,o=void 0;try{for(var r,a=e.previewElement.querySelectorAll("[data-dz-errormessage]")[Symbol.iterator]();!(n=(r=a.next()).done);n=!0){r.value.textContent=t}}catch(e){i=!0,o=e}finally{try{n||null==a.return||a.return()}finally{if(i)throw o}}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var i=!0,o=!1,r=void 0;try{for(var a,l=e.previewElement.querySelectorAll("[data-dz-uploadprogress]")[Symbol.iterator]();!(i=(a=l.next()).done);i=!0){var s=a.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){o=!0,r=e}finally{try{i||null==l.return||l.return()}finally{if(o)throw r}}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}},this.prototype._thumbnailQueue=[],this.prototype._processingThumbnail=!1}},{key:"extend",value:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i
"))),this.clickableElements.length){!function n(){return e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",t.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",(function(){var t=e.hiddenFileInput.files;if(t.length){var i=!0,o=!1,r=void 0;try{for(var a,l=t[Symbol.iterator]();!(i=(a=l.next()).done);i=!0){var s=a.value;e.addFile(s)}}catch(e){o=!0,r=e}finally{try{i||null==l.return||l.return()}finally{if(o)throw r}}}return e.emit("addedfiles",t),n()}))}()}this.URL=null!==window.URL?window.URL:window.webkitURL;var n=!0,i=!1,o=void 0;try{for(var r,a=this.events[Symbol.iterator]();!(n=(r=a.next()).done);n=!0){var l=r.value;this.on(l,this.options[l])}}catch(e){i=!0,o=e}finally{try{n||null==a.return||a.return()}finally{if(i)throw o}}this.on("uploadprogress",(function(){return e.updateTotalUploadProgress()})),this.on("removedfile",(function(){return e.updateTotalUploadProgress()})),this.on("canceled",(function(t){return e.emit("complete",t)})),this.on("complete",(function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout((function(){return e.emit("queuecomplete")}),0)}));var s=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),i+='
');var o=t.createElement(i);return"FORM"!==this.element.tagName?(n=t.createElement('
'))).appendChild(o):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=n?n:o}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t=!0,n=!1,i=void 0;try{for(var o,r=e[Symbol.iterator]();!(t=(o=r.next()).done);t=!0){var a=o.value;if(/(^| )fallback($| )/.test(a.className))return a}}catch(e){n=!0,i=e}finally{try{t||null==r.return||r.return()}finally{if(n)throw i}}},t=0,n=["div","form"];t0){for(var i=["tb","gb","mb","kb","b"],o=0;o=Math.pow(this.options.filesizeBase,4-o)/10){t=e/Math.pow(this.options.filesizeBase,4-o),n=r;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var o=!0,r=!1,a=void 0;try{for(var l,s=i[Symbol.iterator]();!(o=(l=s.next()).done);o=!0){var u=l.value;u.isFile?u.file((function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)})):u.isDirectory&&n._addFilesFromDirectory(u,"".concat(t,"/").concat(u.name))}}catch(e){r=!0,a=e}finally{try{o||null==s.return||s.return()}finally{if(r)throw a}}e()}return null}),o)}()}},{key:"accept",value:function(e,n){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?n(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):t.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(n(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,n):n(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var n=this;e.upload={uuid:t.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=t.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,(function(t){t?(e.accepted=!1,n._errorProcessing([e],t)):(e.accepted=!0,n.options.autoQueue&&n.enqueueFile(e)),n._updateMaxFilesReachedClass()}))}},{key:"enqueueFiles",value:function(e){var t=!0,n=!1,i=void 0;try{for(var o,r=e[Symbol.iterator]();!(t=(o=r.next()).done);t=!0){var a=o.value;this.enqueueFile(a)}}catch(e){n=!0,i=e}finally{try{t||null==r.return||r.return()}finally{if(n)throw i}}return null}},{key:"enqueueFile",value:function(e){var n=this;if(e.status!==t.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=t.QUEUED,this.options.autoProcessQueue)return setTimeout((function(){return n.processQueue()}),0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout((function(){return t._processThumbnailQueue()}),0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,(function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()}))}}},{key:"removeFile",value:function(e){if(e.status===t.UPLOADING&&this.cancelUpload(e),this.files=p(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var n=!0,i=!1,o=void 0;try{for(var r,a=this.files.slice()[Symbol.iterator]();!(n=(r=a.next()).done);n=!0){var l=r.value;(l.status!==t.UPLOADING||e)&&this.removeFile(l)}}catch(e){i=!0,o=e}finally{try{n||null==a.return||a.return()}finally{if(i)throw o}}return null}},{key:"resizeImage",value:function(e,n,i,o,r){var a=this;return this.createThumbnail(e,n,i,o,!0,(function(n,i){if(null==i)return r(e);var o=a.options.resizeMimeType;null==o&&(o=e.type);var l=i.toDataURL(o,a.options.resizeQuality);return r(t.dataURItoBlob(l))}))}},{key:"createThumbnail",value:function(e,t,n,i,o,r){var a=this,l=new FileReader;l.onload=function(){e.dataURL=l.result,"image/svg+xml"!==e.type?a.createThumbnailFromUrl(e,t,n,i,o,r):null!=r&&r(l.result)},l.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,i){var o=this,r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];if(this.emit("addedfile",e),this.emit("complete",e),r){e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.resizeMethod,this.options.fixOrientation,(function(t){o.emit("thumbnail",e,t),n&&n()}),i)}else this.emit("thumbnail",e,t),n&&n()}},{key:"createThumbnailFromUrl",value:function(e,t,n,i,o,r,a){var l=this,s=document.createElement("img");return a&&(s.crossOrigin=a),s.onload=function(){var a=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&o&&(a=function(e){return EXIF.getData(s,(function(){return e(EXIF.getTag(this,"Orientation"))}))}),a((function(o){e.width=s.width,e.height=s.height;var a=l.options.resize.call(l,e,t,n,i),u=document.createElement("canvas"),c=u.getContext("2d");switch(u.width=a.trgWidth,u.height=a.trgHeight,o>4&&(u.width=a.trgHeight,u.height=a.trgWidth),o){case 2:c.translate(u.width,0),c.scale(-1,1);break;case 3:c.translate(u.width,u.height),c.rotate(Math.PI);break;case 4:c.translate(0,u.height),c.scale(1,-1);break;case 5:c.rotate(.5*Math.PI),c.scale(1,-1);break;case 6:c.rotate(.5*Math.PI),c.translate(0,-u.width);break;case 7:c.rotate(.5*Math.PI),c.translate(u.height,-u.width),c.scale(-1,1);break;case 8:c.rotate(-.5*Math.PI),c.translate(-u.height,0)}v(c,s,null!=a.srcX?a.srcX:0,null!=a.srcY?a.srcY:0,a.srcWidth,a.srcHeight,null!=a.trgX?a.trgX:0,null!=a.trgY?a.trgY:0,a.trgWidth,a.trgHeight);var d=u.toDataURL("image/png");if(null!=r)return r(d,u)}))},null!=r&&(s.onerror=r),s.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var i=this.getQueuedFiles();if(i.length>0){if(this.options.uploadMultiple)return this.processFiles(i.slice(0,e-t));for(;n1?t-1:0),i=1;in.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(o.size/n.options.chunkSize)}if(e[0].upload.chunked){var r=e[0],a=i[0];r.upload.chunks=[];var l=function(){for(var i=0;void 0!==r.upload.chunks[i];)i++;if(!(i>=r.upload.totalChunkCount)){0;var o=i*n.options.chunkSize,l=Math.min(o+n.options.chunkSize,r.size),s={name:n._getParamName(0),data:a.webkitSlice?a.webkitSlice(o,l):a.slice(o,l),filename:r.upload.filename,chunkIndex:i};r.upload.chunks[i]={file:r,index:i,dataBlock:s,status:t.UPLOADING,progress:0,retries:0},n._uploadData(e,[s])}};if(r.upload.finishedChunkUpload=function(i){var o=!0;i.status=t.SUCCESS,i.dataBlock=null,i.xhr=null;for(var a=0;a=a;l?r++:r--)o[r]=t.charCodeAt(r);return new Blob([i],{type:n})};var p=function(e,t){return e.filter((function(e){return e!==t})).map((function(e){return e}))},f=function(e){return e.replace(/[\-_](\w)/g,(function(e){return e.charAt(1).toUpperCase()}))};h.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},h.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},h.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},h.getElements=function(e,t){var n,i;if(e instanceof Array){i=[];try{var o=!0,r=!1,a=void 0;try{for(var l,s=e[Symbol.iterator]();!(o=(l=s.next()).done);o=!0)n=l.value,i.push(this.getElement(n,t))}catch(e){r=!0,a=e}finally{try{o||null==s.return||s.return()}finally{if(r)throw a}}}catch(e){i=null}}else if("string"==typeof e){i=[];var u=!0,c=!1,d=void 0;try{for(var h,p=document.querySelectorAll(e)[Symbol.iterator]();!(u=(h=p.next()).done);u=!0)n=h.value,i.push(n)}catch(e){c=!0,d=e}finally{try{u||null==p.return||p.return()}finally{if(c)throw d}}}else null!=e.nodeType&&(i=[e]);if(null==i||!i.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return i},h.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},h.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n=e.type,i=n.replace(/\/.*$/,""),o=!0,r=!1,a=void 0;try{for(var l,s=t[Symbol.iterator]();!(o=(l=s.next()).done);o=!0){var u=l.value;if("."===(u=u.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(u.toLowerCase(),e.name.length-u.length))return!0}else if(/\/\*$/.test(u)){if(i===u.replace(/\/.*$/,""))return!0}else if(n===u)return!0}}catch(e){r=!0,a=e}finally{try{o||null==s.return||s.return()}finally{if(r)throw a}}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each((function(){return new h(this,e)}))}),null!==e?e.exports=h:window.Dropzone=h,h.ADDED="added",h.QUEUED="queued",h.ACCEPTED=h.QUEUED,h.UPLOADING="uploading",h.PROCESSING=h.UPLOADING,h.CANCELED="canceled",h.ERROR="error",h.SUCCESS="success";var v=function(e,t,n,i,o,r,a,l,s,u){var c=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var i=n.getContext("2d");i.drawImage(e,0,0);for(var o=i.getImageData(1,0,1,t).data,r=0,a=t,l=t;l>r;)0===o[4*(l-1)+3]?a=l:r=l,l=a+r>>1;var s=l/t;return 0===s?1:s}(t);return e.drawImage(t,n,i,o,r,a,l,s,u/c)};(function(){function e(){s(this,e)}return c(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,i=void 0,o="",r=void 0,a=void 0,l=void 0,s="",u=0;r=(n=e[u++])>>2,a=(3&n)<<4|(i=e[u++])>>4,l=(15&i)<<2|(o=e[u++])>>6,s=63&o,isNaN(i)?l=s=64:isNaN(o)&&(s=64),t=t+this.KEY_STR.charAt(r)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l)+this.KEY_STR.charAt(s),n=i=o="",r=a=l=s="",ue.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,i="",o=void 0,r=void 0,a="",l=0,s=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(l++))<<2|(o=this.KEY_STR.indexOf(e.charAt(l++)))>>4,n=(15&o)<<4|(r=this.KEY_STR.indexOf(e.charAt(l++)))>>2,i=(3&r)<<6|(a=this.KEY_STR.indexOf(e.charAt(l++))),s.push(t),64!==r&&s.push(n),64!==a&&s.push(i),t=n=i="",o=r=a="",l{function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function o(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function u(e){return function(e){if(Array.isArray(e))return c(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return c(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);nSt,Sortable:()=>je,Swap:()=>ht,default:()=>Dt});function d(e){if("undefined"!=typeof window&&window.navigator)return!!navigator.userAgent.match(e)}var h=d(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),p=d(/Edge/i),f=d(/firefox/i),v=d(/safari/i)&&!d(/chrome/i)&&!d(/android/i),m=d(/iP(ad|od|hone)/i),g=d(/chrome/i)&&d(/android/i),y={capture:!1,passive:!1};function b(e,t,n){e.addEventListener(t,n,!h&&y)}function w(e,t,n){e.removeEventListener(t,n,!h&&y)}function E(e,t){if(t){if(">"===t[0]&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch(e){return!1}return!1}}function k(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function S(e,t,n,i){if(e){n=n||document;do{if(null!=t&&(">"===t[0]?e.parentNode===n&&E(e,t):E(e,t))||i&&e===n)return e;if(e===n)break}while(e=k(e))}return null}var C,x=/\s+/g;function D(e,t,n){if(e&&t)if(e.classList)e.classList[n?"add":"remove"](t);else{var i=(" "+e.className+" ").replace(x," ").replace(" "+t+" "," ");e.className=(i+(n?" "+t:"")).replace(x," ")}}function _(e,t,n){var i=e&&e.style;if(i){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(e,""):e.currentStyle&&(n=e.currentStyle),void 0===t?n:n[t];t in i||-1!==t.indexOf("webkit")||(t="-webkit-"+t),i[t]=n+("string"==typeof n?"":"px")}}function F(e,t){var n="";if("string"==typeof e)n=e;else do{var i=_(e,"transform");i&&"none"!==i&&(n=i+" "+n)}while(!t&&(e=e.parentNode));var o=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return o&&new o(n)}function T(e,t,n){if(e){var i=e.getElementsByTagName(t),o=0,r=i.length;if(n)for(;o=r:o<=r))return i;if(i===A())break;i=P(i,!1)}return!1}function I(e,t,n,i){for(var o=0,r=0,a=e.children;r2&&void 0!==arguments[2]?arguments[2]:{},i=n.evt,r=s(n,Z);K.pluginEvent.bind(je)(e,t,o({dragEl:ee,parentEl:te,ghostEl:ne,rootEl:ie,nextEl:oe,lastDownEl:re,cloneEl:ae,cloneHidden:le,dragStarted:we,putSortable:pe,activeSortable:je.active,originalEvent:i,oldIndex:se,oldDraggableIndex:ce,newIndex:ue,newDraggableIndex:de,hideGhostForTarget:Be,unhideGhostForTarget:Ye,cloneNowHidden:function(){le=!0},cloneNowShown:function(){le=!1},dispatchSortableEvent:function(e){J({sortable:t,name:e,originalEvent:i})}},r))};function J(e){V(o({putSortable:pe,cloneEl:ae,targetEl:ee,rootEl:ie,oldIndex:se,oldDraggableIndex:ce,newIndex:ue,newDraggableIndex:de},e))}var ee,te,ne,ie,oe,re,ae,le,se,ue,ce,de,he,pe,fe,ve,me,ge,ye,be,we,Ee,ke,Se,Ce,xe=!1,De=!1,_e=[],Fe=!1,Te=!1,Ae=[],Me=!1,ze=[],Ie="undefined"!=typeof document,Oe=m,Ne=p||h?"cssFloat":"float",Le=Ie&&!g&&!m&&"draggable"in document.createElement("div"),Pe=function(){if(Ie){if(h)return!1;var e=document.createElement("x");return e.style.cssText="pointer-events:auto","auto"===e.style.pointerEvents}}(),Re=function(e,t){var n=_(e),i=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),o=I(e,0,t),r=I(e,1,t),a=o&&_(o),l=r&&_(r),s=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+M(o).width,u=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+M(r).width;if("flex"===n.display)return"column"===n.flexDirection||"column-reverse"===n.flexDirection?"vertical":"horizontal";if("grid"===n.display)return n.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(o&&a.float&&"none"!==a.float){var c="left"===a.float?"left":"right";return!r||"both"!==l.clear&&l.clear!==c?"horizontal":"vertical"}return o&&("block"===a.display||"flex"===a.display||"table"===a.display||"grid"===a.display||s>=i&&"none"===n[Ne]||r&&"none"===n[Ne]&&s+u>i)?"vertical":"horizontal"},Ue=function(e){function t(e,n){return function(i,o,r,a){var l=i.options.group.name&&o.options.group.name&&i.options.group.name===o.options.group.name;if(null==e&&(n||l))return!0;if(null==e||!1===e)return!1;if(n&&"clone"===e)return e;if("function"==typeof e)return t(e(i,o,r,a),n)(i,o,r,a);var s=(n?i:o).options.group.name;return!0===e||"string"==typeof e&&e===s||e.join&&e.indexOf(s)>-1}}var n={},i=e.group;i&&"object"==r(i)||(i={name:i}),n.name=i.name,n.checkPull=t(i.pull,!0),n.checkPut=t(i.put),n.revertClone=i.revertClone,e.group=n},Be=function(){!Pe&&ne&&_(ne,"display","none")},Ye=function(){!Pe&&ne&&_(ne,"display","")};Ie&&!g&&document.addEventListener("click",(function(e){if(De)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),De=!1,!1}),!0);var He=function(e){if(ee){e=e.touches?e.touches[0]:e;var t=(o=e.clientX,r=e.clientY,_e.some((function(e){var t=e[W].options.emptyInsertThreshold;if(t&&!O(e)){var n=M(e),i=o>=n.left-t&&o<=n.right+t,l=r>=n.top-t&&r<=n.bottom+t;return i&&l?a=e:void 0}})),a);if(t){var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i]);n.target=n.rootEl=t,n.preventDefault=void 0,n.stopPropagation=void 0,t[W]._onDragOver(n)}}var o,r,a},Xe=function(e){ee&&ee.parentNode[W]._isOutsideThisEl(e.target)};function je(e,t){if(!e||!e.nodeType||1!==e.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(e));this.el=e,this.options=t=l({},t),e[W]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Re(e,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(e,t){e.setData("Text",t.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==je.supportPointer&&"PointerEvent"in window&&!v,emptyInsertThreshold:5};for(var i in K.initializePlugins(this,e,n),n)!(i in t)&&(t[i]=n[i]);for(var o in Ue(t),this)"_"===o.charAt(0)&&"function"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!t.forceFallback&&Le,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?b(e,"pointerdown",this._onTapStart):(b(e,"mousedown",this._onTapStart),b(e,"touchstart",this._onTapStart)),this.nativeDraggable&&(b(e,"dragover",this),b(e,"dragenter",this)),_e.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),l(this,q())}function We(e,t,n,i,o,r,a,l){var s,u,c=e[W],d=c.options.onMove;return!window.CustomEvent||h||p?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=t,s.from=e,s.dragged=n,s.draggedRect=i,s.related=o||t,s.relatedRect=r||M(t),s.willInsertAfter=l,s.originalEvent=a,e.dispatchEvent(s),d&&(u=d.call(c,s,a)),u}function qe(e){e.draggable=!1}function Qe(){Me=!1}function Ge(e){for(var t=e.tagName+e.className+e.src+e.href+e.textContent,n=t.length,i=0;n--;)i+=t.charCodeAt(n);return i.toString(36)}function Ke(e){return setTimeout(e,0)}function Ve(e){return clearTimeout(e)}je.prototype={constructor:je,_isOutsideThisEl:function(e){this.el.contains(e)||e===this.el||(Ee=null)},_getDirection:function(e,t){return"function"==typeof this.options.direction?this.options.direction.call(this,e,t,ee):this.options.direction},_onTapStart:function(e){if(e.cancelable){var t=this,n=this.el,i=this.options,o=i.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,u=i.filter;if(function(e){ze.length=0;var t=e.getElementsByTagName("input"),n=t.length;for(;n--;){var i=t[n];i.checked&&ze.push(i)}}(n),!ee&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||i.disabled)&&!s.isContentEditable&&(this.nativeDraggable||!v||!l||"SELECT"!==l.tagName.toUpperCase())&&!((l=S(l,i.draggable,n,!1))&&l.animated||re===l)){if(se=N(l),ce=N(l,i.draggable),"function"==typeof u){if(u.call(this,e,l,this))return J({sortable:t,rootEl:s,name:"filter",targetEl:l,toEl:n,fromEl:n}),$("filter",t,{evt:e}),void(o&&e.cancelable&&e.preventDefault())}else if(u&&(u=u.split(",").some((function(i){if(i=S(s,i.trim(),n,!1))return J({sortable:t,rootEl:i,name:"filter",targetEl:l,fromEl:n,toEl:n}),$("filter",t,{evt:e}),!0}))))return void(o&&e.cancelable&&e.preventDefault());i.handle&&!S(s,i.handle,n,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(e,t,n){var i,o=this,r=o.el,a=o.options,l=r.ownerDocument;if(n&&!ee&&n.parentNode===r){var s=M(n);if(ie=r,te=(ee=n).parentNode,oe=ee.nextSibling,re=n,he=a.group,je.dragged=ee,fe={target:ee,clientX:(t||e).clientX,clientY:(t||e).clientY},ye=fe.clientX-s.left,be=fe.clientY-s.top,this._lastX=(t||e).clientX,this._lastY=(t||e).clientY,ee.style["will-change"]="all",i=function(){$("delayEnded",o,{evt:e}),je.eventCanceled?o._onDrop():(o._disableDelayedDragEvents(),!f&&o.nativeDraggable&&(ee.draggable=!0),o._triggerDragStart(e,t),J({sortable:o,name:"choose",originalEvent:e}),D(ee,a.chosenClass,!0))},a.ignore.split(",").forEach((function(e){T(ee,e.trim(),qe)})),b(l,"dragover",He),b(l,"mousemove",He),b(l,"touchmove",He),b(l,"mouseup",o._onDrop),b(l,"touchend",o._onDrop),b(l,"touchcancel",o._onDrop),f&&this.nativeDraggable&&(this.options.touchStartThreshold=4,ee.draggable=!0),$("delayStart",this,{evt:e}),!a.delay||a.delayOnTouchOnly&&!t||this.nativeDraggable&&(p||h))i();else{if(je.eventCanceled)return void this._onDrop();b(l,"mouseup",o._disableDelayedDrag),b(l,"touchend",o._disableDelayedDrag),b(l,"touchcancel",o._disableDelayedDrag),b(l,"mousemove",o._delayedDragTouchMoveHandler),b(l,"touchmove",o._delayedDragTouchMoveHandler),a.supportPointer&&b(l,"pointermove",o._delayedDragTouchMoveHandler),o._dragStartTimer=setTimeout(i,a.delay)}}},_delayedDragTouchMoveHandler:function(e){var t=e.touches?e.touches[0]:e;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){ee&&qe(ee),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;w(e,"mouseup",this._disableDelayedDrag),w(e,"touchend",this._disableDelayedDrag),w(e,"touchcancel",this._disableDelayedDrag),w(e,"mousemove",this._delayedDragTouchMoveHandler),w(e,"touchmove",this._delayedDragTouchMoveHandler),w(e,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,t){t=t||"touch"==e.pointerType&&e,!this.nativeDraggable||t?this.options.supportPointer?b(document,"pointermove",this._onTouchMove):b(document,t?"touchmove":"mousemove",this._onTouchMove):(b(ee,"dragend",this),b(ie,"dragstart",this._onDragStart));try{document.selection?Ke((function(){document.selection.empty()})):window.getSelection().removeAllRanges()}catch(e){}},_dragStarted:function(e,t){if(xe=!1,ie&&ee){$("dragStarted",this,{evt:t}),this.nativeDraggable&&b(document,"dragover",Xe);var n=this.options;!e&&D(ee,n.dragClass,!1),D(ee,n.ghostClass,!0),je.active=this,e&&this._appendGhost(),J({sortable:this,name:"start",originalEvent:t})}else this._nulling()},_emulateDragOver:function(){if(ve){this._lastX=ve.clientX,this._lastY=ve.clientY,Be();for(var e=document.elementFromPoint(ve.clientX,ve.clientY),t=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(ve.clientX,ve.clientY))!==t;)t=e;if(ee.parentNode[W]._isOutsideThisEl(e),t)do{if(t[W]){if(t[W]._onDragOver({clientX:ve.clientX,clientY:ve.clientY,target:e,rootEl:t})&&!this.options.dragoverBubble)break}e=t}while(t=t.parentNode);Ye()}},_onTouchMove:function(e){if(fe){var t=this.options,n=t.fallbackTolerance,i=t.fallbackOffset,o=e.touches?e.touches[0]:e,r=ne&&F(ne,!0),a=ne&&r&&r.a,l=ne&&r&&r.d,s=Oe&&Ce&&L(Ce),u=(o.clientX-fe.clientX+i.x)/(a||1)+(s?s[0]-Ae[0]:0)/(a||1),c=(o.clientY-fe.clientY+i.y)/(l||1)+(s?s[1]-Ae[1]:0)/(l||1);if(!je.active&&!xe){if(n&&Math.max(Math.abs(o.clientX-this._lastX),Math.abs(o.clientY-this._lastY))o.right+r||e.clientY>i.bottom&&e.clientX>i.left:e.clientY>o.bottom+r||e.clientX>i.right&&e.clientY>i.top}(e,r,this)&&!m.animated){if(m===ee)return Y(!1);if(m&&a===e.target&&(l=m),l&&(n=M(l)),!1!==We(ie,a,ee,t,l,n,e,!!l))return U(),m&&m.nextSibling?a.insertBefore(ee,m.nextSibling):a.appendChild(ee),te=a,H(),Y(!0)}else if(m&&function(e,t,n){var i=M(I(n.el,0,n.options,!0)),o=j(n.el,n.options,ne),r=10;return t?e.clientXc+u*r/2:sd-Se)return-ke}else if(s>c+u*(1-o)/2&&sd-u*r/2))return s>c+u/2?1:-1;return 0}(e,l,n,r,k?1:s.swapThreshold,null==s.invertedSwapThreshold?s.swapThreshold:s.invertedSwapThreshold,Te,Ee===l),0!==y){var T=N(ee);do{T-=y,w=te.children[T]}while(w&&("none"===_(w,"display")||w===ne))}if(0===y||w===l)return Y(!1);Ee=l,ke=y;var A=l.nextElementSibling,L=!1,P=We(ie,a,ee,t,l,n,e,L=1===y);if(!1!==P)return 1!==P&&-1!==P||(L=1===P),Me=!0,setTimeout(Qe,30),U(),L&&!A?a.appendChild(ee):l.parentNode.insertBefore(ee,L?A:l),x&&B(x,0,F-x.scrollTop),te=ee.parentNode,void 0===b||Te||(Se=Math.abs(b-M(l)[C])),H(),Y(!0)}if(a.contains(ee))return Y(!1)}return!1}function R(s,u){$(s,f,o({evt:e,isOwner:d,axis:r?"vertical":"horizontal",revert:i,dragRect:t,targetRect:n,canSort:h,fromSortable:p,target:l,completed:Y,onMove:function(n,i){return We(ie,a,ee,t,n,M(n),e,i)},changed:H},u))}function U(){R("dragOverAnimationCapture"),f.captureAnimationState(),f!==p&&p.captureAnimationState()}function Y(t){return R("dragOverCompleted",{insertion:t}),t&&(d?c._hideClone():c._showClone(f),f!==p&&(D(ee,pe?pe.options.ghostClass:c.options.ghostClass,!1),D(ee,s.ghostClass,!0)),pe!==f&&f!==je.active?pe=f:f===je.active&&pe&&(pe=null),p===f&&(f._ignoreWhileAnimating=l),f.animateAll((function(){R("dragOverAnimationComplete"),f._ignoreWhileAnimating=null})),f!==p&&(p.animateAll(),p._ignoreWhileAnimating=null)),(l===ee&&!ee.animated||l===a&&!l.animated)&&(Ee=null),s.dragoverBubble||e.rootEl||l===document||(ee.parentNode[W]._isOutsideThisEl(e.target),!t&&He(e)),!s.dragoverBubble&&e.stopPropagation&&e.stopPropagation(),v=!0}function H(){ue=N(ee),de=N(ee,s.draggable),J({sortable:f,name:"change",toEl:a,newIndex:ue,newDraggableIndex:de,originalEvent:e})}},_ignoreWhileAnimating:null,_offMoveEvents:function(){w(document,"mousemove",this._onTouchMove),w(document,"touchmove",this._onTouchMove),w(document,"pointermove",this._onTouchMove),w(document,"dragover",He),w(document,"mousemove",He),w(document,"touchmove",He)},_offUpEvents:function(){var e=this.el.ownerDocument;w(e,"mouseup",this._onDrop),w(e,"touchend",this._onDrop),w(e,"pointerup",this._onDrop),w(e,"touchcancel",this._onDrop),w(document,"selectstart",this)},_onDrop:function(e){var t=this.el,n=this.options;ue=N(ee),de=N(ee,n.draggable),$("drop",this,{evt:e}),te=ee&&ee.parentNode,ue=N(ee),de=N(ee,n.draggable),je.eventCanceled||(xe=!1,Te=!1,Fe=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),Ve(this.cloneId),Ve(this._dragStartId),this.nativeDraggable&&(w(document,"drop",this),w(t,"dragstart",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),v&&_(document.body,"user-select",""),_(ee,"transform",""),e&&(we&&(e.cancelable&&e.preventDefault(),!n.dropBubble&&e.stopPropagation()),ne&&ne.parentNode&&ne.parentNode.removeChild(ne),(ie===te||pe&&"clone"!==pe.lastPutMode)&&ae&&ae.parentNode&&ae.parentNode.removeChild(ae),ee&&(this.nativeDraggable&&w(ee,"dragend",this),qe(ee),ee.style["will-change"]="",we&&!xe&&D(ee,pe?pe.options.ghostClass:this.options.ghostClass,!1),D(ee,this.options.chosenClass,!1),J({sortable:this,name:"unchoose",toEl:te,newIndex:null,newDraggableIndex:null,originalEvent:e}),ie!==te?(ue>=0&&(J({rootEl:te,name:"add",toEl:te,fromEl:ie,originalEvent:e}),J({sortable:this,name:"remove",toEl:te,originalEvent:e}),J({rootEl:te,name:"sort",toEl:te,fromEl:ie,originalEvent:e}),J({sortable:this,name:"sort",toEl:te,originalEvent:e})),pe&&pe.save()):ue!==se&&ue>=0&&(J({sortable:this,name:"update",toEl:te,originalEvent:e}),J({sortable:this,name:"sort",toEl:te,originalEvent:e})),je.active&&(null!=ue&&-1!==ue||(ue=se,de=ce),J({sortable:this,name:"end",toEl:te,originalEvent:e}),this.save())))),this._nulling()},_nulling:function(){$("nulling",this),ie=ee=te=ne=oe=ae=re=le=fe=ve=we=ue=de=se=ce=Ee=ke=pe=he=je.dragged=je.ghost=je.clone=je.active=null,ze.forEach((function(e){e.checked=!0})),ze.length=me=ge=0},handleEvent:function(e){switch(e.type){case"drop":case"dragend":this._onDrop(e);break;case"dragenter":case"dragover":ee&&(this._onDragOver(e),function(e){e.dataTransfer&&(e.dataTransfer.dropEffect="move");e.cancelable&&e.preventDefault()}(e));break;case"selectstart":e.preventDefault()}},toArray:function(){for(var e,t=[],n=this.el.children,i=0,o=n.length,r=this.options;i1&&(yt.forEach((function(e){i.addAnimationState({target:e,rect:Et?M(e):o}),X(e),e.fromRect=o,t.removeAnimationState(e)})),Et=!1,function(e,t){yt.forEach((function(n,i){var o=t.children[n.sortableIndex+(e?Number(i):0)];o?t.insertBefore(n,o):t.appendChild(n)}))}(!this.options.removeCloneOnHide,n))},dragOverCompleted:function(e){var t=e.sortable,n=e.isOwner,i=e.insertion,o=e.activeSortable,r=e.parentEl,a=e.putSortable,l=this.options;if(i){if(n&&o._hideClone(),wt=!1,l.animation&&yt.length>1&&(Et||!n&&!o.options.sort&&!a)){var s=M(vt,!1,!0,!0);yt.forEach((function(e){e!==vt&&(H(e,s),r.appendChild(e))})),Et=!0}if(!n)if(Et||xt(),yt.length>1){var u=gt;o._showClone(t),o.options.animation&&!gt&&u&&bt.forEach((function(e){o.addAnimationState({target:e,rect:mt}),e.fromRect=mt,e.thisAnimationDuration=null}))}else o._showClone(t)}},dragOverAnimationCapture:function(e){var t=e.dragRect,n=e.isOwner,i=e.activeSortable;if(yt.forEach((function(e){e.thisAnimationDuration=null})),i.options.animation&&!n&&i.multiDrag.isMultiDrag){mt=l({},t);var o=F(vt,!0);mt.top-=o.f,mt.left-=o.e}},dragOverAnimationComplete:function(){Et&&(Et=!1,xt())},drop:function(e){var t=e.originalEvent,n=e.rootEl,i=e.parentEl,o=e.sortable,r=e.dispatchSortableEvent,a=e.oldIndex,l=e.putSortable,s=l||this.sortable;if(t){var u=this.options,c=i.children;if(!kt)if(u.multiDragKey&&!this.multiDragKeyDown&&this._deselectMultiDrag(),D(vt,u.selectedClass,!~yt.indexOf(vt)),~yt.indexOf(vt))yt.splice(yt.indexOf(vt),1),pt=null,V({sortable:o,rootEl:n,name:"deselect",targetEl:vt,originalEvent:t});else{if(yt.push(vt),V({sortable:o,rootEl:n,name:"select",targetEl:vt,originalEvent:t}),t.shiftKey&&pt&&o.el.contains(pt)){var d,h,p=N(pt),f=N(vt);if(~p&&~f&&p!==f)for(f>p?(h=p,d=f):(h=f,d=p+1);h1){var v=M(vt),m=N(vt,":not(."+this.options.selectedClass+")");if(!wt&&u.animation&&(vt.thisAnimationDuration=null),s.captureAnimationState(),!wt&&(u.animation&&(vt.fromRect=v,yt.forEach((function(e){if(e.thisAnimationDuration=null,e!==vt){var t=Et?M(e):v;e.fromRect=t,s.addAnimationState({target:e,rect:t})}}))),xt(),yt.forEach((function(e){c[m]?i.insertBefore(e,c[m]):i.appendChild(e),m++})),a===N(vt))){var g=!1;yt.forEach((function(e){e.sortableIndex===N(e)||(g=!0)})),g&&(r("update"),r("sort"))}yt.forEach((function(e){X(e)})),s.animateAll()}ft=s}(n===i||l&&"clone"!==l.lastPutMode)&&bt.forEach((function(e){e.parentNode&&e.parentNode.removeChild(e)}))}},nullingGlobal:function(){this.isMultiDrag=kt=!1,bt.length=0},destroyGlobal:function(){this._deselectMultiDrag(),w(document,"pointerup",this._deselectMultiDrag),w(document,"mouseup",this._deselectMultiDrag),w(document,"touchend",this._deselectMultiDrag),w(document,"keydown",this._checkKeyDown),w(document,"keyup",this._checkKeyUp)},_deselectMultiDrag:function(e){if(!(void 0!==kt&&kt||ft!==this.sortable||e&&S(e.target,this.options.draggable,this.sortable.el,!1)||e&&0!==e.button))for(;yt.length;){var t=yt[0];D(t,this.options.selectedClass,!1),yt.shift(),V({sortable:this.sortable,rootEl:this.sortable.el,name:"deselect",targetEl:t,originalEvent:e})}},_checkKeyDown:function(e){e.key===this.options.multiDragKey&&(this.multiDragKeyDown=!0)},_checkKeyUp:function(e){e.key===this.options.multiDragKey&&(this.multiDragKeyDown=!1)}},l(e,{pluginName:"multiDrag",utils:{select:function(e){var t=e.parentNode[W];t&&t.options.multiDrag&&!~yt.indexOf(e)&&(ft&&ft!==t&&(ft.multiDrag._deselectMultiDrag(),ft=t),D(e,t.options.selectedClass,!0),yt.push(e))},deselect:function(e){var t=e.parentNode[W],n=yt.indexOf(e);t&&t.options.multiDrag&&~n&&(D(e,t.options.selectedClass,!1),yt.splice(n,1))}},eventProperties:function(){var e=this,t=[],n=[];return yt.forEach((function(i){var o;t.push({multiDragElement:i,index:i.sortableIndex}),o=Et&&i!==vt?-1:Et?N(i,":not(."+e.options.selectedClass+")"):N(i),n.push({multiDragElement:i,index:o})})),{items:u(yt),clones:[].concat(bt),oldIndicies:t,newIndicies:n}},optionListeners:{multiDragKey:function(e){return"ctrl"===(e=e.toLowerCase())?e="Control":e.length>1&&(e=e.charAt(0).toUpperCase()+e.substr(1)),e}}})}function Ct(e,t){bt.forEach((function(n,i){var o=t.children[n.sortableIndex+(e?Number(i):0)];o?t.insertBefore(n,o):t.appendChild(n)}))}function xt(){yt.forEach((function(e){e!==vt&&e.parentNode&&e.parentNode.removeChild(e)}))}je.mount(new function(){function e(){for(var e in this.defaults={scroll:!0,forceAutoScrollFallback:!1,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0},this)"_"===e.charAt(0)&&"function"==typeof this[e]&&(this[e]=this[e].bind(this))}return e.prototype={dragStarted:function(e){var t=e.originalEvent;this.sortable.nativeDraggable?b(document,"dragover",this._handleAutoScroll):this.options.supportPointer?b(document,"pointermove",this._handleFallbackAutoScroll):t.touches?b(document,"touchmove",this._handleFallbackAutoScroll):b(document,"mousemove",this._handleFallbackAutoScroll)},dragOverCompleted:function(e){var t=e.originalEvent;this.options.dragOverBubble||t.rootEl||this._handleAutoScroll(t)},drop:function(){this.sortable.nativeDraggable?w(document,"dragover",this._handleAutoScroll):(w(document,"pointermove",this._handleFallbackAutoScroll),w(document,"touchmove",this._handleFallbackAutoScroll),w(document,"mousemove",this._handleFallbackAutoScroll)),at(),rt(),clearTimeout(C),C=void 0},nulling:function(){tt=$e=Ze=ot=nt=Je=et=null,it.length=0},_handleFallbackAutoScroll:function(e){this._handleAutoScroll(e,!0)},_handleAutoScroll:function(e,t){var n=this,i=(e.touches?e.touches[0]:e).clientX,o=(e.touches?e.touches[0]:e).clientY,r=document.elementFromPoint(i,o);if(tt=e,t||this.options.forceAutoScrollFallback||p||h||v){st(e,this.options,r,t);var a=P(r,!0);!ot||nt&&i===Je&&o===et||(nt&&at(),nt=setInterval((function(){var r=P(document.elementFromPoint(i,o),!0);r!==a&&(a=r,rt()),st(e,n.options,r,t)}),10),Je=i,et=o)}else{if(!this.options.bubbleScroll||P(r,!0)===A())return void rt();st(e,this.options,P(r,!1),!1)}}},l(e,{pluginName:"scroll",initializeByDefault:!0})}),je.mount(dt,ct);const Dt=je}}]); \ No newline at end of file diff --git a/plugins/form/assets/xhr-submitter.js b/plugins/form/assets/xhr-submitter.js index 539c7bd..72061c3 100644 --- a/plugins/form/assets/xhr-submitter.js +++ b/plugins/form/assets/xhr-submitter.js @@ -1,24 +1,461 @@ -function attachFormSubmitListener(formId) { - var form = document.getElementById(formId); - if (!form) { - console.warn('Form with ID "' + formId + '" not found.'); - return; - } - form.addEventListener('submit', function(e) { - // Prevent standard form submission - e.preventDefault(); - // Submit the form via Ajax - var xhr = new XMLHttpRequest(); - xhr.open(form.getAttribute('method'), form.getAttribute('action')); - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xhr.onload = function() { - if (xhr.status === 200) { - form.innerHTML = xhr.responseText; // Update the current form's innerHTML +/** + * Grav Form XHR Submitter + * + * A modular system for handling form submissions via XMLHttpRequest (AJAX). + * Features include content replacement, captcha handling, and error management. + */ + +(function() { + 'use strict'; + + // Main namespace + window.GravFormXHR = {}; + + /** + * Core Module - Contains configuration and utility functions + */ + const Core = { + config: { + debug: false, + enableLoadingIndicator: false + }, + + /** + * Configure global settings + * @param {Object} options - Configuration options + */ + configure: function(options) { + Object.assign(this.config, options); + }, + + /** + * Logger utility + * @param {string} message - Message to log + * @param {string} level - Log level ('log', 'warn', 'error') + */ + log: function(message, level = 'log') { + if (!this.config.debug) return; + + const validLevels = ['log', 'warn', 'error']; + const finalLevel = validLevels.includes(level) ? level : 'log'; + + console[finalLevel](`[GravFormXHR] ${message}`); + }, + + /** + * Display an error message within a target element + * @param {HTMLElement} target - The element to display the error in + * @param {string} message - The error message + */ + displayError: function(target, message) { + const errorMsgContainer = target.querySelector('.form-messages') || target; + const errorMsg = document.createElement('div'); + errorMsg.className = 'form-message error'; + errorMsg.textContent = message; + errorMsgContainer.insertBefore(errorMsg, errorMsgContainer.firstChild); + } + }; + + /** + * DOM Module - Handles DOM manipulation and form tracking + */ + const DOM = { + /** + * Find a form wrapper by formId + * @param {string} formId - ID of the form + * @returns {HTMLElement|null} - The wrapper element or null + */ + getFormWrapper: function(formId) { + const wrapperId = formId + '-wrapper'; + return document.getElementById(wrapperId); + }, + + /** + * Add or remove loading indicators + * @param {HTMLElement} form - The form element + * @param {HTMLElement} wrapper - The wrapper element + * @param {boolean} isLoading - Whether to add or remove loading classes + */ + updateLoadingState: function(form, wrapper, isLoading) { + if (!Core.config.enableLoadingIndicator) return; + + if (isLoading) { + wrapper.classList.add('loading'); + form.classList.add('submitting'); } else { - // Handle HTTP error responses (optional) - console.error('Form submission failed with status: ' + xhr.status); + wrapper.classList.remove('loading'); + form.classList.remove('submitting'); } - }; - xhr.send(new URLSearchParams(new FormData(form)).toString()); - }); -} + }, + + /** + * Update form content with server response + * @param {string} responseText - Server response HTML + * @param {string} wrapperId - ID of the wrapper to update + * @param {string} formId - ID of the original form + */ + updateFormContent: function(responseText, wrapperId, formId) { + const wrapperElement = document.getElementById(wrapperId); + if (!wrapperElement) { + console.error(`Cannot update content: Wrapper #${wrapperId} not found`); + return; + } + + Core.log(`Updating content for wrapper: ${wrapperId}`); + + // Parse response + const tempDiv = document.createElement('div'); + try { + tempDiv.innerHTML = responseText; + } catch (e) { + console.error(`Error parsing response HTML for wrapper: ${wrapperId}`, e); + Core.displayError(wrapperElement, 'An error occurred processing the server response.'); + return; + } + + try { + this._updateWrapperContent(tempDiv, wrapperElement, wrapperId, formId); + this._reinitializeUpdatedForm(wrapperElement, formId); + } catch (e) { + console.error(`Error during content update for wrapper ${wrapperId}:`, e); + Core.displayError(wrapperElement, 'An error occurred updating the form content.'); + } + }, + + /** + * Update wrapper content based on response parsing strategy + * @private + */ + _updateWrapperContent: function(tempDiv, wrapperElement, wrapperId, formId) { + // Strategy 1: Look for matching wrapper ID in response + const newWrapperElement = tempDiv.querySelector('#' + wrapperId); + + if (newWrapperElement) { + wrapperElement.innerHTML = newWrapperElement.innerHTML; + Core.log(`Update using newWrapperElement.innerHTML SUCCESSFUL for wrapper: ${wrapperId}`); + return; + } + + // Strategy 2: Look for matching form ID in response + const hasMatchingForm = tempDiv.querySelector('#' + formId); + + if (hasMatchingForm) { + Core.log(`Wrapper element #${wrapperId} not found in XHR response, but found matching form. Using entire response.`); + wrapperElement.innerHTML = tempDiv.innerHTML; + return; + } + + // Strategy 3: Look for toast messages + const hasToastMessages = tempDiv.querySelector('.toast'); + + if (hasToastMessages) { + Core.log('Found toast messages in response. Updating wrapper with the response.'); + wrapperElement.innerHTML = tempDiv.innerHTML; + return; + } + + // Fallback: Use entire response with warning + Core.log('No matching content found in response. Response may not be valid for this wrapper.', 'warn'); + wrapperElement.innerHTML = tempDiv.innerHTML; + }, + + /** + * Reinitialize updated form and its components + * @private + */ + _reinitializeUpdatedForm: function(wrapperElement, formId) { + const updatedForm = wrapperElement.querySelector('#' + formId); + + if (updatedForm) { + Core.log(`Re-running initialization for form ${formId} after update`); + + // First reinitialize any captchas + CaptchaManager.reinitializeAll(updatedForm); + + // Trigger mutation._grav event for Dropzone and other field reinitializations + setTimeout(() => { + Core.log('Triggering mutation._grav event for field reinitialization'); + + // Trigger using jQuery if available (preferred method for compatibility) + if (typeof jQuery !== 'undefined') { + jQuery('body').trigger('mutation._grav', [wrapperElement]); + } else { + // Fallback: dispatch native custom event + const event = new CustomEvent('mutation._grav', { + detail: { target: wrapperElement }, + bubbles: true + }); + document.body.dispatchEvent(event); + } + }, 0); + + // Then re-attach the XHR listener + setTimeout(() => { + FormHandler.setupListener(formId); + }, 10); + } else { + // Check if this was a successful submission with just a message + const hasSuccessMessage = wrapperElement.querySelector('.toast-success, .form-success'); + + if (hasSuccessMessage) { + Core.log('No form found after update, but success message detected. This appears to be a successful submission.'); + } else { + console.warn(`Could not find form #${formId} inside the updated wrapper after update. Cannot re-attach listener/initializers.`); + } + } + } + }; + + /** + * XHR Module - Handles XMLHttpRequest operations + */ + const XHRManager = { + /** + * Send form data via XHR + * @param {HTMLFormElement} form - The form to submit + */ + sendFormData: function(form) { + const formId = form.id; + const wrapperId = formId + '-wrapper'; + const wrapperElement = DOM.getFormWrapper(formId); + + if (!wrapperElement) { + console.error(`XHR submission: Target wrapper element #${wrapperId} not found on the page! Cannot proceed.`); + form.innerHTML = '

Error: Form wrapper missing. Cannot update content.

'; + return; + } + + Core.log(`Initiating XHR submission for form: ${formId}, targeting wrapper: ${wrapperId}`); + DOM.updateLoadingState(form, wrapperElement, true); + + const xhr = new XMLHttpRequest(); + xhr.open(form.getAttribute('method') || 'POST', form.getAttribute('action') || window.location.href); + + // Set Headers + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); + xhr.setRequestHeader('X-Grav-Form-XHR', 'true'); + + // Success handler + xhr.onload = () => { + Core.log(`XHR request completed for form: ${formId}, Status: ${xhr.status}`); + DOM.updateLoadingState(form, wrapperElement, false); + + if (xhr.status >= 200 && xhr.status < 300) { + DOM.updateFormContent(xhr.responseText, wrapperId, formId); + } else { + Core.log(`Form submission failed for form: ${formId}, HTTP Status: ${xhr.status} ${xhr.statusText}`, 'error'); + Core.displayError(wrapperElement, `An error occurred during submission (Status: ${xhr.status}). Please check the form and try again.`); + } + }; + + // Network error handler + xhr.onerror = () => { + Core.log(`Form submission failed due to network error for form: ${formId}`, 'error'); + DOM.updateLoadingState(form, wrapperElement, false); + Core.displayError(wrapperElement, 'A network error occurred. Please check your connection and try again.'); + }; + + // Prepare and send data + try { + const formData = new FormData(form); + const urlEncodedData = new URLSearchParams(formData).toString(); + Core.log(`Sending XHR request for form: ${formId} with custom header X-Grav-Form-XHR`); + xhr.send(urlEncodedData); + } catch (e) { + Core.log(`Error preparing or sending XHR request for form: ${formId}: ${e.message}`, 'error'); + DOM.updateLoadingState(form, wrapperElement, false); + Core.displayError(wrapperElement, 'An unexpected error occurred before sending the form.'); + } + } + }; + + /** + * CaptchaManager - Handles captcha registration and initialization + */ + const CaptchaManager = { + providers: {}, + + /** + * Register a captcha provider + * @param {string} name - Provider name + * @param {object} provider - Provider object with init and reset methods + */ + register: function(name, provider) { + this.providers[name] = provider; + Core.log(`Registered captcha provider: ${name}`); + }, + + /** + * Get a provider by name + * @param {string} name - Provider name + * @returns {object|null} Provider object or null if not found + */ + getProvider: function(name) { + return this.providers[name] || null; + }, + + /** + * Get all registered providers + * @returns {object} Object containing all providers + */ + getProviders: function() { + return this.providers; + }, + + /** + * Reinitialize all captchas in a form + * @param {HTMLFormElement} form - Form element containing captchas + */ + reinitializeAll: function(form) { + if (!form || !form.id) return; + + const formId = form.id; + const containers = form.querySelectorAll('[data-captcha-provider]'); + + containers.forEach(container => { + const providerName = container.dataset.captchaProvider; + Core.log(`Found captcha container for provider: ${providerName} in form: ${formId}`); + + const provider = this.getProvider(providerName); + if (provider && typeof provider.reset === 'function') { + setTimeout(() => { + try { + provider.reset(container, form); + Core.log(`Successfully reset ${providerName} captcha in form: ${formId}`); + } catch (e) { + console.error(`Error resetting ${providerName} captcha:`, e); + } + }, 0); + } else { + console.warn(`Could not reset captcha provider "${providerName}" - provider not registered or missing reset method`); + } + }); + } + }; + + /** + * FormHandler - Handles form submission and event listeners + */ + const FormHandler = { + /** + * Submit a form via XHR + * @param {HTMLFormElement} form - Form to submit + */ + submitForm: function(form) { + if (!form || !form.id) { + console.error('submitForm called with invalid form element or form missing ID.'); + return; + } + + XHRManager.sendFormData(form); + }, + + /** + * Set up XHR submission listener for a form + * @param {string} formId - ID of the form + */ + setupListener: function(formId) { + setTimeout(() => { + const form = document.getElementById(formId); + if (!form) { + Core.log(`XHR Setup (delayed): Form with ID "${formId}" not found.`, 'warn'); + return; + } + + // Remove stale marker from previous runs + delete form.dataset.directXhrListenerAttached; + + // Check if any captcha provider is handling the submission + const captchaContainer = form.querySelector('[data-captcha-provider][data-intercepts-submit="true"]'); + + if (!captchaContainer) { + // No intercepting captcha found, attach direct listener + this._attachDirectListener(form); + } else { + // Captcha will intercept, don't attach direct listener + const providerName = captchaContainer.dataset.captchaProvider; + Core.log(`XHR listener deferred: ${providerName} should intercept submit for form: ${formId}`); + // Ensure no stale listener marker remains + delete form.dataset.directXhrListenerAttached; + } + }, 0); + }, + + /** + * Attach a direct submit event listener to a form + * @private + * @param {HTMLFormElement} form - Form element + */ + _attachDirectListener: function(form) { + // Only proceed if XHR is enabled for this form + if (form.dataset.xhrEnabled !== 'true') { + Core.log(`XHR not enabled for form: ${form.id}. Skipping direct listener attachment.`); + return; + } + + // Check if we already attached a listener + if (form.dataset.directXhrListenerAttached === 'true') { + Core.log(`Direct XHR listener already attached for form: ${form.id}`); + return; + } + + const directXhrSubmitHandler = (event) => { + Core.log(`Direct XHR submit handler triggered for form: ${form.id}`); + event.preventDefault(); + FormHandler.submitForm(form); + }; + + Core.log(`Attaching direct XHR listener for form: ${form.id}`); + form.addEventListener('submit', directXhrSubmitHandler); + form.dataset.directXhrListenerAttached = 'true'; + } + }; + + // Initialize basic built-in captcha handlers + // Other providers will register themselves via separate handler JS files + const initializeBasicCaptchaHandlers = function() { + // Basic captcha handler (image refresh etc.) + CaptchaManager.register('basic-captcha', { + reset: function(container, form) { + const formId = form.id; + const captchaImg = container.querySelector('img'); + const captchaInput = container.querySelector('input[type="text"]'); + + if (captchaImg) { + // Add a timestamp to force image reload + const timestamp = new Date().getTime(); + const imgSrc = captchaImg.src.split('?')[0] + '?t=' + timestamp; + captchaImg.src = imgSrc; + + // Clear any existing input + if (captchaInput) { + captchaInput.value = ''; + } + + Core.log(`Reset basic-captcha for form: ${formId}`); + } + } + }); + }; + + // Initialize basic captcha handlers + initializeBasicCaptchaHandlers(); + + // --- Expose Public API --- + + // Core configuration + window.GravFormXHR.configure = Core.configure.bind(Core); + + // Form submission + window.GravFormXHR.submit = FormHandler.submitForm.bind(FormHandler); + window.GravFormXHR.setupListener = FormHandler.setupListener.bind(FormHandler); + + // Captcha management + window.GravFormXHR.captcha = CaptchaManager; + + // Legacy support + window.GravFormXHRSubmitters = {submit: FormHandler.submitForm.bind(FormHandler)}; + window.attachFormSubmitListener = FormHandler.setupListener.bind(FormHandler); + +})(); diff --git a/plugins/form/blueprints.yaml b/plugins/form/blueprints.yaml index 2afe86e..c18620b 100644 --- a/plugins/form/blueprints.yaml +++ b/plugins/form/blueprints.yaml @@ -1,7 +1,7 @@ name: Form slug: form type: plugin -version: 7.4.2 +version: 8.1.0 description: Enables forms handling and processing icon: check-square author: @@ -14,7 +14,7 @@ bugs: https://github.com/getgrav/grav-plugin-form/issues license: MIT dependencies: - - { name: grav, version: '>=1.7.41' } + - { name: grav, version: ">=1.7.49" } form: validation: strict @@ -145,7 +145,7 @@ form: size: large label: PLUGIN_FORM.DESTINATION help: PLUGIN_FORM.DESTINATION_HELP - default: '@self' + default: "@self" files.accept: type: selectize size: large @@ -155,7 +155,7 @@ form: default: - image/* validate: - type: commalist + type: commalist files.filesize: type: text label: PLUGIN_FORM.FILESIZE @@ -213,12 +213,12 @@ form: type: text label: PLUGIN_FORM.RECAPTCHA_SITE_KEY help: PLUGIN_FORM.RECAPTCHA_SITE_KEY_HELP - default: '' + default: "" recaptcha.secret_key: type: text label: PLUGIN_FORM.RECAPTCHA_SECRET_KEY help: PLUGIN_FORM.RECAPTCHA_SECRET_KEY_HELP - default: '' + default: "" turnstile_captcha: type: section @@ -236,22 +236,90 @@ form: type: text label: PLUGIN_FORM.RECAPTCHA_SITE_KEY help: PLUGIN_FORM.RECAPTCHA_SITE_KEY_HELP - default: '' + default: "" turnstile.secret_key: type: text label: PLUGIN_FORM.RECAPTCHA_SECRET_KEY help: PLUGIN_FORM.RECAPTCHA_SECRET_KEY_HELP - default: '' + default: "" basic_captcha: type: section title: PLUGIN_FORM.BASIC_CAPTCHA fields: + basic_captcha.image.width: + type: number + label: PLUGIN_FORM.BASIC_CAPTCHA_BOX_WIDTH + default: 135 + append: px + size: small + validate: + min: 100 + max: 500 + type: number + basic_captcha.image.height: + type: number + label: PLUGIN_FORM.BASIC_CAPTCHA_BOX_HEIGHT + default: 40 + append: px + size: small + validate: + min: 30 + max: 200 + type: number + + basic_captcha.chars.font: + type: select + label: PLUGIN_FORM.BASIC_CAPTCHA_FONT + default: zxx-noise.ttf + options: + "zxx-noise.ttf": zxx-Noise + "zxx-xed.ttf": zxx-Xed + "zxx-camo.ttf": zxx-Camo + "zxx-sans.ttf": zxx-Sans + basic_captcha.chars.size: + type: range + label: PLUGIN_FORM.BASIC_CAPTCHA_SIZE + default: 24 + append: px + validate: + min: 12 + max: 32 + step: 2 + basic_captcha.chars.bg: + type: colorpicker + size: small + label: PLUGIN_FORM.BASIC_CAPTCHA_BG_COLOR + default: "#ffffff" + basic_captcha.chars.text: + type: colorpicker + size: small + label: PLUGIN_FORM.BASIC_CAPTCHA_TEXT_COLOR + default: "#000000" + basic_captcha.chars.start_x: + type: number + label: PLUGIN_FORM.BASIC_CAPTCHA_START_X + default: 5 + append: px + size: small + validate: + min: 0 + type: number + basic_captcha.chars.start_y: + type: number + label: PLUGIN_FORM.BASIC_CAPTCHA_START_Y + default: 30 + append: px + size: small + validate: + min: 0 + type: number + basic_captcha.type: type: elements label: PLUGIN_FORM.BASIC_CAPTCHA_TYPE - default: 'characters' + default: "characters" size: medium options: characters: Random Characters @@ -268,70 +336,7 @@ form: min: 4 max: 12 append: characters - basic_captcha.chars.font: - type: select - label: PLUGIN_FORM.BASIC_CAPTCHA_FONT - default: zxx-noise.ttf - options: - 'zxx-noise.ttf': zxx-Noise - 'zxx-xed.ttf': zxx-Xed - 'zxx-camo.ttf': zxx-Camo - 'zxx-sans.ttf': zxx-Sans - basic_captcha.chars.size: - type: range - label: PLUGIN_FORM.BASIC_CAPTCHA_SIZE - default: 24 - append: px - validate: - min: 12 - max: 32 - step: 2 - basic_captcha.chars.bg: - type: colorpicker - size: small - label: PLUGIN_FORM.BASIC_CAPTCHA_BG_COLOR - default: '#ffffff' - basic_captcha.chars.text: - type: colorpicker - size: small - label: PLUGIN_FORM.BASIC_CAPTCHA_TEXT_COLOR - default: '#000000' - basic_captcha.chars.start_x: - type: number - label: PLUGIN_FORM.BASIC_CAPTCHA_START_X - default: 5 - append: px - size: small - validate: - min: 0 - type: number - basic_captcha.chars.start_y: - type: number - label: PLUGIN_FORM.BASIC_CAPTCHA_START_Y - default: 30 - append: px - size: small - validate: - min: 0 - type: number - basic_captcha.chars.box_width: - type: number - label: PLUGIN_FORM.BASIC_CAPTCHA_BOX_WIDTH - default: 135 - append: px - size: small - validate: - min: 0 - type: number - basic_captcha.chars.box_height: - type: number - label: PLUGIN_FORM.BASIC_CAPTCHA_BOX_HEIGHT - default: 40 - append: px - size: small - validate: - min: 0 - type: number + math: type: element fields: @@ -355,14 +360,14 @@ form: type: selectize selectize: options: - - value: '+' - text: '+ Addition' - - value: '-' - text: '- Subtraction' - - value: '*' - text: 'x Multiplication' - - value: '/' - text: '/ Division' + - value: "+" + text: "+ Addition" + - value: "-" + text: "- Subtraction" + - value: "*" + text: "x Multiplication" + - value: "/" + text: "/ Division" label: PLUGIN_FORM.BASIC_CAPTCHA_MATH_OPERATORS validate: type: commalist diff --git a/plugins/form/classes/BasicCaptcha.php b/plugins/form/classes/BasicCaptcha.php deleted file mode 100644 index 61bc10b..0000000 --- a/plugins/form/classes/BasicCaptcha.php +++ /dev/null @@ -1,122 +0,0 @@ -session = Grav::instance()['session']; - } - - public function getCaptchaCode($length = null): string - { - $config = Grav::instance()['config']->get('plugins.form.basic_captcha'); - $type = $config['type'] ?? 'characters'; - - if ($type == 'math') { - $min = $config['math']['min'] ?? 1; - $max = $config['math']['max'] ?? 12; - $operators = $config['math']['operators'] ?? ['+','-','*']; - - $first_num = random_int($min, $max); - $second_num = random_int($min, $max); - $operator = $operators[array_rand($operators)]; - - // calculator - if ($operator === '-') { - if ($first_num < $second_num) { - $result = "$second_num - $first_num"; - $captcha_code = $second_num - $first_num; - } else { - $result = "$first_num-$second_num"; - $captcha_code = $first_num - $second_num; - } - } elseif ($operator === '*') { - $result = "{$first_num} x {$second_num}"; - $captcha_code = $first_num * $second_num; - } elseif ($operator === '/') { - $result = "$first_num / second_num"; - $captcha_code = $first_num / $second_num; - } elseif ($operator === '+') { - $result = "$first_num + $second_num"; - $captcha_code = $first_num + $second_num; - } - } else { - if ($length === null) { - $length = $config['chars']['length'] ?? 6; - } - $random_alpha = md5(random_bytes(64)); - $captcha_code = substr($random_alpha, 0, $length); - $result = $captcha_code; - } - - - $this->setSession($this->key, $captcha_code); - return $result; - } - - public function setSession($key, $value): void - { - $this->session->$key = $value; - } - - public function getSession($key = null): ?string - { - if ($key === null) { - $key = $this->key; - } - return $this->session->$key ?? null; - } - - public function createCaptchaImage($captcha_code) - { - $config = Grav::instance()['config']->get('plugins.form.basic_captcha'); - $font = $config['chars']['font'] ?? 'zxx-xed.ttf'; - - $target_layer = imagecreatetruecolor($config['chars']['box_width'], $config['chars']['box_height']); - - $bg = $this->hexToRgb($config['chars']['bg'] ?? '#ffffff'); - $text = $this->hexToRgb($config['chars']['text'] ?? '#000000'); - - $captcha_background = imagecolorallocate($target_layer, $bg[0], $bg[1], $bg[2]); - $captcha_text_color = imagecolorallocate($target_layer, $text[0], $text[1], $text[2]); - - $font_path = __DIR__ . '/../fonts/' . $font; - - imagefill($target_layer, 0, 0, $captcha_background); - - imagefttext($target_layer, $config['chars']['size'], 0, $config['chars']['start_x'], $config['chars']['start_y'], $captcha_text_color, $font_path, $captcha_code); - return $target_layer; - } - - public function renderCaptchaImage($imageData): void - { - header("Content-type: image/jpeg"); - imagejpeg($imageData); - } - - public function validateCaptcha($formData): bool - { - $isValid = false; - $capchaSessionData = $this->getSession(); - - if ($capchaSessionData == $formData) { - $isValid = true; - } - return $isValid; - } - - private function hexToRgb($hex): array - { - return sscanf($hex, "#%02x%02x%02x"); - } - -} - diff --git a/plugins/form/classes/Captcha/BasicCaptcha.php b/plugins/form/classes/Captcha/BasicCaptcha.php new file mode 100644 index 0000000..86ace33 --- /dev/null +++ b/plugins/form/classes/Captcha/BasicCaptcha.php @@ -0,0 +1,596 @@ +session = Grav::instance()['session']; + + // Load global configuration + $globalConfig = Grav::instance()['config']->get('plugins.form.basic_captcha', []); + + // Merge field-specific config with global config + if ($fieldConfig && is_array($fieldConfig)) { + $this->config = array_replace_recursive($globalConfig, $fieldConfig); + } else { + $this->config = $globalConfig; + } + } + + public function getCaptchaCode($length = null): string + { + // Support both 'type' (from global config) and 'captcha_type' (from field config) + $type = $this->config['captcha_type'] ?? $this->config['type'] ?? 'characters'; + + // Store the captcha type in session for validation + $this->setSession($this->typeKey, $type); + + switch ($type) { + case 'dotcount': + return $this->getDotCountCaptcha($this->config); + case 'position': + return $this->getPositionCaptcha($this->config); + case 'math': + return $this->getMathCaptcha($this->config); + case 'characters': + default: + return $this->getCharactersCaptcha($this->config, $length); + } + } + + /** + * Creates a dot counting captcha - user has to count dots of a specific color + */ + protected function getDotCountCaptcha($config): string + { + // Define colors with names + $colors = [ + 'red' => [255, 0, 0], + 'blue' => [0, 0, 255], + 'green' => [0, 128, 0], + 'yellow' => [255, 255, 0], + 'purple' => [128, 0, 128], + 'orange' => [255, 165, 0] + ]; + + // Pick a random color to count + $colorNames = array_keys($colors); + $targetColorName = $colorNames[array_rand($colorNames)]; + $targetColor = $colors[$targetColorName]; + + // Generate a random number of dots for the target color (between 5-10) + $targetCount = mt_rand(5, 10); + + // Store the expected answer + $this->setSession($this->key, (string) $targetCount); + + // Return description text + return "count_dots|{$targetColorName}|".implode(',', $targetColor); + } + + /** + * Creates a position-based captcha - user has to identify position of a symbol + */ + protected function getPositionCaptcha($config): string + { + // Define possible symbols - using simple ASCII characters + $symbols = ['*', '+', '$', '#', '@', '!', '?', '%', '&', '=']; + + // Define positions - simpler options + $positions = ['top', 'bottom', 'left', 'right', 'center']; + + // Pick a random symbol and position + $targetSymbol = $symbols[array_rand($symbols)]; + $targetPosition = $positions[array_rand($positions)]; + + // Store the expected answer + $this->setSession($this->key, $targetPosition); + + // Return the instruction and symbol + return "position|{$targetSymbol}|{$targetPosition}"; + } + + /** + * Creates a math-based captcha + */ + protected function getMathCaptcha($config): string + { + $min = $config['math']['min'] ?? 1; + $max = $config['math']['max'] ?? 12; + $operators = $config['math']['operators'] ?? ['+', '-', '*']; + + $first_num = random_int($min, $max); + $second_num = random_int($min, $max); + $operator = $operators[array_rand($operators)]; + + // Calculator + if ($operator === '-') { + if ($first_num < $second_num) { + $result = "$second_num - $first_num"; + $captcha_code = $second_num - $first_num; + } else { + $result = "$first_num - $second_num"; + $captcha_code = $first_num - $second_num; + } + } elseif ($operator === '*') { + $result = "{$first_num} x {$second_num}"; + $captcha_code = $first_num * $second_num; + } elseif ($operator === '+') { + $result = "$first_num + $second_num"; + $captcha_code = $first_num + $second_num; + } + + $this->setSession($this->key, (string) $captcha_code); + return $result; + } + + /** + * Creates a character-based captcha + */ + protected function getCharactersCaptcha($config, $length = null): string + { + if ($length === null) { + $length = $config['chars']['length'] ?? 6; + } + + // Use more complex character set with mixed case and exclude similar-looking characters + $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789'; + $captcha_code = ''; + + // Generate random characters + for ($i = 0; $i < $length; $i++) { + $captcha_code .= $chars[random_int(0, strlen($chars) - 1)]; + } + + $this->setSession($this->key, $captcha_code); + return $captcha_code; + } + + public function setSession($key, $value): void + { + $this->session->$key = $value; + } + + public function getSession($key = null): ?string + { + if ($key === null) { + $key = $this->key; + } + return $this->session->$key ?? null; + } + + /** + * Create captcha image based on the type + */ + public function createCaptchaImage($captcha_code) + { + // Determine image dimensions based on type + $isCharacterCaptcha = false; + if (strpos($captcha_code, '|') === false && !preg_match('/[\+\-x]/', $captcha_code)) { + $isCharacterCaptcha = true; + } + + // Use box_width/box_height for character captchas if specified, otherwise use default image dimensions + if ($isCharacterCaptcha && isset($this->config['chars']['box_width'])) { + $width = $this->config['chars']['box_width']; + } else { + $width = $this->config['image']['width'] ?? 135; + } + + if ($isCharacterCaptcha && isset($this->config['chars']['box_height'])) { + $height = $this->config['chars']['box_height']; + } else { + $height = $this->config['image']['height'] ?? 40; + } + + // Create a blank image + $image = imagecreatetruecolor($width, $height); + + // Set background color (support both image.bg and chars.bg for character captchas) + $bgColor = '#ffffff'; + if ($isCharacterCaptcha && isset($this->config['chars']['bg'])) { + $bgColor = $this->config['chars']['bg']; + } elseif (isset($this->config['image']['bg'])) { + $bgColor = $this->config['image']['bg']; + } + + $bg = $this->hexToRgb($bgColor); + $backgroundColor = imagecolorallocate($image, $bg[0], $bg[1], $bg[2]); + imagefill($image, 0, 0, $backgroundColor); + + // Parse the captcha code to determine type + if (strpos($captcha_code, '|') !== false) { + $parts = explode('|', $captcha_code); + $type = $parts[0]; + + switch ($type) { + case 'count_dots': + return $this->createDotCountImage($image, $parts, $this->config); + case 'position': + return $this->createPositionImage($image, $parts, $this->config); + } + } else { + // Assume it's a character or math captcha if no type indicator + if (preg_match('/[\+\-x]/', $captcha_code)) { + return $this->createMathImage($image, $captcha_code, $this->config); + } else { + return $this->createCharacterImage($image, $captcha_code, $this->config); + } + } + + return $image; + } + + /** + * Create image for dot counting captcha + */ + protected function createDotCountImage($image, $parts, $config) + { + $colorName = $parts[1]; + $targetColorRGB = explode(',', $parts[2]); + + $width = imagesx($image); + $height = imagesy($image); + + // Allocate target color + $targetColor = imagecolorallocate($image, $targetColorRGB[0], $targetColorRGB[1], $targetColorRGB[2]); + + // Create other distraction colors + $distractionColors = []; + $colorOptions = [ + [255, 0, 0], // red + [0, 0, 255], // blue + [0, 128, 0], // green + [255, 255, 0], // yellow + [128, 0, 128], // purple + [255, 165, 0] // orange + ]; + + foreach ($colorOptions as $rgb) { + if ($rgb[0] != $targetColorRGB[0] || $rgb[1] != $targetColorRGB[1] || $rgb[2] != $targetColorRGB[2]) { + $distractionColors[] = imagecolorallocate($image, $rgb[0], $rgb[1], $rgb[2]); + } + } + + // Get target count from session + $targetCount = (int) $this->getSession(); + + // Draw instruction text + $fontPath = __DIR__.'/../../fonts/'.($config['chars']['font'] ?? 'zxx-xed.ttf'); + $black = imagecolorallocate($image, 0, 0, 0); + imagettftext($image, 10, 0, 5, 15, $black, $fontPath, "Count {$colorName}:"); + + // Simplified approach to prevent overlapping + // Divide the image into a grid and place one dot per cell + $gridCells = []; + $gridRows = 2; + $gridCols = 4; + + // Build available grid cells + for ($y = 0; $y < $gridRows; $y++) { + for ($x = 0; $x < $gridCols; $x++) { + $gridCells[] = [$x, $y]; + } + } + + // Shuffle grid cells for random placement + shuffle($gridCells); + + // Calculate cell dimensions + $cellWidth = ($width - 20) / $gridCols; + $cellHeight = ($height - 20) / $gridRows; + + // Dot size for better visibility + $dotSize = 8; + + // Draw target dots first (taking the first N cells) + for ($i = 0; $i < $targetCount && $i < count($gridCells); $i++) { + $cell = $gridCells[$i]; + $gridX = $cell[0]; + $gridY = $cell[1]; + + // Calculate center position of cell with small random offset + $x = 10 + ($gridX + 0.5) * $cellWidth + mt_rand(-2, 2); + $y = 20 + ($gridY + 0.5) * $cellHeight + mt_rand(-2, 2); + + // Draw the dot + imagefilledellipse($image, $x, $y, $dotSize, $dotSize, $targetColor); + + // Add a small border for better contrast + imageellipse($image, $x, $y, $dotSize + 2, $dotSize + 2, $black); + } + + // Draw distraction dots using remaining grid cells + $distractionCount = min(mt_rand(8, 15), count($gridCells) - $targetCount); + + for ($i = 0; $i < $distractionCount; $i++) { + // Get the next available cell + $cellIndex = $targetCount + $i; + + if ($cellIndex >= count($gridCells)) { + break; // No more cells available + } + + $cell = $gridCells[$cellIndex]; + $gridX = $cell[0]; + $gridY = $cell[1]; + + // Calculate center position of cell with small random offset + $x = 10 + ($gridX + 0.5) * $cellWidth + mt_rand(-2, 2); + $y = 20 + ($gridY + 0.5) * $cellHeight + mt_rand(-2, 2); + + // Draw the dot with a random distraction color + $color = $distractionColors[array_rand($distractionColors)]; + imagefilledellipse($image, $x, $y, $dotSize, $dotSize, $color); + } + + // Add subtle grid lines to help with counting + $lightGray = imagecolorallocate($image, 230, 230, 230); + for ($i = 1; $i < $gridCols; $i++) { + imageline($image, 10 + $i * $cellWidth, 20, 10 + $i * $cellWidth, $height - 5, $lightGray); + } + for ($i = 1; $i < $gridRows; $i++) { + imageline($image, 10, 20 + $i * $cellHeight, $width - 10, 20 + $i * $cellHeight, $lightGray); + } + + // Add minimal noise + $this->addImageNoise($image, 15); + + return $image; + } + + /** + * Create image for position captcha + */ + protected function createPositionImage($image, $parts, $config) + { + $symbol = $parts[1]; + $position = $parts[2]; + + $width = imagesx($image); + $height = imagesy($image); + + // Allocate colors + $black = imagecolorallocate($image, 0, 0, 0); + $red = imagecolorallocate($image, 255, 0, 0); + + // Draw instruction text + $fontPath = __DIR__.'/../../fonts/'.($config['chars']['font'] ?? 'zxx-xed.ttf'); + imagettftext($image, 9, 0, 5, 15, $black, $fontPath, "Position of symbol?"); + + // Determine symbol position based on the target position + $symbolX = $width / 2; + $symbolY = $height / 2; + + switch ($position) { + case 'top': + $symbolX = $width / 2; + $symbolY = 20; + break; + case 'bottom': + $symbolX = $width / 2; + $symbolY = $height - 10; + break; + case 'left': + $symbolX = 20; + $symbolY = $height / 2; + break; + case 'right': + $symbolX = $width - 20; + $symbolY = $height / 2; + break; + case 'center': + $symbolX = $width / 2; + $symbolY = $height / 2; + break; + } + + // Draw the symbol - make it larger and in red for visibility + imagettftext($image, 20, 0, $symbolX - 8, $symbolY + 8, $red, $fontPath, $symbol); + + // Draw a grid to make positions clearer + $gray = imagecolorallocate($image, 200, 200, 200); + imageline($image, $width / 2, 15, $width / 2, $height - 5, $gray); + imageline($image, 5, $height / 2, $width - 5, $height / 2, $gray); + + // Add minimal noise + $this->addImageNoise($image, 10); + + return $image; + } + + /** + * Create image for math captcha + */ + protected function createMathImage($image, $mathExpression, $config) + { + $width = imagesx($image); + $height = imagesy($image); + + // Get font and colors + $fontPath = __DIR__.'/../../fonts/'.($config['chars']['font'] ?? 'zxx-xed.ttf'); + $textColor = imagecolorallocate($image, 0, 0, 0); + + // Draw the math expression + $fontSize = 16; + $textBox = imagettfbbox($fontSize, 0, $fontPath, $mathExpression); + $textWidth = $textBox[2] - $textBox[0]; + $textHeight = $textBox[1] - $textBox[7]; + $textX = ($width - $textWidth) / 2; + $textY = ($height + $textHeight) / 2; + + imagettftext($image, $fontSize, 0, $textX, $textY, $textColor, $fontPath, $mathExpression); + + // Add visual noise and distortions to prevent OCR + $this->addImageNoise($image, 25); + $this->addWaveDistortion($image); + + return $image; + } + + /** + * Create image for character captcha + */ + protected function createCharacterImage($image, $captcha_code, $config) + { + $width = imagesx($image); + $height = imagesy($image); + + // Get font settings with support for custom box dimensions, position, and colors + $fontPath = __DIR__.'/../../fonts/'.($config['chars']['font'] ?? 'zxx-xed.ttf'); + $fontSize = $config['chars']['size'] ?? 16; + + // Support custom text color (defaults to black) + $textColorHex = $config['chars']['text'] ?? '#000000'; + $textRgb = $this->hexToRgb($textColorHex); + $textColor = imagecolorallocate($image, $textRgb[0], $textRgb[1], $textRgb[2]); + + // Support custom start position (useful for fine-tuning text placement) + $startX = $config['chars']['start_x'] ?? ($width / (strlen($captcha_code) + 2)); + $baseY = $config['chars']['start_y'] ?? ($height / 2 + 5); + + // Draw each character with random rotation and position + $charWidth = $width / (strlen($captcha_code) + 2); + + for ($i = 0; $i < strlen($captcha_code); $i++) { + $char = $captcha_code[$i]; + $angle = mt_rand(-15, 15); // Random rotation + + // Random vertical position with custom base Y + $y = $baseY + mt_rand(-5, 5); + + imagettftext($image, $fontSize, $angle, $startX, $y, $textColor, $fontPath, $char); + + // Move to next character position with some randomness + $startX += $charWidth + mt_rand(-5, 5); + } + + // Add visual noise and distortions + $this->addImageNoise($image, 25); + $this->addWaveDistortion($image); + + return $image; + } + + /** + * Add random noise to the image + */ + protected function addImageNoise($image, $density = 100) + { + $width = imagesx($image); + $height = imagesy($image); + + // For performance, reduce density + $density = min($density, 30); + + // Add random dots + for ($i = 0; $i < $density; $i++) { + $x = mt_rand(0, $width - 1); + $y = mt_rand(0, $height - 1); + $shade = mt_rand(150, 200); + $color = imagecolorallocate($image, $shade, $shade, $shade); + imagesetpixel($image, $x, $y, $color); + } + + // Add a few random lines + $lineCount = min(3, mt_rand(2, 3)); + for ($i = 0; $i < $lineCount; $i++) { + $x1 = mt_rand(0, $width / 4); + $y1 = mt_rand(0, $height - 1); + $x2 = mt_rand(3 * $width / 4, $width - 1); + $y2 = mt_rand(0, $height - 1); + $shade = mt_rand(150, 200); + $color = imagecolorallocate($image, $shade, $shade, $shade); + imageline($image, $x1, $y1, $x2, $y2, $color); + } + } + + /** + * Add wave distortion to the image + */ + protected function addWaveDistortion($image) + { + $width = imagesx($image); + $height = imagesy($image); + + // Create temporary image + $temp = imagecreatetruecolor($width, $height); + $bg = imagecolorallocate($temp, 255, 255, 255); + imagefill($temp, 0, 0, $bg); + + // Copy original to temp + imagecopy($temp, $image, 0, 0, 0, 0, $width, $height); + + // Clear original image + $bg = imagecolorallocate($image, 255, 255, 255); + imagefill($image, 0, 0, $bg); + + // Apply simplified wave distortion + $amplitude = mt_rand(1, 2); + $period = mt_rand(10, 15); + + // Process only every 2nd pixel for better performance + for ($x = 0; $x < $width; $x += 2) { + $wave = sin($x / $period) * $amplitude; + + for ($y = 0; $y < $height; $y += 2) { + $yp = $y + $wave; + + if ($yp >= 0 && $yp < $height) { + $color = imagecolorat($temp, $x, $yp); + imagesetpixel($image, $x, $y, $color); + + // Fill adjacent pixel for better performance + if ($x + 1 < $width && $y + 1 < $height) { + imagesetpixel($image, $x + 1, $y, $color); + } + } + } + } + + imagedestroy($temp); + } + + public function renderCaptchaImage($imageData): void + { + header("Content-type: image/jpeg"); + imagejpeg($imageData); + } + + public function validateCaptcha($formData): bool + { + $isValid = false; + $capchaSessionData = $this->getSession(); + + // Make validation case-insensitive + if (strtolower((string) $capchaSessionData) == strtolower((string) $formData)) { + $isValid = true; + } + + // Debug validation if enabled + $grav = Grav::instance(); + if ($grav['config']->get('plugins.form.basic_captcha.debug', false)) { + $grav['log']->debug("Captcha Validation - Expected: '{$capchaSessionData}', Got: '{$formData}', Result: ". + ($isValid ? 'valid' : 'invalid')); + } + + // Regenerate a new captcha after validation + $this->setSession($this->key, null); + + return $isValid; + } + + private function hexToRgb($hex): array + { + return sscanf($hex, "#%02x%02x%02x"); + } +} \ No newline at end of file diff --git a/plugins/form/classes/Captcha/BasicCaptchaProvider.php b/plugins/form/classes/Captcha/BasicCaptchaProvider.php new file mode 100644 index 0000000..f52da60 --- /dev/null +++ b/plugins/form/classes/Captcha/BasicCaptchaProvider.php @@ -0,0 +1,134 @@ +config = Grav::instance()['config']->get('plugins.form.basic_captcha', []); + } + + /** + * {@inheritdoc} + */ + public function validate(array $form, array $params = []): array + { + $grav = Grav::instance(); + $session = $grav['session']; + + try { + // Get the expected answer from session + // Make sure to use the same session key that the image generation code uses + $expectedValue = $session->basic_captcha_value ?? null; // Changed from basic_captcha to basic_captcha_value + + // Get the captcha type from session (stored during generation) + $captchaType = $session->basic_captcha_type ?? null; + + // Get the user's answer + $userValue = $form['basic-captcha'] ?? null; + + if (!$expectedValue) { + return [ + 'success' => false, + 'error' => 'missing-session-data', + 'details' => ['error' => 'No captcha value found in session'] + ]; + } + + if (!$userValue) { + return [ + 'success' => false, + 'error' => 'missing-input-response', + 'details' => ['error' => 'User did not enter a captcha value'] + ]; + } + + // Compare the values based on the type stored in session + // If type is not in session, try to infer from global/field config + if (!$captchaType) { + $captchaType = $this->config['captcha_type'] ?? $this->config['type'] ?? 'characters'; + } + + if ($captchaType === 'characters') { + $isValid = strtolower((string)$userValue) === strtolower((string)$expectedValue); + } else { + // For math, dotcount, position - ensure both are treated as integers or exact match + $isValid = (int)$userValue === (int)$expectedValue; + } + + if (!$isValid) { + return [ + 'success' => false, + 'error' => 'validation-failed', + 'details' => [ + 'expected' => $expectedValue, + 'received' => $userValue + ] + ]; + } + + // Clear the session values to prevent reuse + $session->basic_captcha_value = null; + $session->basic_captcha_type = null; + + return [ + 'success' => true + ]; + } catch (\Exception $e) { + return [ + 'success' => false, + 'error' => $e->getMessage(), + 'details' => ['exception' => get_class($e)] + ]; + } + } + + /** + * {@inheritdoc} + */ + public function getClientProperties(string $formId, array $field): array + { + $grav = Grav::instance(); + $session = $grav['session']; + + // Merge field-level configuration with global defaults + $fieldConfig = array_replace_recursive($this->config, $field); + + // Remove non-config keys from field array + unset($fieldConfig['type'], $fieldConfig['label'], $fieldConfig['placeholder'], + $fieldConfig['validate'], $fieldConfig['name'], $fieldConfig['classes']); + + // Generate unique field ID for this form/field combination + $fieldId = md5($formId . '_basic_captcha_' . ($field['name'] ?? 'default')); + + // Store field configuration in session for image generation + $session->{"basic_captcha_config_{$fieldId}"} = $fieldConfig; + + $captchaType = $fieldConfig['type'] ?? 'math'; + + return [ + 'provider' => 'basic-captcha', + 'type' => $captchaType, + 'imageUrl' => "/forms-basic-captcha-image.jpg?field={$fieldId}", + 'refreshable' => true, + 'containerId' => "basic-captcha-{$formId}", + 'fieldId' => $fieldId + ]; + } + + /** + * {@inheritdoc} + */ + public function getTemplateName(): string + { + return 'forms/fields/basic-captcha/basic-captcha.html.twig'; + } +} \ No newline at end of file diff --git a/plugins/form/classes/Captcha/CaptchaFactory.php b/plugins/form/classes/Captcha/CaptchaFactory.php new file mode 100644 index 0000000..da1fd44 --- /dev/null +++ b/plugins/form/classes/Captcha/CaptchaFactory.php @@ -0,0 +1,84 @@ +error("Cannot register captcha provider '{$name}': Provider must implement CaptchaProviderInterface"); + return; + } + + self::$providers[$name] = $provider; +// Grav::instance()['log']->debug("Registered captcha provider: {$name}"); + } + + /** + * Check if a provider is registered + * + * @param string $name Provider name + * @return bool + */ + public static function hasProvider(string $name): bool + { + return isset(self::$providers[$name]); + } + + /** + * Get a provider by name + * + * @param string $name Provider name + * @return CaptchaProviderInterface|null Provider instance or null if not found + */ + public static function getProvider(string $name): ?CaptchaProviderInterface + { + return self::$providers[$name] ?? null; + } + + /** + * Get all registered providers + * + * @return array + */ + public static function getProviders(): array + { + return self::$providers; + } + + /** + * Register all default captcha providers + * + * @return void + */ + public static function registerDefaultProviders(): void + { + // Register built-in providers + self::registerProvider('recaptcha', new ReCaptchaProvider()); + self::registerProvider('turnstile', new TurnstileProvider()); + self::registerProvider('basic-captcha', new BasicCaptchaProvider()); + + // Log the registration +// Grav::instance()['log']->debug('Registered default captcha providers'); + } +} \ No newline at end of file diff --git a/plugins/form/classes/Captcha/CaptchaManager.php b/plugins/form/classes/Captcha/CaptchaManager.php new file mode 100644 index 0000000..39dac70 --- /dev/null +++ b/plugins/form/classes/Captcha/CaptchaManager.php @@ -0,0 +1,244 @@ +fireEvent('onFormRegisterCaptchaProviders'); + } + + /** + * Process a captcha validation + * + * @param Form $form The form to validate + * @param array|null $params Optional parameters + * @return bool True if validation succeeded + */ + public static function validateCaptcha(Form $form, $params = null): bool + { + // Handle case where $params is a boolean (backward compatibility) + if (!is_array($params)) { + $params = []; + } + + // --- 1. Find the captcha field in the form --- + $captchaField = null; + $providerName = null; + + $formFields = $form->value()->blueprints()->get('form/fields'); + foreach ($formFields as $fieldName => $fieldDef) { + $fieldType = $fieldDef['type'] ?? null; + + // Check for modern captcha type with provider + if ($fieldType === 'captcha') { + $captchaField = $fieldDef; + $providerName = $fieldDef['provider'] ?? 'recaptcha'; + break; + } + + // Check for legacy type-based providers (like basic-captcha and turnstile) + // This is for backward compatibility + elseif ($fieldType && CaptchaFactory::hasProvider($fieldType)) { + $captchaField = $fieldDef; + $providerName = $fieldType; + break; + } + } + + if (!$captchaField || !$providerName) { + // No captcha field found or no provider specified + return true; + } + + // --- 2. Get provider and validate --- + $provider = CaptchaFactory::getProvider($providerName); + if (!$provider) { + Grav::instance()['log']->error("Form Captcha: Unknown provider '{$providerName}' requested"); + return false; + } + + // Allow plugins to modify the validation parameters + $validationEvent = new Event([ + 'form' => $form, + 'field' => $captchaField, + 'provider' => $providerName, + 'params' => $params + ]); + Grav::instance()->fireEvent('onBeforeCaptchaValidation', $validationEvent); + $params = $validationEvent['params']; + + // Validate using the provider + try { + $result = $provider->validate($form->value()->toArray(), $params); + + if (!$result['success']) { + $logDetails = $result['details'] ?? []; + $errorMessage = self::getErrorMessage($captchaField, $result['error'] ?? 'validation-failed', $providerName); + + // Fire validation error event + Grav::instance()->fireEvent('onFormValidationError', new Event([ + 'form' => $form, + 'message' => $errorMessage, + 'provider' => $providerName + ])); + + // Log the failure + $uri = Grav::instance()['uri']; + Grav::instance()['log']->warning( + "Form Captcha ({$providerName}) validation failed: [{$uri->route()}] Details: " . + json_encode($logDetails) + ); + + return false; + } + + // Log success + Grav::instance()['log']->info("Form Captcha ({$providerName}) validation successful for form: " . $form->name); + + // Fire success event + Grav::instance()->fireEvent('onCaptchaValidationSuccess', new Event([ + 'form' => $form, + 'provider' => $providerName + ])); + + return true; + } catch (\Exception $e) { + // Handle other errors + Grav::instance()['log']->error("Form Captcha ({$providerName}) validation error: " . $e->getMessage()); + + $errorMessage = Grav::instance()['language']->translate('PLUGIN_FORM.ERROR_VALIDATING_CAPTCHA'); + Grav::instance()->fireEvent('onFormValidationError', new Event([ + 'form' => $form, + 'message' => $errorMessage, + 'provider' => $providerName, + 'exception' => $e + ])); + + return false; + } + } + + /** + * Get appropriate error message based on error code and field definition + * + * @param array $field Field definition + * @param string $errorCode Error code + * @param string $provider Provider name + * @return string + */ + protected static function getErrorMessage(array $field, string $errorCode, string $provider): string + { + $grav = Grav::instance(); + + // First check for specific message in field definition + if (isset($field['captcha_not_validated'])) { + return $field['captcha_not_validated']; + } + + // Then check for specific error code message + if ($errorCode === 'missing-input-response') { + return $grav['language']->translate('PLUGIN_FORM.ERROR_CAPTCHA_NOT_COMPLETED'); + } + + // Allow providers to supply custom error messages via event + $messageEvent = new Event([ + 'provider' => $provider, + 'errorCode' => $errorCode, + 'field' => $field, + 'message' => null + ]); + $grav->fireEvent('onCaptchaErrorMessage', $messageEvent); + + if ($messageEvent['message']) { + return $messageEvent['message']; + } + + // Finally fall back to generic message + return $grav['language']->translate('PLUGIN_FORM.ERROR_VALIDATING_CAPTCHA'); + } + + /** + * Get client-side initialization data for a captcha field + * + * @param string $formId Form ID + * @param array $field Field definition + * @return array Client properties + */ + public static function getClientProperties(string $formId, array $field): array + { + $providerName = $field['provider'] ?? null; + + // Handle legacy field types as providers + if (!$providerName && isset($field['type'])) { + $fieldType = $field['type']; + if (CaptchaFactory::hasProvider($fieldType)) { + $providerName = $fieldType; + } + } + + if (!$providerName) { + // Default to recaptcha for backward compatibility + $providerName = 'recaptcha'; + } + + $provider = CaptchaFactory::getProvider($providerName); + + if (!$provider) { + return [ + 'provider' => $providerName, + 'error' => "Unknown captcha provider: {$providerName}" + ]; + } + + return $provider->getClientProperties($formId, $field); + } + + /** + * Get template name for a captcha field + * + * @param array $field Field definition + * @return string Template name + */ + public static function getTemplateName(array $field): string + { + $providerName = $field['provider'] ?? null; + + // Handle legacy field types as providers + if (!$providerName && isset($field['type'])) { + $fieldType = $field['type']; + if (CaptchaFactory::hasProvider($fieldType)) { + $providerName = $fieldType; + } + } + + if (!$providerName) { + // Default to recaptcha for backward compatibility + $providerName = 'recaptcha'; + } + + $provider = CaptchaFactory::getProvider($providerName); + + if (!$provider) { + return 'forms/fields/captcha/default.html.twig'; + } + + return $provider->getTemplateName(); + } +} \ No newline at end of file diff --git a/plugins/form/classes/Captcha/CaptchaProviderInterface.php b/plugins/form/classes/Captcha/CaptchaProviderInterface.php new file mode 100644 index 0000000..c5d0f7b --- /dev/null +++ b/plugins/form/classes/Captcha/CaptchaProviderInterface.php @@ -0,0 +1,33 @@ +config = Grav::instance()['config']->get('plugins.form.recaptcha', []); + } + + /** + * {@inheritdoc} + */ + public function validate(array $form, array $params = []): array + { + $grav = Grav::instance(); + $uri = $grav['uri']; + $ip = Uri::ip(); + $hostname = $uri->host(); + + try { + $secretKey = $params['recaptcha_secret'] ?? $params['recatpcha_secret'] ?? + $this->config['secret_key'] ?? null; + + $defaultVersion = $this->normalizeVersion($this->config['version'] ?? '2-checkbox'); + $version = $this->normalizeVersion($params['recaptcha_version'] ?? $defaultVersion); + + $payloadVersion = $this->detectVersionFromPayload($form); + if ($payloadVersion !== null) { + $version = $payloadVersion; + } + + if (!$secretKey) { + throw new \RuntimeException("reCAPTCHA secret key not configured."); + } + + $requestMethod = extension_loaded('curl') ? new \ReCaptcha\RequestMethod\CurlPost() : null; + $recaptcha = new \ReCaptcha\ReCaptcha($secretKey, $requestMethod); + + // Handle V3 + if ($version === '3') { + // For V3, look for token in both top level and data[] structure + $token = $form['token'] ?? ($form['data']['token'] ?? null); + $action = $form['action'] ?? ($form['data']['action'] ?? null); + + if (!$token) { + $grav['log']->debug('reCAPTCHA validation failed: token missing for v3'); + return [ + 'success' => false, + 'error' => 'missing-input-response', + 'details' => ['error' => 'missing-input-response', 'version' => 'v3'] + ]; + } + + $recaptcha->setExpectedHostname($hostname); + + // Set action if provided + if ($action) { + $recaptcha->setExpectedAction($action); + } + + // Set score threshold + $recaptcha->setScoreThreshold($this->config['score_threshold'] ?? 0.5); + } + // Handle V2 (both checkbox and invisible) + else { + // For V2, look for standard response parameter + $token = $form['g-recaptcha-response'] ?? ($form['data']['g-recaptcha-response'] ?? null); + if (!$token) { + $post = $grav['uri']->post(); + if (is_array($post)) { + if (isset($post['g-recaptcha-response'])) { + $token = $post['g-recaptcha-response']; + } elseif (isset($post['g_recaptcha_response'])) { + $token = $post['g_recaptcha_response']; + } elseif (isset($post['data']) && is_array($post['data'])) { + if (isset($post['data']['g-recaptcha-response'])) { + $token = $post['data']['g-recaptcha-response']; + } elseif (isset($post['data']['g_recaptcha_response'])) { + $token = $post['data']['g_recaptcha_response']; + } + } + } + } + + if (!$token) { + $grav['log']->debug('reCAPTCHA validation failed: g-recaptcha-response missing for v2'); + return [ + 'success' => false, + 'error' => 'missing-input-response', + 'details' => ['error' => 'missing-input-response', 'version' => 'v2'] + ]; + } + + $recaptcha->setExpectedHostname($hostname); + } + + // Log validation attempt + $grav['log']->debug('reCAPTCHA validation attempt for version ' . $version); + + $validationResponseObject = $recaptcha->verify($token, $ip); + $isValid = $validationResponseObject->isSuccess(); + + if (!$isValid) { + $errorCodes = $validationResponseObject->getErrorCodes(); + $grav['log']->debug('reCAPTCHA validation failed: ' . json_encode($errorCodes)); + + return [ + 'success' => false, + 'error' => 'validation-failed', + 'details' => ['error-codes' => $errorCodes, 'version' => $version] + ]; + } + + // For V3, check if score is available and log it (helpful for debugging/tuning) + if ($version === '3' && method_exists($validationResponseObject, 'getScore')) { + $score = $validationResponseObject->getScore(); + $grav['log']->debug('reCAPTCHA v3 validation successful with score: ' . $score); + } else { + $grav['log']->debug('reCAPTCHA validation successful'); + } + + return [ + 'success' => true + ]; + } catch (\Exception $e) { + $grav['log']->error('reCAPTCHA validation error: ' . $e->getMessage()); + + return [ + 'success' => false, + 'error' => $e->getMessage(), + 'details' => ['exception' => get_class($e)] + ]; + } + } + + /** + * Normalize version values to the internal format we use elsewhere. + */ + protected function normalizeVersion($version): string + { + if ($version === null || $version === '') { + return '2-checkbox'; + } + + if ($version === 3 || $version === '3') { + return '3'; + } + + if ($version === 2 || $version === '2') { + return '2-checkbox'; + } + + return (string) $version; + } + + /** + * Infer the recaptcha version from the submitted payload when possible. + */ + protected function detectVersionFromPayload(array $form): ?string + { + $formData = isset($form['data']) && is_array($form['data']) ? $form['data'] : []; + + $grav = Grav::instance(); + $config = $grav['config']; + if ($config->get('plugins.form.debug')) { + try { + $grav['log']->debug('reCAPTCHA payload inspection', [ + 'top_keys' => array_keys($form), + 'data_keys' => array_keys($formData), + ]); + } catch (\Throwable $e) { + // Ignore logging issues, detection should continue. + } + } + + if (array_key_exists('token', $form) || array_key_exists('token', $formData)) { + return '3'; + } + + if (array_key_exists('g-recaptcha-response', $form) || array_key_exists('g-recaptcha-response', $formData)) { + return '2-checkbox'; + } + + if (array_key_exists('g_recaptcha_response', $form) || array_key_exists('g_recaptcha_response', $formData)) { + // Support alternative key naming just in case + return '2-checkbox'; + } + + return null; + } + + /** + * {@inheritdoc} + */ + public function getClientProperties(string $formId, array $field): array + { + $siteKey = $field['recaptcha_site_key'] ?? $this->config['site_key'] ?? null; + $theme = $field['recaptcha_theme'] ?? $this->config['theme'] ?? 'light'; + $version = $this->normalizeVersion($field['recaptcha_version'] ?? $this->config['version'] ?? '2-checkbox'); + + // Determine which version we're using + $isV3 = $version === '3'; + $isInvisible = $version === '2-invisible'; + + // Log the configuration to help with debugging + $grav = Grav::instance(); + $grav['log']->debug("reCAPTCHA config for form {$formId}: version={$version}, siteKey=" . + (empty($siteKey) ? 'MISSING' : 'configured')); + + return [ + 'provider' => 'recaptcha', + 'siteKey' => $siteKey, + 'theme' => $theme, + 'version' => $version, + 'isV3' => $isV3, + 'isInvisible' => $isInvisible, + 'containerId' => "g-recaptcha-{$formId}", + 'scriptUrl' => "https://www.google.com/recaptcha/api.js" . ($isV3 ? '?render=' . $siteKey : ''), + 'initFunctionName' => "initRecaptcha_{$formId}" + ]; + } + + /** + * {@inheritdoc} + */ + public function getTemplateName(): string + { + // Different templates based on version + $version = $this->normalizeVersion($this->config['version'] ?? '2-checkbox'); + + $isV3 = $version === '3'; + $isInvisible = $version === '2-invisible'; + + if ($isV3) { + return 'forms/fields/recaptcha/recaptchav3.html.twig'; + } elseif ($isInvisible) { + return 'forms/fields/recaptcha/recaptcha-invisible.html.twig'; + } + + return 'forms/fields/recaptcha/recaptcha.html.twig'; + } +} diff --git a/plugins/form/classes/Captcha/TurnstileProvider.php b/plugins/form/classes/Captcha/TurnstileProvider.php new file mode 100644 index 0000000..5a20c70 --- /dev/null +++ b/plugins/form/classes/Captcha/TurnstileProvider.php @@ -0,0 +1,134 @@ +config = Grav::instance()['config']->get('plugins.form.turnstile', []); + } + + /** + * {@inheritdoc} + */ + public function validate(array $form, array $params = []): array + { + $grav = Grav::instance(); + $uri = $grav['uri']; + $ip = Uri::ip(); + + $grav['log']->debug('Turnstile validation - entire form data: ' . json_encode(array_keys($form))); + + try { + $secretKey = $params['turnstile_secret'] ?? + $this->config['secret_key'] ?? null; + + if (!$secretKey) { + $grav['log']->error("Turnstile secret key not configured."); + throw new \RuntimeException("Turnstile secret key not configured."); + } + + // First check $_POST directly, then fallback to form data + $token = $_POST['cf-turnstile-response'] ?? null; + if (!$token) { + $token = $form['cf-turnstile-response'] ?? null; + } + + // Log raw POST data for debugging + $grav['log']->debug('Turnstile validation - raw POST data keys: ' . json_encode(array_keys($_POST))); + $grav['log']->debug('Turnstile validation - token present: ' . ($token ? 'YES' : 'NO')); + + if ($token) { + $grav['log']->debug('Turnstile token length: ' . strlen($token)); + } + + if (!$token) { + $grav['log']->warning('Turnstile validation failed: missing token response'); + return [ + 'success' => false, + 'error' => 'missing-input-response', + 'details' => ['error' => 'missing-input-response'] + ]; + } + + $client = \Grav\Common\HTTP\Client::getClient(); + $grav['log']->debug('Turnstile validation - calling API with token'); + + $response = $client->request('POST', 'https://challenges.cloudflare.com/turnstile/v0/siteverify', [ + 'body' => [ + 'secret' => $secretKey, + 'response' => $token, + 'remoteip' => $ip + ] + ]); + + $statusCode = $response->getStatusCode(); + $grav['log']->debug('Turnstile API response status: ' . $statusCode); + + $content = $response->toArray(); + $grav['log']->debug('Turnstile API response: ' . json_encode($content)); + + if (!isset($content['success'])) { + $grav['log']->error("Invalid response from Turnstile verification (missing 'success' key)."); + throw new \RuntimeException("Invalid response from Turnstile verification (missing 'success' key)."); + } + + if (!$content['success']) { + $grav['log']->warning('Turnstile validation failed: ' . json_encode($content)); + return [ + 'success' => false, + 'error' => 'validation-failed', + 'details' => ['error-codes' => $content['error-codes'] ?? ['validation-failed']] + ]; + } + + $grav['log']->debug('Turnstile validation successful'); + return [ + 'success' => true + ]; + } catch (\Exception $e) { + $grav['log']->error("Turnstile validation error: " . $e->getMessage()); + return [ + 'success' => false, + 'error' => $e->getMessage(), + 'details' => ['exception' => get_class($e)] + ]; + } + } + + /** + * {@inheritdoc} + */ + public function getClientProperties(string $formId, array $field): array + { + $siteKey = $field['turnstile_site_key'] ?? $this->config['site_key'] ?? null; + $theme = $field['turnstile_theme'] ?? $this->config['theme'] ?? 'auto'; + + return [ + 'provider' => 'turnstile', + 'siteKey' => $siteKey, + 'theme' => $theme, + 'containerId' => "cf-turnstile-{$formId}", + 'scriptUrl' => "https://challenges.cloudflare.com/turnstile/v0/api.js", + 'initFunctionName' => "initTurnstile_{$formId}" + ]; + } + + /** + * {@inheritdoc} + */ + public function getTemplateName(): string + { + return 'forms/fields/turnstile/turnstile.html.twig'; + } +} \ No newline at end of file diff --git a/plugins/form/classes/Form.php b/plugins/form/classes/Form.php index a02c559..99a3503 100644 --- a/plugins/form/classes/Form.php +++ b/plugins/form/classes/Form.php @@ -550,6 +550,10 @@ class Form implements FormInterface, ArrayAccess $url = $uri->url; $post = $uri->post(); + if (!empty($post['__unique_form_id__'])) { + $this->setUniqueId($post['__unique_form_id__']); + } + $name = $post['name'] ?? null; $task = $post['task'] ?? null; @@ -661,6 +665,7 @@ class Form implements FormInterface, ArrayAccess // Handle file size limits $settings->filesize *= self::BYTES_TO_MB; // 1024 * 1024 [MB in Bytes] if ($settings->filesize > 0 && $upload['file']['size'] > $settings->filesize) { + $grav['log']->warning(sprintf('Form upload rejected: %s (%d bytes) exceeds limit %d bytes', $filename, $upload['file']['size'], $settings->filesize)); // json_response return [ 'status' => 'error', @@ -748,7 +753,7 @@ class Form implements FormInterface, ArrayAccess * @param Language|null $language * @return string File upload error message */ - public function getFileUploadError(int $error, Language $language = null): string + public function getFileUploadError(int $error, ?Language $language = null): string { if (!$language) { $grav = Grav::instance(); @@ -892,6 +897,16 @@ class Form implements FormInterface, ArrayAccess $this->data->merge($data); } + if (!empty($post['__unique_form_id__'])) { + $this->setUniqueId($post['__unique_form_id__']); + } + + // Ensure file field values are populated from the flash storage before validation. + $flash = $this->getFlash(); + if ($flash->exists()) { + $this->setAllFiles($flash); + } + // Validate and filter data try { $grav->fireEvent('onFormPrepareValidation', new Event(['form' => $this])); @@ -899,17 +914,41 @@ class Form implements FormInterface, ArrayAccess $this->data->validate(); $this->data->filter(); - $grav->fireEvent('onFormValidationProcessed', new Event(['form' => $this])); - } catch (ValidationException $e) { - $this->status = 'error'; - $event = new Event(['form' => $this, 'message' => $e->getMessage(), 'messages' => $e->getMessages()]); - $grav->fireEvent('onFormValidationError', $event); - if ($event->isPropagationStopped()) { - return; + // Add special handling for file/filepond fields + foreach ($this->fields as $field) { + // Don't restrict to just type=file, but also other file based as long as they have filesize && accept + if (isset($field['filesize']) && isset($field['accept']) && + isset($field['validate']['required']) && + $field['validate']['required']) { + + // Get field name + $fieldName = $field['name']; + $fieldLabel = $field['label'] ?? $field['name']; + + // Check if files exist in the session for this field + $flashObject = $this->getFlash(); + if ($flashObject->exists()) { + $filesInField = $flashObject->getFilesByField($fieldName); + + // If no files found, add validation error + if (empty($filesInField)) { + $this->setError("$fieldLabel " . $grav['language']->translate("PLUGIN_FORM.FIELD_REQUIRED")); + throw new ValidationException(); + } + } else { + // No flash object with files found + $this->setError("$fieldLabel " . $grav['language']->translate("PLUGIN_FORM.FIELD_REQUIRED")); + throw new ValidationException(); + } + } } - } catch (RuntimeException $e) { + + $grav->fireEvent('onFormValidationProcessed', new Event(['form' => $this])); + } catch (ValidationException | RuntimeException $e) { $this->status = 'error'; - $event = new Event(['form' => $this, 'message' => $e->getMessage(), 'messages' => []]); + $this->message = $this->message ?? $e->getMessage(); + $this->messages = array_merge($this->messages, $e->getMessages()); + $event = new Event(['form' => $this, 'message' => $this->message, 'messages' => $this->messages]); $grav->fireEvent('onFormValidationError', $event); if ($event->isPropagationStopped()) { return; @@ -918,10 +957,11 @@ class Form implements FormInterface, ArrayAccess $redirect = $redirect_code = null; $process = $this->items['process'] ?? []; - $legacyUploads = !isset($process['upload']) || $process['upload'] !== false; + $legacyUploads = !isset($process['upload']) || $process['upload'] !== true; if ($legacyUploads) { $this->legacyUploads(); + $this->copyFiles(); } if (is_array($process)) { @@ -949,10 +989,6 @@ class Form implements FormInterface, ArrayAccess } } - if ($legacyUploads) { - $this->copyFiles(); - } - $this->getFlash()->delete(); if ($redirect) { @@ -1235,6 +1271,10 @@ class Form implements FormInterface, ArrayAccess $post = $uri->post(); $post['data'] = $this->decodeData($post['data'] ?? []); + if (!empty($post['__unique_form_id__'])) { + $this->setUniqueId($post['__unique_form_id__']); + } + if (empty($post['form-nonce']) || !Utils::verifyNonce($post['form-nonce'], 'form')) { throw new RuntimeException('Bad Request: Nonce is missing or invalid', 400); } @@ -1256,7 +1296,7 @@ class Form implements FormInterface, ArrayAccess * @param string|null $field * @return void */ - protected function removeFlashUpload(string $filename, string $field = null) + protected function removeFlashUpload(string $filename, ?string $field = null) { $flash = $this->getFlash(); $flash->removeFile($filename, $field); diff --git a/plugins/form/classes/Forms.php b/plugins/form/classes/Forms.php index 8294f5c..6ceb798 100644 --- a/plugins/form/classes/Forms.php +++ b/plugins/form/classes/Forms.php @@ -62,7 +62,7 @@ class Forms * @param array|null $form * @return FormInterface|null */ - public function createPageForm(PageInterface $page, string $name = null, array $form = null): ?FormInterface + public function createPageForm(PageInterface $page, ?string $name = null, ?array $form = null): ?FormInterface { if (null === $form) { [$name, $form] = $this->getPageParameters($page, $name); diff --git a/plugins/form/classes/TwigExtension.php b/plugins/form/classes/TwigExtension.php index 41d417b..b1f2d53 100644 --- a/plugins/form/classes/TwigExtension.php +++ b/plugins/form/classes/TwigExtension.php @@ -143,7 +143,7 @@ class TwigExtension extends AbstractExtension * @param string|null $default * @return string[] */ - public function includeFormField(string $type, $layouts = null, string $default = null): array + public function includeFormField(string $type, $layouts = null, ?string $default = null): array { $list = []; foreach ((array)$layouts as $layout) { diff --git a/plugins/form/form.php b/plugins/form/form.php index 853014e..1f71018 100644 --- a/plugins/form/form.php +++ b/plugins/form/form.php @@ -7,9 +7,7 @@ use DateTime; use Doctrine\Common\Cache\Cache; use Exception; use Grav\Common\Data\ValidationException; -use Grav\Common\Debugger; use Grav\Common\Filesystem\Folder; -use Grav\Common\Grav; use Grav\Common\Page\Interfaces\PageInterface; use Grav\Common\Page\Pages; use Grav\Common\Page\Types; @@ -21,14 +19,11 @@ use Grav\Common\Yaml; use Grav\Framework\Form\Interfaces\FormInterface; use Grav\Framework\Psr7\Response; use Grav\Framework\Route\Route; -use Grav\Plugin\Form\BasicCaptcha; +use Grav\Plugin\Form\Captcha\BasicCaptcha; +use Grav\Plugin\Form\Captcha\CaptchaManager; use Grav\Plugin\Form\Form; use Grav\Plugin\Form\Forms; use Grav\Plugin\Form\TwigExtension; -use Grav\Common\HTTP\Client; -use Monolog\Logger; -use ReCaptcha\ReCaptcha; -use ReCaptcha\RequestMethod\CurlPost; use RecursiveArrayIterator; use RecursiveIteratorIterator; use RocketTheme\Toolbox\File\JsonFile; @@ -88,7 +83,7 @@ class FormPlugin extends Plugin return [ 'onPluginsInitialized' => ['onPluginsInitialized', 0], 'onTwigExtensions' => ['onTwigExtensions', 0], - 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0] + 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0], ]; } @@ -97,7 +92,7 @@ class FormPlugin extends Plugin */ public function autoload() { - return require __DIR__ . '/vendor/autoload.php'; + return require __DIR__.'/vendor/autoload.php'; } /** @@ -119,6 +114,10 @@ class FormPlugin extends Plugin return $forms; }; + // Initialize the captcha manager + CaptchaManager::initialize(); + + if ($this->isAdmin()) { $this->enable([ 'onPageInitialized' => ['onPageInitialized', 0], @@ -154,7 +153,7 @@ class FormPlugin extends Plugin } /** - * @param Event $event + * @param Event $event * @return void */ public function onGetPageTemplates(Event $event): void @@ -167,7 +166,7 @@ class FormPlugin extends Plugin /** * Process forms after page header processing, but before caching * - * @param Event $event + * @param Event $event * @return void */ public function onPageProcessed(Event $event): void @@ -252,7 +251,7 @@ class FormPlugin extends Plugin if ($form instanceof Form) { // Post the form $isJson = $uri->extension() === 'json'; - $task = (string)($uri->post('task') ?? $uri->param('task')); + $task = (string) ($uri->post('task') ?? $uri->param('task')); if ($isJson) { if ($task === 'store-state') { @@ -394,7 +393,19 @@ class FormPlugin extends Plugin */ public function onTwigExtensions(): void { - $this->grav['twig']->twig->addExtension(new TwigExtension()); + $twig = $this->grav['twig']->twig; + $twig->addExtension(new TwigExtension()); + $twig->addFunction(new TwigFunction('captcha_template_exists', function ($template) use ($twig) { + return $twig->getLoader()->exists($template); + })); + + // Add function to store basic captcha configuration in session + $twig->addFunction(new TwigFunction('store_basic_captcha_config', function ($fieldId, $config) { + $session = $this->grav['session']; + $sessionKey = "basic_captcha_config_{$fieldId}"; + $session->{$sessionKey} = $config; + return true; + })); } /** @@ -404,16 +415,16 @@ class FormPlugin extends Plugin */ public function onTwigTemplatePaths(): void { - $this->grav['twig']->twig_paths[] = __DIR__ . '/templates'; + $this->grav['twig']->twig_paths[] = __DIR__.'/templates'; } /** * Make form accessible from twig. * - * @param Event|null $event + * @param Event|null $event * @return void */ - public function onTwigVariables(Event $event = null): void + public function onTwigVariables(?Event $event = null): void { if ($event && isset($event['page'])) { $page = $event['page']; @@ -437,7 +448,7 @@ class FormPlugin extends Plugin /** * Handle form processing instructions. * - * @param Event $event + * @param Event $event * @return void * @throws Exception * @throws TransportExceptionInterface @@ -452,121 +463,25 @@ class FormPlugin extends Plugin $this->process($form); switch ($action) { - case 'captcha': - - $captcha_config = $this->config->get('plugins.form.recaptcha'); - - $secret = $params['recaptcha_secret'] ?? $params['recatpcha_secret'] ?? $captcha_config['secret_key']; - - /** @var Uri $uri */ - $uri = $this->grav['uri']; - $action = $form->value('action'); - $hostname = $uri->host(); - $ip = Uri::ip(); - - $recaptcha = new ReCaptcha($secret); - if (extension_loaded('curl')) { - $recaptcha = new ReCaptcha($secret, new CurlPost()); - } - - // get captcha version - $captcha_version = $captcha_config['version'] ?? 2; - - // Add version 3 specific options - if ($captcha_version == 3) { - $token = $form->value('token'); - $resp = $recaptcha - ->setExpectedHostname($hostname) - ->setExpectedAction($action) - ->setScoreThreshold(0.5) - ->verify($token, $ip); - } else { - $token = $form->value('g-recaptcha-response', true); - $resp = $recaptcha - ->setExpectedHostname($hostname) - ->verify($token, $ip); - } - - if (!$resp->isSuccess()) { - $errors = $resp->getErrorCodes(); - $message = $this->grav['language']->translate('PLUGIN_FORM.ERROR_VALIDATING_CAPTCHA'); - - $fields = $form->value()->blueprints()->get('form/fields'); - foreach ($fields as $field) { - $type = $field['type'] ?? 'text'; - $field_message = $field['recaptcha_not_validated'] ?? null; - if ($type === 'captcha' && $field_message) { - $message = $field_message; - break; - } - } - - $this->grav->fireEvent('onFormValidationError', new Event([ - 'form' => $form, - 'message' => $message - ])); - - $this->grav['log']->warning('Form reCAPTCHA Errors: [' . $uri->route() . '] ' . json_encode($errors)); - - $event->stopPropagation(); - - return; - } - break; case 'basic-captcha': - $captcha = new BasicCaptcha(); - $captcha_value = trim($form->value('basic-captcha')); - if (!$captcha->validateCaptcha($captcha_value)) { - $message = $params['message'] ?? $this->grav['language']->translate('PLUGIN_FORM.ERROR_BASIC_CAPTCHA'); - $form->setData('basic-captcha', ''); - $this->grav->fireEvent('onFormValidationError', new Event([ - 'form' => $form, - 'message' => $message - ])); - - $event->stopPropagation(); - return; - } - break; case 'turnstile': - /** @var Uri $uri */ - $uri = $this->grav['uri']; + case 'captcha': + // Convert boolean params to array if needed + $captcha_params = is_array($params) ? $params : []; - $turnstile_config = $this->config->get('plugins.form.turnstile'); - $secret = $turnstile_config['secret_key'] ?? null; - $token = $form->getValue('cf-turnstile-response') ?? null; - $ip = Uri::ip(); - - $client = Client::getClient(); - $response = $client->request('POST', 'https://challenges.cloudflare.com/turnstile/v0/siteverify', [ - 'body' => [ - 'secret' => $secret, - 'response' => $token, - 'remoteip' => $ip - ] - ]); - - $content = $response->toArray(); - - if (!$content['success']) { - $message = $params['message'] ?? $this->grav['language']->translate('PLUGIN_FORM.ERROR_BASIC_CAPTCHA'); - - $this->grav->fireEvent('onFormValidationError', new Event([ - 'form' => $form, - 'message' => $message - ])); - - $this->grav['log']->warning('Form Turnstile invalid: [' . $uri->route() . '] ' . json_encode($content)); + // Use the captcha manager to validate + $validated = CaptchaManager::validateCaptcha($form, $captcha_params); + if (!$validated) { $event->stopPropagation(); - return; } - break; + case 'timestamp': $label = $params['label'] ?? 'Timestamp'; $format = $params['format'] ?? 'Y-m-d H:i:s'; $blueprint = $form->value()->blueprints(); - $blueprint->set('form/fields/timestamp', ['name' => 'timestamp', 'label' => $label, 'type' => 'hidden']); + $blueprint->set('form/fields/timestamp', + ['name' => 'timestamp', 'label' => $label, 'type' => 'hidden']); $now = new DateTime('now'); $date_string = $now->format($format); $form->setFields($blueprint->fields()); @@ -593,7 +508,7 @@ class FormPlugin extends Plugin break; case 'redirect': $this->grav['session']->setFlashObject('form', $form); - $url = ((string)$params); + $url = ((string) $params); $vars = array( 'form' => $form ); @@ -616,11 +531,11 @@ class FormPlugin extends Plugin } break; case 'display': - $route = (string)$params; + $route = (string) $params; if (!$route || $route[0] !== '/') { /** @var Uri $uri */ $uri = $this->grav['uri']; - $route = rtrim($uri->route(), '/') . '/' . ($route ?: ''); + $route = rtrim($uri->route(), '/').'/'.($route ?: ''); } /** @var Twig $twig */ @@ -640,7 +555,7 @@ class FormPlugin extends Plugin break; case 'remember': foreach ($params as $remember_field) { - $field_cookie = 'forms-' . $form['name'] . '-' . $remember_field; + $field_cookie = 'forms-'.$form['name'].'-'.$remember_field; setcookie($field_cookie, $form->value($remember_field), time() + 60 * 60 * 24 * 60); } break; @@ -652,9 +567,9 @@ class FormPlugin extends Plugin case 'save': $prefix = $params['fileprefix'] ?? ''; $format = $params['dateformat'] ?? 'Ymd-His-u'; - $raw_format = (bool)($params['dateraw'] ?? false); + $raw_format = (bool) ($params['dateraw'] ?? false); $postfix = $params['filepostfix'] ?? ''; - $ext = !empty($params['extension']) ? '.' . trim($params['extension'], '.') : '.txt'; + $ext = !empty($params['extension']) ? '.'.trim($params['extension'], '.') : '.txt'; $filename = $params['filename'] ?? ''; $folder = !empty($params['folder']) ? $params['folder'] : $form->getName(); $operation = $params['operation'] ?? 'create'; @@ -664,7 +579,7 @@ class FormPlugin extends Plugin throw new RuntimeException('Form save: \'operation: add\' is only supported with a static filename'); } - $filename = $prefix . $this->udate($format, $raw_format) . $postfix . $ext; + $filename = $prefix.$this->udate($format, $raw_format).$postfix.$ext; } // Handle bad filenames. @@ -683,8 +598,8 @@ class FormPlugin extends Plugin $locator = $this->grav['locator']; $path = $locator->findResource('user-data://', true); - $dir = $path . DS . $folder; - $fullFileName = $dir . DS . $filename; + $dir = $path.DS.$folder; + $fullFileName = $dir.DS.$filename; if (!empty($params['raw']) || !empty($params['template'])) { // Save data as it comes from the form. @@ -780,7 +695,7 @@ class FormPlugin extends Plugin /** * Custom field logic can go in here * - * @param Event $event + * @param Event $event * @return void */ public function onFormValidationProcessed(Event $event): void @@ -796,7 +711,7 @@ class FormPlugin extends Plugin /** * Handle form validation error * - * @param Event $event An event object + * @param Event $event An event object * @return void * @throws Exception */ @@ -832,7 +747,7 @@ class FormPlugin extends Plugin /** * Add a form definition to the forms plugin * - * @param PageInterface $page + * @param PageInterface $page * @return void */ public function addFormDefinition(PageInterface $page, string $name, array $form): void @@ -850,8 +765,8 @@ class FormPlugin extends Plugin /** * Add a form to the forms plugin * - * @param string|null $route - * @param FormInterface|null $form + * @param string|null $route + * @param FormInterface|null $form * @return void */ public function addForm(?string $route, ?FormInterface $form): void @@ -874,7 +789,7 @@ class FormPlugin extends Plugin /** * function to get a specific form * - * @param string|array|null $data Optional form name or ['name' => $name, 'route' => $route] + * @param string|array|null $data Optional form name or ['name' => $name, 'route' => $route] * @return FormInterface|null */ public function getForm($data = null): ?FormInterface @@ -885,8 +800,8 @@ class FormPlugin extends Plugin // Handle parameters. if (is_array($data)) { - $name = (string)($data['name'] ?? ''); - $route = (string)($data['route'] ?? ''); + $name = (string) ($data['name'] ?? ''); + $route = (string) ($data['route'] ?? ''); } elseif (is_string($data)) { $name = $data; $route = ''; @@ -943,7 +858,8 @@ class FormPlugin extends Plugin if (null === $form) { // First check if we requested a specific form which didn't exist. if ($route_provided || $unnamed) { - $this->grav['debugger']->addMessage(sprintf('Form %s not found in page %s', $name ?? 'unnamed', $route), 'warning'); + $this->grav['debugger']->addMessage(sprintf('Form %s not found in page %s', $name ?? 'unnamed', $route), + 'warning'); return null; } @@ -957,7 +873,8 @@ class FormPlugin extends Plugin // Check for naming conflicts. if (count($forms) > 1) { - $this->grav['debugger']->addMessage(sprintf('Fetching form by its name, but there are multiple pages with the same form name %s', $name), 'warning'); + $this->grav['debugger']->addMessage(sprintf('Fetching form by its name, but there are multiple pages with the same form name %s', + $name), 'warning'); } [$route, $name, $form] = $first; @@ -969,7 +886,8 @@ class FormPlugin extends Plugin if (is_array($form)) { // Form was cached as an array, try to create the object. if (null === $page) { - $this->grav['debugger']->addMessage(sprintf('Form %s cannot be created as page %s does not exist', $name, $route), 'warning'); + $this->grav['debugger']->addMessage(sprintf('Form %s cannot be created as page %s does not exist', + $name, $route), 'warning'); return null; } @@ -1071,7 +989,7 @@ class FormPlugin extends Plugin * * - fillWithCurrentDateTime * - * @param FormInterface $form + * @param FormInterface $form * @return void */ protected function process($form) @@ -1098,7 +1016,7 @@ class FormPlugin extends Plugin /** * Return all forms matching the given name. * - * @param string $name + * @param string $name * @return array */ protected function findFormByName(string $name): array @@ -1127,7 +1045,7 @@ class FormPlugin extends Plugin { /** @var Uri $uri */ $uri = $this->grav['uri']; - $status = (bool)$uri->post('form-nonce'); + $status = (bool) $uri->post('form-nonce'); if ($status && $form = $this->form()) { // Make sure form is something we recognize. @@ -1135,7 +1053,7 @@ class FormPlugin extends Plugin return false; } - if (isset($form->xhr_submit) && $form->xhr_submit) { + if (isset($form->xhr_submit) && $form->xhr_submit && $this->isFormXhrRequest()) { $form->set('template', $form->template ?? 'form-xhr'); } @@ -1145,7 +1063,7 @@ class FormPlugin extends Plugin } if (isset($form->refresh_prevention)) { - $refresh_prevention = (bool)$form->refresh_prevention; + $refresh_prevention = (bool) $form->refresh_prevention; } else { $refresh_prevention = $this->config->get('plugins.form.refresh_prevention', false); } @@ -1173,10 +1091,10 @@ class FormPlugin extends Plugin /** * Get the current form, should already be processed but can get it directly from the page if necessary * - * @param PageInterface|null $page + * @param PageInterface|null $page * @return FormInterface|null */ - protected function form(PageInterface $page = null) + protected function form(?PageInterface $page = null) { /** @var Forms $forms */ $forms = $this->grav['forms']; @@ -1223,12 +1141,12 @@ class FormPlugin extends Plugin } /** - * @param PageInterface $page - * @param string|null $name - * @param array|null $form + * @param PageInterface $page + * @param string|null $name + * @param array|null $form * @return FormInterface|null */ - protected function createForm(PageInterface $page, string $name = null, array $form = null): ?FormInterface + protected function createForm(PageInterface $page, ?string $name = null, ?array $form = null): ?FormInterface { /** @var Forms $forms */ $forms = $this->grav['forms']; @@ -1250,7 +1168,8 @@ class FormPlugin extends Plugin $forms = $cache->fetch($this->getFormCacheId()); } catch (Exception $e) { - $this->grav['debugger']->addMessage(sprintf('Unserializing cached forms failed: %s', $e->getMessage()), 'error'); + $this->grav['debugger']->addMessage(sprintf('Unserializing cached forms failed: %s', $e->getMessage()), + 'error'); $forms = null; } @@ -1262,7 +1181,8 @@ class FormPlugin extends Plugin if ($forms) { $this->forms = Utils::arrayMergeRecursiveUnique($this->forms, $forms); if ($this->config()['debug']) { - $this->grav['log']->debug(sprintf("<<<< Loaded cached forms: %s\n%s", $this->getFormCacheId(), $this->arrayToString($this->forms))); + $this->grav['log']->debug(sprintf("<<<< Loaded cached forms: %s\n%s", $this->getFormCacheId(), + $this->arrayToString($this->forms))); } } @@ -1286,7 +1206,8 @@ class FormPlugin extends Plugin $cache->save($cache_id, $this->forms); if ($this->config()['debug']) { - $this->grav['log']->debug(sprintf(">>>> Saved cached forms: %s\n%s", $this->getFormCacheId(), $this->arrayToString($this->forms))); + $this->grav['log']->debug(sprintf(">>>> Saved cached forms: %s\n%s", $this->getFormCacheId(), + $this->arrayToString($this->forms))); } } @@ -1300,17 +1221,17 @@ class FormPlugin extends Plugin /** @var \Grav\Common\Cache $cache */ $cache = $this->grav['cache']; /** @var Pages $pages */ - $pages= $this->grav['pages']; + $pages = $this->grav['pages']; // $cache_id = $cache->getKey() . '-form-plugin'; - $cache_id = $pages->getPagesCacheId() . '-form-plugin'; + $cache_id = $pages->getPagesCacheId().'-form-plugin'; return $cache_id; } /** * Create unix timestamp for storing the data into the filesystem. * - * @param string $format - * @param bool $raw + * @param string $format + * @param bool $raw * @return string */ protected function udate($format = 'u', $raw = false) @@ -1326,10 +1247,22 @@ class FormPlugin extends Plugin return date(preg_replace('`(?path() === '/forms-basic-captcha-image.jpg') { - $captcha = new BasicCaptcha(); + // Get field ID from query parameter + $fieldId = $_GET['field'] ?? null; + $fieldConfig = null; + + // Retrieve field-specific configuration from session if available + if ($fieldId) { + $session = $this->grav['session']; + $sessionKey = "basic_captcha_config_{$fieldId}"; + $fieldConfig = $session->{$sessionKey} ?? null; + } + + // Create captcha with field-specific or global config + $captcha = new BasicCaptcha($fieldConfig); $code = $captcha->getCaptchaCode(); $image = $captcha->createCaptchaImage($code); $captcha->renderCaptchaImage($image); @@ -1337,12 +1270,14 @@ class FormPlugin extends Plugin } } - protected function arrayToString($array, $level = 2) { + protected function arrayToString($array, $level = 2) + { $result = $this->limitArrayLevels($array, $level); return json_encode($result, JSON_UNESCAPED_SLASHES); } - protected function limitArrayLevels($array, $levelsToKeep, $currentLevel = 0) { + protected function limitArrayLevels($array, $levelsToKeep, $currentLevel = 0) + { if ($currentLevel >= $levelsToKeep) { return '-'; } @@ -1357,4 +1292,21 @@ class FormPlugin extends Plugin return $result; } + + protected function isFormXhrRequest(): bool + { + if (!$this->grav['request']) { + return false; + } + + // Check 1: Our custom header (most reliable for our purpose) + $isCustomXhr = $this->grav['request']->getHeaderLine('X-Grav-Form-XHR') === 'true'; + + // Check 2: Standard X-Requested-With (often added by libraries) + $isStdXhr = $this->grav['request']->getHeaderLine('X-Requested-With') === 'XMLHttpRequest'; + + // Require our custom header for the specific partial rendering logic. + // You could use || $isStdXhr if you want to be more lenient, but $isCustomXhr is stricter. + return $isCustomXhr && $isStdXhr; + } } diff --git a/plugins/form/form.yaml b/plugins/form/form.yaml index 97de6b9..b6e4ce4 100644 --- a/plugins/form/form.yaml +++ b/plugins/form/form.yaml @@ -26,18 +26,29 @@ turnstile: secret_key: basic_captcha: - type: characters # options: [characters | math] + type: math # Options: dotcount, position, math, characters + debug: false # Enable debug logging for troubleshooting + + # Image settings + image: + width: 135 # Image width (default: 135 for classic size) + height: 40 # Image height (default: 40 for classic size) + bg: '#ffffff' # Background color + + # Character captcha settings (used for the 'characters' type) chars: - length: 6 # number of chars to output - font: zxx-noise.ttf # options: [zxx-noise.ttf | zxx-camo.ttf | zxx-xed.ttf | zxx-sans.ttf] - bg: '#cccccc' # 6-char hex color - text: '#333333' # 6-char hex color - size: 24 # font size in px - start_x: 5 # start position in x direction in px - start_y: 30 # start position in y direction in px - box_width: 135 # box width in px - box_height: 40 # box height in px + length: 6 # Number of characters to display + font: zxx-xed.ttf # Font file in the plugin's fonts directory + size: 24 # Font size + box_width: 200 # Image width + box_height: 70 # Image height + start_x: 10 # Starting X position for text + start_y: 40 # Starting Y position for text + bg: '#ffffff' # Background color + text: '#000000' # Text color + + # Math puzzle settings (used for the 'math' type) math: - min: 1 # smallest digit - max: 12 # largest digit - operators: ['+','-','*'] # operators that can be used in math + min: 1 # Minimum number value + max: 12 # Maximum number value + operators: ['+','-','*'] # Available operators diff --git a/plugins/form/languages.yaml b/plugins/form/languages.yaml index 0479936..424cb98 100644 --- a/plugins/form/languages.yaml +++ b/plugins/form/languages.yaml @@ -1,6 +1,8 @@ en: PLUGIN_FORM: NOT_VALIDATED: "Form not validated. One or more required fields are missing." + FIELD_REQUIRED: "field is required." + VALIDATION_MATCH: "%s field does not match %s field." NONCE_NOT_VALIDATED: "Oops, your form has timed out, please reload the page and submit the form again." FILES: "Files Upload" FORM_ALREADY_SUBMITTED: "This form has already been submitted." @@ -10,8 +12,8 @@ en: DESTINATION_HELP: "The location where the files should be uploaded to" ACCEPT: "Allowed MIME Types" ACCEPT_HELP: "A list of MIME Types that are allowed for upload" - ERROR_BASIC_CAPTCHA: "Captcha failed for this form, please try again" - ERROR_VALIDATING_CAPTCHA: "reCAPTCHA bot protection has identified this form submission is problematic" + ERROR_CAPTCHA_NOT_COMPLETED: "Human verification failed for this form, please try again" + ERROR_VALIDATING_CAPTCHA: "Human verification has identified this form submission is problematic" DATA_SUMMARY: "Here is the summary of what you wrote to us:" NO_FORM_DATA: "No form data available" RECAPTCHA: "reCAPTCHA" @@ -41,6 +43,7 @@ en: FILEUPLOAD_ERR_CANT_WRITE: 'Failed to write file to disk' FILEUPLOAD_ERR_EXTENSION: 'A PHP extension stopped the file upload' FILEUPLOAD_ERR_UNKNOWN: 'Unknown file upload error' + EXCEEDED_GRAV_FILESIZE_LIMIT: 'File exceeds the server upload size limit.' DROPZONE_CANCEL_UPLOAD: 'Cancel upload' DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Are you sure you want to cancel this upload?' DROPZONE_DEFAULT_MESSAGE: 'Drop your files here or click in this area' @@ -90,10 +93,19 @@ en: TURNSTILE_CAPTCHA: "Cloudflare Turnstile Captcha" MODULAR_FORM_FIX: "Modular Form Fix" MODULAR_FORM_FIX_HELP: "Fixes the issue with modular forms not finding the correct form automatically" + XHR_FILE_UPLOAD: "XHR File Upload" + XHR_FILE_UPLOAD_HELP: "Enable advanced XHR support for file uploads in forms submitted via AJAX" + FILEPOND_REMOVE_FILE: "Remove file" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Are you sure you want to remove this file?" + FILEPOND_CANCEL_UPLOAD: "Cancel upload" + FILEPOND_ERROR_FILESIZE: "File is too large" + FILEPOND_ERROR_FILETYPE: "Invalid file type" eu: PLUGIN_FORM: NOT_VALIDATED: "Formularioa ez da baliozkotu. Beharrezkoa den eremu bat edo gehiago falta dira." + FIELD_REQUIRED: "Eremua beharrezkoa da." + VALIDATION_MATCH: "%s eremuak ez du bat dator %s eremuarekin." NONCE_NOT_VALIDATED: "Arazo bat gertatu da. Egiaztatu sartutako informazioa eta bidali berriro formularioa." FILES: "Fitxategi Kargatzea" FORM_ALREADY_SUBMITTED: "Formulario hau dagoeneko bidali da." @@ -103,6 +115,7 @@ eu: DESTINATION_HELP: "Fitxategiak non kokatu behar diren" ACCEPT: "Baimendutako MIME motak" ACCEPT_HELP: "Kargatu ahal diren MIME moten zerrenda" + ERROR_CAPTCHA_NOT_COMPLETED: "Giza egiaztapena huts egin du form hauentzat, saiatu berriro mesedez." ERROR_VALIDATING_CAPTCHA: "Errorea reCAPTCHA egiaztatzerakoan" DATA_SUMMARY: "Hona hemen idatzi diguzunaren laburpena:" NO_FORM_DATA: "Formularioaren datuak ez daude eskuragarri" @@ -124,43 +137,75 @@ eu: FILEUPLOAD_PREVENT_SELF: 'Ezin da "%s" erabili orrialdeetatik kanpo.' FILEUPLOAD_UNABLE_TO_UPLOAD: '%s: %s fitxategia ezin da kargatu' FILEUPLOAD_UNABLE_TO_MOVE: '%s fitxategia ezin da mugitu "%s"-ra' - DROPZONE_CANCEL_UPLOAD: 'Utzi kargatzea' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Ziur al zaude kargatzea bertan behera utzi nahi duzula?' - DROPZONE_DEFAULT_MESSAGE: 'Utzi zure fitxategiak hemen edo klik egin eremu honetan ' - DROPZONE_FALLBACK_MESSAGE: 'Zure nabigatzaileak ez du jasaten fitxategiak arrastratzea.' - DROPZONE_FALLBACK_TEXT: 'Mesedez erabili beheko formularioa zure fitxategiak kargatzeko.' - DROPZONE_FILE_TOO_BIG: 'Fitxategiak asko pisatzen du ({{filesize}}MiB). Gehienezko tamaina: {{maxFilesize}}MiB.' + FILEUPLOAD_ERR_OK: "Ez dago erroreik, fitxategia behar bezala kargatuta." + FILEUPLOAD_ERR_INI_SIZE: "Kargatutako fitxategia gehienezko tamaina gainditzen du." + FILEUPLOAD_ERR_FORM_SIZE: "Kargatutako fitxategia HTMLn zehaztutako MAX_FILE_SIZE direktiba gainditzen du." + FILEUPLOAD_ERR_PARTIAL: "Fitxategia partzialki kargatuta geratu da." + FILEUPLOAD_ERR_NO_FILE: "Ez da fitxategirik kargatu." + FILEUPLOAD_ERR_NO_TMP_DIR: "Ezin da aurkitu aldi-mailako karpeta." + FILEUPLOAD_ERR_CANT_WRITE: "Fitxategia diskera idazteko huts egin du." + FILEUPLOAD_ERR_EXTENSION: "PHP luzapen batek gelditu du fitxategia kargatzean." + FILEUPLOAD_ERR_UNKNOWN: "Ezezagun den fitxategi kargatze errorea." + DROPZONE_CANCEL_UPLOAD: "Utzi kargatzea" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Ziur al zaude kargatzea bertan behera utzi nahi duzula?" + DROPZONE_DEFAULT_MESSAGE: "Utzi zure fitxategiak hemen edo klik egin eremu honetan" + DROPZONE_FALLBACK_MESSAGE: "Zure nabigatzaileak ez du jasaten fitxategiak arrastratzea." + DROPZONE_FALLBACK_TEXT: "Erabili beheko formulario alternatiboa fitxategiak kargatzeko, zahar bezain bezala." + DROPZONE_FILE_TOO_BIG: "Fitxategia asko pisatzen du ({{filesize}}MiB). Gehienezko tamaina: {{maxFilesize}}MiB." DROPZONE_INVALID_FILE_TYPE: "Ezin dituzu mota honetako fitxategiak kargatu." DROPZONE_MAX_FILES_EXCEEDED: "Ezin dituzu fitxategi gehiago kargatu." DROPZONE_REMOVE_FILE: "Fitxategia ezabatu" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Zihur al zaude fitxategia ezabatu nahi duzula?' - DROPZONE_RESPONSE_ERROR: "Zerbitzariak{{statusCode}} kodearekin erantzun du." + DROPZONE_REMOVE_FILE_CONFIRMATION: "Ziur al zaude fitxategia ezabatu nahi duzula?" + DROPZONE_RESPONSE_ERROR: "Zerbitzariak {{statusCode}} kodearekin erantzun du." YES: "Bai" NO: "Ez" REFRESH_PREVENTION: "Eguneratze prebentzioa" - REFRESH_PREVENTION_HELP: "Erabili formularioaren ID bakarra, zihurtatzeko ez dela berriro prozesatuko nabigatzailea eguneratzerakoan." + REFRESH_PREVENTION_HELP: "Erabili formularioaren ID berezia, berriz kargatzean ez dadin errepikatu." LIMIT: "Muga" - LIMIT_HELP: "Baimendutako gehienezko fitxategi kopurua eremu bakoitzeko (beharrezkoak dira fitxategi anitz)" + LIMIT_HELP: "Fitxategi gehienezko kopurua eremu bakoitzeko (anitz beharrezkoak)" FILESIZE: "Gehienezko fitxategi tamaina" - FILESIZE_HELP: "Onartutako gehienezko fitxategi tamaina (MB-tan), 0 = Sistemaren lehenetsia" + FILESIZE_HELP: "Onartutako fitxategi tamaina maximoa (MBetan), 0 = Sistema lehenetsia" AVOID_OVERWRITING: "Gainean idaztea ekidin" - AVOID_OVERWRITING_HELP: "Izen bereko fitxategiak gainean idaztea ekidin. Data aurrizkia gehituko da" + AVOID_OVERWRITING_HELP: "Izen bera duten fitxategien gainean idaztea ekiditzen du. Data aurrizkia gehituko da." RANDOM_NAME: "Ausazko izena" - RANDOM_NAME_HELP: "Sortu ausazko 15 karakteredun kate luze bat, izen bezala, kargatutako fitxategientzat" + RANDOM_NAME_HELP: "Sortu ausazko 15 karaktere luze bat kargatutako fitxategientzat." CLIENT_SIDE_VALIDATION: "Bezeroaren aldeko baliozkotzea" - CLIENT_SIDE_VALIDATION_HELP: "Lehenetsita, formularioek HTML5 bezeroaren aldeko baliozkotzea erabiliko dute lehenengo defentsa moduan." + CLIENT_SIDE_VALIDATION_HELP: "Formulariek HTML5 bezeroaren aldeko baliozkotzea erabiliko dute lehenengo defentsa moduan." INLINE_ERRORS: "Erroreak lerroan" - INLINE_ERRORS_HELP: "Erabilgarria den 'bezeroaren aldeko baliozkotzea' desgaituta dago, testuinguruko formulario erroreak erakusten ditu" - RESOLUTION_MIN: "{{Attr}} atributua {{min}}px gutxienekoa baino txikiagoa izan zen
" - RESOLUTION_MAX: "{{Attr}} atributua {{max}}px gehienekoa baino handiagoa izan da
" - DESTINATION_NOT_SPECIFIED: "Helmuga ez da zehaztu" - INVALID_MIME_TYPE: "%s fitxategiaren %s MIME mota ez da onartzen." - INVALID_FILE_EXTENSION: "%s fitxategiaren luzapena ez da onartzen." + INLINE_ERRORS_HELP: "Erabilgarria, bezeroaren aldeko baliozkotzea desgaitu badago, inline formako erroreak erakusten ditu." + RESOLUTION_MIN: "{{attr}} txikiena {{min}}px baino txikiagoa da
" + RESOLUTION_MAX: "{{attr}} handiena {{max}}px baino handiagoa da
" + BASIC_CAPTCHA: "Oinarrizko Captcha" + BASIC_CAPTCHA_TYPE: "Captcha erronka mota" + BASIC_CAPTCHA_LENGTH: "Karaktere kopurua" + BASIC_CAPTCHA_FONT: "TTF Letra-mota" + BASIC_CAPTCHA_SIZE: "Letra tamaina" + BASIC_CAPTCHA_BG_COLOR: "Atzeko planoaren kolorea" + BASIC_CAPTCHA_TEXT_COLOR: "Testuaren kolorea" + BASIC_CAPTCHA_START_X: "Testuaren hasierako x- posizioa" + BASIC_CAPTCHA_START_Y: "Testuaren hasierako y- posizioa" + BASIC_CAPTCHA_BOX_WIDTH: "Irudiaren zabalera" + BASIC_CAPTCHA_BOX_HEIGHT: "Irudiaren altuera" + BASIC_CAPTCHA_MATH_MIN: "Zenbaki minimoa" + BASIC_CAPTCHA_MATH_MAX: "Zenbaki maximoa" + BASIC_CAPTCHA_MATH_OPERATORS: "Matematikako eragileak (ausazkoak)" + TURNSTILE_CAPTCHA: "Cloudflare Turnstile Captcha" + MODULAR_FORM_FIX: "Formulario modularra konpontzea" + MODULAR_FORM_FIX_HELP: "Modular formularioek form zuzenak automatikoki ez aurkitzen dituzten arazoa konpontzen du." + XHR_FILE_UPLOAD: "XHR Fitxategi Kargatzea" + XHR_FILE_UPLOAD_HELP: "AJAX bidez bidalitako formularietarako XHR aurreratua kargatzeko laguntza ahalbidetzen du." + FILEPOND_REMOVE_FILE: "Fitxategia ezabatu" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Ziur al zaude fitxategi hau ezabatu nahi duzula?" + FILEPOND_CANCEL_UPLOAD: "Kargatzea bertan behera utzi" + FILEPOND_ERROR_FILESIZE: "Fitxategia handiegia da" + FILEPOND_ERROR_FILETYPE: "Fitxategi mota ezegokia" de: PLUGIN_FORM: NOT_VALIDATED: "Formularwerte nicht gültig. Für ein oder mehrere erforderliche Felder fehlen Werte." - NONCE_NOT_VALIDATED: "Ups, es gibt da ein Problem. Eingabewerte bitte noch mal prüfen und das Formular erneut absenden." + FIELD_REQUIRED: "Feld ist erforderlich." + VALIDATION_MATCH: "%s-Feld stimmt nicht mit %s-Feld überein." + NONCE_NOT_VALIDATED: "Ups, es gibt da ein Problem. Bitte prüfen Sie Ihre Eingaben und senden Sie das Formular erneut." FILES: "Dateien hochladen" FORM_ALREADY_SUBMITTED: "Formular wurde bereits versendet." ALLOW_MULTIPLE: "Erlaube mehr als eine Datei" @@ -169,61 +214,117 @@ de: DESTINATION_HELP: "Das Ziel, wohin die Dateien hochgeladen werden sollen." ACCEPT: "Erlaubte MIME-Typen" ACCEPT_HELP: "Eine Liste von MIME-Typen, die hochgeladen werden dürfen." - ERROR_VALIDATING_CAPTCHA: "Die Überprüfung des Captcha ist fehlgeschlagen." - DATA_SUMMARY: "Hier die Zusammenfassung dessen, was du geschrieben hast:" - YES: "Ja" - NO: "Nein" + ERROR_CAPTCHA_NOT_COMPLETED: "Menschliche Verifizierung für dieses Formular fehlgeschlagen, bitte versuchen Sie es erneut." + ERROR_VALIDATING_CAPTCHA: "Die Überprüfung des Captchas ist fehlgeschlagen." + DATA_SUMMARY: "Hier die Zusammenfassung dessen, was Sie geschrieben haben:" NO_FORM_DATA: "Keine Formulardaten vorhanden" RECAPTCHA: "ReCaptcha" + RECAPTCHA_VERSION: "Version" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Checkbox" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Unsichtbar" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Neueste" + RECAPTCHA_THEME: "Thema" + RECAPTCHA_THEME_LIGHT: "Helles Thema" + RECAPTCHA_THEME_DARK: "Dunkles Thema" RECAPTCHA_SITE_KEY: "Seitenschlüssel" - RECAPTCHA_SITE_KEY_HELP: "Für mehr Informationen besuche https://developers.google.com/recaptcha" + RECAPTCHA_SITE_KEY_HELP: "Für mehr Informationen besuchen Sie https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Privater Schlüssel" - RECAPTCHA_SECRET_KEY_HELP: "Für mehr Informationen besuche https://developers.google.com/recaptcha" + RECAPTCHA_SECRET_KEY_HELP: "Für mehr Informationen besuchen Sie https://developers.google.com/recaptcha" GENERAL: "General" USE_BUILT_IN_CSS: "Benutze eingebautes CSS" USE_INLINE_CSS: "Benutze inline CSS" FILEUPLOAD_PREVENT_SELF: '"%s" kann nicht ausserhalb der Seiten verwendet werden.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Upload-Fehler %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Fehler beim Verschieben von %s nach "%s"' - DROPZONE_CANCEL_UPLOAD: 'Upload abgebrochen' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Bist du sicher, dass du diesen Upload abbrechen möchtest??' - DROPZONE_DEFAULT_MESSAGE: 'Ziehe deine Dateien hierhin: Klicke hier' - DROPZONE_FALLBACK_MESSAGE: 'Dein Browser unterstützt kein "drag and drop".' - DROPZONE_FILE_TOO_BIG: 'Datei zu gross ({{filesize}}MiB). Maximale Dateigrösse: {{maxFilesize}}MiB.' - DROPZONE_INVALID_FILE_TYPE: "Du kannst keine Dateien dieses Typs hochladen." - DROPZONE_MAX_FILES_EXCEEDED: "Du kannst keine weiteren Dateien hochladen." + FILEUPLOAD_ERR_OK: "Kein Fehler, Datei wurde erfolgreich hochgeladen." + FILEUPLOAD_ERR_INI_SIZE: "Die hochgeladene Datei überschreitet die maximale Upload-Größe." + FILEUPLOAD_ERR_FORM_SIZE: "Die hochgeladene Datei überschreitet die im HTML angegebene MAX_FILE_SIZE-Direktive." + FILEUPLOAD_ERR_PARTIAL: "Die Datei wurde nur teilweise hochgeladen." + FILEUPLOAD_ERR_NO_FILE: "Es wurde keine Datei hochgeladen." + FILEUPLOAD_ERR_NO_TMP_DIR: "Temporäres Verzeichnis fehlt." + FILEUPLOAD_ERR_CANT_WRITE: "Datei konnte nicht auf die Festplatte geschrieben werden." + FILEUPLOAD_ERR_EXTENSION: "Eine PHP-Erweiterung hat den Upload gestoppt." + FILEUPLOAD_ERR_UNKNOWN: "Unbekannter Fehler beim Dateiupload." + DROPZONE_CANCEL_UPLOAD: "Upload abbrechen" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Sind Sie sicher, dass Sie diesen Upload abbrechen möchten?" + DROPZONE_DEFAULT_MESSAGE: "Ziehen Sie Ihre Dateien hierher oder klicken Sie in diesen Bereich" + DROPZONE_FALLBACK_MESSAGE: "Ihr Browser unterstützt kein Drag-and-Drop-Datei-Upload." + DROPZONE_FALLBACK_TEXT: "Bitte verwenden Sie das alternative Formular unten, um Ihre Dateien hochzuladen." + DROPZONE_FILE_TOO_BIG: "Datei zu groß ({{filesize}}MiB). Maximale Dateigröße: {{maxFilesize}}MiB." + DROPZONE_INVALID_FILE_TYPE: "Sie können keine Dateien dieses Typs hochladen." + DROPZONE_MAX_FILES_EXCEEDED: "Sie können keine weiteren Dateien hochladen." DROPZONE_REMOVE_FILE: "Datei entfernen" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Möchtest du diese Datei wirklich löschen?' + DROPZONE_REMOVE_FILE_CONFIRMATION: "Möchten Sie diese Datei wirklich löschen?" DROPZONE_RESPONSE_ERROR: "Server antwortet mit {{statusCode}}." - LIMIT_HELP: "Maximale anzahl erlaubter Dateien (Mehrfachauswahl erforderlich) " - FILESIZE: "Maximale Dateigrösse" - FILESIZE_HELP: "Maximale Dateigrösse (in MB), 0 = Benutze Standart" - AVOID_OVERWRITING: "Überschreiben verhindern" - AVOID_OVERWRITING_HELP: "Verhindert das Überschreiben und fügt einen Dateipräfix hinzu." + YES: "Ja" + NO: "Nein" + REFRESH_PREVENTION: "Aktualisierungs-Verhinderung" + REFRESH_PREVENTION_HELP: "Verwenden Sie die eindeutige Formular-ID, damit das Formular bei einem Neuladen des Browsers nicht erneut verarbeitet wird." + LIMIT: "Limit" + LIMIT_HELP: "Maximale Anzahl der erlaubten Dateien pro Feld (bei Mehrfachauswahl erforderlich)" + FILESIZE: "Maximale Dateigröße" + FILESIZE_HELP: "Maximal erlaubte Dateigröße (in MB), 0 = Systemvorgabe" + AVOID_OVERWRITING: "Überschreiben vermeiden" + AVOID_OVERWRITING_HELP: "Verhindert, dass Dateien mit gleichem Namen überschrieben werden. Ein Datumsprefix wird hinzugefügt." RANDOM_NAME: "Zufälliger Name" - RANDOM_NAME_HELP: "Generiert einen 15 Zeichen langen Zufallsnamen." - CLIENT_SIDE_VALIDATION: "Klientseitige Überprüfung" + RANDOM_NAME_HELP: "Erzeugt einen 15 Zeichen langen zufälligen Namen für die hochgeladenen Dateien." + CLIENT_SIDE_VALIDATION: "Klientseitige Validierung" + CLIENT_SIDE_VALIDATION_HELP: "Standardmäßig verwenden Formulare die HTML5-Validierung auf der Clientseite als erste Verteidigungslinie." INLINE_ERRORS: "Inline-Fehler" - DESTINATION_NOT_SPECIFIED: "Zielort nicht definiert" - INVALID_MIME_TYPE: "Der MIME-Typ %s für die Datei %s ist nicht erlaubt." - INVALID_FILE_EXTENSION: "Die Dateiendung %s ist nicht erlaubt." + INLINE_ERRORS_HELP: "Nützlich, wenn die clientseitige Validierung deaktiviert ist. Zeigt kontextbezogene Inline-Fehler an." + RESOLUTION_MIN: "Der {{attr}} ist kleiner als das Minimum von {{min}}px
" + RESOLUTION_MAX: "Der {{attr}} ist größer als das Maximum von {{max}}px
" + BASIC_CAPTCHA: "Einfaches Captcha" + BASIC_CAPTCHA_TYPE: "Captcha-Herausforderungstyp" + BASIC_CAPTCHA_LENGTH: "Anzahl der Zeichen" + BASIC_CAPTCHA_FONT: "TTF-Schriftart" + BASIC_CAPTCHA_SIZE: "Schriftgröße" + BASIC_CAPTCHA_BG_COLOR: "Hintergrundfarbe" + BASIC_CAPTCHA_TEXT_COLOR: "Textfarbe" + BASIC_CAPTCHA_START_X: "Textstart x-Position" + BASIC_CAPTCHA_START_Y: "Textstart y-Position" + BASIC_CAPTCHA_BOX_WIDTH: "Bildbreite" + BASIC_CAPTCHA_BOX_HEIGHT: "Bildhöhe" + BASIC_CAPTCHA_MATH_MIN: "Mindestzahl" + BASIC_CAPTCHA_MATH_MAX: "Maximalzahl" + BASIC_CAPTCHA_MATH_OPERATORS: "Mathematische Operatoren (zufällig)" + TURNSTILE_CAPTCHA: "Cloudflare Turnstile Captcha" + MODULAR_FORM_FIX: "Modulares Formular-Update" + MODULAR_FORM_FIX_HELP: "Behebt das Problem, dass modulare Formulare nicht automatisch das richtige Formular finden." + XHR_FILE_UPLOAD: "XHR Dateiupload" + XHR_FILE_UPLOAD_HELP: "Aktiviert den erweiterten XHR-Support für Dateiuploads in per AJAX gesendeten Formularen." + FILEPOND_REMOVE_FILE: "Datei entfernen" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Sind Sie sicher, dass Sie diese Datei entfernen möchten?" + FILEPOND_CANCEL_UPLOAD: "Upload abbrechen" + FILEPOND_ERROR_FILESIZE: "Datei ist zu groß" + FILEPOND_ERROR_FILETYPE: "Ungültiger Dateityp" es: PLUGIN_FORM: NOT_VALIDATED: "Falló la validación del formulario. Uno o más campos obligatorios no fueron cubiertos." + FIELD_REQUIRED: "El campo es obligatorio." + VALIDATION_MATCH: "El campo %s no coincide con el campo %s." NONCE_NOT_VALIDATED: "Oops, hay un problema, por favor revise la información e intente enviar el formulario otra vez." FILES: "Subida de Ficheros" FORM_ALREADY_SUBMITTED: "Este formulario ya ha sido enviado" ALLOW_MULTIPLE: "Permitir más de un fichero" - ALLOW_MULTIPLE_HELP: "Permitir seleccionar más de un fichero para subir." + ALLOW_MULTIPLE_HELP: "Permite seleccionar más de un fichero para subir." DESTINATION: "Destino" DESTINATION_HELP: "El lugar de destino al que subir los ficheros" ACCEPT: "MIME Types permitidos" - ACCEPT_HELP: "Una lista de MIME Types que se permiten subir." + ACCEPT_HELP: "Una lista de MIME Types que se permiten subir." + ERROR_CAPTCHA_NOT_COMPLETED: "La verificación humana falló para este formulario, por favor, inténtalo de nuevo." ERROR_VALIDATING_CAPTCHA: "Error al comprobar el Captcha" DATA_SUMMARY: "Este es el resumen de lo que nos has escrito:" NO_FORM_DATA: "No hay datos disponibles del formulario" RECAPTCHA: "ReCaptcha" + RECAPTCHA_VERSION: "Versión" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Casilla" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Invisible" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Última" + RECAPTCHA_THEME: "Tema" + RECAPTCHA_THEME_LIGHT: "Tema claro" + RECAPTCHA_THEME_DARK: "Tema oscuro" RECAPTCHA_SITE_KEY: "Site key" RECAPTCHA_SITE_KEY_HELP: "Para más información visita https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Secret key" @@ -234,39 +335,77 @@ es: FILEUPLOAD_PREVENT_SELF: 'No se puede utilizar "%s" fuera de las páginas' FILEUPLOAD_UNABLE_TO_UPLOAD: 'No se puede subir el fichero %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'No se puede mover el fichero %s to "%s"' - DROPZONE_CANCEL_UPLOAD: 'Cancelar subida' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: '¿Estas seguro que quieres cancelar esta subida?' - DROPZONE_DEFAULT_MESSAGE: 'Arrastra tus ficheros aquí o haz click en esta área' - DROPZONE_FALLBACK_MESSAGE: 'Tu navegador no soporta el arrastrar y soltar ficheros de subida.' - DROPZONE_FALLBACK_TEXT: 'Por favor utiliza el formulario alternativo que esta debajo, para subir ficheros como antiguamente.' - DROPZONE_FILE_TOO_BIG: 'Fichero demasiado grande ({{filesize}}MiB). Máximo tamaño: {{maxFilesize}}MiB.' + FILEUPLOAD_ERR_OK: "No hay error, el fichero se ha subido correctamente." + FILEUPLOAD_ERR_INI_SIZE: "El fichero subido excede el tamaño máximo permitido." + FILEUPLOAD_ERR_FORM_SIZE: "El fichero subido excede la directiva MAX_FILE_SIZE especificada en el HTML." + FILEUPLOAD_ERR_PARTIAL: "El fichero se subió parcialmente." + FILEUPLOAD_ERR_NO_FILE: "No se subió ningún fichero." + FILEUPLOAD_ERR_NO_TMP_DIR: "Falta una carpeta temporal." + FILEUPLOAD_ERR_CANT_WRITE: "Error al escribir el fichero en disco." + FILEUPLOAD_ERR_EXTENSION: "Una extensión de PHP detuvo la subida del fichero." + FILEUPLOAD_ERR_UNKNOWN: "Error desconocido en la subida del fichero." + DROPZONE_CANCEL_UPLOAD: "Cancelar subida" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "¿Estás seguro de que quieres cancelar esta subida?" + DROPZONE_DEFAULT_MESSAGE: "Arrastra tus ficheros aquí o haz click en esta área" + DROPZONE_FALLBACK_MESSAGE: "Tu navegador no soporta el arrastrar y soltar ficheros de subida." + DROPZONE_FALLBACK_TEXT: "Por favor utiliza el formulario alternativo que está debajo para subir ficheros como antiguamente." + DROPZONE_FILE_TOO_BIG: "Fichero demasiado grande ({{filesize}}MiB). Tamaño máximo: {{maxFilesize}}MiB." DROPZONE_INVALID_FILE_TYPE: "No puedes subir ficheros de este tipo." - DROPZONE_MAX_FILES_EXCEEDED: "No puedes subir mas ficheros." + DROPZONE_MAX_FILES_EXCEEDED: "No puedes subir más ficheros." DROPZONE_REMOVE_FILE: "Borrar fichero" - DROPZONE_REMOVE_FILE_CONFIRMATION: '¿Estas seguro de que quieres borrar este fichero?' - DROPZONE_RESPONSE_ERROR: "El servidor respondió con el código de estado {{statusCode}}." + DROPZONE_REMOVE_FILE_CONFIRMATION: "¿Estás seguro de que quieres borrar este fichero?" + DROPZONE_RESPONSE_ERROR: "El servidor respondió con el código {{statusCode}}." YES: "Si" NO: "No" REFRESH_PREVENTION: "Prevenir refresco" - REFRESH_PREVENTION_HELP: "Utiliza el ID único del formulario para garantizar que el este no se vuelve a procesar cuando se refresca el navegador" + REFRESH_PREVENTION_HELP: "Utiliza el ID único del formulario para garantizar que éste no se reprocese al refrescar el navegador" LIMIT: "Límite" - LIMIT_HELP: "Máximo número de ficheros permitidos por campo (múltiples requeridos)" + LIMIT_HELP: "Número máximo de ficheros permitidos por campo (múltiples requeridos)" FILESIZE: "Tamaño máximo de fichero" - FILESIZE_HELP: "Tamaño máximo de fichero permitido (en MB), 0 = Utiliza el de por defecto del sistema" + FILESIZE_HELP: "Tamaño máximo de fichero permitido (en MB), 0 = Usa el del sistema por defecto" AVOID_OVERWRITING: "Evitar sobreescribir" - AVOID_OVERWRITING_HELP: "Evita que los ficheros con el mismo nombre sean sobreescritos. Se agregará el prefijo de fecha" + AVOID_OVERWRITING_HELP: "Evita que ficheros con el mismo nombre sean sobreescritos. Se agregará un prefijo con la fecha" RANDOM_NAME: "Nombre aleatorio" - RANDOM_NAME_HELP: "Genera una cadela aleatoria de 15 caracteres como nombre de fichero a subir" + RANDOM_NAME_HELP: "Genera una cadena aleatoria de 15 caracteres como nombre para el fichero subido" CLIENT_SIDE_VALIDATION: "Validación del lado del cliente" - CLIENT_SIDE_VALIDATION_HELP: "Por defecto los formularios usarán validación HTML5 del lado del cliente como primera línea de defensa" + CLIENT_SIDE_VALIDATION_HELP: "Por defecto los formularios usarán la validación HTML5 del lado del cliente como primera línea de defensa" INLINE_ERRORS: "Errores en línea" - INLINE_ERRORS_HELP: "Útil con 'validación del lado del cliente' desactivado, muestra errores en el formulario contextual en línea" - RESOLUTION_MIN: "{{attr}} fué menor que el mínimo {{min}}px
" - RESOLUTION_MAX: "{{attr}} fué mayor que el máximo {{max}}px
" + INLINE_ERRORS_HELP: "Útil si la validación del lado del cliente está desactivada, muestra errores contextuales en línea" + RESOLUTION_MIN: "{{attr}} fue menor que el mínimo de {{min}}px
" + RESOLUTION_MAX: "{{attr}} fue mayor que el máximo de {{max}}px
" + DESTINATION_NOT_SPECIFIED: "Destino no especificado" + INVALID_MIME_TYPE: "El tipo MIME %s para el archivo %s no es aceptado." + INVALID_FILE_EXTENSION: "La extensión del archivo %s no es aceptada." + BASIC_CAPTCHA: "Captcha básico" + BASIC_CAPTCHA_TYPE: "Tipo de desafío Captcha" + BASIC_CAPTCHA_LENGTH: "Número de caracteres" + BASIC_CAPTCHA_FONT: "Fuente TTF" + BASIC_CAPTCHA_SIZE: "Tamaño de fuente" + BASIC_CAPTCHA_BG_COLOR: "Color de fondo" + BASIC_CAPTCHA_TEXT_COLOR: "Color del texto" + BASIC_CAPTCHA_START_X: "Posición inicial x del texto" + BASIC_CAPTCHA_START_Y: "Posición inicial y del texto" + BASIC_CAPTCHA_BOX_WIDTH: "Ancho de la imagen" + BASIC_CAPTCHA_BOX_HEIGHT: "Alto de la imagen" + BASIC_CAPTCHA_MATH_MIN: "Número mínimo" + BASIC_CAPTCHA_MATH_MAX: "Número máximo" + BASIC_CAPTCHA_MATH_OPERATORS: "Operadores matemáticos (aleatorios)" + TURNSTILE_CAPTCHA: "Captcha Cloudflare Turnstile" + MODULAR_FORM_FIX: "Corrección de formulario modular" + MODULAR_FORM_FIX_HELP: "Corrige el problema de que los formularios modulares no encuentran automáticamente el formulario correcto." + XHR_FILE_UPLOAD: "Carga de archivo XHR" + XHR_FILE_UPLOAD_HELP: "Habilita soporte XHR avanzado para la carga de archivos en formularios enviados vía AJAX." + FILEPOND_REMOVE_FILE: "Eliminar archivo" + FILEPOND_REMOVE_FILE_CONFIRMATION: "¿Está seguro de que desea eliminar este archivo?" + FILEPOND_CANCEL_UPLOAD: "Cancelar carga" + FILEPOND_ERROR_FILESIZE: "El archivo es demasiado grande" + FILEPOND_ERROR_FILETYPE: "Tipo de archivo inválido" fr: PLUGIN_FORM: NOT_VALIDATED: "Formulaire non validé. Un ou plusieurs champs obligatoires sont manquants." + FIELD_REQUIRED: "Le champ est obligatoire." + VALIDATION_MATCH: "Le champ %s ne correspond pas au champ %s." NONCE_NOT_VALIDATED: "Oups, un problème est survenu. Veuillez vérifier votre saisie et soumettre à nouveau le formulaire." FILES: "Fichiers chargés" FORM_ALREADY_SUBMITTED: "Le formulaire a déjà été envoyé." @@ -276,19 +415,37 @@ fr: DESTINATION_HELP: "L'emplacement où les fichiers doivent être chargés." ACCEPT: "Autoriser les Types MIME" ACCEPT_HELP: "Liste des Types MIME autorisés au chargement" + ERROR_CAPTCHA_NOT_COMPLETED: "La vérification humaine a échoué pour ce formulaire, veuillez réessayer." ERROR_VALIDATING_CAPTCHA: "Erreur lors de la validation du Captcha" DATA_SUMMARY: "Voici le résumé de ce que vous nous avez écrit :" NO_FORM_DATA: "Aucune donnée de formulaire disponible" RECAPTCHA: "ReCaptcha" + RECAPTCHA_VERSION: "Version" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Case à cocher" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Invisible" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Dernière" + RECAPTCHA_THEME: "Thème" + RECAPTCHA_THEME_LIGHT: "Thème clair" + RECAPTCHA_THEME_DARK: "Thème sombre" RECAPTCHA_SITE_KEY: "Clé du site" - RECAPTCHA_SITE_KEY_HELP: "Pour plus d'informations veuillez vous rendre sur https://developers.google.com/recaptcha" + RECAPTCHA_SITE_KEY_HELP: "Pour plus d'informations, rendez-vous sur https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Clé secrète" - RECAPTCHA_SECRET_KEY_HELP: "Pour plus d'informations veuillez vous rendre sur https://developers.google.com/recaptcha" + RECAPTCHA_SECRET_KEY_HELP: "Pour plus d'informations, rendez-vous sur https://developers.google.com/recaptcha" GENERAL: "Général" USE_BUILT_IN_CSS: "Utiliser les CSS natifs" + USE_INLINE_CSS: "Utiliser CSS en ligne" FILEUPLOAD_PREVENT_SELF: "Impossible d'utiliser '%s' en dehors des pages." FILEUPLOAD_UNABLE_TO_UPLOAD: "Impossible de charger le fichier %s: %s" - FILEUPLOAD_UNABLE_TO_MOVE: 'Impossible de déplacer le fichier %s vers "%s"' + FILEUPLOAD_UNABLE_TO_MOVE: "Impossible de déplacer le fichier %s vers \"%s\"" + FILEUPLOAD_ERR_OK: "Aucune erreur, le fichier a été chargé avec succès." + FILEUPLOAD_ERR_INI_SIZE: "Le fichier chargé dépasse la taille maximale autorisée." + FILEUPLOAD_ERR_FORM_SIZE: "Le fichier chargé dépasse la directive MAX_FILE_SIZE spécifiée dans le HTML." + FILEUPLOAD_ERR_PARTIAL: "Le fichier n'a été que partiellement chargé." + FILEUPLOAD_ERR_NO_FILE: "Aucun fichier n'a été chargé." + FILEUPLOAD_ERR_NO_TMP_DIR: "Dossier temporaire manquant." + FILEUPLOAD_ERR_CANT_WRITE: "Échec de l'écriture du fichier sur le disque." + FILEUPLOAD_ERR_EXTENSION: "Une extension PHP a interrompu le chargement du fichier." + FILEUPLOAD_ERR_UNKNOWN: "Erreur inconnue lors du chargement du fichier." DROPZONE_CANCEL_UPLOAD: "Annuler le chargement" DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Êtes-vous certain de vouloir annuler ce téléchargement ?" DROPZONE_DEFAULT_MESSAGE: "Glissez vos fichiers ici ou cliquez dans cette zone" @@ -303,37 +460,61 @@ fr: YES: "Oui" NO: "Non" REFRESH_PREVENTION: "Prévenir la redondance" - REFRESH_PREVENTION_HELP: "Utilise l’identifiant unique du formulaire pour s’assurer qu’il n’est pas pris deux fois en compte si l’on recharge le navigateur." + REFRESH_PREVENTION_HELP: "Utilisez l’identifiant unique du formulaire pour éviter que le formulaire ne soit traité à nouveau lors d’un rafraîchissement." LIMIT: "Limite" - LIMIT_HELP: "Nombre maximum de fichiers par champ (quand multiple)" + LIMIT_HELP: "Nombre maximum de fichiers par champ (si plusieurs sont requis)" FILESIZE: "Poids du fichier max." - FILESIZE_HELP: "Poids maximum autorisé pour le fichier (en MB), 0 = utiliser la valeur du système par défaut" + FILESIZE_HELP: "Poids maximal autorisé pour le fichier (en MB), 0 = utiliser la valeur par défaut du système" AVOID_OVERWRITING: "Éviter la réécriture" - AVOID_OVERWRITING_HELP: "Évite qu’un fichier avec le même nom soit écrasé. Le nom sera préfixé de la date." + AVOID_OVERWRITING_HELP: "Empêche que des fichiers du même nom soient écrasés. Un préfixe de date sera ajouté." RANDOM_NAME: "Nom aléatoire" - RANDOM_NAME_HELP: "Génère une chaîne de caractère aléatoire de quinze caractères pour le nom du fichier uploadé." + RANDOM_NAME_HELP: "Génère une chaîne aléatoire de quinze caractères pour le nom du fichier uploadé." CLIENT_SIDE_VALIDATION: "Validation côté client" - CLIENT_SIDE_VALIDATION_HELP: "Par défaut, les formulaires utiliseront la validation en HTML5 avant tout autre validation." + CLIENT_SIDE_VALIDATION_HELP: "Par défaut, les formulaires utiliseront la validation HTML5 côté client comme première ligne de défense." INLINE_ERRORS: "Erreurs en ligne" - INLINE_ERRORS_HELP: "Utile avec « Validation côté client » désactivé ; affiche des erreurs contextuelles en ligne." - RESOLUTION_MIN: "{{attr}} est inférieur au minimum de {{min}}px
" - RESOLUTION_MAX: "{{attr}} est supérieur au minimum de {{max}}px
" - DESTINATION_NOT_SPECIFIED: "La destination n’est pas indiquée." - INVALID_MIME_TYPE: "Le type MIME %s pour le fichier %s n’est pas accepté." - INVALID_FILE_EXTENSION: "L’extension pour le fichier %s n’est pas acceptée." + INLINE_ERRORS_HELP: "Utile si la validation côté client est désactivée, affiche des erreurs contextuelles en ligne." + RESOLUTION_MIN: "Le {{attr}} est inférieur au minimum de {{min}}px
" + RESOLUTION_MAX: "Le {{attr}} est supérieur au maximum de {{max}}px
" + BASIC_CAPTCHA: "Captcha basique" + BASIC_CAPTCHA_TYPE: "Type de défi Captcha" + BASIC_CAPTCHA_LENGTH: "Nombre de caractères" + BASIC_CAPTCHA_FONT: "Police TTF" + BASIC_CAPTCHA_SIZE: "Taille de police" + BASIC_CAPTCHA_BG_COLOR: "Couleur de fond" + BASIC_CAPTCHA_TEXT_COLOR: "Couleur du texte" + BASIC_CAPTCHA_START_X: "Position x de départ du texte" + BASIC_CAPTCHA_START_Y: "Position y de départ du texte" + BASIC_CAPTCHA_BOX_WIDTH: "Largeur de l'image" + BASIC_CAPTCHA_BOX_HEIGHT: "Hauteur de l'image" + BASIC_CAPTCHA_MATH_MIN: "Nombre minimum" + BASIC_CAPTCHA_MATH_MAX: "Nombre maximum" + BASIC_CAPTCHA_MATH_OPERATORS: "Opérateurs mathématiques (aléatoires)" + TURNSTILE_CAPTCHA: "Captcha Cloudflare Turnstile" + MODULAR_FORM_FIX: "Correction du formulaire modulaire" + MODULAR_FORM_FIX_HELP: "Corrige le problème des formulaires modulaires qui ne trouvent pas automatiquement le bon formulaire." + XHR_FILE_UPLOAD: "Upload de fichier XHR" + XHR_FILE_UPLOAD_HELP: "Active le support XHR avancé pour l'upload de fichiers dans les formulaires soumis via AJAX." + FILEPOND_REMOVE_FILE: "Supprimer le fichier" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Êtes-vous sûr de vouloir supprimer ce fichier ?" + FILEPOND_CANCEL_UPLOAD: "Annuler l'upload" + FILEPOND_ERROR_FILESIZE: "Le fichier est trop volumineux" + FILEPOND_ERROR_FILETYPE: "Type de fichier invalide" ru: PLUGIN_FORM: NOT_VALIDATED: "Форма не подтверждена. Отсутствует одно или несколько обязательных полей." - NONCE_NOT_VALIDATED: "Упс, у вас возникла проблема, проверьте свои данные и отправьте форму еще раз." + FIELD_REQUIRED: "Поле обязательно для заполнения." + VALIDATION_MATCH: "Поле %s не соответствует полю %s." + NONCE_NOT_VALIDATED: "Упс, возникла проблема. Проверьте введённые данные и отправьте форму ещё раз." FILES: "Загрузка файлов" FORM_ALREADY_SUBMITTED: "Эта форма уже была отправлена." ALLOW_MULTIPLE: "Разрешить несколько файлов" ALLOW_MULTIPLE_HELP: "Позволяет выбрать более одного файла для загрузки." DESTINATION: "Место назначения" - DESTINATION_HELP: "Место, куда файлы должны быть загружены в" - ACCEPT: "Разрешенные MIME типы" - ACCEPT_HELP: "Список MIME типов, разрешенных для загрузки" + DESTINATION_HELP: "Место, куда файлы должны быть загружены" + ACCEPT: "Разрешённые MIME типы" + ACCEPT_HELP: "Список MIME типов, разрешённых для загрузки" + ERROR_CAPTCHA_NOT_COMPLETED: "Проверка на человека не пройдена для этой формы, пожалуйста, попробуйте ещё раз." ERROR_VALIDATING_CAPTCHA: "Ошибка проверки Captcha" DATA_SUMMARY: "Вот краткое изложение того, что вы нам написали:" NO_FORM_DATA: "Данные формы отсутствуют" @@ -355,56 +536,95 @@ ru: FILEUPLOAD_PREVENT_SELF: 'Нельзя использовать "%s" за пределами страниц.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Не удалось загрузить файл %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Не удалось переместить файл %s в "%s"' - DROPZONE_CANCEL_UPLOAD: 'Отменить загрузку' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Вы действительно хотите отменить эту загрузку?' - DROPZONE_DEFAULT_MESSAGE: 'Перетащите свои файлы сюда или щелкните в этой области' - DROPZONE_FALLBACK_MESSAGE: 'Ваш браузер не поддерживает загрузку файлов с перетаскиванием.' - DROPZONE_FALLBACK_TEXT: 'Пожалуйста, используйте приведенную ниже форму для загрузки ваших файлов, как в старые времена.' - DROPZONE_FILE_TOO_BIG: 'Файл слишком большой ({{filesize}}мб). Максимальный размер файла: {{maxFilesize}}мб.' + FILEUPLOAD_ERR_OK: "Ошибки отсутствуют, файл загружен успешно." + FILEUPLOAD_ERR_INI_SIZE: "Загруженный файл превышает максимально допустимый размер." + FILEUPLOAD_ERR_FORM_SIZE: "Загруженный файл превышает директиву MAX_FILE_SIZE, указанную в HTML." + FILEUPLOAD_ERR_PARTIAL: "Файл был загружен только частично." + FILEUPLOAD_ERR_NO_FILE: "Файл не был загружен." + FILEUPLOAD_ERR_NO_TMP_DIR: "Отсутствует временная папка." + FILEUPLOAD_ERR_CANT_WRITE: "Не удалось записать файл на диск." + FILEUPLOAD_ERR_EXTENSION: "PHP расширение остановило загрузку файла." + FILEUPLOAD_ERR_UNKNOWN: "Неизвестная ошибка загрузки файла." + DROPZONE_CANCEL_UPLOAD: "Отменить загрузку" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Вы действительно хотите отменить эту загрузку?" + DROPZONE_DEFAULT_MESSAGE: "Перетащите файлы сюда или щелкните в этой области" + DROPZONE_FALLBACK_MESSAGE: "Ваш браузер не поддерживает загрузку файлов перетаскиванием." + DROPZONE_FALLBACK_TEXT: "Пожалуйста, используйте форму ниже для загрузки файлов, как в старые времена." + DROPZONE_FILE_TOO_BIG: "Файл слишком большой ({{filesize}}мб). Максимальный размер файла: {{maxFilesize}}мб." DROPZONE_INVALID_FILE_TYPE: "Вы не можете загружать файлы этого типа." DROPZONE_MAX_FILES_EXCEEDED: "Вы не можете загружать больше файлов." DROPZONE_REMOVE_FILE: "Удалить файл" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Вы действительно хотите удалить этот файл?' + DROPZONE_REMOVE_FILE_CONFIRMATION: "Вы действительно хотите удалить этот файл?" DROPZONE_RESPONSE_ERROR: "Сервер ответил кодом {{statusCode}}." YES: "Да" NO: "Нет" REFRESH_PREVENTION: "Предотвращение обновления" - REFRESH_PREVENTION_HELP: "Используйте уникальный идентификатор формы, чтобы гарантировать, что одна и та же форма не будет отправляться заново при обновлении страницы браузера" + REFRESH_PREVENTION_HELP: "Используйте уникальный идентификатор формы, чтобы гарантировать, что одна и та же форма не будет отправляться повторно при обновлении страницы." LIMIT: "Лимит" - LIMIT_HELP: "Максимальное количество разрешенных файлов в поле (требуется несколько)" + LIMIT_HELP: "Максимальное количество разрешенных файлов в поле (если требуется несколько)" FILESIZE: "Максимальный размер файла" - FILESIZE_HELP: "Максимально допустимый размер файла (в МБ), 0 = Использовать системные установки по умолчанию" + FILESIZE_HELP: "Максимально допустимый размер файла (в МБ), 0 = использовать системные настройки по умолчанию" AVOID_OVERWRITING: "Избегать перезаписи" - AVOID_OVERWRITING_HELP: "Не допускать перезаписи файлов с тем же именем. Будет добавлен префикс с датой" + AVOID_OVERWRITING_HELP: "Не допускает перезаписи файлов с одинаковыми именами. Добавляется префикс с датой." RANDOM_NAME: "Случайное имя" - RANDOM_NAME_HELP: "Создавать случайное строковое имя из 15 символов для загруженных файлов" + RANDOM_NAME_HELP: "Создает случайную строку из 15 символов для имени загруженных файлов." CLIENT_SIDE_VALIDATION: "Проверка на стороне клиента" - CLIENT_SIDE_VALIDATION_HELP: "По умолчанию формы будут использовать HTML5 проверку клиента как первую степень защиты" + CLIENT_SIDE_VALIDATION_HELP: "По умолчанию формы используют HTML5 проверку на стороне клиента в качестве первой линии защиты." INLINE_ERRORS: "Встроенные ошибки" - INLINE_ERRORS_HELP: "Полезно с отключенной «проверкой на стороне клиента», отображает встроенные контекстные ошибки формы" - RESOLUTION_MIN: "{{attr}} меньше минимума {{min}}px
" - RESOLUTION_MAX: "The {{attr}} больше, чем максимум {{max}}px
" - DESTINATION_NOT_SPECIFIED: "Назначение не указано" - INVALID_MIME_TYPE: "Тип MIME %s для файла %s не принимается." - INVALID_FILE_EXTENSION: "Расширение файла %s не является допустимым для файла." + INLINE_ERRORS_HELP: "Полезно, если проверка на стороне клиента отключена, отображает встроенные контекстные ошибки формы." + RESOLUTION_MIN: "Поле {{attr}} меньше минимума {{min}}px
" + RESOLUTION_MAX: "Поле {{attr}} больше максимума {{max}}px
" + BASIC_CAPTCHA: "Простое Captcha" + BASIC_CAPTCHA_TYPE: "Тип задания Captcha" + BASIC_CAPTCHA_LENGTH: "Количество символов" + BASIC_CAPTCHA_FONT: "TTF Шрифт" + BASIC_CAPTCHA_SIZE: "Размер шрифта" + BASIC_CAPTCHA_BG_COLOR: "Цвет фона" + BASIC_CAPTCHA_TEXT_COLOR: "Цвет текста" + BASIC_CAPTCHA_START_X: "Начальная x-позиция текста" + BASIC_CAPTCHA_START_Y: "Начальная y-позиция текста" + BASIC_CAPTCHA_BOX_WIDTH: "Ширина изображения" + BASIC_CAPTCHA_BOX_HEIGHT: "Высота изображения" + BASIC_CAPTCHA_MATH_MIN: "Минимальное число" + BASIC_CAPTCHA_MATH_MAX: "Максимальное число" + BASIC_CAPTCHA_MATH_OPERATORS: "Математические операторы (случайные)" + TURNSTILE_CAPTCHA: "Captcha Cloudflare Turnstile" + MODULAR_FORM_FIX: "Исправление модульной формы" + MODULAR_FORM_FIX_HELP: "Исправляет проблему, когда модульные формы не находят автоматически правильную форму." + XHR_FILE_UPLOAD: "XHR загрузка файла" + XHR_FILE_UPLOAD_HELP: "Включает расширенную поддержку XHR для загрузки файлов в формах, отправляемых через AJAX." + FILEPOND_REMOVE_FILE: "Удалить файл" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Вы уверены, что хотите удалить этот файл?" + FILEPOND_CANCEL_UPLOAD: "Отменить загрузку" + FILEPOND_ERROR_FILESIZE: "Файл слишком большой" + FILEPOND_ERROR_FILETYPE: "Неверный тип файла" uk: PLUGIN_FORM: NOT_VALIDATED: "Форма не підтверджена. Відсутнє одне або кілька обов'язкових полів." - NONCE_NOT_VALIDATED: "Упс, у вас виникла проблема, перевірте свої дані і відправте форму ще раз." + FIELD_REQUIRED: "Поле є обов'язковим." + VALIDATION_MATCH: "Поле %s не відповідає полю %s." + NONCE_NOT_VALIDATED: "Упс, сталася помилка. Будь ласка, перевірте дані та відправте форму ще раз." FILES: "Завантаження файлів" - FORM_ALREADY_SUBMITTED: "Ця форма вже була відправлена." + FORM_ALREADY_SUBMITTED: "Цю форму вже було відправлено." ALLOW_MULTIPLE: "Дозволити декілька файлів" ALLOW_MULTIPLE_HELP: "Дозволяє вибрати більше одного файлу для завантаження." DESTINATION: "Місце призначення" - DESTINATION_HELP: "Місце, куди файли повинні бути завантажені в" + DESTINATION_HELP: "Місце, куди файли повинні бути завантажені" ACCEPT: "Дозволені MIME типи" ACCEPT_HELP: "Перелік MIME типів, дозволених для завантаження" + ERROR_CAPTCHA_NOT_COMPLETED: "Людську перевірку не пройдено для цієї форми, будь ласка, спробуйте ще раз." ERROR_VALIDATING_CAPTCHA: "Помилка перевірки Captcha" DATA_SUMMARY: "Ось стислий виклад того, що ви нам написали:" NO_FORM_DATA: "Дані форми відсутні" RECAPTCHA: "reCAPTCHA" RECAPTCHA_VERSION: "Версія" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Прапорець" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Невидимий" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Остання" + RECAPTCHA_THEME: "Тема" + RECAPTCHA_THEME_LIGHT: "Світла тема" + RECAPTCHA_THEME_DARK: "Темна тема" RECAPTCHA_SITE_KEY: "Ключ сайту (site key)" RECAPTCHA_SITE_KEY_HELP: "Для отримання додаткової інформації відвідайте https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Секретний ключ (secret key)" @@ -415,63 +635,183 @@ uk: FILEUPLOAD_PREVENT_SELF: 'Не можна використовувати "%s" за межами сторінок.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Не вдалося завантажити файл %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Не вдалося перемістити файл %s до "%s"' - DROPZONE_CANCEL_UPLOAD: 'Скасувати завантаження' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Ви дійсно хочете скасувати це завантаження?' - DROPZONE_DEFAULT_MESSAGE: 'Перетягніть свої файли сюди чи клацніть в цій області' - DROPZONE_FALLBACK_MESSAGE: 'Ваш браузер не підтримує завантаження файлів з перетягуванням.' - DROPZONE_FALLBACK_TEXT: 'Будь ласка, використовуйте цю форму для завантаження ваших файлів, як в старі часи.' - DROPZONE_FILE_TOO_BIG: 'Файл занадто великий ({{filesize}}мб). Максимальний розмір файлу: {{maxFilesize}}мб.' + FILEUPLOAD_ERR_OK: "Файл успішно завантажено без помилок." + FILEUPLOAD_ERR_INI_SIZE: "Завантажений файл перевищує максимальний дозволений розмір." + FILEUPLOAD_ERR_FORM_SIZE: "Завантажений файл перевищує директиву MAX_FILE_SIZE, вказану в HTML." + FILEUPLOAD_ERR_PARTIAL: "Файл було завантажено лише частково." + FILEUPLOAD_ERR_NO_FILE: "Файл не було завантажено." + FILEUPLOAD_ERR_NO_TMP_DIR: "Відсутня тимчасова папка." + FILEUPLOAD_ERR_CANT_WRITE: "Не вдалося записати файл на диск." + FILEUPLOAD_ERR_EXTENSION: "PHP-розширення зупинило завантаження файлу." + FILEUPLOAD_ERR_UNKNOWN: "Невідома помилка завантаження файлу." + DROPZONE_CANCEL_UPLOAD: "Скасувати завантаження" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Ви впевнені, що хочете скасувати це завантаження?" + DROPZONE_DEFAULT_MESSAGE: "Перетягніть файли сюди або клацніть у цій області" + DROPZONE_FALLBACK_MESSAGE: "Ваш браузер не підтримує завантаження файлів методом перетягування." + DROPZONE_FALLBACK_TEXT: "Будь ласка, використовуйте альтернативну форму нижче для завантаження файлів як раніше." + DROPZONE_FILE_TOO_BIG: "Файл занадто великий ({{filesize}}мб). Максимальний розмір файлу: {{maxFilesize}}мб." DROPZONE_INVALID_FILE_TYPE: "Ви не можете завантажувати файли цього типу." DROPZONE_MAX_FILES_EXCEEDED: "Ви не можете завантажувати більше файлів." DROPZONE_REMOVE_FILE: "Видалити файл" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Ви дійсно хочете видалити цей файл?' + DROPZONE_REMOVE_FILE_CONFIRMATION: "Ви впевнені, що хочете видалити цей файл?" DROPZONE_RESPONSE_ERROR: "Сервер відповів кодом {{statusCode}}." YES: "Так" NO: "Ні" - REFRESH_PREVENTION: "Запобігання оновлення" - REFRESH_PREVENTION_HELP: "Використовуйте унікальний ідентифікатор форми, щоб гарантувати, що одна і та ж форма не буде відправлятися заново при оновленні сторінки браузера" + REFRESH_PREVENTION: "Запобігання оновленню" + REFRESH_PREVENTION_HELP: "Використовуйте унікальний ідентифікатор форми, щоб уникнути повторної обробки форми при оновленні браузера." LIMIT: "Ліміт" - LIMIT_HELP: "Максимальна кількість дозволених файлів в поле (потрібно декілька)" + LIMIT_HELP: "Максимальна кількість дозволених файлів у полі (якщо потрібно декілька)" FILESIZE: "Максимальний розмір файлу" - FILESIZE_HELP: "Максимально допустимий розмір файлу (в МБ), 0 = Використовувати системні налаштування за замовчуванням" + FILESIZE_HELP: "Максимально допустимий розмір файлу (у МБ), 0 = використовувати системне значення за замовчуванням" AVOID_OVERWRITING: "Уникати перезапису" - AVOID_OVERWRITING_HELP: "Не допускати перезапису файлів з тим же ім'ям. Буде додано префікс з датою" + AVOID_OVERWRITING_HELP: "Не допускає перезапису файлів з однаковими іменами. До імені буде додано префікс з датою." RANDOM_NAME: "Випадкове ім'я" - RANDOM_NAME_HELP: "Створювати випадкове строкове ім'я з 15 символів для завантажених файлів" + RANDOM_NAME_HELP: "Створює випадковий рядок з 15 символів для імені завантаженого файлу." CLIENT_SIDE_VALIDATION: "Перевірка на стороні клієнта" - CLIENT_SIDE_VALIDATION_HELP: "За замовчуванням форми будуть використовувати HTML5 перевірку клієнта як першу ступінь захисту" + CLIENT_SIDE_VALIDATION_HELP: "За замовчуванням форми використовують HTML5 перевірку на стороні клієнта як перший рівень захисту." INLINE_ERRORS: "Вбудовані помилки" - INLINE_ERRORS_HELP: "Корисно з відключеною «перевіркою на стороні клієнта», відображає вбудовані контекстні помилки форми" - RESOLUTION_MIN: "{{attr}} менше, ніж мінімум {{min}}px
" - RESOLUTION_MAX: "The {{attr}} більше, ніж максимум {{max}}px
" - DESTINATION_NOT_SPECIFIED: "Призначення не вказано" - INVALID_MIME_TYPE: "Тип MIME %s для файла %s не приймається." - INVALID_FILE_EXTENSION: "Розширення файлу %s не є допустимим для файлу." + INLINE_ERRORS_HELP: "Корисно, якщо перевірка на стороні клієнта відключена; показує контекстні помилки прямо у формі." + RESOLUTION_MIN: "Значення {{attr}} менше мінімуму {{min}}px
" + RESOLUTION_MAX: "Значення {{attr}} більше максимуму {{max}}px
" + BASIC_CAPTCHA: "Базовий Captcha" + BASIC_CAPTCHA_TYPE: "Тип завдання Captcha" + BASIC_CAPTCHA_LENGTH: "Кількість символів" + BASIC_CAPTCHA_FONT: "TTF Шрифт" + BASIC_CAPTCHA_SIZE: "Розмір шрифту" + BASIC_CAPTCHA_BG_COLOR: "Колір фону" + BASIC_CAPTCHA_TEXT_COLOR: "Колір тексту" + BASIC_CAPTCHA_START_X: "Початкова x-позиція тексту" + BASIC_CAPTCHA_START_Y: "Початкова y-позиція тексту" + BASIC_CAPTCHA_BOX_WIDTH: "Ширина зображення" + BASIC_CAPTCHA_BOX_HEIGHT: "Висота зображення" + BASIC_CAPTCHA_MATH_MIN: "Мінімальне число" + BASIC_CAPTCHA_MATH_MAX: "Максимальне число" + BASIC_CAPTCHA_MATH_OPERATORS: "Математичні оператори (випадкові)" + TURNSTILE_CAPTCHA: "Captcha Cloudflare Turnstile" + MODULAR_FORM_FIX: "Виправлення модульної форми" + MODULAR_FORM_FIX_HELP: "Виправляє проблему, коли модульні форми автоматично не знаходять правильну форму." + XHR_FILE_UPLOAD: "XHR завантаження файлу" + XHR_FILE_UPLOAD_HELP: "Увімкнути розширену підтримку XHR для завантаження файлів у формах, відправлених через AJAX." + FILEPOND_REMOVE_FILE: "Видалити файл" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Ви впевнені, що хочете видалити цей файл?" + FILEPOND_CANCEL_UPLOAD: "Скасувати завантаження" + FILEPOND_ERROR_FILESIZE: "Файл занадто великий" + FILEPOND_ERROR_FILETYPE: "Невірний тип файлу" hr: PLUGIN_FORM: NOT_VALIDATED: "Formular nije validiran. Jedan ili više traženih polja nedostaju." + FIELD_REQUIRED: "Polje je obavezno." + VALIDATION_MATCH: "Polje %s ne odgovara polju %s." NONCE_NOT_VALIDATED: "Ups, došlo je do problema, molimo provjerite svoj unos i pokušajte opet." FILES: "Upload Fajlova" + FORM_ALREADY_SUBMITTED: "Obrazac je već poslan." ALLOW_MULTIPLE: "Dopusti više od jednog fajla" - DESTINATION: "Destinacija" - DESTINATION_HELP: "Lokacija gdje bi fajlovi trebali biti uploadani" - ACCEPT: "Dopušteni MIME Tipovi" - ACCEPT_HELP: "Lista dopuštenih MIME Tipova koji su dozvoljeni za upload" + ALLOW_MULTIPLE_HELP: "Omogućuje odabir više od jednog fajla za slanje." + DESTINATION: "Odredište" + DESTINATION_HELP: "Lokacija na koju trebaju biti poslani fajlovi." + ACCEPT: "Dopušteni MIME tipovi" + ACCEPT_HELP: "Popis MIME tipova koji su dopušteni za slanje." + ERROR_CAPTCHA_NOT_COMPLETED: "Provjera korisnika nije uspjela za ovaj obrazac, molimo pokušajte ponovno." ERROR_VALIDATING_CAPTCHA: "Greška pri validiranju Captcha" + DATA_SUMMARY: "Ovo je sažetak onoga što ste nam napisali:" + NO_FORM_DATA: "Nema dostupnih podataka obrasca" + RECAPTCHA: "ReCaptcha" + RECAPTCHA_VERSION: "Verzija" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Potvrdni okvir" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Nevidljivo" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Najnovije" + RECAPTCHA_THEME: "Tema" + RECAPTCHA_THEME_LIGHT: "Svijetla tema" + RECAPTCHA_THEME_DARK: "Tamna tema" + RECAPTCHA_SITE_KEY: "Ključ stranice" + RECAPTCHA_SITE_KEY_HELP: "Za više informacija posjetite https://developers.google.com/recaptcha" + RECAPTCHA_SECRET_KEY: "Tajni ključ" + RECAPTCHA_SECRET_KEY_HELP: "Za više informacija posjetite https://developers.google.com/recaptcha" + GENERAL: "Općenito" + USE_BUILT_IN_CSS: "Koristi ugrađeni CSS" + USE_INLINE_CSS: "Koristi inline CSS" + FILEUPLOAD_PREVENT_SELF: 'Ne možete koristiti "%s" izvan stranica.' + FILEUPLOAD_UNABLE_TO_UPLOAD: 'Nije moguće poslati fajl %s: %s' + FILEUPLOAD_UNABLE_TO_MOVE: 'Nije moguće premjestiti fajl %s na "%s"' + FILEUPLOAD_ERR_OK: "Fajl je uspješno poslan bez grešaka." + FILEUPLOAD_ERR_INI_SIZE: "Poslani fajl prelazi maksimalnu veličinu upload-a." + FILEUPLOAD_ERR_FORM_SIZE: "Poslani fajl prelazi MAX_FILE_SIZE direktivu navedenu u HTML-u." + FILEUPLOAD_ERR_PARTIAL: "Fajl je samo djelomično poslan." + FILEUPLOAD_ERR_NO_FILE: "Nije poslan nijedan fajl." + FILEUPLOAD_ERR_NO_TMP_DIR: "Nedostaje privremeni direktorij." + FILEUPLOAD_ERR_CANT_WRITE: "Neuspješno zapisivanje fajla na disk." + FILEUPLOAD_ERR_EXTENSION: "PHP ekstenzija je zaustavila slanje fajla." + FILEUPLOAD_ERR_UNKNOWN: "Nepoznata greška pri slanju fajla." + DROPZONE_CANCEL_UPLOAD: "Odustani od slanja" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Jeste li sigurni da želite otkazati slanje?" + DROPZONE_DEFAULT_MESSAGE: "Povucite fajlove ovdje ili kliknite u ovom području" + DROPZONE_FALLBACK_MESSAGE: "Vaš preglednik ne podržava povlačenje fajlova." + DROPZONE_FALLBACK_TEXT: "Molimo koristite alternativni obrazac ispod za slanje fajlova kao nekada." + DROPZONE_FILE_TOO_BIG: "Fajl je prevelik ({{filesize}}MiB). Maksimalna veličina: {{maxFilesize}}MiB." + DROPZONE_INVALID_FILE_TYPE: "Ne možete poslati fajlove ovog tipa." + DROPZONE_MAX_FILES_EXCEEDED: "Ne možete poslati više fajlova." + DROPZONE_REMOVE_FILE: "Ukloni fajl" + DROPZONE_REMOVE_FILE_CONFIRMATION: "Jeste li sigurni da želite izbrisati ovaj fajl?" + DROPZONE_RESPONSE_ERROR: "Server je odgovorio s kodom {{statusCode}}." + YES: "Da" + NO: "Ne" + REFRESH_PREVENTION: "Sprječavanje ponovnog slanja" + REFRESH_PREVENTION_HELP: "Koristite jedinstveni ID obrasca kako biste spriječili ponovno procesiranje obrasca prilikom osvježavanja preglednika." + LIMIT: "Ograničenje" + LIMIT_HELP: "Maksimalan broj dozvoljenih fajlova po polju (ako je potrebno više)" + FILESIZE: "Maksimalna veličina fajla" + FILESIZE_HELP: "Maksimalna dopuštena veličina fajla (u MB), 0 = koristi zadanu vrijednost sustava" + AVOID_OVERWRITING: "Izbjegavaj prepisivanje" + AVOID_OVERWRITING_HELP: "Sprječava prepisivanje fajlova s istim imenom. Datumski prefiks će biti dodan." + RANDOM_NAME: "Slučajno ime" + RANDOM_NAME_HELP: "Generira slučajni niz od 15 znakova kao ime poslanog fajla" + CLIENT_SIDE_VALIDATION: "Validacija na strani klijenta" + CLIENT_SIDE_VALIDATION_HELP: "Obrasci će po defaultu koristiti HTML5 validaciju na strani klijenta kao prvu liniju obrane." + INLINE_ERRORS: "Greške inline" + INLINE_ERRORS_HELP: "Korisno ako je validacija na strani klijenta isključena; prikazuje kontekstualne greške u obrascu." + RESOLUTION_MIN: "Vrijednost {{attr}} je manja od minimalne {{min}}px
" + RESOLUTION_MAX: "Vrijednost {{attr}} je veća od maksimalne {{max}}px
" + BASIC_CAPTCHA: "Osnovni Captcha" + BASIC_CAPTCHA_TYPE: "Tip Captcha izazova" + BASIC_CAPTCHA_LENGTH: "Broj znakova" + BASIC_CAPTCHA_FONT: "TTF font" + BASIC_CAPTCHA_SIZE: "Veličina fonta" + BASIC_CAPTCHA_BG_COLOR: "Boja pozadine" + BASIC_CAPTCHA_TEXT_COLOR: "Boja teksta" + BASIC_CAPTCHA_START_X: "Početna x-pozicija teksta" + BASIC_CAPTCHA_START_Y: "Početna y-pozicija teksta" + BASIC_CAPTCHA_BOX_WIDTH: "Širina slike" + BASIC_CAPTCHA_BOX_HEIGHT: "Visina slike" + BASIC_CAPTCHA_MATH_MIN: "Minimalni broj" + BASIC_CAPTCHA_MATH_MAX: "Maksimalni broj" + BASIC_CAPTCHA_MATH_OPERATORS: "Matematički operatori (slučajni)" + TURNSTILE_CAPTCHA: "Captcha Cloudflare Turnstile" + MODULAR_FORM_FIX: "Popravljanje modularnog obrasca" + MODULAR_FORM_FIX_HELP: "Rješava problem gdje modularni obrasci automatski ne pronalaze ispravan obrazac." + XHR_FILE_UPLOAD: "XHR slanje fajla" + XHR_FILE_UPLOAD_HELP: "Omogućava naprednu XHR podršku za slanje fajlova u obrascima poslanim putem AJAX-a." + FILEPOND_REMOVE_FILE: "Ukloni fajl" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Jeste li sigurni da želite ukloniti ovaj fajl?" + FILEPOND_CANCEL_UPLOAD: "Odustani od slanja" + FILEPOND_ERROR_FILESIZE: "Fajl je prevelik" + FILEPOND_ERROR_FILETYPE: "Nevažeći tip fajla" hu: PLUGIN_FORM: NOT_VALIDATED: "Érvénytelen az űrlap. Egy vagy több kötelező mező nincs kitöltve." + FIELD_REQUIRED: "A mező kitöltése kötelező." + VALIDATION_MATCH: "A %s mező nem egyezik a %s mezővel." NONCE_NOT_VALIDATED: "Upsz, van egy kis probléma, kérlek nézd át az űrlapot, majd küldd el újra." FILES: "Fájlok Feltöltése" FORM_ALREADY_SUBMITTED: "Ez az űrlap már el lett küldve." ALLOW_MULTIPLE: "Több fájl feltöltése" ALLOW_MULTIPLE_HELP: "Engedélyezi egyszerre több állomány feltöltését." DESTINATION: "Feltöltés Helye" - DESTINATION_HELP: "Ide lesznek feltöltve az állományok" + DESTINATION_HELP: "Ide kerülnek feltöltve az állományok." ACCEPT: "Engedélyezett MIME-típusok" ACCEPT_HELP: "A feltölthető állományok MIME-típusainak listája" + ERROR_CAPTCHA_NOT_COMPLETED: "Az emberi ellenőrzés sikertelen volt ehhez az űrlaphoz, kérlek próbáld meg újra." ERROR_VALIDATING_CAPTCHA: "Hiba lépett fel a Captcha validálása során" DATA_SUMMARY: "Üzenet összesítő:" NO_FORM_DATA: "Űrlap adatok nem elérhetőek." @@ -484,253 +824,529 @@ hu: RECAPTCHA_THEME_LIGHT: "Világos téma" RECAPTCHA_THEME_DARK: "Sötét téma" RECAPTCHA_SITE_KEY: "Site kulcs" - RECAPTCHA_SITE_KEY_HELP: "További információért látogass el ide a https://developers.google.com/recaptcha webhelyre." + RECAPTCHA_SITE_KEY_HELP: "További információért látogass el ide: https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Secret kulcs" - RECAPTCHA_SECRET_KEY_HELP: "További információért látogass el ide a https://developers.google.com/recaptcha webhelyre." + RECAPTCHA_SECRET_KEY_HELP: "További információért látogass el ide: https://developers.google.com/recaptcha" GENERAL: "Általános" USE_BUILT_IN_CSS: "Alapértelmezett CSS használata" USE_INLINE_CSS: "Beágyazott CSS használata" FILEUPLOAD_PREVENT_SELF: '"%s" nem használható oldalakon kívül.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Sikertelen fájlfeltöltés %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: '%s áthelyezése sikertelen ide: "%s"' - DROPZONE_CANCEL_UPLOAD: 'Feltöltés megszakítása' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Biztos megszakítsuk a feltöltést?' - DROPZONE_DEFAULT_MESSAGE: 'Húzza a fájlokat ide vagy kattintson a területre' - DROPZONE_FALLBACK_MESSAGE: 'A böngésző nem támogatja a drag and drop fájlfeltöltéseket.' - DROPZONE_FALLBACK_TEXT: 'Kérjük használja a kompatibilitási űrlapot vagy a hagyományos fájfeltöltést.' - DROPZONE_FILE_TOO_BIG: 'Túl nagy állomány ({{filesize}}MiB). Maximum fájlméret: {{maxFilesize}}MiB.' + FILEUPLOAD_ERR_OK: "Nincs hiba, a fájl sikeresen feltöltve." + FILEUPLOAD_ERR_INI_SIZE: "A feltöltött fájl meghaladja a megengedett maximális méretet." + FILEUPLOAD_ERR_FORM_SIZE: "A feltöltött fájl meghaladja a HTML-ben megadott MAX_FILE_SIZE értéket." + FILEUPLOAD_ERR_PARTIAL: "A fájl csak részben lett feltöltve." + FILEUPLOAD_ERR_NO_FILE: "Nem lett fájl feltöltve." + FILEUPLOAD_ERR_NO_TMP_DIR: "Hiányzik az ideiglenes mappa." + FILEUPLOAD_ERR_CANT_WRITE: "Nem sikerült a fájlt lemezre írni." + FILEUPLOAD_ERR_EXTENSION: "Egy PHP kiterjesztés megállította a fájlfeltöltést." + FILEUPLOAD_ERR_UNKNOWN: "Ismeretlen hiba történt a fájlfeltöltés során." + DROPZONE_CANCEL_UPLOAD: "Feltöltés megszakítása" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Biztos megszakítsuk a feltöltést?" + DROPZONE_DEFAULT_MESSAGE: "Húzza a fájlokat ide vagy kattintson a területre" + DROPZONE_FALLBACK_MESSAGE: "A böngésző nem támogatja a drag and drop fájlfeltöltéseket." + DROPZONE_FALLBACK_TEXT: "Kérjük, használja az alternatív űrlapot a fájlok feltöltéséhez." + DROPZONE_FILE_TOO_BIG: "Túl nagy állomány ({{filesize}}MiB). Maximális fájlméret: {{maxFilesize}}MiB." DROPZONE_INVALID_FILE_TYPE: "Ilyen típusú fájlok feltöltése nem megengedett." - DROPZONE_MAX_FILES_EXCEEDED: "További fájlok feltöltése nem megengedett, elérte a maximumot." + DROPZONE_MAX_FILES_EXCEEDED: "Nem engedélyezett több fájl feltöltése." DROPZONE_REMOVE_FILE: "Fájl eltávolítása" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Biztos az eltávolításban?' + DROPZONE_REMOVE_FILE_CONFIRMATION: "Biztosan eltávolítja ezt a fájlt?" DROPZONE_RESPONSE_ERROR: "Szerver hiba, kód: {{statusCode}}." YES: "Igen" NO: "Nem" REFRESH_PREVENTION: "Újratöltési védelem" - REFRESH_PREVENTION_HELP: "Az űrlap egyedi azonosítójának használata annak érdekében hogy az űrlap ne legyen újrafeldolgozva oldalfrissítés esetén." + REFRESH_PREVENTION_HELP: "Az űrlap egyedi azonosítójának használata annak érdekében, hogy az űrlapot ne dolgozzuk fel újra oldalfrissítéskor." LIMIT: "Limit" - LIMIT_HELP: "Az egy mezőben megadható fájlok maximális száma. (multiple required)" + LIMIT_HELP: "Egy mezőben megadható fájlok maximális száma." FILESIZE: "Maximum fájlméret" - FILESIZE_HELP: "Maximum engedélyezett fájlméret (MB-ban), 0 = Rendszer alapértelmezés használata." + FILESIZE_HELP: "Megengedett maximális fájlméret (MB-ban), 0 = rendszer alapértelmezett" AVOID_OVERWRITING: "Felülírás elkerülése" - AVOID_OVERWRITING_HELP: "A már létező fájlok felülírásának elkerülése, dátum előtag hozzáadásával a fájlnévhez." + AVOID_OVERWRITING_HELP: "Megakadályozza az azonos nevű fájlok felülírását. Dátum előtag kerül hozzáadásra." RANDOM_NAME: "Véletlenszerű név" - RANDOM_NAME_HELP: "Generáljon egy 15 karakter hosszú véletlenszerű nevet a feltöltött fájloknak." + RANDOM_NAME_HELP: "Generál egy 15 karakter hosszú véletlenszerű nevet a feltöltött fájloknak." CLIENT_SIDE_VALIDATION: "Kliens oldali validáció" - CLIENT_SIDE_VALIDATION_HELP: "Az űrlapok HTML5 kliens oldali validációt használnak alapértelmezésként, mint első védelmi vonal." + CLIENT_SIDE_VALIDATION_HELP: "Az űrlapok HTML5 kliens oldali validációt használnak első védelmi vonalként." INLINE_ERRORS: "Beágyazott hibaüzenetek" - INLINE_ERRORS_HELP: "Beágyazott kontextuális űrlaphibák megjelenítése, hasznos ha a 'Kliens oldali validáció' ki van kapcsolva." - RESOLUTION_MIN: "A(z) {{attr}} érték kisebb mint a minimum {{min}}px
" - RESOLUTION_MAX: "A(z) {{attr}} érték nagyobb mint a maximum {{max}}px
" - DESTINATION_NOT_SPECIFIED: "A feltöltés helye nincs megadva." - INVALID_MIME_TYPE: "MIME-típus %s nem engedélyezett. Állomány: %s." - INVALID_FILE_EXTENSION: "A(z) %s állomány kiterjesztése nem engedélyezett." + INLINE_ERRORS_HELP: "Ha a kliens oldali validáció ki van kapcsolva, megjeleníti a kontextuális űrlaphibákat." + RESOLUTION_MIN: "A(z) {{attr}} értéke kisebb, mint a minimum {{min}}px
" + RESOLUTION_MAX: "A(z) {{attr}} értéke nagyobb, mint a maximum {{max}}px
" + BASIC_CAPTCHA: "Alap Captcha" + BASIC_CAPTCHA_TYPE: "Captcha kihívás típusa" + BASIC_CAPTCHA_LENGTH: "Karakterek száma" + BASIC_CAPTCHA_FONT: "TTF betűtípus" + BASIC_CAPTCHA_SIZE: "Betűméret" + BASIC_CAPTCHA_BG_COLOR: "Háttérszín" + BASIC_CAPTCHA_TEXT_COLOR: "Szöveg színe" + BASIC_CAPTCHA_START_X: "Szöveg kezdő x-pozíciója" + BASIC_CAPTCHA_START_Y: "Szöveg kezdő y-pozíciója" + BASIC_CAPTCHA_BOX_WIDTH: "Kép szélessége" + BASIC_CAPTCHA_BOX_HEIGHT: "Kép magassága" + BASIC_CAPTCHA_MATH_MIN: "Minimális szám" + BASIC_CAPTCHA_MATH_MAX: "Maximális szám" + BASIC_CAPTCHA_MATH_OPERATORS: "Véletlenszerű matematikai operátorok" + TURNSTILE_CAPTCHA: "Cloudflare Turnstile Captcha" + MODULAR_FORM_FIX: "Moduláris űrlap javítása" + MODULAR_FORM_FIX_HELP: "Javítja azt a problémát, hogy a moduláris űrlapok nem találják meg automatikusan a helyes űrlapot." + XHR_FILE_UPLOAD: "XHR fájl feltöltés" + XHR_FILE_UPLOAD_HELP: "AJAX-szal beküldött űrlapok esetén engedélyezi az XHR kiterjesztett támogatását a fájlok feltöltéséhez." + FILEPOND_REMOVE_FILE: "Fájl eltávolítása" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Biztosan el szeretné távolítani ezt a fájlt?" + FILEPOND_CANCEL_UPLOAD: "Feltöltés megszakítása" + FILEPOND_ERROR_FILESIZE: "A fájl túl nagy" + FILEPOND_ERROR_FILETYPE: "Érvénytelen fájltípus" it: PLUGIN_FORM: NOT_VALIDATED: "Il Form risulta invalido. Uno o più campi risultano omessi." + FIELD_REQUIRED: "Il campo è obbligatorio." + VALIDATION_MATCH: "Il campo %s non corrisponde al campo %s." NONCE_NOT_VALIDATED: "Oops è stato riscontrato un errore, si prega di ricontrollare i dati inseriti e provare di nuovo." FILES: "Invio dei Files" + FORM_ALREADY_SUBMITTED: "Questo modulo è già stato inviato." ALLOW_MULTIPLE: "Consenti più di un file" - ALLOW_MULTIPLE_HELP: "Permette la selezione di più di un file per l'upload" + ALLOW_MULTIPLE_HELP: "Permette la selezione di più di un file per l'upload." DESTINATION: "Destinazione" - DESTINATION_HELP: "La destinazione dove i files vengono uploadati" + DESTINATION_HELP: "La destinazione dove i files vengono caricati" ACCEPT: "Tipi di MIME Concessi" - ACCEPT_HELP: "Una lista di tipi di MIME che sono permessi per l'upload" + ACCEPT_HELP: "Una lista di tipi di MIME permessi per l'upload" + ERROR_CAPTCHA_NOT_COMPLETED: "La verifica umana non è riuscita per questo modulo, riprova per favore." ERROR_VALIDATING_CAPTCHA: "Errore durante la validazione del Captcha" DATA_SUMMARY: "Ecco il riassunto di ciò che ci hai scritto:" NO_FORM_DATA: "Nessuna informazione disponibile" RECAPTCHA: "ReCaptcha" + RECAPTCHA_VERSION: "Versione" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Checkbox" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Invisibile" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Ultima" + RECAPTCHA_THEME: "Tema" + RECAPTCHA_THEME_LIGHT: "Tema chiaro" + RECAPTCHA_THEME_DARK: "Tema scuro" RECAPTCHA_SITE_KEY: "Site key" RECAPTCHA_SITE_KEY_HELP: "Per maggiori informazioni visita https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Chiave segreta" RECAPTCHA_SECRET_KEY_HELP: "Per maggiori informazioni visita https://developers.google.com/recaptcha" GENERAL: "Generale" USE_BUILT_IN_CSS: "Usa CSS incorporato" + USE_INLINE_CSS: "Usa CSS inline" FILEUPLOAD_PREVENT_SELF: 'Non si può usare "%s" fuori dalle pagine.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Impossibile caricare il file %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Impossibile muovere il file %s to "%s"' - DROPZONE_CANCEL_UPLOAD: 'Trasferimento annullato' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Sei sicuro di voler cancellare questo trasferimento?' + FILEUPLOAD_ERR_OK: "Nessun errore, il file è stato caricato correttamente." + FILEUPLOAD_ERR_INI_SIZE: "Il file caricato supera la dimensione massima consentita." + FILEUPLOAD_ERR_FORM_SIZE: "Il file caricato supera la direttiva MAX_FILE_SIZE specificata nell'HTML." + FILEUPLOAD_ERR_PARTIAL: "Il file è stato caricato solo parzialmente." + FILEUPLOAD_ERR_NO_FILE: "Nessun file è stato caricato." + FILEUPLOAD_ERR_NO_TMP_DIR: "Cartella temporanea mancante." + FILEUPLOAD_ERR_CANT_WRITE: "Impossibile scrivere il file su disco." + FILEUPLOAD_ERR_EXTENSION: "Un'estensione PHP ha bloccato il caricamento del file." + FILEUPLOAD_ERR_UNKNOWN: "Errore sconosciuto durante il caricamento del file." + DROPZONE_CANCEL_UPLOAD: "Trasferimento annullato" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Sei sicuro di voler cancellare questo trasferimento?" DROPZONE_DEFAULT_MESSAGE: "Trascina qui i tuoi file o clicca su quest'area" - DROPZONE_FALLBACK_MESSAGE: 'Il tuo browser non supporta il trascinamento dei file per il trasferimento.' - DROPZONE_FALLBACK_TEXT: 'Utilizza il modulo di riserva qui sotto per caricare i tuoi file come ai vecchi tempi.' - DROPZONE_FILE_TOO_BIG: 'Il file è troppo grande ({{filesize}}MiB). Dimensione massima consentita: {{maxFilesize}}MiB.' - DROPZONE_INVALID_FILE_TYPE: "Non puoi caricare questo tipo di file" - DROPZONE_MAX_FILES_EXCEEDED: "Non puoi caricare ulteriori file, hai raggiunto il limite consentito." + DROPZONE_FALLBACK_MESSAGE: "Il tuo browser non supporta il trascinamento dei file per il trasferimento." + DROPZONE_FALLBACK_TEXT: "Utilizza il modulo di riserva qui sotto per caricare i tuoi file come ai vecchi tempi." + DROPZONE_FILE_TOO_BIG: "Il file è troppo grande ({{filesize}}MiB). Dimensione massima consentita: {{maxFilesize}}MiB." + DROPZONE_INVALID_FILE_TYPE: "Non puoi caricare questo tipo di file." + DROPZONE_MAX_FILES_EXCEEDED: "Non puoi caricare ulteriori file." DROPZONE_REMOVE_FILE: "Rimuovi il file" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Sei sicuro di voler eliminare questo file??' + DROPZONE_REMOVE_FILE_CONFIRMATION: "Sei sicuro di voler eliminare questo file?" DROPZONE_RESPONSE_ERROR: "Il Server ha risposto con il codice {{statusCode}}." YES: "Si" NO: "No" + CLIENT_SIDE_VALIDATION: "Validazione lato client" + CLIENT_SIDE_VALIDATION_HELP: "I moduli utilizzeranno di default la validazione HTML5 lato client come prima linea di difesa." + INLINE_ERRORS: "Errori inline" + INLINE_ERRORS_HELP: "Utile se la validazione lato client è disattivata, mostra errori contestuali inline." + RESOLUTION_MIN: "Il {{attr}} è inferiore al minimo di {{min}}px
" + RESOLUTION_MAX: "Il {{attr}} è superiore al massimo di {{max}}px
" + DESTINATION_NOT_SPECIFIED: "Destinazione non specificata" + INVALID_MIME_TYPE: "Il tipo MIME %s per il file %s non è accettato." + INVALID_FILE_EXTENSION: "L'estensione del file %s non è accettata." + BASIC_CAPTCHA: "Captcha base" + BASIC_CAPTCHA_TYPE: "Tipo di sfida Captcha" + BASIC_CAPTCHA_LENGTH: "Numero di caratteri" + BASIC_CAPTCHA_FONT: "Carattere TTF" + BASIC_CAPTCHA_SIZE: "Dimensione del carattere" + BASIC_CAPTCHA_BG_COLOR: "Colore di sfondo" + BASIC_CAPTCHA_TEXT_COLOR: "Colore del testo" + BASIC_CAPTCHA_START_X: "Posizione x iniziale del testo" + BASIC_CAPTCHA_START_Y: "Posizione y iniziale del testo" + BASIC_CAPTCHA_BOX_WIDTH: "Larghezza dell'immagine" + BASIC_CAPTCHA_BOX_HEIGHT: "Altezza dell'immagine" + BASIC_CAPTCHA_MATH_MIN: "Numero minimo" + BASIC_CAPTCHA_MATH_MAX: "Numero massimo" + BASIC_CAPTCHA_MATH_OPERATORS: "Operatori matematici (casuali)" + TURNSTILE_CAPTCHA: "Captcha Cloudflare Turnstile" + MODULAR_FORM_FIX: "Correzione del modulo modulare" + MODULAR_FORM_FIX_HELP: "Risolvi il problema dei moduli modulari che non trovano automaticamente il modulo corretto." + XHR_FILE_UPLOAD: "Caricamento file XHR" + XHR_FILE_UPLOAD_HELP: "Abilita il supporto XHR avanzato per il caricamento dei file in moduli inviati via AJAX." + FILEPOND_REMOVE_FILE: "Rimuovi file" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Sei sicuro di voler rimuovere questo file?" + FILEPOND_CANCEL_UPLOAD: "Annulla caricamento" + FILEPOND_ERROR_FILESIZE: "Il file è troppo grande" + FILEPOND_ERROR_FILETYPE: "Tipo di file non valido" ro: PLUGIN_FORM: NOT_VALIDATED: "Formularul nu a fost validat. Unul sau mai multe câmpuri sunt goale." - NONCE_NOT_VALIDATED: "Oops a apărut o problemă, vă rugăm verificați datele introduse și trimiteți formularul din nou." + FIELD_REQUIRED: "Câmpul este obligatoriu." + VALIDATION_MATCH: "Câmpul %s nu corespunde cu câmpul %s." + NONCE_NOT_VALIDATED: "Oops, a apărut o problemă, vă rugăm verificați datele introduse și trimiteți formularul din nou." FILES: "Încărcare fișiere" + FORM_ALREADY_SUBMITTED: "Acest formular a fost deja trimis." ALLOW_MULTIPLE: "Permiteți mai multe fișiere" ALLOW_MULTIPLE_HELP: "Vă permite să selectați mai multe fișiere pentru încărcare." DESTINATION: "Destinație" DESTINATION_HELP: "Locația unde vor fi încărcate fișierele." - ACCEPT: "Permite tipuri MIME " - ACCEPT_HELP: "O listă cu tipuri MIME care sunt permise la încărcare." + ACCEPT: "Permite tipuri MIME" + ACCEPT_HELP: "O listă cu tipuri MIME permise la încărcare." + ERROR_CAPTCHA_NOT_COMPLETED: "Verificarea umană a eșuat pentru acest formular, vă rugăm să încercați din nou." ERROR_VALIDATING_CAPTCHA: "Eroare la validarea Captcha." DATA_SUMMARY: "Mai jos aveți un rezumat al mesajului pe care ni l-ați trimis:" - NO_FORM_DATA: "Nu e disponibilă nici o dată pentru formular" + NO_FORM_DATA: "Nu e disponibilă nicio informație pentru formular." RECAPTCHA: "ReCaptcha" + RECAPTCHA_VERSION: "Versiune" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Casetă de selectare" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Invizibil" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Ultima" + RECAPTCHA_THEME: "Temă" + RECAPTCHA_THEME_LIGHT: "Temă deschisă" + RECAPTCHA_THEME_DARK: "Temă închisă" RECAPTCHA_SITE_KEY: "Cheia pentru Site" - RECAPTCHA_SITE_KEY_HELP: "Pentru mai multe detalii vă rugăm vizitați https://developers.google.com/recaptcha" + RECAPTCHA_SITE_KEY_HELP: "Pentru mai multe detalii, vizitați https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Cheia secretă pentru Site" - RECAPTCHA_SECRET_KEY_HELP: "Pentru mai multe detalii vă rugăm vizitați https://developers.google.com/recaptcha" + RECAPTCHA_SECRET_KEY_HELP: "Pentru mai multe detalii, vizitați https://developers.google.com/recaptcha" + GENERAL: "General" + USE_BUILT_IN_CSS: "Utilizează CSS încorporat" + USE_INLINE_CSS: "Utilizează CSS inline" + FILEUPLOAD_PREVENT_SELF: 'Nu se poate folosi "%s" în afara paginilor.' + FILEUPLOAD_UNABLE_TO_UPLOAD: 'Nu se poate încărca fișierul %s: %s' + FILEUPLOAD_UNABLE_TO_MOVE: 'Nu se poate muta fișierul %s la "%s"' + FILEUPLOAD_ERR_OK: "Nu există eroare, fișierul a fost încărcat cu succes." + FILEUPLOAD_ERR_INI_SIZE: "Fișierul încărcat depășește dimensiunea maximă admisă." + FILEUPLOAD_ERR_FORM_SIZE: "Fișierul încărcat depășește directiva MAX_FILE_SIZE specificată în HTML." + FILEUPLOAD_ERR_PARTIAL: "Fișierul a fost încărcat doar parțial." + FILEUPLOAD_ERR_NO_FILE: "Niciun fișier nu a fost încărcat." + FILEUPLOAD_ERR_NO_TMP_DIR: "Lipsește directorul temporar." + FILEUPLOAD_ERR_CANT_WRITE: "Eroare la scrierea fișierului pe disc." + FILEUPLOAD_ERR_EXTENSION: "O extensie PHP a oprit încărcarea fișierului." + FILEUPLOAD_ERR_UNKNOWN: "Eroare necunoscută la încărcarea fișierului." + DROPZONE_CANCEL_UPLOAD: "Anulează încărcarea" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Sigur doriți să anulați această încărcare?" + DROPZONE_DEFAULT_MESSAGE: "Trage fișierele aici sau click aici" + DROPZONE_FALLBACK_MESSAGE: "Browserul dumneavoastră nu suportă încărcarea prin drag and drop." + DROPZONE_FALLBACK_TEXT: "Vă rugăm folosiți formularul de rezervă de mai jos pentru încărcarea fișierelor ca înainte." + DROPZONE_FILE_TOO_BIG: "Fișierul este prea mare ({{filesize}}MiB). Dimensiunea maximă: {{maxFilesize}}MiB." + DROPZONE_INVALID_FILE_TYPE: "Nu puteți încărca fișiere de acest tip." + DROPZONE_MAX_FILES_EXCEEDED: "Nu puteți încărca mai multe fișiere." + DROPZONE_REMOVE_FILE: "Elimină fișier" + DROPZONE_REMOVE_FILE_CONFIRMATION: "Sigur doriți să eliminați acest fișier?" + DROPZONE_RESPONSE_ERROR: "Serverul a răspuns cu codul {{statusCode}}." + YES: "Da" + NO: "Nu" + REFRESH_PREVENTION: "Prevenirea reîncărcării" + REFRESH_PREVENTION_HELP: "Utilizați ID-ul unic al formularului pentru a preveni re-procesarea formularului la reîncărcarea paginii." + LIMIT: "Limită" + LIMIT_HELP: "Numărul maxim de fișiere admise per câmp (se poate permite mai multe)" + FILESIZE: "Dimensiunea maximă a fișierului" + FILESIZE_HELP: "Dimensiunea maximă admisă a fișierului (în MB), 0 = folosește valoarea implicită a sistemului" + AVOID_OVERWRITING: "Evită suprascrierea" + AVOID_OVERWRITING_HELP: "Previne ca fișierele cu același nume să fie suprascrise. Se adaugă un prefix cu data." + RANDOM_NAME: "Nume aleator" + RANDOM_NAME_HELP: "Generează un șir aleator de 15 caractere pentru numele fișierelor încărcate." + CLIENT_SIDE_VALIDATION: "Validare pe partea clientului" + CLIENT_SIDE_VALIDATION_HELP: "Formularele vor folosi implicit validarea HTML5 pe partea clientului ca prima linie de apărare." + INLINE_ERRORS: "Erori inline" + INLINE_ERRORS_HELP: "Util dacă validarea pe partea clientului este dezactivată, afișează erori contextuale inline." + RESOLUTION_MIN: "{{attr}} este mai mic decât minimul de {{min}}px
" + RESOLUTION_MAX: "{{attr}} este mai mare decât maximul de {{max}}px
" + BASIC_CAPTCHA: "Captcha de bază" + BASIC_CAPTCHA_TYPE: "Tipul provocării Captcha" + BASIC_CAPTCHA_LENGTH: "Numărul de caractere" + BASIC_CAPTCHA_FONT: "Font TTF" + BASIC_CAPTCHA_SIZE: "Dimensiunea fontului" + BASIC_CAPTCHA_BG_COLOR: "Culoarea de fundal" + BASIC_CAPTCHA_TEXT_COLOR: "Culoarea textului" + BASIC_CAPTCHA_START_X: "Poziția inițială x a textului" + BASIC_CAPTCHA_START_Y: "Poziția inițială y a textului" + BASIC_CAPTCHA_BOX_WIDTH: "Lățimea imaginii" + BASIC_CAPTCHA_BOX_HEIGHT: "Înălțimea imaginii" + BASIC_CAPTCHA_MATH_MIN: "Număr minim" + BASIC_CAPTCHA_MATH_MAX: "Număr maxim" + BASIC_CAPTCHA_MATH_OPERATORS: "Operatori matematici (aleatori)" + TURNSTILE_CAPTCHA: "Captcha Cloudflare Turnstile" + MODULAR_FORM_FIX: "Corectare formular modular" + MODULAR_FORM_FIX_HELP: "Corectează problema în care formularele modulare nu găsesc automat formularul corect." + XHR_FILE_UPLOAD: "Încărcare fișier XHR" + XHR_FILE_UPLOAD_HELP: "Activează suportul avansat XHR pentru încărcarea fișierelor în formularele trimise prin AJAX." + FILEPOND_REMOVE_FILE: "Elimină fișier" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Sunteți sigur că doriți să eliminați acest fișier?" + FILEPOND_CANCEL_UPLOAD: "Anulează încărcarea" + FILEPOND_ERROR_FILESIZE: "Fișierul este prea mare" + FILEPOND_ERROR_FILETYPE: "Tip de fișier nevalid" cs: PLUGIN_FORM: NOT_VALIDATED: "Formulář nebyl ověřen. Chybí jedno nebo více povinných polí." - NONCE_NOT_VALIDATED: "Jejda, došlo k problému, zkontrolujte vstupní stránku a znovu odešlete formulář." + FIELD_REQUIRED: "Pole je povinné." + VALIDATION_MATCH: "Pole %s neodpovídá poli %s." + NONCE_NOT_VALIDATED: "Jejda, došlo k problému, zkontrolujte prosím vstup a odešlete formulář znovu." FILES: "Nahrávání souborů" + FORM_ALREADY_SUBMITTED: "Formulář byl již odeslán." ALLOW_MULTIPLE: "Povolit více než jeden soubor" ALLOW_MULTIPLE_HELP: "Umožňuje vybrat více než jeden soubor pro nahrání." DESTINATION: "Cílové umístění" DESTINATION_HELP: "Místo, kam mají být soubory nahrány" ACCEPT: "Povolené MIME typy" - ACCEPT_HELP: "Seznam MIME typů souborů povolených pro upload" - ERROR_VALIDATING_CAPTCHA: "Nepodařilo se ověřit CAPTCHA (kontrola proti spamu)" + ACCEPT_HELP: "Seznam povolených MIME typů pro upload" + ERROR_CAPTCHA_NOT_COMPLETED: "Lidská verifikace selhala pro tento formulář, zkuste to prosím znovu." + ERROR_VALIDATING_CAPTCHA: "Nepodařilo se ověřit CAPTCHA." DATA_SUMMARY: "Shrnutí toho, co jste nám napsali:" NO_FORM_DATA: "Formulář neobsahuje žádná data" RECAPTCHA: "ReCaptcha" + RECAPTCHA_VERSION: "Verze" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Zaškrtávací políčko" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Neviditelné" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Nejnovější" + RECAPTCHA_THEME: "Téma" + RECAPTCHA_THEME_LIGHT: "Světlé téma" + RECAPTCHA_THEME_DARK: "Tmavé téma" RECAPTCHA_SITE_KEY: "Site key" - RECAPTCHA_SITE_KEY_HELP: "Více informací https://developers.google.com/recaptcha" + RECAPTCHA_SITE_KEY_HELP: "Více informací viz https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Secret key" - RECAPTCHA_SECRET_KEY_HELP: "Více informací https://developers.google.com/recaptcha" + RECAPTCHA_SECRET_KEY_HELP: "Více informací viz https://developers.google.com/recaptcha" GENERAL: "Všeobecné" - USE_BUILT_IN_CSS: "Použít built-in CSS" - FILEUPLOAD_PREVENT_SELF: 'Nelze použít "% s" mimo stránky.' + USE_BUILT_IN_CSS: "Použít vestavěné CSS" + USE_INLINE_CSS: "Použít inline CSS" + FILEUPLOAD_PREVENT_SELF: 'Nelze použít "%s" mimo stránky.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Nelze nahrát soubor %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Nelze přesunout soubor %s do "%s"' - DROPZONE_CANCEL_UPLOAD: 'Zrušit upload' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Opravdu chcete zrušit nahrávání souboru?' - DROPZONE_DEFAULT_MESSAGE: 'Přetáhněte sem soubory nebo klikněte v tomto prostoru' - DROPZONE_FALLBACK_MESSAGE: 'Váš prohlížeč nepodporuje nahrávání souborů táhni a pusť.' - DROPZONE_FALLBACK_TEXT: 'Použijte níže uvedený formulář pro nahrání souborů, jako v minulých dnech.' - DROPZONE_FILE_TOO_BIG: 'Soubor je příliš velký ({{filesize}}MiB). Max. velikost souboru: {{maxFilesize}}MiB.' + FILEUPLOAD_ERR_OK: "Soubor byl úspěšně nahrán bez chyb." + FILEUPLOAD_ERR_INI_SIZE: "Nahraný soubor překračuje maximální povolenou velikost." + FILEUPLOAD_ERR_FORM_SIZE: "Nahraný soubor překračuje direktivu MAX_FILE_SIZE určenou v HTML." + FILEUPLOAD_ERR_PARTIAL: "Soubor byl nahrán pouze částečně." + FILEUPLOAD_ERR_NO_FILE: "Nebyl nahrán žádný soubor." + FILEUPLOAD_ERR_NO_TMP_DIR: "Chybí dočasný adresář." + FILEUPLOAD_ERR_CANT_WRITE: "Nepodařilo se zapsat soubor na disk." + FILEUPLOAD_ERR_EXTENSION: "PHP rozšíření zastavilo nahrávání souboru." + FILEUPLOAD_ERR_UNKNOWN: "Neznámá chyba při nahrávání souboru." + DROPZONE_CANCEL_UPLOAD: "Zrušit upload" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Opravdu chcete zrušit nahrávání souboru?" + DROPZONE_DEFAULT_MESSAGE: "Přetáhněte sem soubory nebo klikněte v prostoru" + DROPZONE_FALLBACK_MESSAGE: "Váš prohlížeč nepodporuje nahrávání souborů metodou drag and drop." + DROPZONE_FALLBACK_TEXT: "Použijte prosím níže uvedený formulář pro nahrání souborů jako dříve." + DROPZONE_FILE_TOO_BIG: "Soubor je příliš velký ({{filesize}}MiB). Max. velikost: {{maxFilesize}}MiB." DROPZONE_INVALID_FILE_TYPE: "Nelze nahrát soubory tohoto typu." DROPZONE_MAX_FILES_EXCEEDED: "Nelze nahrát další soubory." DROPZONE_REMOVE_FILE: "Odstranit soubor" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Opravdu chcete tento soubor smazat?' + DROPZONE_REMOVE_FILE_CONFIRMATION: "Opravdu chcete tento soubor smazat?" DROPZONE_RESPONSE_ERROR: "Server vrátil chybový kód: {{statusCode}}." YES: "Ano" NO: "Ne" + pl: PLUGIN_FORM: - NOT_VALIDATED: "Formularz został odrzucony. Jedno lub więcej pól wymaga wypełnienia." + NOT_VALIDATED: "Formularz został odrzucony. Jedno lub więcej pól wymaganych nie zostało wypełnionych." + FIELD_REQUIRED: "Pole jest wymagane." + VALIDATION_MATCH: "Pole %s nie pasuje do pola %s." NONCE_NOT_VALIDATED: "Ups, pojawił się problem. Proszę sprawdzić, czy wszystkie pola zostały wypełnione i wysłać formularz ponownie." FILES: "Plik przesłany." FORM_ALREADY_SUBMITTED: "Ten formularz został już wysłany." ALLOW_MULTIPLE: "Zezwól na więcej niż jeden plik." - ALLOW_MULTIPLE_HELP: "Zezwól na przesłanie więcej niż jednego pliku." + ALLOW_MULTIPLE_HELP: "Zezwala na przesłanie więcej niż jednego pliku." DESTINATION: "Cel" - DESTINATION_HELP: "Lokalizacja przesłanego pliku." + DESTINATION_HELP: "Lokalizacja, gdzie ma zostać przesłany plik." ACCEPT: "Dozwolone typy MIME" - ACCEPT_HELP: "Lista dozwolonych do przesłania typów MIME" + ACCEPT_HELP: "Lista dozwolonych typów MIME do przesłania." + ERROR_CAPTCHA_NOT_COMPLETED: "Weryfikacja człowieka nie powiodła się dla tego formularza, spróbuj ponownie." ERROR_VALIDATING_CAPTCHA: "Błąd walidacji Captcha" DATA_SUMMARY: "Oto podsumowanie informacji, które do nas napisałeś:" - NO_FORM_DATA: "Brak dostępnych danych formularza" + NO_FORM_DATA: "Brak danych formularza" RECAPTCHA: "ReCaptcha" + RECAPTCHA_VERSION: "Wersja" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Checkbox" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Niewidoczny" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Najnowsza" + RECAPTCHA_THEME: "Motyw" + RECAPTCHA_THEME_LIGHT: "Jasny motyw" + RECAPTCHA_THEME_DARK: "Ciemny motyw" RECAPTCHA_SITE_KEY: "Klucz strony" - RECAPTCHA_SITE_KEY_HELP: "Aby uzyskać więcej informacji, odwiedź https://developers.google.com/recaptcha" + RECAPTCHA_SITE_KEY_HELP: "Więcej informacji: https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Tajny klucz" - RECAPTCHA_SECRET_KEY_HELP: "Aby uzyskać więcej informacji, odwiedź https://developers.google.com/recaptcha" + RECAPTCHA_SECRET_KEY_HELP: "Więcej informacji: https://developers.google.com/recaptcha" GENERAL: "Ogólne" USE_BUILT_IN_CSS: "Użyj wbudowanych stylów CSS" USE_INLINE_CSS: "Użyj stylów inline CSS" FILEUPLOAD_PREVENT_SELF: 'Nie można użyć "%s" poza stronami.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Nie można przesłać pliku %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Nie można przenieść pliku %s do "%s"' - DROPZONE_CANCEL_UPLOAD: 'Anuluj przesyłanie' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Czy na pewno chcesz anulować to przesyłanie?' - DROPZONE_DEFAULT_MESSAGE: 'Upuść pliki tutaj lub kliknij w tym obszarze' - DROPZONE_FALLBACK_MESSAGE: 'Twoja przeglądarka nie wspiera przesyłania plików metodą przeciągnij i upuść.' - DROPZONE_FALLBACK_TEXT: 'Proszę użyć zapasowego formularza do przesyłania plików znajdującego się poniżej.' - DROPZONE_FILE_TOO_BIG: 'Plik jest zbyt duży ({{filesize}}MiB). Maksymalna wielkość pliku: {{maxFilesize}}MiB.' + FILEUPLOAD_ERR_OK: "Plik został przesłany bez błędów." + FILEUPLOAD_ERR_INI_SIZE: "Przesłany plik przekracza maksymalny dozwolony rozmiar." + FILEUPLOAD_ERR_FORM_SIZE: "Przesłany plik przekracza dyrektywę MAX_FILE_SIZE określoną w HTML." + FILEUPLOAD_ERR_PARTIAL: "Plik został przesłany tylko częściowo." + FILEUPLOAD_ERR_NO_FILE: "Plik nie został przesłany." + FILEUPLOAD_ERR_NO_TMP_DIR: "Brak folderu tymczasowego." + FILEUPLOAD_ERR_CANT_WRITE: "Nie udało się zapisać pliku na dysku." + FILEUPLOAD_ERR_EXTENSION: "Rozszerzenie PHP zatrzymało przesyłanie pliku." + FILEUPLOAD_ERR_UNKNOWN: "Nieznany błąd przesyłania pliku." + DROPZONE_CANCEL_UPLOAD: "Anuluj przesyłanie" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Czy na pewno chcesz anulować przesyłanie?" + DROPZONE_DEFAULT_MESSAGE: "Upuść pliki tutaj lub kliknij w tym obszarze" + DROPZONE_FALLBACK_MESSAGE: "Twoja przeglądarka nie wspiera przesyłania plików metodą przeciągnij i upuść." + DROPZONE_FALLBACK_TEXT: "Proszę użyć zapasowego formularza poniżej do przesyłania plików." + DROPZONE_FILE_TOO_BIG: "Plik jest zbyt duży ({{filesize}}MiB). Maksymalny rozmiar: {{maxFilesize}}MiB." DROPZONE_INVALID_FILE_TYPE: "Nie możesz przesłać pliku w tym formacie." - DROPZONE_MAX_FILES_EXCEEDED: "Nie możesz już przesłać więcej plików." + DROPZONE_MAX_FILES_EXCEEDED: "Nie możesz przesłać więcej plików." DROPZONE_REMOVE_FILE: "Usuń plik" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Czy na pewno chcesz usunąć ten plik?' + DROPZONE_REMOVE_FILE_CONFIRMATION: "Czy na pewno chcesz usunąć ten plik?" DROPZONE_RESPONSE_ERROR: "Serwer odpowiedział kodem {{statusCode}}." YES: "Tak" NO: "Nie" REFRESH_PREVENTION: "Zapobiegaj odświeżaniu" - REFRESH_PREVENTION_HELP: "Użyj unikatowego identyfikatora ID, aby upewnić się, że przeglądarka nie przetworzy formularza ponownie." + REFRESH_PREVENTION_HELP: "Użyj unikalnego ID, aby upewnić się, że formularz nie zostanie przetworzony ponownie przy odświeżeniu." LIMIT: "Limit" - LIMIT_HELP: "Maksymalna ilość dozwolonych plików na pole (wymagana liczba mnoga)" + LIMIT_HELP: "Maksymalna liczba dozwolonych plików na pole." FILESIZE: "Maksymalny rozmiar pliku" FILESIZE_HELP: "Maksymalny dozwolony rozmiar pliku (w MB), 0 = użyj ustawień systemowych" AVOID_OVERWRITING: "Unikaj nadpisywania" - AVOID_OVERWRITING_HELP: "Unikaj nadpisywania plików o tej samej nazwie. Zostanie dodany prefiks z datą" + AVOID_OVERWRITING_HELP: "Unikaj nadpisywania plików o tej samej nazwie. Dodany zostanie prefiks z datą." RANDOM_NAME: "Losowa nazwa" RANDOM_NAME_HELP: "Wygeneruj losowy ciąg 15 znaków jako nazwę dla przesyłanych plików" CLIENT_SIDE_VALIDATION: "Weryfikacja po stronie klienta" - CLIENT_SIDE_VALIDATION_HELP: "Domyślnie formularze użyją weryfikacji HTML5 po stronie klienta jako pierwszej linii obrony" + CLIENT_SIDE_VALIDATION_HELP: "Domyślnie formularze używają HTML5 weryfikacji po stronie klienta jako pierwszej linii obrony." INLINE_ERRORS: "Błędy inline" - INLINE_ERRORS_HELP: "Przydatne przy wyłączonej weryfikacji po stronie klienta, wyświetla kontekstowe błędy formularza" - RESOLUTION_MIN: "{{attr}} była mniejsza od minimum wynoszącego {{min}}px
" - RESOLUTION_MAX: "{{attr}} była większa od maksimum wynoszącego {{max}}px
" - DESTINATION_NOT_SPECIFIED: "Cel nie został określony" - INVALID_MIME_TYPE: "Typ MIME %s dla pliku %s nie jest dozwolony." - INVALID_FILE_EXTENSION: "Rozszerzenie pliku %s nie jest dozwolone." + INLINE_ERRORS_HELP: "Przydatne, gdy weryfikacja po stronie klienta jest wyłączona, pokazuje błędy bezpośrednio w formularzu." + RESOLUTION_MIN: "Pole {{attr}} jest mniejsze od minimum {{min}}px
" + RESOLUTION_MAX: "Pole {{attr}} jest większe od maksimum {{max}}px
" + BASIC_CAPTCHA: "Podstawowy Captcha" + BASIC_CAPTCHA_TYPE: "Typ wyzwania Captcha" + BASIC_CAPTCHA_LENGTH: "Liczba znaków" + BASIC_CAPTCHA_FONT: "Czcionka TTF" + BASIC_CAPTCHA_SIZE: "Rozmiar czcionki" + BASIC_CAPTCHA_BG_COLOR: "Kolor tła" + BASIC_CAPTCHA_TEXT_COLOR: "Kolor tekstu" + BASIC_CAPTCHA_START_X: "Pozycja początkowa x tekstu" + BASIC_CAPTCHA_START_Y: "Pozycja początkowa y tekstu" + BASIC_CAPTCHA_BOX_WIDTH: "Szerokość obrazu" + BASIC_CAPTCHA_BOX_HEIGHT: "Wysokość obrazu" + BASIC_CAPTCHA_MATH_MIN: "Minimalna liczba" + BASIC_CAPTCHA_MATH_MAX: "Maksymalna liczba" + BASIC_CAPTCHA_MATH_OPERATORS: "Operatory matematyczne (losowe)" + TURNSTILE_CAPTCHA: "Captcha Cloudflare Turnstile" + MODULAR_FORM_FIX: "Naprawa formularza modularnego" + MODULAR_FORM_FIX_HELP: "Naprawia problem z automatycznym nieznajdowaniem prawidłowego formularza w formularzach modularnych." + XHR_FILE_UPLOAD: "XHR przesyłanie plików" + XHR_FILE_UPLOAD_HELP: "Włącza zaawansowane wsparcie XHR dla przesyłania plików w formularzach wysyłanych metodą AJAX." + FILEPOND_REMOVE_FILE: "Usuń plik" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Czy na pewno chcesz usunąć ten plik?" + FILEPOND_CANCEL_UPLOAD: "Anuluj przesyłanie" + FILEPOND_ERROR_FILESIZE: "Plik jest zbyt duży" + FILEPOND_ERROR_FILETYPE: "Nieprawidłowy typ pliku" + nl: PLUGIN_FORM: NOT_VALIDATED: "Formulier niet gevalideerd. Een of meerdere verplichte velden ontbreken." - NONCE_NOT_VALIDATED: "Oeps er was een probleem, controleer je input en stuur het formulier opnieuw." - FILES: "Bestanden geupload" + FIELD_REQUIRED: "Veld is verplicht." + VALIDATION_MATCH: "Het veld %s komt niet overeen met het veld %s." + NONCE_NOT_VALIDATED: "Oeps, er was een probleem, controleer je input en stuur het formulier opnieuw." + FILES: "Bestanden geüpload" FORM_ALREADY_SUBMITTED: "Dit formulier is al eerder verstuurd." - ALLOW_MULTIPLE: "Meer dan een bestand toegestaan" - ALLOW_MULTIPLE_HELP: "Staat toe dat meer dan een bestand geselecteerd kan worden voor uploaden." + ALLOW_MULTIPLE: "Meer dan één bestand toegestaan" + ALLOW_MULTIPLE_HELP: "Staat toe dat meer dan één bestand geselecteerd kan worden voor uploaden." DESTINATION: "Bestemming" - DESTINATION_HELP: "De lokatie waar de bestanden naartoe moeten worden geupload" + DESTINATION_HELP: "De locatie waar de bestanden naartoe moeten worden geüpload" ACCEPT: "Toegestane MIME types" - ACCEPT_HELP: "Een lijst van MIME types welke zijn toegestaan om te uploaden" + ACCEPT_HELP: "Een lijst van MIME types die zijn toegestaan om te uploaden" + ERROR_CAPTCHA_NOT_COMPLETED: "Menselijke verificatie is mislukt voor dit formulier, probeer het opnieuw." ERROR_VALIDATING_CAPTCHA: "Fout bij Captcha validatie" DATA_SUMMARY: "Hier is de samenvatting van wat u ons heeft gestuurd:" NO_FORM_DATA: "Geen formdata beschikbaar" RECAPTCHA: "ReCaptcha" + RECAPTCHA_VERSION: "Versie" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Checkbox" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Onzichtbaar" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Nieuwste" + RECAPTCHA_THEME: "Thema" + RECAPTCHA_THEME_LIGHT: "Licht thema" + RECAPTCHA_THEME_DARK: "Donker thema" RECAPTCHA_SITE_KEY: "Site sleutel" RECAPTCHA_SITE_KEY_HELP: "Voor meer informatie ga naar https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Geheime sleutel" RECAPTCHA_SECRET_KEY_HELP: "Voor meer informatie ga naar https://developers.google.com/recaptcha" GENERAL: "Algemeen" USE_BUILT_IN_CSS: "Gebruik ingebouwde CSS" - FILEUPLOAD_PREVENT_SELF: 'Kan "%s" niet buiten paginas gebruiken.' + USE_INLINE_CSS: "Gebruik inline CSS" + FILEUPLOAD_PREVENT_SELF: 'Kan "%s" niet buiten pagina''s gebruiken.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Niet mogelijk om bestand %s: %s te uploaden' FILEUPLOAD_UNABLE_TO_MOVE: 'Niet mogelijk om bestand %s naar "%s" te verplaatsen' - DROPZONE_CANCEL_UPLOAD: 'Upload annuleren' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Weet u zeker dat u deze upload wilt annuleren?' - DROPZONE_DEFAULT_MESSAGE: 'Sleep hier uw bestanden heen of klik in dit gebied' - DROPZONE_FALLBACK_MESSAGE: 'Uw browser ondersteund geen drag en drop bestand uploads.' - DROPZONE_FALLBACK_TEXT: 'Gebruik alsublieft het fallback formulier hieronder om uw bestanden te uploaden zoals vroeger.' - DROPZONE_FILE_TOO_BIG: 'Bestand is te groot ({{filesize}}MiB). Maximale bestandsgrootte: {{maxFilesize}}MiB.' + FILEUPLOAD_ERR_OK: "Er is geen fout opgetreden, het bestand is succesvol geüpload." + FILEUPLOAD_ERR_INI_SIZE: "Het geüploade bestand overschrijdt de maximale uploadgrootte." + FILEUPLOAD_ERR_FORM_SIZE: "Het geüploade bestand overschrijdt de MAX_FILE_SIZE richtlijn in de HTML." + FILEUPLOAD_ERR_PARTIAL: "Het bestand is slechts gedeeltelijk geüpload." + FILEUPLOAD_ERR_NO_FILE: "Er is geen bestand geüpload." + FILEUPLOAD_ERR_NO_TMP_DIR: "Er ontbreekt een tijdelijke map." + FILEUPLOAD_ERR_CANT_WRITE: "Het bestand kon niet naar de schijf worden geschreven." + FILEUPLOAD_ERR_EXTENSION: "Een PHP-extensie heeft het uploaden gestopt." + FILEUPLOAD_ERR_UNKNOWN: "Onbekende fout tijdens het uploaden van het bestand." + DROPZONE_CANCEL_UPLOAD: "Upload annuleren" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Weet u zeker dat u deze upload wilt annuleren?" + DROPZONE_DEFAULT_MESSAGE: "Sleep hier uw bestanden heen of klik in dit gebied" + DROPZONE_FALLBACK_MESSAGE: "Uw browser ondersteunt geen drag and drop bestand uploads." + DROPZONE_FALLBACK_TEXT: "Gebruik alstublieft het fallback formulier hieronder om uw bestanden te uploaden zoals vroeger." + DROPZONE_FILE_TOO_BIG: "Bestand is te groot ({{filesize}}MiB). Maximale bestandsgrootte: {{maxFilesize}}MiB." DROPZONE_INVALID_FILE_TYPE: "U kunt geen bestanden uploaden van dit type." DROPZONE_MAX_FILES_EXCEEDED: "U kunt niet meer bestanden uploaden." DROPZONE_REMOVE_FILE: "Verwijder bestand" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Weet u zeker dat u het bestand wilt verwijderen?' + DROPZONE_REMOVE_FILE_CONFIRMATION: "Weet u zeker dat u dit bestand wilt verwijderen?" DROPZONE_RESPONSE_ERROR: "Server reageert met {{statusCode}} code." YES: "Ja" NO: "Nee" REFRESH_PREVENTION: "Verversbescherming" - REFRESH_PREVENTION_HELP: "Gebruik het unieke ID van her formulier om zeker te stellen dat hetzelfde formulier niet opnieuw wordt verwerkt als de browser ververst wordt" + REFRESH_PREVENTION_HELP: "Gebruik het unieke ID van het formulier om te voorkomen dat hetzelfde formulier opnieuw wordt verwerkt bij het verversen van de browser." LIMIT: "Limiet" - LIMIT_HELP: "Maximum aantal toegestande bestanden per veld (meerdere vereist)" + LIMIT_HELP: "Maximum aantal toegestane bestanden per veld (meerdere vereist)" FILESIZE: "Maximale bestandsgrootte" FILESIZE_HELP: "Maximale bestandsgrootte toegestaan (in MB), 0 = Gebruik systeem standaard" AVOID_OVERWRITING: "Vermijd overschrijven" - AVOID_OVERWRITING_HELP: "Voorkom dat bestanden met dezelfde naam worden overschreven. Datum prefix wordt toegevoegd" + AVOID_OVERWRITING_HELP: "Voorkom dat bestanden met dezelfde naam worden overschreven. Datum prefix wordt toegevoegd." RANDOM_NAME: "Willekeurige naam" - RANDOM_NAME_HELP: "Genereer een willekeurige naam van 15 karakters voor de geuploade bestanden" + RANDOM_NAME_HELP: "Genereer een willekeurige naam van 15 karakters voor de geüploade bestanden" + CLIENT_SIDE_VALIDATION_HELP: "Formulieren gebruiken standaard HTML5 validatie aan de clientzijde als eerste verdedigingslinie." + INLINE_ERRORS: "Inline fouten" + INLINE_ERRORS_HELP: "Handig bij uitgeschakelde client-side validatie, toont inline contextuele formulierfouten." + BASIC_CAPTCHA: "Basis Captcha" + BASIC_CAPTCHA_TYPE: "Captcha-uitdagingstype" + BASIC_CAPTCHA_LENGTH: "Aantal tekens" + BASIC_CAPTCHA_FONT: "TTF-lettertype" + BASIC_CAPTCHA_SIZE: "Lettergrootte" + BASIC_CAPTCHA_BG_COLOR: "Achtergrondkleur" + BASIC_CAPTCHA_TEXT_COLOR: "Tekstkleur" + BASIC_CAPTCHA_START_X: "Beginsituatie x-positie van de tekst" + BASIC_CAPTCHA_START_Y: "Beginsituatie y-positie van de tekst" + BASIC_CAPTCHA_BOX_WIDTH: "Afbeeldingsbreedte" + BASIC_CAPTCHA_BOX_HEIGHT: "Afbeeldingshoogte" + BASIC_CAPTCHA_MATH_MIN: "Minimumgetal" + BASIC_CAPTCHA_MATH_MAX: "Maximumgetal" + BASIC_CAPTCHA_MATH_OPERATORS: "Wiskundige operatoren (willekeurig)" + TURNSTILE_CAPTCHA: "Cloudflare Turnstile Captcha" + MODULAR_FORM_FIX: "Modulair formulier fix" + MODULAR_FORM_FIX_HELP: "Lost het probleem op dat modulaire formulieren het juiste formulier niet automatisch vinden." + XHR_FILE_UPLOAD: "XHR-bestandsupload" + XHR_FILE_UPLOAD_HELP: "Schakel geavanceerde XHR-ondersteuning in voor bestandsuploads in via AJAX verzonden formulieren." + FILEPOND_REMOVE_FILE: "Verwijder bestand" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Weet u zeker dat u dit bestand wilt verwijderen?" + FILEPOND_CANCEL_UPLOAD: "Annuleer upload" + FILEPOND_ERROR_FILESIZE: "Bestand is te groot" + FILEPOND_ERROR_FILETYPE: "Ongeldig bestandstype" + pt: PLUGIN_FORM: NOT_VALIDATED: "Formulário não validado. Falta preencher um ou mais campos obrigatórios." - NONCE_NOT_VALIDATED: "Oops, houve um problema. Por favor verifique os dados informados e envie o formulário novamente." + FIELD_REQUIRED: "O campo é obrigatório." + VALIDATION_MATCH: "O campo %s não corresponde ao campo %s." + NONCE_NOT_VALIDATED: "Oops, houve um problema. Por favor, verifique os dados informados e envie o formulário novamente." FILES: "Envio de Arquivos" FORM_ALREADY_SUBMITTED: "Este formulário já foi enviado." ALLOW_MULTIPLE: "Permitir mais de um arquivo" @@ -739,10 +1355,18 @@ pt: DESTINATION_HELP: "O local para onde os arquivos devem ser enviados" ACCEPT: "Tipos MIME Permitidos" ACCEPT_HELP: "Uma lista de tipos MIME permitidos no upload" + ERROR_CAPTCHA_NOT_COMPLETED: "A verificação humana falhou para este formulário, por favor, tente novamente." ERROR_VALIDATING_CAPTCHA: "Erro ao validar o captcha" DATA_SUMMARY: "Aqui está um resumo do que você escreveu:" NO_FORM_DATA: "Nenhum dado de formulário disponível" RECAPTCHA: "ReCaptcha" + RECAPTCHA_VERSION: "Versão" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Caixa de seleção" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Invisível" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Última" + RECAPTCHA_THEME: "Tema" + RECAPTCHA_THEME_LIGHT: "Tema claro" + RECAPTCHA_THEME_DARK: "Tema escuro" RECAPTCHA_SITE_KEY: "Site key" RECAPTCHA_SITE_KEY_HELP: "Para mais informações visite https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Secret key" @@ -753,51 +1377,95 @@ pt: FILEUPLOAD_PREVENT_SELF: 'Não é permitido usar "%s" fora de páginas.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Não foi possível enviar o arquivo %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Não foi possível mover o arquivo %s para "%s"' - DROPZONE_CANCEL_UPLOAD: 'Cancelar envio' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Tem certeza de que deseja cancelar este envio?' - DROPZONE_DEFAULT_MESSAGE: 'Arraste seus arquivos para cá ou clique nesta área' - DROPZONE_FALLBACK_MESSAGE: 'Seu navegador não suporta arrastar e soltar arquivos.' - DROPZONE_FALLBACK_TEXT: 'Por favor use o formulário abaixo para enviar seus arquivos como antigamente.' - DROPZONE_FILE_TOO_BIG: 'O arquivo é muito grande ({{filesize}}MiB). Tamanho máximo: {{maxFilesize}}MiB.' + FILEUPLOAD_ERR_OK: "Arquivo enviado com sucesso, sem erros." + FILEUPLOAD_ERR_INI_SIZE: "O arquivo enviado excede o tamanho máximo permitido." + FILEUPLOAD_ERR_FORM_SIZE: "O arquivo enviado excede a diretiva MAX_FILE_SIZE especificada no HTML." + FILEUPLOAD_ERR_PARTIAL: "O arquivo foi enviado apenas parcialmente." + FILEUPLOAD_ERR_NO_FILE: "Nenhum arquivo foi enviado." + FILEUPLOAD_ERR_NO_TMP_DIR: "Pasta temporária ausente." + FILEUPLOAD_ERR_CANT_WRITE: "Falha ao escrever o arquivo em disco." + FILEUPLOAD_ERR_EXTENSION: "Uma extensão PHP interrompeu o upload do arquivo." + FILEUPLOAD_ERR_UNKNOWN: "Erro desconhecido no upload do arquivo." + DROPZONE_CANCEL_UPLOAD: "Cancelar envio" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Tem certeza de que deseja cancelar este envio?" + DROPZONE_DEFAULT_MESSAGE: "Arraste seus arquivos para cá ou clique nesta área" + DROPZONE_FALLBACK_MESSAGE: "Seu navegador não suporta arrastar e soltar arquivos." + DROPZONE_FALLBACK_TEXT: "Por favor, use o formulário abaixo para enviar seus arquivos como antigamente." + DROPZONE_FILE_TOO_BIG: "O arquivo é muito grande ({{filesize}}MiB). Tamanho máximo: {{maxFilesize}}MiB." DROPZONE_INVALID_FILE_TYPE: "Você não pode enviar arquivos deste tipo." DROPZONE_MAX_FILES_EXCEEDED: "Você não pode enviar mais arquivos." DROPZONE_REMOVE_FILE: "Remover arquivo" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Tem certeza de que deseja excluir este arquivo?' + DROPZONE_REMOVE_FILE_CONFIRMATION: "Tem certeza de que deseja excluir este arquivo?" DROPZONE_RESPONSE_ERROR: "O servidor respondeu com código {{statusCode}}." YES: "Sim" NO: "Não" REFRESH_PREVENTION: "Evitar recarregamento" - REFRESH_PREVENTION_HELP: "Usar o ID do formulário para garantir que ele não seja reprocessado se o usuário recarregar a página" + REFRESH_PREVENTION_HELP: "Use o ID do formulário para garantir que ele não seja reprocessado se o usuário recarregar a página." LIMIT: "Limite" LIMIT_HELP: "Número máximo de arquivos permitidos por campo (deve ser múltiplo)" FILESIZE: "Tamanho máximo" - FILESIZE_HELP: "Tamanho máximo de arquivo permitido (em MB), 0 = Use o default do sistema" + FILESIZE_HELP: "Tamanho máximo de arquivo permitido (em MB), 0 = Use o padrão do sistema" AVOID_OVERWRITING: "Evitar sobrescrita" - AVOID_OVERWRITING_HELP: "Prevenir que arquivos com o mesmo nome sejam sobrescritos. Serão adicionados prefixos com a data" + AVOID_OVERWRITING_HELP: "Previne que arquivos com o mesmo nome sejam sobrescritos. Prefixos com data serão adicionados." RANDOM_NAME: "Nome aleatório" RANDOM_NAME_HELP: "Gerar um nome aleatório de 15 caracteres para os arquivos recebidos" CLIENT_SIDE_VALIDATION: "Validação no cliente" - CLIENT_SIDE_VALIDATION_HELP: "Por padrão os formulários usarão a validação HTML5 no cliente como primeira linha de defesa" + CLIENT_SIDE_VALIDATION_HELP: "Por padrão, os formulários usarão a validação HTML5 no cliente como primeira linha de defesa." INLINE_ERRORS: "Erros inline" - INLINE_ERRORS_HELP: "Útil se a validação no cliente estiver desabilitada. Mostra os erros próximo aos respectivos campos" - RESOLUTION_MIN: "A {{attr}} é menor que o mínimo de {{min}}px
" - RESOLUTION_MAX: "A {{attr}} é maior que o máximo de {{max}}px
" + INLINE_ERRORS_HELP: "Útil se a validação do lado do cliente estiver desativada, exibindo erros contextuais próximo aos campos." + RESOLUTION_MIN: "O {{attr}} é menor que o mínimo de {{min}}px
" + RESOLUTION_MAX: "O {{attr}} é maior que o máximo de {{max}}px
" + BASIC_CAPTCHA: "Captcha Básico" + BASIC_CAPTCHA_TYPE: "Tipo de desafio Captcha" + BASIC_CAPTCHA_LENGTH: "Número de caracteres" + BASIC_CAPTCHA_FONT: "Fonte TTF" + BASIC_CAPTCHA_SIZE: "Tamanho da fonte" + BASIC_CAPTCHA_BG_COLOR: "Cor de fundo" + BASIC_CAPTCHA_TEXT_COLOR: "Cor do texto" + BASIC_CAPTCHA_START_X: "Posição inicial x do texto" + BASIC_CAPTCHA_START_Y: "Posição inicial y do texto" + BASIC_CAPTCHA_BOX_WIDTH: "Largura da imagem" + BASIC_CAPTCHA_BOX_HEIGHT: "Altura da imagem" + BASIC_CAPTCHA_MATH_MIN: "Número mínimo" + BASIC_CAPTCHA_MATH_MAX: "Número máximo" + BASIC_CAPTCHA_MATH_OPERATORS: "Operadores matemáticos (aleatórios)" + TURNSTILE_CAPTCHA: "Captcha Cloudflare Turnstile" + MODULAR_FORM_FIX: "Correção do formulário modular" + MODULAR_FORM_FIX_HELP: "Corrige o problema de formulários modulares que não encontram automaticamente o formulário correto." + XHR_FILE_UPLOAD: "Upload de arquivo XHR" + XHR_FILE_UPLOAD_HELP: "Ativa o suporte avançado XHR para uploads de arquivos em formulários enviados via AJAX." + FILEPOND_REMOVE_FILE: "Remover arquivo" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Tem certeza de que deseja remover este arquivo?" + FILEPOND_CANCEL_UPLOAD: "Cancelar upload" + FILEPOND_ERROR_FILESIZE: "O arquivo é muito grande" + FILEPOND_ERROR_FILETYPE: "Tipo de arquivo inválido" + da: PLUGIN_FORM: NOT_VALIDATED: "Formular ikke valideret. Et eller flere påkrævede felter mangler." - NONCE_NOT_VALIDATED: "Ups der var et problem, tjek venligst dit input og send formularen igen." + FIELD_REQUIRED: "Feltet er påkrævet." + VALIDATION_MATCH: "Feltet %s stemmer ikke overens med feltet %s." + NONCE_NOT_VALIDATED: "Ups, der var et problem, tjek venligst dit input og send formularen igen." FILES: "Filupload" FORM_ALREADY_SUBMITTED: "Denne formular er allerede blevet sendt." ALLOW_MULTIPLE: "Tillad mere end én fil." ALLOW_MULTIPLE_HELP: "Tillader at der vælges mere end én fil til upload." DESTINATION: "Destination" - DESTINATION_HELP: "Lokationen hvor filerne skal uploades til" + DESTINATION_HELP: "Lokationen, hvor filerne skal uploades til" ACCEPT: "Tilladte MIME Typer" - ACCEPT_HELP: "En liste af MIME Typer der er tilladte for upload" + ACCEPT_HELP: "En liste af MIME Typer, der er tilladte for upload" + ERROR_CAPTCHA_NOT_COMPLETED: "Menneskelig verifikation mislykkedes for denne formular, prøv venligst igen." ERROR_VALIDATING_CAPTCHA: "Fejl ved validering af Captcha" DATA_SUMMARY: "Her er resuméet af det, du skrev til os:" NO_FORM_DATA: "Ingen formular-data til rådighed" RECAPTCHA: "ReCaptcha" + RECAPTCHA_VERSION: "Version" + RECAPTCHA_VERSION_V2_CHECKBOX: "v2 - Afkrydsningsfelt" + RECAPTCHA_VERSION_V2_INVISIBLE: "v2 - Usynlig" + RECAPTCHA_VERSION_V3_LATEST: "v3 - Seneste" + RECAPTCHA_THEME: "Tema" + RECAPTCHA_THEME_LIGHT: "Lyst tema" + RECAPTCHA_THEME_DARK: "Mørkt tema" RECAPTCHA_SITE_KEY: "Site nøgle" RECAPTCHA_SITE_KEY_HELP: "For mere info besøg https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Hemmelig nøgle" @@ -808,41 +1476,71 @@ da: FILEUPLOAD_PREVENT_SELF: 'Kan ikke bruge "%s" uden for sider.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Kan ikke uploade filen %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Kan ikke flytte fil %s til "%s"' - DROPZONE_CANCEL_UPLOAD: 'Annuller upload' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Er du sikker på, at du vil annullere denne upload?' - DROPZONE_DEFAULT_MESSAGE: 'Drop dine filer her eller klik i dette område' - DROPZONE_FALLBACK_MESSAGE: 'Din browser understøtter ikke træk-og-slip filoploads.' - DROPZONE_FALLBACK_TEXT: 'Brug venligst nedenstående formular til at uploade dine filer som i de gamle dage.' - DROPZONE_FILE_TOO_BIG: 'Filen er for stor ({{filesize}}MiB). Maks. filstørrelse: {{maxFilesize}}MiB.' + FILEUPLOAD_ERR_OK: "Ingen fejl, filen er blevet uploadet med succes." + FILEUPLOAD_ERR_INI_SIZE: "Den uploadede fil overskrider den maksimale tilladte størrelse." + FILEUPLOAD_ERR_FORM_SIZE: "Den uploadede fil overskrider MAX_FILE_SIZE-direktivet specificeret i HTML." + FILEUPLOAD_ERR_PARTIAL: "Filen blev kun delvist uploadet." + FILEUPLOAD_ERR_NO_FILE: "Ingen fil blev uploadet." + FILEUPLOAD_ERR_NO_TMP_DIR: "Midlertidig mappe mangler." + FILEUPLOAD_ERR_CANT_WRITE: "Kunne ikke skrive filen til disk." + FILEUPLOAD_ERR_EXTENSION: "En PHP-udvidelse stoppede uploaden." + FILEUPLOAD_ERR_UNKNOWN: "Ukendt fejl ved filupload." + DROPZONE_CANCEL_UPLOAD: "Upload annulleres" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Er du sikker på, at du vil annullere denne upload?" + DROPZONE_DEFAULT_MESSAGE: "Slip dine filer her eller klik i dette område" + DROPZONE_FALLBACK_MESSAGE: "Din browser understøtter ikke drag and drop filuploads." + DROPZONE_FALLBACK_TEXT: "Brug venligst nedenstående formular til at uploade dine filer som tidligere." + DROPZONE_FILE_TOO_BIG: "Filen er for stor ({{filesize}}MiB). Maks. filstørrelse: {{maxFilesize}}MiB." DROPZONE_INVALID_FILE_TYPE: "Du kan ikke uploade filer af denne type." DROPZONE_MAX_FILES_EXCEEDED: "Du kan ikke uploade flere filer." DROPZONE_REMOVE_FILE: "Fjern fil" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Er du sikker på, at du vil slette denne fil?' + DROPZONE_REMOVE_FILE_CONFIRMATION: "Er du sikker på, at du vil slette denne fil?" DROPZONE_RESPONSE_ERROR: "Server svarede med {{statusCode}} kode." YES: "Ja" NO: "Nej" REFRESH_PREVENTION: "Forebyg opdatering" - REFRESH_PREVENTION_HELP: "Brug formularens unikke ID for at sikre, at samme form ikke bearbejdes igen, når du opdaterer browseren" + REFRESH_PREVENTION_HELP: "Brug formularens unikke ID for at sikre, at samme formular ikke behandles igen ved opdatering." LIMIT: "Begrænsning" - LIMIT_HELP: "Maksimum antal tilladte filer pr. felt (flere påkrævede)" + LIMIT_HELP: "Maksimalt antal tilladte filer pr. felt." FILESIZE: "Maks. filstørrelse" FILESIZE_HELP: "Maksimal filstørrelse tilladt (i MB), 0 = Brug systemstandard" - AVOID_OVERWRITING: "Undgå at overskrive" - AVOID_OVERWRITING_HELP: "Forhindre at filer med samme navn overskrives. Dato præfiks vil blive tilføjet" + AVOID_OVERWRITING: "Undgå overskrivning" + AVOID_OVERWRITING_HELP: "Forhindrer at filer med samme navn overskrives. Dato præfiks vil blive tilføjet." RANDOM_NAME: "Tilfældigt navn" RANDOM_NAME_HELP: "Generer et tilfældigt 15 tegn langt strengnavn for de uploadede filer" - CLIENT_SIDE_VALIDATION: "Validering på klientsiden" - CLIENT_SIDE_VALIDATION_HELP: "Som standard bruger formularer HTML5-klient validering som første forsvarslinje" + CLIENT_SIDE_VALIDATION_HELP: "Formularer bruger som standard HTML5-klientvalidering som første forsvarslinje." INLINE_ERRORS: "Inline fejl" - INLINE_ERRORS_HELP: "Nyttig med 'validering på klientsiden' deaktiveret, viser inline kontekstuelle form fejl" - RESOLUTION_MIN: "{{attr}} var mindre end minimum på {{min}}px
" - RESOLUTION_MAX: "{{attr}} var højere end maksimum på {{max}}px
" - DESTINATION_NOT_SPECIFIED: "Destination ikke angivet" - INVALID_MIME_TYPE: "MIME typen %s for filen %s er ikke accepteret." - INVALID_FILE_EXTENSION: "Filendelsen for filen %s er ikke accepteret." + INLINE_ERRORS_HELP: "Nyttigt med deaktiveret klientvalidering, viser inline kontekstuelle fejl." + BASIC_CAPTCHA: "Grundlæggende Captcha" + BASIC_CAPTCHA_TYPE: "Captcha-udfordringstype" + BASIC_CAPTCHA_LENGTH: "Antal tegn" + BASIC_CAPTCHA_FONT: "TTF-skrifttype" + BASIC_CAPTCHA_SIZE: "Skriftstørrelse" + BASIC_CAPTCHA_BG_COLOR: "Baggrundsfarve" + BASIC_CAPTCHA_TEXT_COLOR: "Tekstfarve" + BASIC_CAPTCHA_START_X: "Tekst start x-position" + BASIC_CAPTCHA_START_Y: "Tekst start y-position" + BASIC_CAPTCHA_BOX_WIDTH: "Billedbredde" + BASIC_CAPTCHA_BOX_HEIGHT: "Billedhøjde" + BASIC_CAPTCHA_MATH_MIN: "Minimumstal" + BASIC_CAPTCHA_MATH_MAX: "Maksimumstal" + BASIC_CAPTCHA_MATH_OPERATORS: "Matematiske operatorer (tilfældigt)" + TURNSTILE_CAPTCHA: "Cloudflare Turnstile Captcha" + MODULAR_FORM_FIX: "Modulær formularrettelse" + MODULAR_FORM_FIX_HELP: "Retter problemet med, at modulære formularer ikke automatisk finder den korrekte formular." + XHR_FILE_UPLOAD: "XHR filupload" + XHR_FILE_UPLOAD_HELP: "Aktiver avanceret XHR-understøttelse til filuploads i formularer, der sendes via AJAX." + FILEPOND_REMOVE_FILE: "Verwijder bestand" + FILEPOND_REMOVE_FILE_CONFIRMATION: "Weet u zeker dat u dit bestand wilt verwijderen?" + FILEPOND_CANCEL_UPLOAD: "Annuleer upload" + FILEPOND_ERROR_FILESIZE: "Bestand is te groot" + FILEPOND_ERROR_FILETYPE: "Ongeldig bestandstype" + lt: PLUGIN_FORM: NOT_VALIDATED: "Forma nepatikrinta. Trūksta vieno ar daugiau privalomų laukų." + FIELD_REQUIRED: "Laukas yra privalomas." + VALIDATION_MATCH: "Laukas %s nesutampa su lauku %s." NONCE_NOT_VALIDATED: "Oi, įvyko klaida. Prašome patikrinti įvestus duomenis ir pateikti formą iš naujo." FILES: "Bylų įkėlimas" FORM_ALREADY_SUBMITTED: "Ši forma jau buvo pateikta." @@ -852,6 +1550,7 @@ lt: DESTINATION_HELP: "Vieta, kur bylos turėtų būti įkeltos" ACCEPT: "Leidžiami MIME tipai" ACCEPT_HELP: "MIME tipų sąrašas, kuriuos galima įkelti" + ERROR_CAPTCHA_NOT_COMPLETED: "Žmogaus patikrinimas nepavyko šiam formos, bandykite dar kartą." ERROR_VALIDATING_CAPTCHA: "reCAPTCHA apsauga aptiko problemų pateikiant formą" DATA_SUMMARY: "Čia yra santrauka to, ką mums parašėte:" NO_FORM_DATA: "Nėra formos duomenų" @@ -864,53 +1563,46 @@ lt: RECAPTCHA_THEME_LIGHT: "Šviesi tema" RECAPTCHA_THEME_DARK: "Tamsi tema" RECAPTCHA_SITE_KEY: "Puslapio raktas" - RECAPTCHA_SITE_KEY_HELP: "Daugiau informacijos - https://developers.google.com/recaptcha" + RECAPTCHA_SITE_KEY_HELP: "Daugiau informacijos – https://developers.google.com/recaptcha" RECAPTCHA_SECRET_KEY: "Slaptas raktas" - RECAPTCHA_SECRET_KEY_HELP: "Daugiau informacijos - https://developers.google.com/recaptcha" + RECAPTCHA_SECRET_KEY_HELP: "Daugiau informacijos – https://developers.google.com/recaptcha" GENERAL: "Bendra" USE_BUILT_IN_CSS: "Naudoti įdiegtą CSS" USE_INLINE_CSS: "Naudoti įterptą (inline) CSS" FILEUPLOAD_PREVENT_SELF: 'Negalima naudoti "%s" už puslapių ribų.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Nepavyko įkelti bylos %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Nepavyko perkelti bylos iš %s į "%s"' - FILEUPLOAD_ERR_OK: 'Klaidos nėra, byla įkelta sėkmingai' - FILEUPLOAD_ERR_INI_SIZE: 'Įkelta byla viršija maksimalų įkėlimo dydį' - FILEUPLOAD_ERR_FORM_SIZE: 'Įkelta byla viršija HTML nurodytą MAX_FILE_SIZE direktyvą' - FILEUPLOAD_ERR_PARTIAL: 'Įkeliama byla buvo įkelta tik dalinai' - FILEUPLOAD_ERR_NO_FILE: 'Nebuvo įkelta jokia byla' - FILEUPLOAD_ERR_NO_TMP_DIR: 'Nerastas laikinasis katalogas' - FILEUPLOAD_ERR_CANT_WRITE: 'Nepavyko įrašyti bylos į diską' - FILEUPLOAD_ERR_EXTENSION: 'PHP plėtinys sustabdė bylos įkėlimą' - FILEUPLOAD_ERR_UNKNOWN: 'Nežinoma bylos įkėlimo klaida' - DROPZONE_CANCEL_UPLOAD: 'Atšaukti įkėlimą' - DROPZONE_CANCEL_UPLOAD_CONFIRMATION: 'Ar tikrai norite atšaukti šį įkėlimą?' - DROPZONE_DEFAULT_MESSAGE: 'Tempkite bylas čia arba paspauskite šioje zonoje' - DROPZONE_FALLBACK_MESSAGE: 'Jūsų naršyklė nepalaiko bylų įtempimo (drag and drop).' - DROPZONE_FALLBACK_TEXT: 'Prašome bylų įkėlimui naudoti žemiau esantį atsarginį variantą, kaip senais laikais.' - DROPZONE_FILE_TOO_BIG: 'Byla per didelė ({{filesize}}MiB). Maks. dydis: {{maxFilesize}}MiB.' + FILEUPLOAD_ERR_OK: "Klaidos nėra, byla įkelta sėkmingai." + FILEUPLOAD_ERR_INI_SIZE: "Įkelta byla viršija maksimalų įkėlimo dydį." + FILEUPLOAD_ERR_FORM_SIZE: "Įkelta byla viršija HTML nurodytą MAX_FILE_SIZE direktyvą." + FILEUPLOAD_ERR_PARTIAL: "Byla buvo įkelta tik dalinai." + FILEUPLOAD_ERR_NO_FILE: "Nebuvo įkelta jokia byla." + FILEUPLOAD_ERR_NO_TMP_DIR: "Nerastas laikinasis katalogas." + FILEUPLOAD_ERR_CANT_WRITE: "Nepavyko įrašyti bylos į diską." + FILEUPLOAD_ERR_EXTENSION: "PHP plėtinys sustabdė bylos įkėlimą." + FILEUPLOAD_ERR_UNKNOWN: "Nežinoma bylos įkėlimo klaida." + DROPZONE_CANCEL_UPLOAD: "Atšaukti įkėlimą" + DROPZONE_CANCEL_UPLOAD_CONFIRMATION: "Ar tikrai norite atšaukti šį įkėlimą?" + DROPZONE_DEFAULT_MESSAGE: "Tempkite bylas čia arba paspauskite šioje zonoje" + DROPZONE_FALLBACK_MESSAGE: "Jūsų naršyklė nepalaiko bylų įtempimo (drag and drop)." + DROPZONE_FALLBACK_TEXT: "Prašome bylų įkėlimui naudoti žemiau esantį atsarginį variantą, kaip senais laikais." + DROPZONE_FILE_TOO_BIG: "Byla per didelė ({{filesize}}MiB). Maks. dydis: {{maxFilesize}}MiB." DROPZONE_INVALID_FILE_TYPE: "Negalite įkelti šio tipo bylų." DROPZONE_MAX_FILES_EXCEEDED: "Nebegalite įkelti daugiau bylų." DROPZONE_REMOVE_FILE: "Šalinti bylą" - DROPZONE_REMOVE_FILE_CONFIRMATION: 'Ar tikrai norite ištrinti šią bylą?' + DROPZONE_REMOVE_FILE_CONFIRMATION: "Ar tikrai norite ištrinti šią bylą?" DROPZONE_RESPONSE_ERROR: "Serveris atsakė su {{statusCode}} kodu." YES: "Taip" NO: "Ne" REFRESH_PREVENTION: "Atnaujinimo apsauga" - REFRESH_PREVENTION_HELP: "Naudoti formos unikalų ID, kad būtų sustabdytas formos pakartotinis apdorojimas atnaujinus puslapį" + REFRESH_PREVENTION_HELP: "Naudoti formos unikalų ID, kad būtų sustabdytas formos pakartotinis apdorojimas atnaujinus puslapį." LIMIT: "Riba" - LIMIT_HELP: "Maksimalus viename lauke leidžiamų bylų kiekis (privaloma leisti daugiau nei vieną)" + LIMIT_HELP: "Maksimalus viename lauke leidžiamų bylų kiekis." FILESIZE: "Maks. bylos dydis" FILESIZE_HELP: "Maksimalus leidžiamas bylos dydis (MB), 0 = naudoti sistemos pagal nutylėjimą" AVOID_OVERWRITING: "Išvengti perrašymo" - AVOID_OVERWRITING_HELP: "Neleisti perrašyti bylų tuo pačiu pavadinimu. Bus pridėtas datos priešdėlis" + AVOID_OVERWRITING_HELP: "Neleisti perrašyti bylų tuo pačiu pavadinimu. Bus pridėtas datos priešdėlis." RANDOM_NAME: "Atsitiktinis pavadinimas" RANDOM_NAME_HELP: "Generuoti atsitiktinį 15-os simbolių ilgio pavadinimą įkeliamoms byloms" CLIENT_SIDE_VALIDATION: "Tikrinimas kliento pusėje" - CLIENT_SIDE_VALIDATION_HELP: "Pagal nutylėjimą formos naudos HTML5 kliento tikrinimą kaip pirminį" - INLINE_ERRORS: "Įterptos klaidos" - INLINE_ERRORS_HELP: "Pravartu su išjungtu 'tikrinimu kliento pusėje' - parodo kontekstines formos klaidas" - RESOLUTION_MIN: "{{attr}} buvo mažiau nei minimalus {{min}}px
" - RESOLUTION_MAX: "{{attr}} buvo daugiau nei maksimalus {{max}}px
" - DESTINATION_NOT_SPECIFIED: "Nenurodytas tikslas" - INVALID_MIME_TYPE: "MIME tipas %s bylai %s nepriimtinas." - INVALID_FILE_EXTENSION: "Bylos išplėtimas bylai %s nepriimtinas." + CLIENT_SIDE_VALIDATION_HELP: "Pagal nutylėjimą formos naudoja HTML5 kliento pusės tikrinimą kaip pirmą gynybos liniją." diff --git a/plugins/form/package-lock.json b/plugins/form/package-lock.json new file mode 100644 index 0000000..989cd48 --- /dev/null +++ b/plugins/form/package-lock.json @@ -0,0 +1,8861 @@ +{ + "name": "grav-plugin-form", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "grav-plugin-form", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "dropzone": "getgrav/dropzone#master", + "exif-js": "^2.3.0", + "filepond": "^4.32.7", + "filepond-plugin-file-validate-size": "^2.2.8", + "filepond-plugin-file-validate-type": "^1.2.9", + "filepond-plugin-image-preview": "^4.6.12", + "filepond-plugin-image-resize": "^2.0.10", + "sortablejs": "^1.10.2" + }, + "devDependencies": { + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.0", + "babel-eslint": "^10.1.0", + "babel-loader": "^8.1.0", + "babel-polyfill": "^6.26.0", + "css-loader": "^7.1.2", + "eslint": "^6.8.0", + "eslint-loader": "^3.0.4", + "exports-loader": "^0.7.0", + "gulp": "^5.0.0", + "gulp-autoprefixer": "^9.0.0", + "gulp-clean-css": "^4.3.0", + "gulp-csscomb": "^0.1.0", + "gulp-rename": "^2.0.0", + "gulp-webpack": "^0.0.1", + "immutable": "^4.0.0-rc.12", + "imports-loader": "^0.8.0", + "json-loader": "^0.5.7", + "style-loader": "^1.1.3", + "terser-webpack-plugin": "^5.3.10", + "webpack": "^5.98.0", + "webpack-cli": "^6.0.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", + "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", + "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", + "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", + "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.1", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@gulpjs/messages": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz", + "integrity": "sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@gulpjs/to-absolute-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz", + "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "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/node": { + "version": "22.13.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.14.tgz", + "integrity": "sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/vinyl": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", + "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", + "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", + "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", + "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "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.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "peer": true, + "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/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/async-done": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz", + "integrity": "sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.4.4", + "once": "^1.4.0", + "stream-exhaust": "^1.0.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/async-settle": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-2.0.0.tgz", + "integrity": "sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-done": "^2.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/babel-loader/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/babel-loader/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/babel-loader/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/bach": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz", + "integrity": "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-done": "^2.0.0", + "async-settle": "^2.0.0", + "now-and-later": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "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": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bufferstreams": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-0.0.1.tgz", + "integrity": "sha512-h4DT+HucKOfXH2oung0sn55RZLX1jnGub7AJoxmQS4Fv0/Un2eg0VMiU7eAqlGJ758qPZ/VSRlUz2HlCG+DgVw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "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/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001707", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", + "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", + "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/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", + "integrity": "sha512-qebjpyeaA/nJ4w3EO2cV2++/zEkccPnjWogzA2rff+Lk8ILI75vULeTmyd4wPxWdKwtP3J+G39IXVZadh0UHyw==", + "dev": true, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-props": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-4.0.0.tgz", + "integrity": "sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "each-props": "^3.0.0", + "is-plain-object": "^5.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/copy-props/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/csscomb": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/csscomb/-/csscomb-2.0.5.tgz", + "integrity": "sha512-HhQtPpaS2pJziy2aQtTGoWUfaxu3r31/aLbOqyWGqD5zeyfBO2D70YYFu4IaRdxBeIG78FbLYYZHoPWuHLDW9A==", + "dev": true, + "dependencies": { + "commander": "2.0.0", + "gonzales-pe": "2.0.x", + "minimatch": "0.2.12", + "vow": "0.4.4", + "vow-fs": "0.3.2" + }, + "bin": { + "csscomb": "bin/csscomb" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/csscomb/node_modules/lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/csscomb/node_modules/minimatch": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.12.tgz", + "integrity": "sha512-jeVdfKmlomLerf8ecetSr6gLS0OXnLRluhnv9Rf2yj70NsD8uVGqrpwTqJGKpIF8VTRR9fQAl62CZ1eNIEMk3A==", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" + } + }, + "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/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha512-5sFRfAAmbHdIts+eKjR9kYJoF0ViCMVX9yqLu5A7S/v+nd077KgCITOMiirmyCBiZpKLDXbBOkYm6tu7rX/TKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + }, + "bin": { + "dateformat": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dropzone": { + "version": "5.7.1", + "resolved": "git+ssh://git@github.com/getgrav/dropzone.git#2d3cccc306c0952f126e26a1b9a4c9f5fe067318", + "license": "MIT" + }, + "node_modules/duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "dev": true, + "license": "BSD", + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/each-props": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-3.0.0.tgz", + "integrity": "sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/each-props/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/easy-transform-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-transform-stream/-/easy-transform-stream-1.0.1.tgz", + "integrity": "sha512-ktkaa6XR7COAR3oj02CF3IOgz2m1hCaY3SfzvKT4Svt2MhHw9XCt+ncJNWfe2TGz31iqzNGZ8spdKQflj+Rlog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.128", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz", + "integrity": "sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, + "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": "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/eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-loader": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.4.tgz", + "integrity": "sha512-I496aBd+Hi23Y0Cx+sKvw+VwlJre4ScIRlkrvTO6Scq68X/UXbN6F3lAhN8b0Zv8atAyprkyrA42K5QBJtCyaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fs-extra": "^8.1.0", + "loader-fs-cache": "^1.0.3", + "loader-utils": "^1.2.3", + "object-hash": "^2.0.3", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/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/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/esrecurse/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/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "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/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exif-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/exif-js/-/exif-js-2.3.0.tgz", + "integrity": "sha512-1Og9pAzG2FZRVlaavH8bB8BTeHcjMdJhKmeQITkX+uLRCD0xPtKAdZ2clZmQdJ56p9adXtJ8+jwrGp/4505lYg==", + "license": "MIT" + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exports-loader": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.7.0.tgz", + "integrity": "sha512-RKwCrO4A6IiKm0pG3c9V46JxIHcDplwwGJn6+JJ1RcVnh/WSGJa0xkmk5cRVtgOPzCAtTMGj2F7nluh9L0vpSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "source-map": "0.5.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/exports-loader/node_modules/source-map": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.0.tgz", + "integrity": "sha512-gjGnxNN0K+/Pr4Mi4fs/pOtda10dKB6Wn9QvjOrH6v5TWsI7ghHuJUHoIgyM6DkUL5kr2GtPFGererzKpMBWfA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "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-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fastest-levenshtein": "^1.0.7" + } + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/filepond": { + "version": "4.32.7", + "resolved": "https://registry.npmjs.org/filepond/-/filepond-4.32.7.tgz", + "integrity": "sha512-L2idUfC31Qb2ZuFn8yAjX+Km6Ouq0kQn6JHcwhqrl5Ee9cB7xctLa0nkbbAeCML2+a1/cUsd0TqBgVcxYW08GA==", + "license": "MIT", + "peer": true + }, + "node_modules/filepond-plugin-file-validate-size": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/filepond-plugin-file-validate-size/-/filepond-plugin-file-validate-size-2.2.8.tgz", + "integrity": "sha512-yzb8scATmkWqPTP7oKQz6L8WwJm6Xmgc/fuq6DFGRaLz0I7372BUvBsxagBk/hypMIjvieNzhggm33Y60x3rcw==", + "license": "MIT", + "peerDependencies": { + "filepond": ">=3.1.2 <5.x" + } + }, + "node_modules/filepond-plugin-file-validate-type": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/filepond-plugin-file-validate-type/-/filepond-plugin-file-validate-type-1.2.9.tgz", + "integrity": "sha512-Tzv07aNdZvjUXDRA3XL16QMEvh6llDrXlcZ6W0eTHQ+taHaVg/JKJTFs/AViO+6ZcpPCcQStbhYEL2HoS+vldw==", + "license": "MIT", + "peerDependencies": { + "filepond": ">=1.x <5.x" + } + }, + "node_modules/filepond-plugin-image-preview": { + "version": "4.6.12", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-preview/-/filepond-plugin-image-preview-4.6.12.tgz", + "integrity": "sha512-Y8ETX5QVV0mbPB0586UH8AUmG9tZg8PuN5bdEAIlZVJFTct5ebViJ7+Am94/VhTPjLqZjBf1zmDq5JU6XRsZKw==", + "license": "MIT", + "peerDependencies": { + "filepond": ">=4.x <5.x" + } + }, + "node_modules/filepond-plugin-image-resize": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-resize/-/filepond-plugin-image-resize-2.0.10.tgz", + "integrity": "sha512-irX+J275u8Ph1KcciCeSQmxeFjbu0+co5XVCkiwdSNnz6KiqrCKN7RXTvEbdgSdDzyi5omr2oP1rKWps5L1RsQ==", + "license": "MIT", + "peerDependencies": { + "filepond": ">=3.x <5.x" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flagged-respawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz", + "integrity": "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.8", + "streamx": "^2.12.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-stream": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.2.tgz", + "integrity": "sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@gulpjs/to-absolute-glob": "^4.0.0", + "anymatch": "^3.1.3", + "fastq": "^1.13.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "is-negated-glob": "^1.0.0", + "normalize-path": "^3.0.0", + "streamx": "^2.12.5" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-stream/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/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob-watcher": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz", + "integrity": "sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-done": "^2.0.0", + "chokidar": "^3.5.3" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/glogg": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-2.2.0.tgz", + "integrity": "sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==", + "dev": true, + "license": "MIT", + "dependencies": { + "sparkles": "^2.1.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/gonzales-pe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-2.0.2.tgz", + "integrity": "sha512-RpskFL5GRsQa+ZfB9cAyxiv5ZNg5/eY77g+8qfgjxdcqTe260Zmj1jGmVU7jJbJoBwMrH1wVl5o2z4a84dCVaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0" + } + }, + "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/gulp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.0.tgz", + "integrity": "sha512-S8Z8066SSileaYw1S2N1I64IUc/myI2bqe2ihOBzO6+nKpvNSg7ZcWJt/AwF8LC/NVN+/QZ560Cb/5OPsyhkhg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob-watcher": "^6.0.0", + "gulp-cli": "^3.0.0", + "undertaker": "^2.0.0", + "vinyl-fs": "^4.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp-autoprefixer": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-9.0.0.tgz", + "integrity": "sha512-lVQz5fqdjm4RMB1O3xLPtaZNMbFFoGKbV+SN3NJgT9X+PIyYld7dXARpoXIKEZAqE9WC2SoDQU0mxqZahWq07A==", + "dev": true, + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.16", + "gulp-plugin-extras": "^0.2.2", + "postcss": "^8.4.31", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "gulp": ">=4" + }, + "peerDependenciesMeta": { + "gulp": { + "optional": true + } + } + }, + "node_modules/gulp-clean-css": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.3.0.tgz", + "integrity": "sha512-mGyeT3qqFXTy61j0zOIciS4MkYziF2U594t2Vs9rUnpkEHqfu6aDITMp8xOvZcvdX61Uz3y1mVERRYmjzQF5fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-css": "4.2.3", + "plugin-error": "1.0.1", + "through2": "3.0.1", + "vinyl-sourcemaps-apply": "0.2.1" + } + }, + "node_modules/gulp-clean-css/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gulp-clean-css/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/gulp-clean-css/node_modules/through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "2 || 3" + } + }, + "node_modules/gulp-cli": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.0.0.tgz", + "integrity": "sha512-RtMIitkT8DEMZZygHK2vEuLPqLPAFB4sntSxg4NoDta7ciwGZ18l7JuhCTiS5deOJi2IoK0btE+hs6R4sfj7AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@gulpjs/messages": "^1.1.0", + "chalk": "^4.1.2", + "copy-props": "^4.0.0", + "gulplog": "^2.2.0", + "interpret": "^3.1.1", + "liftoff": "^5.0.0", + "mute-stdout": "^2.0.0", + "replace-homedir": "^2.0.0", + "semver-greatest-satisfied-range": "^2.0.0", + "string-width": "^4.2.3", + "v8flags": "^4.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp-cli/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/gulp-cli/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/gulp-cli/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/gulp-cli/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/gulp-cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp-cli/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/gulp-cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-cli/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/gulp-csscomb": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gulp-csscomb/-/gulp-csscomb-0.1.0.tgz", + "integrity": "sha512-vkqjMOZJ6kOi8VHZpk8JGdpe/UBoWITL7Jz8ittSoDJarni211qIEAiuind2TLtY8URE2eE4CMMeo+fbnsJiVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bufferstreams": "0.0.1", + "csscomb": "~2.0.3", + "gulp-util": "~2.2.12" + }, + "engines": { + "node": ">= 0.9.0" + } + }, + "node_modules/gulp-plugin-extras": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/gulp-plugin-extras/-/gulp-plugin-extras-0.2.2.tgz", + "integrity": "sha512-0gssXzTNrrOocYBWN4qOZqd03cz3bxhjxVUPZV9iJdBR0ZZbwMQO/OT8hZChYoc9GjKaA5meaqDr6CjkmKA7BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/vinyl": "^2.0.9", + "chalk": "^5.3.0", + "easy-transform-stream": "^1.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gulp-plugin-extras/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/gulp-rename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", + "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha512-9rtv4sj9EtCWYGD15HQQvWtRBtU9g1t0+w29tphetHxjxEAuBKQJkhGqvlLkHEtUjEgoqIpsVwPKU1yMZAa+wA==", + "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", + "dev": true, + "dependencies": { + "chalk": "^0.5.0", + "dateformat": "^1.0.7-1.2.3", + "lodash._reinterpolate": "^2.4.1", + "lodash.template": "^2.4.1", + "minimist": "^0.2.0", + "multipipe": "^0.1.0", + "through2": "^0.5.0", + "vinyl": "^0.2.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/gulp-util/node_modules/ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/minimist": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.4.tgz", + "integrity": "sha512-Pkrrm8NjyQ8yVt8Am9M+yUt74zE3iokhzbG1bFVNjLB92vwM71hf40RkEsryg98BujhVOncKm/C1xROxZ030LQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gulp-util/node_modules/strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^0.2.1" + }, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true, + "license": "MIT", + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-webpack": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/gulp-webpack/-/gulp-webpack-0.0.1.tgz", + "integrity": "sha512-FZHGlet2IwNvHo/fAV9WDaKhs039zbScigP7AwpL/hRZ65UJXdZ+nAtNFjls1+ICBDiAV3/LQB5KALnS7MV0/Q==", + "deprecated": "Has been renamed to https://www.npmjs.com/package/webpack-stream", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulplog": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz", + "integrity": "sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "glogg": "^2.2.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^0.2.0" + }, + "bin": { + "has-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "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/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/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/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imports-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz", + "integrity": "sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.0.2", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 4" + } + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/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/inquirer/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/inquirer/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/inquirer/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/inquirer/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/inquirer/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/inquirer/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/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/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, + "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/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "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/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/last-run": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-2.0.0.tgz", + "integrity": "sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/lead": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz", + "integrity": "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/liftoff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.0.tgz", + "integrity": "sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/liftoff/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-fs-cache": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", + "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^0.1.1", + "mkdirp": "^0.5.1" + } + }, + "node_modules/loader-fs-cache/node_modules/find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-fs-cache/node_modules/pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._escapehtmlchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha512-eHm2t2Lg476lq5v4FVmm3B5mCaRlDyTE8fnMfPCEq2o46G4au0qNXIKh7YWhjprm1zgSMLcMSs1XHMgkw02PbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._htmlescapes": "~2.4.1" + } + }, + "node_modules/lodash._escapestringchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha512-iZ6Os4iipaE43pr9SBks+UpZgAjJgRC+lGf7onEoByMr1+Nagr1fmR7zCM6Q4RGMB/V3a57raEN0XZl7Uub3/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha512-g79hNmMOBVyV+4oKIHM7MWy9Awtk3yqf0Twlawr6f+CmG44nTwBh9I5XiLUnk39KTfYoDBpS66glQGgQCnFIuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha512-BOlKGKNHhCHswGOWtmVb5zBygyxN7EmTuzVOSQI6QSoGhG+kvv71gICFS1TBpnqvT1n53txK8CDK3u5D2/GZxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha512-QGEOOjJi7W9LIgDAMVgtGBb8Qgo8ieDlSOCoZjtG45ZNRvDJZjwVMTYlfTIWdNRUiR1I9BjIqQ3Zaf1+DYM94g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._reunescapedhtml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha512-CfmZRU1Mk4E/5jh+Wu8lc7tuc3VkuwWZYVIgdPDH9NRSHgiL4Or3AA4JCIpgrkVzHOM+jKu2OMkAVquruhRHDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._htmlescapes": "~2.4.1", + "lodash.keys": "~2.4.1" + } + }, + "node_modules/lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha512-lBrglYxLD/6KAJ8IEa5Lg+YHgNAL7FyKqXg4XOUI+Du/vtniLs1ZqS+yHNKPkK54waAgkdUnDOYaWf+rv4B+AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._objecttypes": "~2.4.1" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha512-5wTIPWwGGr07JFysAZB8+7JB2NjJKXDIwogSaRX5zED85zyUAQwtOqUk8AsJkkigUcL3akbHYXd5+BPtTGQPZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._objecttypes": "~2.4.1", + "lodash.keys": "~2.4.1" + } + }, + "node_modules/lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha512-PiEStyvZ8gz37qBE+HqME1Yc/ewb/59AMOu8pG7Ztani86foPTxgzckQvMdphmXPY6V5f20Ex/CaNBqHG4/ycQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._escapehtmlchar": "~2.4.1", + "lodash._reunescapedhtml": "~2.4.1", + "lodash.keys": "~2.4.1" + } + }, + "node_modules/lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._objecttypes": "~2.4.1" + } + }, + "node_modules/lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha512-ZpJhwvUXHSNL5wYd1RM6CUa2ZuqorG9ngoJ9Ix5Cce+uX7I5O/E06FCJdhSZ33b5dVyeQDnIlWH7B2s5uByZ7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + }, + "node_modules/lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha512-5yLOQwlS69xbaez3g9dA1i0GMAj8pLDHp8lhA4V7M1vRam1lqD76f0jg5EV+65frbqrXo1WH9ZfKalfYBzJ5yQ==", + "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._escapestringchar": "~2.4.1", + "lodash._reinterpolate": "~2.4.1", + "lodash.defaults": "~2.4.1", + "lodash.escape": "~2.4.1", + "lodash.keys": "~2.4.1", + "lodash.templatesettings": "~2.4.1", + "lodash.values": "~2.4.1" + } + }, + "node_modules/lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha512-vY3QQ7GxbeLe8XfTvoYDbaMHO5iyTDJS1KIZrxp00PRMmyBKr8yEcObHSl2ppYTwd8MgqPXAarTvLA14hx8ffw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._reinterpolate": "~2.4.1", + "lodash.escape": "~2.4.1" + } + }, + "node_modules/lodash.values": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha512-fQwubKvj2Nox2gy6YnjFm8C1I6MIlzKUtBB+Pj7JGtloGqDDL5CPRr4DUUFWPwXWwAl2k3f4C3Aw8H1qAPB9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.keys": "~2.4.1" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer2": "0.0.2" + } + }, + "node_modules/mute-stdout": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-2.0.0.tgz", + "integrity": "sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "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/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-uuid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz", + "integrity": "sha512-Vns3Mj1WBYNwPchf2T/pt9q2GUpM97JvLekAkAwWYX1H2kIxYQ+jUb3GWmaNRboP5XoS3p3nxptIv00I+cOtLg==", + "deprecated": "Use uuid module instead", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/now-and-later": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz", + "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/optionator/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/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/plugin-error/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "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", + "peer": true, + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, + "license": "ISC" + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/replace-homedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-2.0.0.tgz", + "integrity": "sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz", + "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "value-or-function": "^4.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-2.0.0.tgz", + "integrity": "sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "sver": "^1.8.3" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sortablejs": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.2.tgz", + "integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparkles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz", + "integrity": "sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.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": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stream-composer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz", + "integrity": "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.13.2" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true, + "license": "MIT" + }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/style-loader": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/style-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sver": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/sver/-/sver-1.8.4.tgz", + "integrity": "sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "semver": "^6.3.0" + } + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/terser": { + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha512-zexCrAOTbjkBCXGyozn7hhS3aEaqdrc59mAD2E3dKYzV1vFuEGQ1hEDJN2oQMQFwy4he2zyLqPZV+AlfS8ZWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-through": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz", + "integrity": "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undertaker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-2.0.0.tgz", + "integrity": "sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bach": "^2.0.1", + "fast-levenshtein": "^3.0.0", + "last-run": "^2.0.0", + "undertaker-registry": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/undertaker-registry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-2.0.0.tgz", + "integrity": "sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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/uri-js/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/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/v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8flags": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", + "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-or-function": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz", + "integrity": "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha512-4gFk9xrecazOTuFKcUYrE1TjHSYL63dio72D+q0d1mHF51FEcxTT2RHFpHbN5TNJgmPYHuVsBdhvXEOCDcytSA==", + "dev": true, + "dependencies": { + "clone-stats": "~0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/vinyl-contents": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz", + "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^5.0.0", + "vinyl": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-contents/node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/vinyl-contents/node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz", + "integrity": "sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fs-mkdirp-stream": "^2.0.1", + "glob-stream": "^8.0.0", + "graceful-fs": "^4.2.11", + "iconv-lite": "^0.6.3", + "is-valid-glob": "^1.0.0", + "lead": "^4.0.0", + "normalize-path": "3.0.0", + "resolve-options": "^2.0.0", + "stream-composer": "^1.0.2", + "streamx": "^2.14.0", + "to-through": "^3.0.0", + "value-or-function": "^4.0.0", + "vinyl": "^3.0.0", + "vinyl-sourcemap": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-fs/node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/vinyl-fs/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vinyl-fs/node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz", + "integrity": "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-source-map": "^2.0.0", + "graceful-fs": "^4.2.10", + "now-and-later": "^3.0.0", + "streamx": "^2.12.5", + "vinyl": "^3.0.0", + "vinyl-contents": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-sourcemap/node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/vinyl-sourcemap/node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", + "dev": true, + "license": "ISC", + "dependencies": { + "source-map": "^0.5.1" + } + }, + "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vow": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.4.tgz", + "integrity": "sha512-r2f2JN12F0VSJLb+6HIyyGnbZt4kgxzMf1bgHaa5fQp6Cq2HyQNQ+UOcFH2H3rfzOOSTPM3ebnZ7COaYf4AYnw==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vow-fs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.2.tgz", + "integrity": "sha512-raT20j8SL2sCX3MlLCv6SWw3IeFU+3AuCDjGh5Q8Xs4EoT5GDjftg/a8r0PPr6gV7qyJET0OtPQ1hOvE7imEcw==", + "dev": true, + "dependencies": { + "glob": "3.2.8", + "node-uuid": "1.4.0", + "vow": "0.4.4", + "vow-queue": "0.3.1" + }, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/vow-fs/node_modules/glob": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.8.tgz", + "integrity": "sha512-Y3icmja4O+RjRYHMc97ggBZOljMWzBFGEOk96IXbNGRbQEZrz15HAcqe89t9WUcmcDdVVNAK5ar2lTpL+SutNA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "BSD", + "dependencies": { + "inherits": "2", + "minimatch": "~0.2.11" + }, + "engines": { + "node": "*" + } + }, + "node_modules/vow-fs/node_modules/lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/vow-fs/node_modules/minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/vow-queue": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.3.1.tgz", + "integrity": "sha512-rX8acYHR7w/aQohdBkb+ihVY1MZpBlsrDVgNT95+m8V0Mc1YVffn4TjxX3gAQ7nZoWw7LusnaYywSb2gmekpXQ==", + "dev": true, + "dependencies": { + "vow": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.98.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", + "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", + "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.6.1", + "@webpack-cli/configtest": "^3.0.1", + "@webpack-cli/info": "^3.0.1", + "@webpack-cli/serve": "^3.0.1", + "colorette": "^2.0.14", + "commander": "^12.1.0", + "cross-spawn": "^7.0.3", + "envinfo": "^7.14.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^6.0.1" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.82.0" + }, + "peerDependenciesMeta": { + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/webpack-cli/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/webpack-cli/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/webpack-cli/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/webpack-cli/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/webpack-cli/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/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "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/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + } + } +} diff --git a/plugins/form/package.json b/plugins/form/package.json index bb0f3f8..5768dcd 100644 --- a/plugins/form/package.json +++ b/plugins/form/package.json @@ -14,6 +14,11 @@ "dependencies": { "dropzone": "getgrav/dropzone#master", "exif-js": "^2.3.0", + "filepond": "^4.32.7", + "filepond-plugin-file-validate-size": "^2.2.8", + "filepond-plugin-file-validate-type": "^1.2.9", + "filepond-plugin-image-preview": "^4.6.12", + "filepond-plugin-image-resize": "^2.0.10", "sortablejs": "^1.10.2" }, "devDependencies": { @@ -22,22 +27,22 @@ "babel-eslint": "^10.1.0", "babel-loader": "^8.1.0", "babel-polyfill": "^6.26.0", - "css-loader": "^3.4.2", + "css-loader": "^7.1.2", "eslint": "^6.8.0", "eslint-loader": "^3.0.4", "exports-loader": "^0.7.0", - "gulp": "^4.0.2", - "gulp-autoprefixer": "^7.0.1", + "gulp": "^5.0.0", + "gulp-autoprefixer": "^9.0.0", "gulp-clean-css": "^4.3.0", - "gulp-csscomb": "^3.1.0", + "gulp-csscomb": "^0.1.0", "gulp-rename": "^2.0.0", - "gulp-webpack": "^1.5.0", + "gulp-webpack": "^0.0.1", "immutable": "^4.0.0-rc.12", "imports-loader": "^0.8.0", "json-loader": "^0.5.7", "style-loader": "^1.1.3", - "uglifyjs-webpack-plugin": "^2.2.0", - "webpack": "^4.42.1", - "webpack-cli": "^3.3.11" + "terser-webpack-plugin": "^5.3.10", + "webpack": "^5.98.0", + "webpack-cli": "^6.0.1" } } diff --git a/plugins/form/scss/form-styles.scss b/plugins/form/scss/form-styles.scss index 96fb5ff..a5d6098 100644 --- a/plugins/form/scss/form-styles.scss +++ b/plugins/form/scss/form-styles.scss @@ -58,6 +58,32 @@ $form-active-color: #000; z-index: 2; } + .dz-image img { + margin: 0; + } + + .dz-remove { + font-size: 16px; + position: absolute; + top: 3px; + right: 3px; + display: inline-flex; + height: 20px; + width: 20px; + background-color: red; + justify-content: center; + align-items: center; + color: white; + font-weight: bold; + border-radius: 50%; + cursor: pointer; + z-index: 20; + &:hover { + background-color: darkred; + text-decoration: none; + } + } + .dz-error-message { min-width: 140px; width: auto; @@ -72,7 +98,13 @@ $form-active-color: #000; } } - +//Filepond +.filepond--root.form-input { + min-height: 7rem; + height: auto; + overflow:hidden; + border: 0; +} // New JS powered tabs .form-tabs { diff --git a/plugins/form/templates/forms/default/data.html.twig b/plugins/form/templates/forms/default/data.html.twig index 9b6c16f..69ad498 100644 --- a/plugins/form/templates/forms/default/data.html.twig +++ b/plugins/form/templates/forms/default/data.html.twig @@ -1,75 +1,81 @@ {% macro render_field(form, fields, scope) %} - {% import _self as self %} + {% import _self as self %} - {% for index, field in fields %} - {%- set show_field = attribute(field, "input@") ?? field.store ?? true %} - {% if field.fields %} - {%- set new_scope = field.nest_id ? scope ~ field.name ~ '.' : scope -%} - {{- self.render_field(form, field.fields, new_scope) }} - {% else %} - {% if show_field %} - {%- set value = form.value(scope ~ (field.name ?? index)) -%} - {% if value %} - {% block field %} -
- {% block field_label %} - {{ field.label|t|e }}: - {% endblock %} + {% for index, field in fields %} + {%- set show_field = attribute(field, "input@") ?? field.store ?? true %} + {% if field.fields %} + {%- set new_scope = field.nest_id ? scope ~ field.name ~ '.' : scope -%} + {{- self.render_field(form, field.fields, new_scope) }} + {% else %} + {% if show_field %} + {%- set value = form.value(scope ~ (field.name ?? index)) -%} + {% if value %} + {% block field %} +
+ {% block field_label %} + + {%- if field.markdown -%} + {{ field.data_label ? field.data_label|t|e|markdown(false) : field.label|t|emarkdown(false) }} + {%- else -%} + {{ field.data_label ? field.data_label|t|e : field.label|t|e }} + {%- endif -%} + : + {% endblock %} - {% block field_value %} - {% if field.type == 'checkboxes' %} -
    - {% set use_keys = field.use is defined and field.use == 'keys' %} - {% for key,value in form.value(scope ~ field.name) %} - {% set index = (use_keys ? key : value) %} -
  • {{ field.options[index]|t|e }}
  • - {% endfor %} -
- {% elseif field.type == 'radio' %} - {% set value = form.value(scope ~ field.name) %} - {{ field.options[value]|t|e }} - {% elseif field.type == 'checkbox' %} - {{ (form.value(scope ~ field.name) == 1) ? "GRAV.YES"|t|e : "GRAV.NO"|t|e }} - {% elseif field.type == 'select' %} - {% set value = form.value(scope ~ field.name) %} - {% if value is iterable %} -
    - {% set use_keys = field.use is defined and field.use == 'keys' %} - {% for key, val in value %} - {% set index = (use_keys ? key : val) %} -
  • {{ field.options[index]|t|e }}
  • - {% endfor %} -
- {% else %} - {{ field.options[value]|t|e }} - {% endif %} - {% else %} - {% set value = form.value(scope ~ field.name) %} - {% if value is iterable %} -
    - {% for val in value %} - {% if val is iterable %} -
      - {% for v in val %} -
    • {{ string(v)|e }}
    • - {% endfor %} -
    - {% else %} -
  • {{ string(val)|e }}
  • - {% endif %} - {% endfor %} -
- {% else %} - {{ string(value)|e|nl2br }} - {% endif %} - {% endif %} - {% endblock %} -
- {% endblock %} + {% block field_value %} + {% if field.type == 'checkboxes' %} +
    + {% set use_keys = field.use is defined and field.use == 'keys' %} + {% for key,value in form.value(scope ~ field.name) %} + {% set index = (use_keys ? key : value) %} +
  • {{ field.options[index]|t|e }}
  • + {% endfor %} +
+ {% elseif field.type == 'radio' %} + {% set value = form.value(scope ~ field.name) %} + {{ field.options[value]|t|e }} + {% elseif field.type == 'checkbox' %} + {{ (form.value(scope ~ field.name) == 1) ? "GRAV.YES"|t|e : "GRAV.NO"|t|e }} + {% elseif field.type == 'select' %} + {% set value = form.value(scope ~ field.name) %} + {% if value is iterable %} +
    + {% set use_keys = field.use is defined and field.use == 'keys' %} + {% for key, val in value %} + {% set index = (use_keys ? key : val) %} +
  • {{ field.options[index]|t|e }}
  • + {% endfor %} +
+ {% else %} + {{ field.options[value]|t|e }} + {% endif %} + {% else %} + {% set value = form.value(scope ~ field.name) %} + {% if value is iterable %} +
    + {% for val in value %} + {% if val is iterable %} +
      + {% for v in val %} +
    • {{ string(v)|e }}
    • + {% endfor %} +
    + {% else %} +
  • {{ string(val)|e }}
  • + {% endif %} + {% endfor %} +
+ {% else %} + {{ string(value)|e|nl2br }} + {% endif %} {% endif %} - {% endif %} + {% endblock %} +
+ {% endblock %} {% endif %} - {% endfor %} + {% endif %} + {% endif %} + {% endfor %} {% endmacro %} {% import _self as macro %} diff --git a/plugins/form/templates/forms/default/data.txt.twig b/plugins/form/templates/forms/default/data.txt.twig index 27aa87b..5631d57 100644 --- a/plugins/form/templates/forms/default/data.txt.twig +++ b/plugins/form/templates/forms/default/data.txt.twig @@ -9,7 +9,7 @@ {%- if show_field %} {%- set value = form.value(scope ~ (field.name ?? index)) -%} {%- if value -%} - {{- field.label|t|e }}: {{ string(value is iterable ? value|json_encode : value) ~ "\n" }} + {{- field.data_label ? field.data_label|t|e : field.label|t|e }}: {{ string(value is iterable ? value|json_encode : value) ~ "\n" }} {%- endif -%} {%- endif %} {%- endif %} diff --git a/plugins/form/templates/forms/default/form.html.twig b/plugins/form/templates/forms/default/form.html.twig index 263972d..f05e9b9 100644 --- a/plugins/form/templates/forms/default/form.html.twig +++ b/plugins/form/templates/forms/default/form.html.twig @@ -3,6 +3,7 @@ {% set layout = layout ?? form.layout ?? 'default' %} {% set field_layout = field_layout ?? layout %} +
{# Keep here for Backwards Compatibility #} {% include 'partials/form-messages.html.twig' %} @@ -103,8 +104,9 @@ name="{{ form.name }}" action="{{ action }}" method="{{ method }}"{{ multipart|raw }} - {% if form.id %}id="{{ form.id }}"{% endif %} + id="{{ form.id|default(form.name|hyphenize) }}" {% if form.novalidate %}novalidate{% endif %} + {% if form.xhr_submit %}data-xhr-enabled="true"{% endif %} {% if form.keep_alive %}data-grav-keepalive="true"{% endif %} {% if form.attributes is defined %} {% for key,attribute in form.attributes %} @@ -201,9 +203,9 @@ {% endembed %} - {% if config.forms.dropzone.enabled %} {% endif %} +
\ No newline at end of file diff --git a/plugins/form/templates/forms/fields/basic-captcha/basic-captcha.html.twig b/plugins/form/templates/forms/fields/basic-captcha/basic-captcha.html.twig index 68d9c7a..1170f9e 100644 --- a/plugins/form/templates/forms/fields/basic-captcha/basic-captcha.html.twig +++ b/plugins/form/templates/forms/fields/basic-captcha/basic-captcha.html.twig @@ -3,20 +3,27 @@ {% extends "forms/field.html.twig" %} {% block prepend %} -
- human test - - + {% set field_id = field.name|default('default') %} + {% set config_hash = (form.id ~ '_basic_captcha_' ~ field_id)|md5 %} + {% set image_url = url('/forms-basic-captcha-image.jpg') ~ '?field=' ~ config_hash %} + + {# Store field configuration in session for image generation #} + {% set global_config = grav.config.get('plugins.form.basic_captcha', {}) %} + {% set merged_config = global_config|merge(field) %} + {% do store_basic_captcha_config(config_hash, merged_config) %} + +
+ human test +
+ + {% do assets.addJs('plugin://form/assets/captcha/basic-captcha-refresh.js') %} {% endblock %} {% block input_attributes %} diff --git a/plugins/form/templates/forms/fields/captcha/captcha.html.twig b/plugins/form/templates/forms/fields/captcha/captcha.html.twig index 75a4bee..ae5ef60 100644 --- a/plugins/form/templates/forms/fields/captcha/captcha.html.twig +++ b/plugins/form/templates/forms/fields/captcha/captcha.html.twig @@ -1,100 +1,18 @@ {% extends "forms/field.html.twig" %} -{% set config = grav.config %} -{% set site_key = field.recaptcha_site_key and field.recaptcha_site_key != 'ENTER_YOUR_CAPTCHA_SITE_KEY' ? field.recaptcha_site_key : config.plugins.form.recaptcha.site_key %} -{% set action = (page.route|trim('/') ~ '-' ~ form.name)|underscorize %} -{% set formName = form.name|underscorize %} -{% set theme = config.plugins.form.recaptcha.theme ?? 'light' %} +{% block field %} + {# This main captcha field serves as a router to the appropriate provider template #} + {% set provider = field.provider %} -{% block label %}{% endblock %} + {% if provider is not defined or provider == null %} + {% set provider = 'recaptcha' %} + {% endif %} -{% block input %} - {% if not site_key %} - - {% elseif config.plugins.form.recaptcha.version == 3 %} - {% do assets.addJs('https://www.google.com/recaptcha/api.js?render='~site_key~'&theme=' ~ theme) %} - {##} - - {% elseif config.plugins.form.recaptcha.version == '2-invisible' %} - - - - {% else %} - - -
- {% endif %} -{% endblock %} + {% if captcha_template_exists(template) %} + {% include template with {'field': field} %} + {% else %} +
ERROR - unknown captcha provider: {{ provider }}
+ {% endif %} +{% endblock %} \ No newline at end of file diff --git a/plugins/form/templates/forms/fields/file/file.html.twig b/plugins/form/templates/forms/fields/file/file.html.twig index a4b9d47..08c22a7 100644 --- a/plugins/form/templates/forms/fields/file/file.html.twig +++ b/plugins/form/templates/forms/fields/file/file.html.twig @@ -1,7 +1,7 @@ {% extends "forms/field.html.twig" %} {% macro bytesToSize(bytes) -%} - {% spaceless %} + {% apply spaceless %} {% set kilobyte = 1024 %} {% set megabyte = kilobyte * 1024 %} {% set gigabyte = megabyte * 1024 %} @@ -18,7 +18,7 @@ {% else %} {{ (bytes / terabyte)|number_format(2, '.') ~ ' TB' }} {% endif %} - {% endspaceless %} + {% endapply %} {%- endmacro %} {% macro preview(path, value, global) %} @@ -69,6 +69,7 @@
{% block file_extras %}{% endblock %} @@ -98,12 +99,16 @@
{% endif %} + {% if form.xhr_submit %} + {% do assets.addJs('plugin://form/assets/dropzone-reinit.js', { 'group': 'bottom', 'loading': 'defer', 'priority': 90 }) %} + {% endif %} + {% if grav.browser.browser == 'msie' and grav.browser.version < 12 %} {% do assets.addJs('plugin://form/assets/object.assign.polyfill.js') %} {% endif %} {% do assets.addJs('jquery', 101) %} - {% do assets.addJs('plugin://form/assets/form.vendor.js', { 'group': 'bottom', 'loading': 'defer' }) %} - {% do assets.addJs('plugin://form/assets/form.min.js', { 'group': 'bottom', 'loading': 'defer' }) %} + {% do assets.addJs('plugin://form/assets/form.vendor.js', { 'group': 'bottom', 'loading': 'defer', 'priority': 100 }) %} + {% do assets.addJs('plugin://form/assets/form.min.js', { 'group': 'bottom', 'loading': 'defer', 'priority': 99 }) %} {% do assets.addCss('plugin://form/assets/dropzone.min.css', { 'group': 'form'}) %} {{ assets.css('form')|raw }} {% do assets.addInlineJs(" @@ -128,4 +133,4 @@ } }); ", {'group': 'bottom', 'position': 'before'}) %} -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/plugins/form/templates/forms/fields/filepond/filepond.html.twig b/plugins/form/templates/forms/fields/filepond/filepond.html.twig new file mode 100644 index 0000000..b1a67b9 --- /dev/null +++ b/plugins/form/templates/forms/fields/filepond/filepond.html.twig @@ -0,0 +1,128 @@ +{% extends "forms/field.html.twig" %} + +{% set defaults = config.plugins.form %} +{% set files = defaults.files|merge(field|default([])) %} +{% set limit = not field.multiple ? 1 : files.limit %} + +{% block input %} + {% set page_can_upload = exists or (type == 'page' and not exists and not (field.destination starts with '@self' or field.destination starts with 'self@')) %} + {% set max_filesize = (field.filesize > form_max_filesize or field.filesize == 0) ? form_max_filesize : field.filesize %} + + {% block prepend %}{% endblock %} + {% set settings = {name: field.name, paramName: (scope ~ field.name)|fieldName ~ (files.multiple ? '[]' : ''), limit: limit, filesize: max_filesize, accept: files.accept, resolution: files.resolution, resizeWidth: field.filepond.resize_width, resizeHeight: field.filepond.resize_height, resizeQuality: field.filepond.resize_quality } %} + {% set filepond_settings = field.filepond|default({}) %} + {% set file_url_add = form.getFileUploadAjaxRoute().getUri() %} + {% set file_url_remove = form.getFileDeleteAjaxRoute(null, null).getUri() %} +
+ {% block file_extras %}{% endblock %} + + + {% for path, file in value %} + + {% endfor %} + {% include 'forms/fields/hidden/hidden.html.twig' with {field: {name: '_json.' ~ field.name}, value: (value ?? [])|json_encode } %} + +
+ {% if inline_errors and errors %} +
+

{{ errors|first|raw }}

+
+ {% endif %} + + {% if grav.browser.browser == 'msie' and grav.browser.version < 12 %} + {% do assets.addJs('plugin://form/assets/object.assign.polyfill.js') %} + {% endif %} + + {% do assets.addJs('jquery', 101) %} + + {# FilePond core and plugins #} + {% do assets.addJs('plugin://form/assets/filepond/filepond.min.js', { 'group': 'bottom', 'loading': 'defer', 'priority': 98 }) %} + {% do assets.addJs('plugin://form/assets/filepond/filepond-plugin-file-validate-size.min.js', { 'group': 'bottom', 'loading': 'defer', 'priority': 97 }) %} + {% do assets.addJs('plugin://form/assets/filepond/filepond-plugin-file-validate-type.min.js', { 'group': 'bottom', 'loading': 'defer', 'priority': 97 }) %} + {% do assets.addJs('plugin://form/assets/filepond/filepond-plugin-image-preview.min.js', { 'group': 'bottom', 'loading': 'defer', 'priority': 97 }) %} + {% do assets.addJs('plugin://form/assets/filepond/filepond-plugin-image-resize.min.js', { 'group': 'bottom', 'loading': 'defer', 'priority': 97 }) %} + {% do assets.addJs('plugin://form/assets/filepond/filepond-plugin-image-transform.min.js', { 'group': 'bottom', 'loading': 'defer', 'priority': 97 }) %} + + {# FilePond CSS #} + {% do assets.addCss('plugin://form/assets/filepond/filepond.min.css') %} + {% do assets.addCss('plugin://form/assets/filepond/filepond-plugin-image-preview.min.css') %} + + {# Custom handlers - note: load this AFTER the libraries #} + {% do assets.addJs('plugin://form/assets/filepond-handler.js', { 'group': 'bottom', 'loading': 'defer', 'priority': 96 }) %} + +{# {% if form.xhr_submit %}#} +{# {% do assets.addJs('plugin://form/assets/filepond-reinit.js', { 'group': 'bottom', 'loading': 'defer', 'priority': 90 }) %}#} +{# {% endif %}#} + + {% do assets.addInlineJs(" + window.GravForm = window.GravForm || {}; + window.GravForm = Object.assign({}, window.GravForm, { + translations: { + PLUGIN_FORM: { + 'FILEPOND_REMOVE_FILE': " ~ 'PLUGIN_FORM.FILEPOND_REMOVE_FILE'|t|json_encode ~ ", + 'FILEPOND_REMOVE_FILE_CONFIRMATION': " ~ 'PLUGIN_FORM.FILEPOND_REMOVE_FILE_CONFIRMATION'|t|json_encode ~ ", + 'FILEPOND_CANCEL_UPLOAD': " ~ 'PLUGIN_FORM.FILEPOND_CANCEL_UPLOAD'|t|json_encode ~ ", + 'FILEPOND_ERROR_FILESIZE': " ~ 'PLUGIN_FORM.FILEPOND_ERROR_FILESIZE'|t|json_encode ~ ", + 'FILEPOND_ERROR_FILETYPE': " ~ 'PLUGIN_FORM.FILEPOND_ERROR_FILETYPE'|t|json_encode ~ " + } + } + }); + ", {'group': 'bottom', 'position': 'before'}) %} + + {% do assets.addInlineJs(" + document.addEventListener('DOMContentLoaded', function() { + if (typeof GravFormXHR !== 'undefined') { + // First check if DOM property exists + if (GravFormXHR.DOM && typeof GravFormXHR.DOM.updateFormContent === 'function') { + var originalUpdateFormContent = GravFormXHR.DOM.updateFormContent; + GravFormXHR.DOM.updateFormContent = function() { + var result = originalUpdateFormContent.apply(this, arguments); + + // Dispatch event after form content is updated + setTimeout(function() { + document.dispatchEvent(new Event('grav-form-updated')); + if (window.reinitializeFilePonds) { + window.reinitializeFilePonds(); + } + }, 50); + + return result; + }; + } + // If DOM property doesn't exist, try to hook into submit directly + else if (typeof GravFormXHR.submit === 'function') { + var originalSubmit = GravFormXHR.submit; + GravFormXHR.submit = function(form) { + var result = originalSubmit.apply(this, arguments); + + // Reinitialize FilePond after form submission + setTimeout(function() { + document.dispatchEvent(new Event('grav-form-updated')); + if (window.reinitializeFilePonds) { + window.reinitializeFilePonds(); + } + }, 500); + + return result; + }; + } + } + }); + ", {'group': 'bottom'}) %} +{% endblock %} \ No newline at end of file diff --git a/plugins/form/templates/forms/fields/recaptcha/recaptcha.html.twig b/plugins/form/templates/forms/fields/recaptcha/recaptcha.html.twig new file mode 100644 index 0000000..acdb251 --- /dev/null +++ b/plugins/form/templates/forms/fields/recaptcha/recaptcha.html.twig @@ -0,0 +1,393 @@ +{% extends "forms/field.html.twig" %} + +{% block label %}{% endblock %} + +{% block input %} + {% set config = grav.config %} + {% set formId = form.id ?: form.name %} + {% set callbackId = formId|underscorize %} + {% set lang = grav.language.language %} + + {# Get configuration values with fallbacks #} + {% set version = field.recaptcha_version ?? config.plugins.form.recaptcha.version ?? '2-checkbox' %} + {% set site_key = field.recaptcha_site_key ?? config.plugins.form.recaptcha.site_key %} + {% set theme = field.recaptcha_theme ?? config.plugins.form.recaptcha.theme ?? 'light' %} + + {% if not site_key %} +
reCAPTCHA site key is not set. Please set it in the form field or plugin configuration.
+ {% else %} + {% if version == 3 or version == '3' %} + {# --- reCAPTCHA v3 Handling --- #} + {% set action = (page.route|trim('/') ~ '-' ~ form.name)|underscorize|md5 %} + +
+ {# Container for v3 - will be managed by JS #} + + +
+ + {% do assets.addJs('https://www.google.com/recaptcha/api.js?render=' ~ site_key, { group: 'bottom' }) %} + + + + {% elseif version == '2-invisible' %} + {# --- reCAPTCHA v2 Invisible Handling --- #} +
+ {# Container for v2 invisible - will be managed by JS #} +
+
+ + + + {% else %} + {# --- reCAPTCHA v2 Checkbox Handling --- #} + {# Add script and container #} + {% set container_id = 'g-recaptcha-' ~ formId %} + {% set onloadCallback = 'captchaCheckboxOnloadCallback_' ~ callbackId %} + +
+
+
+ + {% do assets.addJs('https://www.google.com/recaptcha/api.js?onload=' ~ onloadCallback ~ '&render=explicit', { 'group': 'bottom', 'loading': 'defer' }) %} + + + {% endif %} + {% endif %} +{% endblock %} diff --git a/plugins/form/templates/forms/fields/spacer/spacer.html.twig b/plugins/form/templates/forms/fields/spacer/spacer.html.twig index cdeafd7..fbc91ad 100644 --- a/plugins/form/templates/forms/fields/spacer/spacer.html.twig +++ b/plugins/form/templates/forms/fields/spacer/spacer.html.twig @@ -1,9 +1,9 @@ {% extends "forms/field.html.twig" %} {% block field %} -
+
{% if field.title %} -

{{- field.title|t|raw -}}

+ <{{ title_type|default('h3') }}>{{- field.title|t|raw -}} {% endif %} {% if field.markdown %} diff --git a/plugins/form/templates/forms/fields/tabs/tabs.html.twig b/plugins/form/templates/forms/fields/tabs/tabs.html.twig index 4195d22..e001b03 100644 --- a/plugins/form/templates/forms/fields/tabs/tabs.html.twig +++ b/plugins/form/templates/forms/fields/tabs/tabs.html.twig @@ -38,7 +38,7 @@
{% for tab in tabs %} {% if tab.type == 'tab' and (tab.condition is null or tab.condition == true) %} - + {{ tab.title|t }} {% endif %} @@ -47,7 +47,7 @@
{% embed 'forms/default/fields.html.twig' with {name: field.name, fields: fields} %} {% block inner_markup_field_open %} -
+
{% endblock %} {% block inner_markup_field_close %}
diff --git a/plugins/form/templates/forms/fields/turnstile/turnstile.html.twig b/plugins/form/templates/forms/fields/turnstile/turnstile.html.twig index 84ccc37..5068a61 100644 --- a/plugins/form/templates/forms/fields/turnstile/turnstile.html.twig +++ b/plugins/form/templates/forms/fields/turnstile/turnstile.html.twig @@ -1,15 +1,107 @@ {% extends "forms/field.html.twig" %} -{% set config = grav.config %} -{% set site_key = field.turnstile_site_key ?? config.plugins.form.turnstile.site_key %} -{% set theme = field.theme ?? config.plugins.form.turnstile.theme ?? 'light' %} - {% block label %}{% endblock %} {% block input %} - {% do assets.addJs('https://challenges.cloudflare.com/turnstile/v0/api.js', { defer: '', async: '' }) %} + {% set config = grav.config %} + {% set formId = form.id ?: form.name %} -
-
-
-{% endblock %} + {# Get configuration values with fallbacks #} + {% set site_key = field.turnstile_site_key ?? config.plugins.form.turnstile.site_key %} + {% set theme = field.turnstile_theme ?? config.plugins.form.turnstile.theme ?? 'light' %} + {% set container_id = 'cf-turnstile-' ~ formId %} + {% set init_var = 'turnstile_initialized_' ~ formId %} + + {% if not site_key %} +
Turnstile site key is not set. Please set it in the form field or plugin configuration.
+ {% else %} + {# Add a hidden field for the token directly in the INPUT block to ensure it's part of the field #} + + +
+
+
+ + {% do assets.addJs('https://challenges.cloudflare.com/turnstile/v0/api.js?onload=onloadTurnstileCallback_' ~ formId ~ '&render=explicit', { 'loading': 'async', 'defer': '' }) %} + + + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/plugins/form/templates/forms/form.html.twig b/plugins/form/templates/forms/form.html.twig index 53ec58c..5a598ff 100644 --- a/plugins/form/templates/forms/form.html.twig +++ b/plugins/form/templates/forms/form.html.twig @@ -26,9 +26,9 @@ You can also override individual fields by copying (using text field as an examp templates/forms/fields/text/text.html.twig -> templates/forms/fields/text/tailwind-text.html.twig #} - {% extends "forms/default/form.html.twig" %} {% block xhr %} {% include 'forms/layouts/xhr.html.twig' %} {% endblock %} + diff --git a/plugins/form/templates/forms/layouts/form/default-form.html.twig b/plugins/form/templates/forms/layouts/form/default-form.html.twig index a97fda6..8f73c33 100644 --- a/plugins/form/templates/forms/layouts/form/default-form.html.twig +++ b/plugins/form/templates/forms/layouts/form/default-form.html.twig @@ -6,3 +6,4 @@ {% block embed_fields %}{% endblock %} {% block embed_buttons %}{% endblock %} + diff --git a/plugins/form/templates/forms/layouts/xhr.html.twig b/plugins/form/templates/forms/layouts/xhr.html.twig index f39e62e..8046b7c 100644 --- a/plugins/form/templates/forms/layouts/xhr.html.twig +++ b/plugins/form/templates/forms/layouts/xhr.html.twig @@ -1,8 +1,25 @@ {% if form.xhr_submit == true %} - {% do assets.addJs('plugin://form/assets/xhr-submitter.js', {'group': 'bottom', 'position': 'before'}) %} + {# Ensure xhr-submitter.js is loaded BEFORE the inline JS that uses it #} + {% do assets.addJs('plugin://form/assets/xhr-submitter.js', {'group': 'bottom', 'priority': 101, 'position': 'before'}) %} {% do assets.addInlineJs(" document.addEventListener('DOMContentLoaded', () => { + // This now primarily sets up the *potential* for XHR submission + // It might not attach the listener directly if recaptcha is present attachFormSubmitListener('" ~ form.id ~ "'); + + // Re-run captcha initializers *if* the form was loaded via XHR initially + // This covers edge cases, might not be strictly needed if captcha script handles DOMContentLoaded + const formElement = document.getElementById('" ~ form.id ~ "'); + if (formElement && window.GravRecaptchaInitializers) { + const initializerFuncName = 'initRecaptcha_" ~ form.id ~ "'; + if (typeof window.GravRecaptchaInitializers[initializerFuncName] === 'function') { + // Check if it needs init (e.g., if container exists but no widget/listener) + // For simplicity, just call it again; the init function should be idempotent + // window.GravRecaptchaInitializers[initializerFuncName](); + } + } });", - {'group': 'bottom', 'position': 'before'}) %} + {'group': 'bottom', 'priority': 100, 'position': 'before'}) %} + {% do assets.addJs('plugin://form/assets/captcha/recaptcha-handler.js', {'group': 'bottom', 'priority': 99, 'position': 'before'}) %} + {% do assets.addJs('plugin://form/assets/captcha/turnstile-handler.js', {'group': 'bottom', 'priority': 98, 'position': 'before'}) %} {% endif %} \ No newline at end of file diff --git a/plugins/form/test-captcha.php b/plugins/form/test-captcha.php new file mode 100644 index 0000000..51feafb --- /dev/null +++ b/plugins/form/test-captcha.php @@ -0,0 +1,133 @@ +config = new MockConfig(); + $this->session = new MockSession(); + } + + public function offsetGet($offset) { + return $this->$offset; + } +} + +class MockConfig { + private $data = [ + 'plugins.form.basic_captcha' => [ + 'type' => 'math', + 'image' => [ + 'width' => 135, + 'height' => 40, + 'bg' => '#ffffff' + ], + 'chars' => [ + 'font' => 'zxx-xed.ttf', + 'size' => 16 + ], + 'math' => [ + 'min' => 1, + 'max' => 12, + 'operators' => ['+', '-', '*'] + ] + ] + ]; + + public function get($key) { + return $this->data[$key] ?? null; + } +} + +class MockSession { + private $data = []; + + public function __set($key, $value) { + $this->data[$key] = $value; + } + + public function __get($key) { + return $this->data[$key] ?? null; + } +} + +// Override Grav instance +namespace Grav\Common; +class Grav { + private static $instance; + + public static function instance() { + if (!self::$instance) { + self::$instance = new \MockGrav(); + } + return self::$instance; + } +} + +// Test the captcha +$captcha = new BasicCaptcha(); + +// Test different types +$types = ['math', 'characters']; + +foreach ($types as $type) { + echo "Testing $type captcha...\n"; + + // Update config for type + Grav::instance()->config = new MockConfig(); + $configData = [ + 'plugins.form.basic_captcha' => [ + 'type' => $type, + 'image' => [ + 'width' => 135, + 'height' => 40, + 'bg' => '#ffffff' + ], + 'chars' => [ + 'font' => 'zxx-xed.ttf', + 'size' => 16, + 'length' => 6 + ], + 'math' => [ + 'min' => 1, + 'max' => 12, + 'operators' => ['+', '-', '*'] + ] + ] + ]; + + // Generate captcha code + $code = $captcha->getCaptchaCode(); + echo " Code: $code\n"; + + // Create image + $image = $captcha->createCaptchaImage($code); + + // Check image dimensions + $width = imagesx($image); + $height = imagesy($image); + echo " Image dimensions: {$width}x{$height}\n"; + + // Save test image + $filename = "test-captcha-{$type}.jpg"; + imagejpeg($image, $filename); + echo " Saved to: $filename\n"; + + // Clean up + imagedestroy($image); + + echo "\n"; +} + +echo "Test complete! Check the generated test-captcha-*.jpg files.\n"; \ No newline at end of file diff --git a/plugins/form/vendor/google/recaptcha/src/ReCaptcha/ReCaptcha.php b/plugins/form/vendor/google/recaptcha/src/ReCaptcha/ReCaptcha.php index 31ec44a..8646719 100644 --- a/plugins/form/vendor/google/recaptcha/src/ReCaptcha/ReCaptcha.php +++ b/plugins/form/vendor/google/recaptcha/src/ReCaptcha/ReCaptcha.php @@ -130,7 +130,7 @@ class ReCaptcha * @param RequestMethod $requestMethod method used to send the request. Defaults to POST. * @throws \RuntimeException if $secret is invalid */ - public function __construct($secret, RequestMethod $requestMethod = null) + public function __construct($secret, ?RequestMethod $requestMethod = null) { if (empty($secret)) { throw new \RuntimeException('No secret provided'); diff --git a/plugins/form/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/CurlPost.php b/plugins/form/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/CurlPost.php index 1bd7cce..db3ba4a 100644 --- a/plugins/form/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/CurlPost.php +++ b/plugins/form/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/CurlPost.php @@ -63,7 +63,7 @@ class CurlPost implements RequestMethod * @param Curl $curl Curl resource * @param string $siteVerifyUrl URL for reCAPTCHA siteverify API */ - public function __construct(Curl $curl = null, $siteVerifyUrl = null) + public function __construct(?Curl $curl = null, $siteVerifyUrl = null) { $this->curl = (is_null($curl)) ? new Curl() : $curl; $this->siteVerifyUrl = (is_null($siteVerifyUrl)) ? ReCaptcha::SITE_VERIFY_URL : $siteVerifyUrl; diff --git a/plugins/form/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/SocketPost.php b/plugins/form/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/SocketPost.php index 464bc28..ae98f78 100644 --- a/plugins/form/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/SocketPost.php +++ b/plugins/form/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/SocketPost.php @@ -57,7 +57,7 @@ class SocketPost implements RequestMethod * @param \ReCaptcha\RequestMethod\Socket $socket optional socket, injectable for testing * @param string $siteVerifyUrl URL for reCAPTCHA siteverify API */ - public function __construct(Socket $socket = null, $siteVerifyUrl = null) + public function __construct(?Socket $socket = null, $siteVerifyUrl = null) { $this->socket = (is_null($socket)) ? new Socket() : $socket; $this->siteVerifyUrl = (is_null($siteVerifyUrl)) ? ReCaptcha::SITE_VERIFY_URL : $siteVerifyUrl; diff --git a/plugins/form/webpack.conf.js b/plugins/form/webpack.conf.js index 351aa50..aebcbc7 100644 --- a/plugins/form/webpack.conf.js +++ b/plugins/form/webpack.conf.js @@ -1,31 +1,41 @@ var webpack = require('webpack'); var path = require('path'); -var UglifyJsPlugin = require('uglifyjs-webpack-plugin'); +var TerserPlugin = require('terser-webpack-plugin'); var isProd = process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'production-wip'; +var mode = isProd ? 'production' : 'development'; module.exports = { entry: { site: './app/main.js' }, - devtool: isProd ? false : 'eval-source-map', + mode: mode, + devtool: isProd ? false : 'source-map', target: 'web', output: { path: path.resolve(__dirname, 'assets'), - filename: 'form.min.js', - chunkFilename: 'form.vendor.js' + filename: (pathData) => { + return pathData.chunk && pathData.chunk.name === 'site' + ? 'form.min.js' + : `form.${pathData.chunk && pathData.chunk.name ? pathData.chunk.name : 'chunk'}.js`; + }, + chunkFilename: 'form.[name].js' }, optimization: { minimize: isProd, - minimizer: [ - new UglifyJsPlugin({ - uglifyOptions: { + minimizer: isProd ? [ + new TerserPlugin({ + parallel: true, + extractComments: false, + terserOptions: { compress: { drop_console: true }, - dead_code: true + format: { + comments: false + } } }) - ], + ] : [], splitChunks: { cacheGroups: { vendors: { @@ -51,12 +61,18 @@ module.exports = { rules: [ { enforce: 'pre', test: /\.json$/, loader: 'json-loader' }, { enforce: 'pre', test: /\.js$/, loader: 'eslint-loader', exclude: /node_modules/ }, - { test: /\.css$/, loader: 'style-loader!css-loader' }, + { + test: /\.css$/, + use: [ + 'style-loader', + 'css-loader' + ] + }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/, - query: { + options: { presets: ['@babel/preset-env'] } } diff --git a/plugins/form/yarn.lock b/plugins/form/yarn.lock index 5c98598..01a2035 100644 --- a/plugins/form/yarn.lock +++ b/plugins/form/yarn.lock @@ -4,28 +4,29 @@ "@ampproject/remapping@^2.2.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2", "@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: - "@babel/highlight" "^7.24.2" + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" picocolors "^1.0.0" "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz" integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== -"@babel/core@^7.9.0": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.9.0": version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz" integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== dependencies: "@ampproject/remapping" "^2.2.0" @@ -46,7 +47,7 @@ "@babel/generator@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz" integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== dependencies: "@babel/types" "^7.24.0" @@ -56,21 +57,21 @@ "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz" integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: "@babel/types" "^7.22.15" "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz" integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: "@babel/compat-data" "^7.23.5" @@ -81,7 +82,7 @@ "@babel/helper-create-class-features-plugin@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz#db58bf57137b623b916e24874ab7188d93d7f68f" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz" integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -96,7 +97,7 @@ "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz" integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -105,7 +106,7 @@ "@babel/helper-define-polyfill-provider@^0.6.1": version "0.6.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz" integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== dependencies: "@babel/helper-compilation-targets" "^7.22.6" @@ -116,12 +117,12 @@ "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== "@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: "@babel/template" "^7.22.15" @@ -129,28 +130,28 @@ "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" "@babel/helper-member-expression-to-functions@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz" integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: "@babel/types" "^7.23.0" "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1": version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz" integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== dependencies: "@babel/types" "^7.24.0" "@babel/helper-module-transforms@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz" integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" @@ -161,19 +162,19 @@ "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== dependencies: "@babel/types" "^7.22.5" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz" integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz" integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -182,7 +183,7 @@ "@babel/helper-replace-supers@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz" integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" @@ -191,43 +192,43 @@ "@babel/helper-simple-access@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: "@babel/types" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== dependencies: "@babel/types" "^7.22.5" "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.23.4": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== "@babel/helper-validator-option@^7.23.5": version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== "@babel/helper-wrap-function@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz" integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" @@ -235,39 +236,30 @@ "@babel/types" "^7.22.19" "@babel/helpers@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" - integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz" + integrity sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg== dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/template" "^7.27.0" + "@babel/types" "^7.27.0" -"@babel/highlight@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" - integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== +"@babel/parser@^7.24.1", "@babel/parser@^7.27.0", "@babel/parser@^7.7.0": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz" + integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg== dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.7.0": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" - integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== + "@babel/types" "^7.27.0" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz" integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz" integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -276,7 +268,7 @@ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz" integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" @@ -284,131 +276,131 @@ "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-import-assertions@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz" integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-import-attributes@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz" integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -416,14 +408,14 @@ "@babel/plugin-transform-arrow-functions@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz" integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-async-generator-functions@^7.24.3": version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz" integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== dependencies: "@babel/helper-environment-visitor" "^7.22.20" @@ -433,7 +425,7 @@ "@babel/plugin-transform-async-to-generator@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz" integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== dependencies: "@babel/helper-module-imports" "^7.24.1" @@ -442,21 +434,21 @@ "@babel/plugin-transform-block-scoped-functions@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz" integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-block-scoping@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz#27af183d7f6dad890531256c7a45019df768ac1f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz" integrity sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-class-properties@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz" integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== dependencies: "@babel/helper-create-class-features-plugin" "^7.24.1" @@ -464,7 +456,7 @@ "@babel/plugin-transform-class-static-block@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz#4e37efcca1d9f2fcb908d1bae8b56b4b6e9e1cb6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz" integrity sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA== dependencies: "@babel/helper-create-class-features-plugin" "^7.24.1" @@ -473,7 +465,7 @@ "@babel/plugin-transform-classes@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz" integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -487,7 +479,7 @@ "@babel/plugin-transform-computed-properties@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz" integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -495,14 +487,14 @@ "@babel/plugin-transform-destructuring@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz" integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-dotall-regex@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz" integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" @@ -510,14 +502,14 @@ "@babel/plugin-transform-duplicate-keys@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz" integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-dynamic-import@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz" integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -525,7 +517,7 @@ "@babel/plugin-transform-exponentiation-operator@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz" integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" @@ -533,7 +525,7 @@ "@babel/plugin-transform-export-namespace-from@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz" integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -541,7 +533,7 @@ "@babel/plugin-transform-for-of@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz" integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -549,7 +541,7 @@ "@babel/plugin-transform-function-name@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz" integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== dependencies: "@babel/helper-compilation-targets" "^7.23.6" @@ -558,7 +550,7 @@ "@babel/plugin-transform-json-strings@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz" integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -566,14 +558,14 @@ "@babel/plugin-transform-literals@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz" integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-logical-assignment-operators@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz" integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -581,14 +573,14 @@ "@babel/plugin-transform-member-expression-literals@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz" integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-modules-amd@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz" integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== dependencies: "@babel/helper-module-transforms" "^7.23.3" @@ -596,7 +588,7 @@ "@babel/plugin-transform-modules-commonjs@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz" integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== dependencies: "@babel/helper-module-transforms" "^7.23.3" @@ -605,7 +597,7 @@ "@babel/plugin-transform-modules-systemjs@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz" integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== dependencies: "@babel/helper-hoist-variables" "^7.22.5" @@ -615,7 +607,7 @@ "@babel/plugin-transform-modules-umd@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz" integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== dependencies: "@babel/helper-module-transforms" "^7.23.3" @@ -623,7 +615,7 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -631,14 +623,14 @@ "@babel/plugin-transform-new-target@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz" integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz" integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -646,7 +638,7 @@ "@babel/plugin-transform-numeric-separator@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz" integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -654,7 +646,7 @@ "@babel/plugin-transform-object-rest-spread@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz" integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== dependencies: "@babel/helper-compilation-targets" "^7.23.6" @@ -664,7 +656,7 @@ "@babel/plugin-transform-object-super@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz" integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -672,7 +664,7 @@ "@babel/plugin-transform-optional-catch-binding@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz" integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -680,7 +672,7 @@ "@babel/plugin-transform-optional-chaining@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz" integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -689,14 +681,14 @@ "@babel/plugin-transform-parameters@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz" integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-private-methods@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz" integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== dependencies: "@babel/helper-create-class-features-plugin" "^7.24.1" @@ -704,7 +696,7 @@ "@babel/plugin-transform-private-property-in-object@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz" integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -714,14 +706,14 @@ "@babel/plugin-transform-property-literals@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz" integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-regenerator@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz" integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -729,21 +721,21 @@ "@babel/plugin-transform-reserved-words@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz" integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-shorthand-properties@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz" integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-spread@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz" integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -751,35 +743,35 @@ "@babel/plugin-transform-sticky-regex@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz" integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-template-literals@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz" integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-typeof-symbol@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz" integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-unicode-escapes@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz" integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-unicode-property-regex@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz" integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" @@ -787,7 +779,7 @@ "@babel/plugin-transform-unicode-regex@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz" integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" @@ -795,7 +787,7 @@ "@babel/plugin-transform-unicode-sets-regex@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz" integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" @@ -803,7 +795,7 @@ "@babel/preset-env@^7.9.0": version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.3.tgz#f3f138c844ffeeac372597b29c51b5259e8323a3" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz" integrity sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA== dependencies: "@babel/compat-data" "^7.24.1" @@ -889,7 +881,7 @@ "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -898,28 +890,28 @@ "@babel/regjsgen@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.8.4": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" - integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz" + integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.24.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== +"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.27.0": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz" + integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA== dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.27.0" + "@babel/types" "^7.27.0" "@babel/traverse@^7.24.1", "@babel/traverse@^7.7.0": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz" integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== dependencies: "@babel/code-frame" "^7.24.1" @@ -933,18 +925,34 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" - integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== +"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.27.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz" + integrity sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg== dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@discoveryjs/json-ext@^0.6.1": + version "0.6.3" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz" + integrity sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== + +"@gulpjs/messages@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz" + integrity sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg== + +"@gulpjs/to-absolute-glob@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz" + integrity sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA== + dependencies: + is-negated-glob "^1.0.0" "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -953,220 +961,269 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@types/json-schema@^7.0.5": +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "9.6.1" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.6": + version "1.0.7" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + +"@types/expect@^1.20.4": + version "1.20.4" + resolved "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz" + integrity sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg== + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.9": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== +"@types/node@*": + version "22.13.14" + resolved "https://registry.npmjs.org/@types/node/-/node-22.13.14.tgz" + integrity sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w== dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" + undici-types "~6.20.0" -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== +"@types/vinyl@^2.0.9": + version "2.0.12" + resolved "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz" + integrity sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw== dependencies: - "@webassemblyjs/wast-printer" "1.9.0" + "@types/expect" "^1.20.4" + "@types/node" "*" -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== +"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== dependencies: - "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== + +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== + +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" + "@xtuc/long" "4.2.2" -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== + +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" + +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== +"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" + "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" +"@webpack-cli/configtest@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz" + integrity sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA== + +"@webpack-cli/info@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz" + integrity sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ== + +"@webpack-cli/serve@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz" + integrity sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg== "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== acorn-jsx@^5.2.0: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw== - -acorn@^6.4.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.1: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^7.1.1: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== +acorn@^8.14.0: + version "8.14.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +acorn@^8.8.2: + version "8.14.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.9.1: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1174,335 +1231,177 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg== +ajv@^8.0.0: + version "8.17.1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== +ajv@^8.8.2, ajv@^8.9.0: + version "8.17.1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" ansi-colors@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz" integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== dependencies: ansi-wrap "^0.1.0" -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A== - dependencies: - ansi-wrap "0.1.0" - ansi-escapes@^4.2.1: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw== - dependencies: - ansi-wrap "0.1.0" +ansi-regex@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + integrity sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA== -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow== - dependencies: - ansi-wrap "0.1.0" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== +ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + integrity sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA== ansi-regex@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" + integrity sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-wrap@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + resolved "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" integrity sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw== -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@~3.1.2: +anymatch@^3.1.3, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" -append-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" - integrity sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA== - dependencies: - buffer-equal "^1.0.0" - -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - integrity sha512-OQwDZUqYaQwyyhDJHThmzId8daf4/RFNLaeh3AevmSeZ5Y7ug4Ga/yKc6l6kTZOBW781rCj103ZuTh8GAsB3+Q== - dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA== - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== -arr-filter@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee" - integrity sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA== - dependencies: - make-iterator "^1.0.0" - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-map@^2.0.0, arr-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4" - integrity sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw== - dependencies: - make-iterator "^1.0.0" - -arr-union@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - integrity sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA== - arr-union@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - integrity sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ== - -array-each@^1.0.0, array-each@^1.0.1: +array-each@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + resolved "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz" integrity sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA== -array-initial@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" - integrity sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw== - dependencies: - array-slice "^1.0.0" - is-number "^4.0.0" - -array-last@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" - integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== - dependencies: - is-number "^4.0.0" - -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q== +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" + integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== array-slice@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + resolved "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz" integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== -array-sort@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" - integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== - dependencies: - default-compare "^1.0.0" - get-value "^2.0.6" - kind-of "^5.0.2" - -array-uniq@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -asn1.js@^4.10.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -assert@^1.1.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76" - integrity sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A== - dependencies: - object.assign "^4.1.4" - util "^0.10.4" - assign-symbols@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== astral-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-done@^1.2.0, async-done@^1.2.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2" - integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw== +async-done@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz" + integrity sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw== dependencies: - end-of-stream "^1.1.0" - once "^1.3.2" - process-nextick-args "^2.0.0" - stream-exhaust "^1.0.1" + end-of-stream "^1.4.4" + once "^1.4.0" + stream-exhaust "^1.0.2" -async-each@^1.0.0, async-each@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" - integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== - -async-settle@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" - integrity sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw== +async-settle@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/async-settle/-/async-settle-2.0.0.tgz" + integrity sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg== dependencies: - async-done "^1.2.2" + async-done "^2.0.0" -async@^0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - integrity sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw== - -async@^1.3.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== - -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - integrity sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -autoprefixer@^9.6.1: - version "9.8.8" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" - integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== +autoprefixer@^10.4.16: + version "10.4.21" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz" + integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" + browserslist "^4.24.4" + caniuse-lite "^1.0.30001702" + fraction.js "^4.3.7" normalize-range "^0.1.2" - num2fraction "^1.2.2" - picocolors "^0.2.1" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" + picocolors "^1.1.1" + postcss-value-parser "^4.2.0" + +b4a@^1.6.4: + version "1.6.7" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== babel-eslint@^10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + resolved "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz" integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== dependencies: "@babel/code-frame" "^7.0.0" @@ -1514,7 +1413,7 @@ babel-eslint@^10.1.0: babel-loader@^8.1.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz" integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== dependencies: find-cache-dir "^3.3.1" @@ -1524,7 +1423,7 @@ babel-loader@^8.1.0: babel-plugin-polyfill-corejs2@^0.4.10: version "0.4.10" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz" integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== dependencies: "@babel/compat-data" "^7.22.6" @@ -1533,7 +1432,7 @@ babel-plugin-polyfill-corejs2@^0.4.10: babel-plugin-polyfill-corejs3@^0.10.4: version "0.10.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz" integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== dependencies: "@babel/helper-define-polyfill-provider" "^0.6.1" @@ -1541,14 +1440,14 @@ babel-plugin-polyfill-corejs3@^0.10.4: babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz" integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== dependencies: "@babel/helper-define-polyfill-provider" "^0.6.1" babel-polyfill@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + resolved "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz" integrity sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ== dependencies: babel-runtime "^6.26.0" @@ -1557,351 +1456,135 @@ babel-polyfill@^6.26.0: babel-runtime@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" -bach@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880" - integrity sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg== +bach@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz" + integrity sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg== dependencies: - arr-filter "^1.1.1" - arr-flatten "^1.0.1" - arr-map "^2.0.0" - array-each "^1.0.0" - array-initial "^1.0.0" - array-last "^1.1.1" - async-done "^1.2.2" - async-settle "^1.0.0" - now-and-later "^2.0.0" + async-done "^2.0.0" + async-settle "^2.0.0" + now-and-later "^3.0.0" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2: +bare-events@^2.2.0: + version "2.5.4" + resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz" + integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== + +base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - integrity sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA== - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== - big.js@^5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== +bl@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz" + integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== dependencies: - file-uri-to-path "1.0.0" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + buffer "^6.0.3" + inherits "^2.0.4" + readable-stream "^3.4.0" brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" + fill-range "^7.1.1" -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== +browserslist@^4.22.2, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.4, "browserslist@>= 4.21.0": + version "4.24.4" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browserify-aes@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-0.4.0.tgz#067149b668df31c4b58533e02d01e806d8608e2c" - integrity sha512-hnvbMhZ/Ete34qnoKKyjikiYQfZbl89d5UZ29cz3EG13cv/8VRyM8Zs84luB/O7BRzC3qSng9dVovJ6jghcAvg== - dependencies: - inherits "^2.0.1" - -browserify-aes@^1.0.4, browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" - integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== - dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.5" - hash-base "~3.0" - inherits "^2.0.4" - parse-asn1 "^5.1.7" - readable-stream "^2.3.8" - safe-buffer "^5.2.1" - -browserify-zlib@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" - integrity sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ== - dependencies: - pako "~0.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^4.12.0, browserslist@^4.22.2, browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== - dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -buffer-equal@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90" - integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^4.3.0, buffer@^4.9.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" + base64-js "^1.3.1" + ieee754 "^1.2.1" -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== - -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.5, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" +bufferstreams@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/bufferstreams/-/bufferstreams-0.0.1.tgz" + integrity sha512-h4DT+HucKOfXH2oung0sn55RZLX1jnGub7AJoxmQS4Fv0/Un2eg0VMiU7eAqlGJ758qPZ/VSRlUz2HlCG+DgVw== callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g== - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001587: - version "1.0.30001600" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079" - integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ== - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ== +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz" + integrity sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ== dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" + camelcase "^2.0.0" + map-obj "^1.0.0" -chalk@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" + integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw== + +caniuse-lite@^1.0.30001688, caniuse-lite@^1.0.30001702: + version "1.0.30001707" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz" + integrity sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw== + +chalk@^0.5.0: + version "0.5.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz" + integrity sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg== dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" -chalk@^2.1.0, chalk@^2.4.2: +chalk@^2.1.0: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -1910,55 +1593,33 @@ chalk@^2.1.0, chalk@^2.4.2: chalk@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.3.0: + version "5.4.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== + chardet@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^1.0.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg== - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -chokidar@^2.0.0, chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^3.4.1: +chokidar@^3.5.3: version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -1971,296 +1632,150 @@ chokidar@^3.4.1: optionalDependencies: fsevents "~2.3.2" -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - clean-css@4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz" integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== dependencies: source-map "~0.6.0" cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-width@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA== +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -clone-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - integrity sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g== - -clone-stats@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - integrity sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA== + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" clone-stats@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + resolved "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz" integrity sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag== -clone@^1.0.0, clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== +clone-stats@~0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + integrity sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA== -clone@^2.1.1: +clone@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== -cloneable-readable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" - integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== - dependencies: - inherits "^2.0.1" - process-nextick-args "^2.0.0" - readable-stream "^2.3.5" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - -collection-map@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" - integrity sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA== - dependencies: - arr-map "^2.0.2" - for-own "^1.0.0" - make-iterator "^1.0.0" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-support@^1.1.3: +color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -commander@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.0.0.tgz#d1b86f901f8b64bd941bdeadaf924530393be928" - integrity sha512-qebjpyeaA/nJ4w3EO2cV2++/zEkccPnjWogzA2rff+Lk8ILI75vULeTmyd4wPxWdKwtP3J+G39IXVZadh0UHyw== +colorette@^2.0.14: + version "2.0.20" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== commander@^2.20.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz" + integrity sha512-qebjpyeaA/nJ4w3EO2cV2++/zEkccPnjWogzA2rff+Lk8ILI75vULeTmyd4wPxWdKwtP3J+G39IXVZadh0UHyw== + commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -component-emitter@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" - integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== - concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.5.0, concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== - -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== +copy-props@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/copy-props/-/copy-props-4.0.0.tgz" + integrity sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw== dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - -copy-props@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.5.tgz#03cf9ae328d4ebb36f8f1d804448a6af9ee3f2d2" - integrity sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw== - dependencies: - each-props "^1.3.2" + each-props "^3.0.0" is-plain-object "^5.0.0" core-js-compat@^3.31.0, core-js-compat@^3.36.1: version "3.36.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz" integrity sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA== dependencies: browserslist "^4.23.0" core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - cross-spawn@^6.0.5: version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" @@ -2269,378 +1784,178 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -crypto-browserify@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.3.0.tgz#b9fc75bb4a0ed61dcf1cd5dae96eb30c9c3e506c" - integrity sha512-9n5nGl6D8zb29Ui8Ji8pVdUIE3RUe6A9zQf2iLPjFKftnkkkJBCGb7TkYAFNjt9nfsvZTLL52CwxzS9Tw7Bujw== +cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: - browserify-aes "0.4.0" - pbkdf2-compat "2.0.1" - ripemd160 "0.2.0" - sha.js "2.2.6" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== +css-loader@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz" + integrity sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA== dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" + icss-utils "^5.1.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.5.4" -css-loader@^3.4.2: - version "3.6.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" - integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== +csscomb@~2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/csscomb/-/csscomb-2.0.5.tgz" + integrity sha512-HhQtPpaS2pJziy2aQtTGoWUfaxu3r31/aLbOqyWGqD5zeyfBO2D70YYFu4IaRdxBeIG78FbLYYZHoPWuHLDW9A== dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.0" - semver "^6.3.0" - -csscomb-core@3.0.0-3.1: - version "3.0.0-3.1" - resolved "https://registry.yarnpkg.com/csscomb-core/-/csscomb-core-3.0.0-3.1.tgz#b411c8d7cfe0df3f2fe1df84d1bd64a6f0046c68" - integrity sha512-lH06bqpHy9wqVZHW0SpT76VyUV+dRe/8YArY8vHIgZTDakrSqXNlfK29G+sIDXRcCfXQ/+HE32z7rUA+Ib5JJQ== - dependencies: - gonzales-pe "3.0.0-28" + commander "2.0.0" + gonzales-pe "2.0.x" minimatch "0.2.12" vow "0.4.4" vow-fs "0.3.2" -csscomb@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/csscomb/-/csscomb-3.1.8.tgz#a8a738884f409baf35ec9461afc52e1c75bd23a2" - integrity sha512-B3PpQGLVYExNDPV6RruMTPv27q+LTfH1mTzaLr+zNQHScdCFmdPCVef1sHwU5x5lLzxttoeAIOzHodd8/ppJmg== - dependencies: - commander "2.0.0" - csscomb-core "3.0.0-3.1" - gonzales-pe "3.0.0-28" - vow "0.4.4" - cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cyclist@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3" - integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA== - -d@1, d@^1.0.1, d@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" - integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz" + integrity sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng== dependencies: - es5-ext "^0.10.64" - type "^2.7.2" + array-find-index "^1.0.1" -dateformat@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" - integrity sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw== - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== +dateformat@^1.0.7-1.2.3: + version "1.0.12" + resolved "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz" + integrity sha512-5sFRfAAmbHdIts+eKjR9kYJoF0ViCMVX9yqLu5A7S/v+nd077KgCITOMiirmyCBiZpKLDXbBOkYm6tu7rX/TKg== dependencies: - ms "2.0.0" + get-stdin "^4.0.1" + meow "^3.3.0" debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.2.0: +decamelize@^1.1.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -default-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" - integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== - dependencies: - kind-of "^5.0.2" - -default-resolution@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" - integrity sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -des.js@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" - integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - detect-file@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - dropzone@getgrav/dropzone#master: version "5.7.1" - resolved "https://codeload.github.com/getgrav/dropzone/tar.gz/2d3cccc306c0952f126e26a1b9a4c9f5fe067318" + resolved "git+ssh://git@github.com/getgrav/dropzone.git#2d3cccc306c0952f126e26a1b9a4c9f5fe067318" duplexer2@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz" integrity sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g== dependencies: readable-stream "~1.1.9" -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== +each-props@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/each-props/-/each-props-3.0.0.tgz" + integrity sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw== dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -each-props@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" - integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== - dependencies: - is-plain-object "^2.0.1" + is-plain-object "^5.0.0" object.defaults "^1.1.0" -electron-to-chromium@^1.4.668: - version "1.4.719" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.719.tgz#22a94ce7a5150511ba88e900836039e159efe22c" - integrity sha512-FbWy2Q2YgdFzkFUW/W5jBjE9dj+804+98E4Pup78JBPnbdb3pv6IneY2JCPKdeKLh3AOKHQeYf+KwLr7mxGh6Q== +easy-transform-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/easy-transform-stream/-/easy-transform-stream-1.0.1.tgz" + integrity sha512-ktkaa6XR7COAR3oj02CF3IOgz2m1hCaY3SfzvKT4Svt2MhHw9XCt+ncJNWfe2TGz31iqzNGZ8spdKQflj+Rlog== -elliptic@^6.5.3, elliptic@^6.5.5: - version "6.5.5" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" - integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" +electron-to-chromium@^1.5.73: + version "1.5.128" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz" + integrity sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ== emoji-regex@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== - emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.4.4: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== +enhanced-resolve@^5.17.1: + version "5.18.1" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" + graceful-fs "^4.2.4" + tapable "^2.2.0" -enhanced-resolve@~0.9.0: - version "0.9.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" - integrity sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.2.0" - tapable "^0.1.8" - -errno@^0.1.3, errno@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" +envinfo@^7.14.0: + version "7.14.0" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== error-ex@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-module-lexer@^1.2.1: + version "1.6.0" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz" + integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14: - version "0.10.64" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" - integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - esniff "^2.0.1" - next-tick "^1.1.0" - -es6-iterator@^2.0.1, es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" - integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== - dependencies: - d "^1.0.2" - ext "^1.7.0" - -es6-weak-map@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== eslint-loader@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-3.0.4.tgz#4329482877e381c91460a055bcd08d3855b9922d" + resolved "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.4.tgz" integrity sha512-I496aBd+Hi23Y0Cx+sKvw+VwlJre4ScIRlkrvTO6Scq68X/UXbN6F3lAhN8b0Zv8atAyprkyrA42K5QBJtCyaw== dependencies: fs-extra "^8.1.0" @@ -2649,17 +1964,9 @@ eslint-loader@^3.0.4: object-hash "^2.0.3" schema-utils "^2.6.5" -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^5.0.0: +eslint-scope@^5.0.0, eslint-scope@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -2667,19 +1974,19 @@ eslint-scope@^5.0.0: eslint-utils@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz" integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: eslint-visitor-keys "^1.1.0" eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@^6.8.0: +"eslint@^5.0.0 || ^6.0.0", eslint@^6.8.0, "eslint@>= 4.12.1": version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + resolved "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz" integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== dependencies: "@babel/code-frame" "^7.0.0" @@ -2720,19 +2027,9 @@ eslint@^6.8.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -esniff@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" - integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== - dependencies: - d "^1.0.1" - es5-ext "^0.10.62" - event-emitter "^0.3.5" - type "^2.7.2" - espree@^6.1.2: version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + resolved "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz" integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== dependencies: acorn "^7.1.1" @@ -2741,283 +2038,192 @@ espree@^6.1.2: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0, esrecurse@^4.3.0: +esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== - dependencies: - d "1" - es5-ext "~0.10.14" - -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== - -events@^3.0.0: +events@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - exif-js@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/exif-js/-/exif-js-2.3.0.tgz#9d10819bf571f873813e7640241255ab9ce1a814" + resolved "https://registry.npmjs.org/exif-js/-/exif-js-2.3.0.tgz" integrity sha512-1Og9pAzG2FZRVlaavH8bB8BTeHcjMdJhKmeQITkX+uLRCD0xPtKAdZ2clZmQdJ56p9adXtJ8+jwrGp/4505lYg== -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA== - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA== - dependencies: - fill-range "^2.1.0" - expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== dependencies: homedir-polyfill "^1.0.1" exports-loader@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.7.0.tgz#84881c784dea6036b8e1cd1dac3da9b6409e21a5" + resolved "https://registry.npmjs.org/exports-loader/-/exports-loader-0.7.0.tgz" integrity sha512-RKwCrO4A6IiKm0pG3c9V46JxIHcDplwwGJn6+JJ1RcVnh/WSGJa0xkmk5cRVtgOPzCAtTMGj2F7nluh9L0vpSA== dependencies: loader-utils "^1.1.0" source-map "0.5.0" -ext@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" - integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== - dependencies: - type "^2.7.2" - -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - integrity sha512-L7AGmkO6jhDkEBBGWlLtftA80Xq8DipnrRPr0pyi7GQLXkaq9JYA4xF4z6qnadIC6euiTDKco0cGSU9muw+WTw== - dependencies: - kind-of "^1.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: +extend-shallow@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0: +extend@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^3.0.3: version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg== - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fancy-log@^1.1.0, fancy-log@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - parse-node-version "^1.0.0" - time-stamp "^1.0.0" - -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz#e6a754cc8f15e58987aa9cbd27af66fd6f4e5af9" - integrity sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw== +fast-levenshtein@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz" + integrity sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ== + dependencies: + fastest-levenshtein "^1.0.7" fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + +fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.7: + version "1.0.16" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.13.0: + version "1.19.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + dependencies: + reusify "^1.0.4" figures@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz" integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== dependencies: flat-cache "^2.0.1" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filepond-plugin-file-validate-size@^2.2.8: + version "2.2.8" + resolved "https://registry.npmjs.org/filepond-plugin-file-validate-size/-/filepond-plugin-file-validate-size-2.2.8.tgz" + integrity sha512-yzb8scATmkWqPTP7oKQz6L8WwJm6Xmgc/fuq6DFGRaLz0I7372BUvBsxagBk/hypMIjvieNzhggm33Y60x3rcw== -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ== +filepond-plugin-file-validate-type@^1.2.9: + version "1.2.9" + resolved "https://registry.npmjs.org/filepond-plugin-file-validate-type/-/filepond-plugin-file-validate-type-1.2.9.tgz" + integrity sha512-Tzv07aNdZvjUXDRA3XL16QMEvh6llDrXlcZ6W0eTHQ+taHaVg/JKJTFs/AViO+6ZcpPCcQStbhYEL2HoS+vldw== -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" +filepond-plugin-image-preview@^4.6.12: + version "4.6.12" + resolved "https://registry.npmjs.org/filepond-plugin-image-preview/-/filepond-plugin-image-preview-4.6.12.tgz" + integrity sha512-Y8ETX5QVV0mbPB0586UH8AUmG9tZg8PuN5bdEAIlZVJFTct5ebViJ7+Am94/VhTPjLqZjBf1zmDq5JU6XRsZKw== -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" +filepond-plugin-image-resize@^2.0.10: + version "2.0.10" + resolved "https://registry.npmjs.org/filepond-plugin-image-resize/-/filepond-plugin-image-resize-2.0.10.tgz" + integrity sha512-irX+J275u8Ph1KcciCeSQmxeFjbu0+co5XVCkiwdSNnz6KiqrCKN7RXTvEbdgSdDzyi5omr2oP1rKWps5L1RsQ== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +filepond@^4.32.7, "filepond@>=1.x <5.x", "filepond@>=3.1.2 <5.x", "filepond@>=3.x <5.x", "filepond@>=4.x <5.x": + version "4.32.7" + resolved "https://registry.npmjs.org/filepond/-/filepond-4.32.7.tgz" + integrity sha512-L2idUfC31Qb2ZuFn8yAjX+Km6Ouq0kQn6JHcwhqrl5Ee9cB7xctLa0nkbbAeCML2+a1/cUsd0TqBgVcxYW08GA== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-cache-dir@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz" integrity sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A== dependencies: commondir "^1.0.1" mkdirp "^0.5.1" pkg-dir "^1.0.0" -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - find-cache-dir@^3.3.1: version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" @@ -3026,275 +2232,178 @@ find-cache-dir@^3.3.1: find-up@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - find-up@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" path-exists "^4.0.0" -findup-sync@^2.0.0: +findup-sync@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz" + integrity sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.3" + micromatch "^4.0.4" + resolve-dir "^1.0.1" + +fined@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - integrity sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g== - dependencies: - detect-file "^1.0.0" - is-glob "^3.1.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -fined@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" - integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + resolved "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz" + integrity sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A== dependencies: expand-tilde "^2.0.2" - is-plain-object "^2.0.3" + is-plain-object "^5.0.0" object.defaults "^1.1.0" - object.pick "^1.2.0" - parse-filepath "^1.0.1" + object.pick "^1.3.0" + parse-filepath "^1.0.2" -flagged-respawn@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" - integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== +flagged-respawn@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz" + integrity sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA== flat-cache@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== dependencies: flatted "^2.0.0" rimraf "2.6.3" write "1.0.3" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + resolved "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== - dependencies: - for-in "^1.0.1" - for-own@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + resolved "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz" integrity sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg== dependencies: for-in "^1.0.1" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" jsonfile "^4.0.0" universalify "^0.1.0" -fs-mkdirp-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" - integrity sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ== +fs-mkdirp-stream@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz" + integrity sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw== dependencies: - graceful-fs "^4.1.11" - through2 "^2.0.3" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" + graceful-fs "^4.2.8" + streamx "^2.12.0" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^1.0.0, fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.1: +get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA== - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w== - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + integrity sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw== glob-parent@^5.0.0, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob-stream@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" - integrity sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw== +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - extend "^3.0.0" - glob "^7.1.1" - glob-parent "^3.1.0" - is-negated-glob "^1.0.0" - ordered-read-streams "^1.0.0" - pumpify "^1.3.5" - readable-stream "^2.1.5" - remove-trailing-separator "^1.0.1" - to-absolute-glob "^2.0.0" - unique-stream "^2.0.2" + is-glob "^4.0.3" -glob-watcher@^5.0.3: - version "5.0.5" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.5.tgz#aa6bce648332924d9a8489be41e3e5c52d4186dc" - integrity sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw== +glob-stream@^8.0.0: + version "8.0.2" + resolved "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.2.tgz" + integrity sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw== dependencies: - anymatch "^2.0.0" - async-done "^1.2.0" - chokidar "^2.0.0" + "@gulpjs/to-absolute-glob" "^4.0.0" + anymatch "^3.1.3" + fastq "^1.13.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" is-negated-glob "^1.0.0" - just-debounce "^1.0.0" normalize-path "^3.0.0" - object.defaults "^1.1.0" + streamx "^2.12.5" -glob@3.2.8: - version "3.2.8" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.8.tgz#5506f4311721bcc618c7d8dba144188750307073" - integrity sha512-Y3icmja4O+RjRYHMc97ggBZOljMWzBFGEOk96IXbNGRbQEZrz15HAcqe89t9WUcmcDdVVNAK5ar2lTpL+SutNA== +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob-watcher@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz" + integrity sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw== dependencies: - inherits "2" - minimatch "~0.2.11" + async-done "^2.0.0" + chokidar "^3.5.3" -glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: +glob@^7.1.3: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -3304,25 +2413,26 @@ glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@3.2.8: + version "3.2.8" + resolved "https://registry.npmjs.org/glob/-/glob-3.2.8.tgz" + integrity sha512-Y3icmja4O+RjRYHMc97ggBZOljMWzBFGEOk96IXbNGRbQEZrz15HAcqe89t9WUcmcDdVVNAK5ar2lTpL+SutNA== + dependencies: + inherits "2" + minimatch "~0.2.11" + global-modules@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: global-prefix "^1.0.1" is-windows "^1.0.1" resolve-dir "^1.0.0" -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - global-prefix@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== dependencies: expand-tilde "^2.0.2" @@ -3331,66 +2441,48 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^12.1.0: version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + resolved "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== dependencies: type-fest "^0.8.1" -glogg@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" - integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== +glogg@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/glogg/-/glogg-2.2.0.tgz" + integrity sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A== dependencies: - sparkles "^1.0.0" + sparkles "^2.1.0" -gonzales-pe@3.0.0-28: - version "3.0.0-28" - resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-3.0.0-28.tgz#dd50b41dd15b682a28c40e5f0ff2007901ac62bd" - integrity sha512-sCw8URZxZobuEYqQxip57k2ND5nO1JPV9DL3pzCdjd9RDghFOCunMRxKRmC1qgyZUHGfYtOWZ4Q00zCY8Rgf5w== +gonzales-pe@2.0.x: + version "2.0.2" + resolved "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-2.0.2.tgz" + integrity sha512-RpskFL5GRsQa+ZfB9cAyxiv5ZNg5/eY77g+8qfgjxdcqTe260Zmj1jGmVU7jJbJoBwMrH1wVl5o2z4a84dCVaQ== -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.8: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -gulp-autoprefixer@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-7.0.1.tgz#3c0dc26afc802d317e7560a7f760a0399049075a" - integrity sha512-QJGEmHw+bEt7FSqvmbAUTxbCuNLJYx4sz3ox9WouYqT/7j5FH5CQ8ZnpL1M7H5npX1bUJa7lUVY1w20jXxhOxg== +gulp-autoprefixer@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-9.0.0.tgz" + integrity sha512-lVQz5fqdjm4RMB1O3xLPtaZNMbFFoGKbV+SN3NJgT9X+PIyYld7dXARpoXIKEZAqE9WC2SoDQU0mxqZahWq07A== dependencies: - autoprefixer "^9.6.1" - fancy-log "^1.3.2" - plugin-error "^1.0.1" - postcss "^7.0.17" - through2 "^3.0.1" + autoprefixer "^10.4.16" + gulp-plugin-extras "^0.2.2" + postcss "^8.4.31" vinyl-sourcemaps-apply "^0.2.1" gulp-clean-css@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-4.3.0.tgz#5b1e73f2fca46703eb636014cdd4553cea65146d" + resolved "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.3.0.tgz" integrity sha512-mGyeT3qqFXTy61j0zOIciS4MkYziF2U594t2Vs9rUnpkEHqfu6aDITMp8xOvZcvdX61Uz3y1mVERRYmjzQF5fg== dependencies: clean-css "4.2.3" @@ -3398,291 +2490,172 @@ gulp-clean-css@^4.3.0: through2 "3.0.1" vinyl-sourcemaps-apply "0.2.1" -gulp-cli@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.3.0.tgz#ec0d380e29e52aa45e47977f0d32e18fd161122f" - integrity sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A== +gulp-cli@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.0.0.tgz" + integrity sha512-RtMIitkT8DEMZZygHK2vEuLPqLPAFB4sntSxg4NoDta7ciwGZ18l7JuhCTiS5deOJi2IoK0btE+hs6R4sfj7AA== dependencies: - ansi-colors "^1.0.1" - archy "^1.0.0" - array-sort "^1.0.0" - color-support "^1.1.3" - concat-stream "^1.6.0" - copy-props "^2.0.1" - fancy-log "^1.3.2" - gulplog "^1.0.0" - interpret "^1.4.0" - isobject "^3.0.1" - liftoff "^3.1.0" - matchdep "^2.0.0" - mute-stdout "^1.0.0" - pretty-hrtime "^1.0.0" - replace-homedir "^1.0.0" - semver-greatest-satisfied-range "^1.1.0" - v8flags "^3.2.0" - yargs "^7.1.0" + "@gulpjs/messages" "^1.1.0" + chalk "^4.1.2" + copy-props "^4.0.0" + gulplog "^2.2.0" + interpret "^3.1.1" + liftoff "^5.0.0" + mute-stdout "^2.0.0" + replace-homedir "^2.0.0" + semver-greatest-satisfied-range "^2.0.0" + string-width "^4.2.3" + v8flags "^4.0.0" + yargs "^16.2.0" -gulp-csscomb@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/gulp-csscomb/-/gulp-csscomb-3.1.0.tgz#bab3e66ef71b087932e4ccead2a01883403545ad" - integrity sha512-DNg9GcnN1hHYCVP5nO+pKNL9BPW9ucD6DmyS36etPpLc4mMNPd+xjM8bf9o+wZdNZJok9a/Wxv3/PAQwlFAl4A== +gulp-csscomb@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/gulp-csscomb/-/gulp-csscomb-0.1.0.tgz" + integrity sha512-vkqjMOZJ6kOi8VHZpk8JGdpe/UBoWITL7Jz8ittSoDJarni211qIEAiuind2TLtY8URE2eE4CMMeo+fbnsJiVA== dependencies: - ansi-colors "^1.0.1" - csscomb "^3.1.7" - fancy-log "^1.3.2" - plugin-error "^0.1.2" - through2 "^2.0.1" + bufferstreams "0.0.1" + csscomb "~2.0.3" + gulp-util "~2.2.12" + +gulp-plugin-extras@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/gulp-plugin-extras/-/gulp-plugin-extras-0.2.2.tgz" + integrity sha512-0gssXzTNrrOocYBWN4qOZqd03cz3bxhjxVUPZV9iJdBR0ZZbwMQO/OT8hZChYoc9GjKaA5meaqDr6CjkmKA7BA== + dependencies: + "@types/vinyl" "^2.0.9" + chalk "^5.3.0" + easy-transform-stream "^1.0.1" gulp-rename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-2.0.0.tgz#9bbc3962b0c0f52fc67cd5eaff6c223ec5b9cf6c" + resolved "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz" integrity sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ== -"gulp-util@>=3.0.0 <3.1.0-0": - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - integrity sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw== +gulp-util@~2.2.12: + version "2.2.20" + resolved "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz" + integrity sha512-9rtv4sj9EtCWYGD15HQQvWtRBtU9g1t0+w29tphetHxjxEAuBKQJkhGqvlLkHEtUjEgoqIpsVwPKU1yMZAa+wA== dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" + chalk "^0.5.0" + dateformat "^1.0.7-1.2.3" + lodash._reinterpolate "^2.4.1" + lodash.template "^2.4.1" + minimist "^0.2.0" + multipipe "^0.1.0" + through2 "^0.5.0" + vinyl "^0.2.1" -gulp-webpack@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/gulp-webpack/-/gulp-webpack-1.5.0.tgz#7aa683fe88c02d246148e27c7229cb6b62892dba" - integrity sha512-0ZjbZIlOHRYtBxS3mtv5yBhiIH1CcqQt1D2sY4VPFww3DD3D67tI248cjEspkMleDXPfve0XSR8H3DccMe5SLQ== +gulp-webpack@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/gulp-webpack/-/gulp-webpack-0.0.1.tgz" + integrity sha512-FZHGlet2IwNvHo/fAV9WDaKhs039zbScigP7AwpL/hRZ65UJXdZ+nAtNFjls1+ICBDiAV3/LQB5KALnS7MV0/Q== + +gulp@^5.0.0, gulp@>=4: + version "5.0.0" + resolved "https://registry.npmjs.org/gulp/-/gulp-5.0.0.tgz" + integrity sha512-S8Z8066SSileaYw1S2N1I64IUc/myI2bqe2ihOBzO6+nKpvNSg7ZcWJt/AwF8LC/NVN+/QZ560Cb/5OPsyhkhg== dependencies: - gulp-util ">=3.0.0 <3.1.0-0" - memory-fs ">=0.2.0 <0.3.0-0" - through ">=2.3.4 <2.4.0-0" - vinyl ">=0.5.0 <0.6.0-0" - webpack ">=1.9.0 <2.0.0-0" + glob-watcher "^6.0.0" + gulp-cli "^3.0.0" + undertaker "^2.0.0" + vinyl-fs "^4.0.0" -gulp@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa" - integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== +gulplog@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz" + integrity sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A== dependencies: - glob-watcher "^5.0.3" - gulp-cli "^2.2.0" - undertaker "^1.2.1" - vinyl-fs "^3.0.0" + glogg "^2.2.0" -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - integrity sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw== +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz" + integrity sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA== dependencies: - glogg "^1.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + ansi-regex "^0.2.0" has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - integrity sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw== - dependencies: - sparkles "^1.0.0" - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash-base@~3.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - hasown@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - homedir-polyfill@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== dependencies: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -https-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" - integrity sha512-EjDQFbgJr1vDD/175UJeSX3ncQ3+RUnCL5NkthQGHvF4VNHlzTy8ifJfTqz47qiPRqaFH58+CbuG3x51WuB1XQ== - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== - iconv-lite@^0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: - postcss "^7.0.14" + safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.4: +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== - ignore@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== immutable@^4.0.0-rc.12: version "4.3.5" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz" integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== import-fresh@^3.0.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" imports-loader@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.8.0.tgz#030ea51b8ca05977c40a3abfd9b4088fe0be9a69" + resolved "https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz" integrity sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ== dependencies: loader-utils "^1.0.2" @@ -3690,45 +2663,37 @@ imports-loader@^0.8.0: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg== - -infer-owner@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz" + integrity sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg== + dependencies: + repeating "^2.0.0" inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@^1.3.4, ini@^1.3.5: +ini@^1.3.4: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inquirer@^7.0.0: version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz" integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== dependencies: ansi-escapes "^4.2.1" @@ -3745,282 +2710,155 @@ inquirer@^7.0.0: strip-ansi "^6.0.0" through "^2.3.6" -interpret@^0.6.4: - version "0.6.6" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" - integrity sha512-Vg6X07U0AOZb4HF6CWHa+jnJU8j71buKQ9Pc0C75qBXgvCYbxWBkGo4jnTS3O0MIc9FZtt0mB7h+uclojqdw1Q== - -interpret@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== is-absolute@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + resolved "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz" integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== dependencies: is-relative "^1.0.0" is-windows "^1.0.1" -is-accessor-descriptor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" - integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== - dependencies: - hasown "^2.0.0" - is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== - dependencies: - binary-extensions "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-core-module@^2.13.0: version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" -is-data-descriptor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" - integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== - dependencies: - hasown "^2.0.0" - -is-descriptor@^0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" - integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== - dependencies: - is-accessor-descriptor "^1.0.1" - is-data-descriptor "^1.0.1" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" - integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== - dependencies: - is-accessor-descriptor "^1.0.1" - is-data-descriptor "^1.0.1" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg== - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA== - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - is-extendable@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== - -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-negated-glob@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + resolved "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz" integrity sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug== -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg== - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-plain-object@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ== - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q== - is-relative@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + resolved "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz" integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== dependencies: is-unc-path "^1.0.0" is-unc-path@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + resolved "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz" integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== dependencies: unc-path-regex "^0.1.2" -is-utf8@^0.2.0, is-utf8@^0.2.1: +is-utf8@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== is-valid-glob@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + resolved "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz" integrity sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA== -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== - isarray@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -4028,151 +2866,97 @@ js-yaml@^3.13.1: jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-loader@^0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + resolved "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz" integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== - json5@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" json5@^2.1.2, json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" -just-debounce@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.1.0.tgz#2f81a3ad4121a76bc7cb45dbf704c0d76a8e5ddf" - integrity sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ== - -kind-of@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - integrity sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -last-run@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" - integrity sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ== - dependencies: - default-resolution "^2.0.0" - es6-weak-map "^2.0.1" +last-run@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/last-run/-/last-run-2.0.0.tgz" + integrity sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ== -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== - -lazystream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" - integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== - dependencies: - readable-stream "^2.0.5" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== - dependencies: - invert-kv "^1.0.0" - -lead@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" - integrity sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow== - dependencies: - flush-write-stream "^1.0.2" +lead@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz" + integrity sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg== levn@^0.3.0, levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" -liftoff@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" - integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== +liftoff@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/liftoff/-/liftoff-5.0.0.tgz" + integrity sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg== dependencies: - extend "^3.0.0" - findup-sync "^3.0.0" - fined "^1.0.1" - flagged-respawn "^1.0.0" - is-plain-object "^2.0.4" - object.map "^1.0.0" - rechoir "^0.6.2" - resolve "^1.1.7" + extend "^3.0.2" + findup-sync "^5.0.0" + fined "^2.0.0" + flagged-respawn "^2.0.0" + is-plain-object "^5.0.0" + rechoir "^0.8.0" + resolve "^1.20.0" load-json-file@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== dependencies: graceful-fs "^4.1.2" @@ -4183,30 +2967,20 @@ load-json-file@^1.0.0: loader-fs-cache@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" + resolved "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz" integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA== dependencies: find-cache-dir "^0.1.1" mkdirp "^0.5.1" -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^0.2.11: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - integrity sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug== - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" - -loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: version "1.4.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" @@ -4215,518 +2989,316 @@ loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4 loader-utils@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^2.1.2" -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - integrity sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ== +lodash._escapehtmlchar@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz" + integrity sha512-eHm2t2Lg476lq5v4FVmm3B5mCaRlDyTE8fnMfPCEq2o46G4au0qNXIKh7YWhjprm1zgSMLcMSs1XHMgkw02PbQ== + dependencies: + lodash._htmlescapes "~2.4.1" -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - integrity sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA== +lodash._escapestringchar@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz" + integrity sha512-iZ6Os4iipaE43pr9SBks+UpZgAjJgRC+lGf7onEoByMr1+Nagr1fmR7zCM6Q4RGMB/V3a57raEN0XZl7Uub3/g== -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - integrity sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg== +lodash._htmlescapes@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + integrity sha512-g79hNmMOBVyV+4oKIHM7MWy9Awtk3yqf0Twlawr6f+CmG44nTwBh9I5XiLUnk39KTfYoDBpS66glQGgQCnFIuA== -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA== +lodash._isnative@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + integrity sha512-BOlKGKNHhCHswGOWtmVb5zBygyxN7EmTuzVOSQI6QSoGhG+kvv71gICFS1TBpnqvT1n53txK8CDK3u5D2/GZxQ== -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - integrity sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ== +lodash._objecttypes@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + integrity sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q== -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - integrity sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ== +lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz" + integrity sha512-QGEOOjJi7W9LIgDAMVgtGBb8Qgo8ieDlSOCoZjtG45ZNRvDJZjwVMTYlfTIWdNRUiR1I9BjIqQ3Zaf1+DYM94g== -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - integrity sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w== +lodash._reunescapedhtml@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz" + integrity sha512-CfmZRU1Mk4E/5jh+Wu8lc7tuc3VkuwWZYVIgdPDH9NRSHgiL4Or3AA4JCIpgrkVzHOM+jKu2OMkAVquruhRHDQ== + dependencies: + lodash._htmlescapes "~2.4.1" + lodash.keys "~2.4.1" -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== - -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - integrity sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ== +lodash._shimkeys@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz" + integrity sha512-lBrglYxLD/6KAJ8IEa5Lg+YHgNAL7FyKqXg4XOUI+Du/vtniLs1ZqS+yHNKPkK54waAgkdUnDOYaWf+rv4B+AA== + dependencies: + lodash._objecttypes "~2.4.1" lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - integrity sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ== +lodash.defaults@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz" + integrity sha512-5wTIPWwGGr07JFysAZB8+7JB2NjJKXDIwogSaRX5zED85zyUAQwtOqUk8AsJkkigUcL3akbHYXd5+BPtTGQPZw== dependencies: - lodash._root "^3.0.0" + lodash._objecttypes "~2.4.1" + lodash.keys "~2.4.1" -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - integrity sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ== - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - integrity sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ== +lodash.escape@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz" + integrity sha512-PiEStyvZ8gz37qBE+HqME1Yc/ewb/59AMOu8pG7Ztani86foPTxgzckQvMdphmXPY6V5f20Ex/CaNBqHG4/ycQ== dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" + lodash._escapehtmlchar "~2.4.1" + lodash._reunescapedhtml "~2.4.1" + lodash.keys "~2.4.1" -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw== - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - integrity sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ== +lodash.isobject@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + integrity sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA== dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" + lodash._objecttypes "~2.4.1" -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - integrity sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ== +lodash.keys@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz" + integrity sha512-ZpJhwvUXHSNL5wYd1RM6CUa2ZuqorG9ngoJ9Ix5Cce+uX7I5O/E06FCJdhSZ33b5dVyeQDnIlWH7B2s5uByZ7g== dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" + lodash._isnative "~2.4.1" + lodash._shimkeys "~2.4.1" + lodash.isobject "~2.4.1" + +lodash.template@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz" + integrity sha512-5yLOQwlS69xbaez3g9dA1i0GMAj8pLDHp8lhA4V7M1vRam1lqD76f0jg5EV+65frbqrXo1WH9ZfKalfYBzJ5yQ== + dependencies: + lodash._escapestringchar "~2.4.1" + lodash._reinterpolate "~2.4.1" + lodash.defaults "~2.4.1" + lodash.escape "~2.4.1" + lodash.keys "~2.4.1" + lodash.templatesettings "~2.4.1" + lodash.values "~2.4.1" + +lodash.templatesettings@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz" + integrity sha512-vY3QQ7GxbeLe8XfTvoYDbaMHO5iyTDJS1KIZrxp00PRMmyBKr8yEcObHSl2ppYTwd8MgqPXAarTvLA14hx8ffw== + dependencies: + lodash._reinterpolate "~2.4.1" + lodash.escape "~2.4.1" + +lodash.values@~2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz" + integrity sha512-fQwubKvj2Nox2gy6YnjFm8C1I6MIlzKUtBB+Pj7JGtloGqDDL5CPRr4DUUFWPwXWwAl2k3f4C3Aw8H1qAPB9ww== + dependencies: + lodash.keys "~2.4.1" lodash@^4.17.14, lodash@^4.17.19: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg== - -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - integrity sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ== +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz" + integrity sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ== + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" +lru-cache@2: + version "2.7.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" + integrity sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ== make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -make-iterator@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" - integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== - dependencies: - kind-of "^6.0.2" - -map-cache@^0.2.0, map-cache@^0.2.2: +map-cache@^0.2.0: version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== -matchdep@^2.0.0: +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + integrity sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA== + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" - integrity sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA== + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - findup-sync "^2.0.0" - micromatch "^3.0.4" - resolve "^1.4.0" - stack-trace "0.0.10" + braces "^3.0.3" + picomatch "^2.3.1" -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== +mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -"memory-fs@>=0.2.0 <0.3.0-0", memory-fs@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" - integrity sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng== - -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" - integrity sha512-QTNXnl79X97kZ9jJk/meJrtDuvgvRakX5LU7HZW1L7MsXHuSTwoMIzN9tOLLH3Xfsj/gbsSqX/ovnsqz246zKQ== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA== - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" + mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@0.2.12: - version "0.2.12" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.12.tgz#ea82a012ac662c7ddfaa144f1c147e6946f5dafb" - integrity sha512-jeVdfKmlomLerf8ecetSr6gLS0OXnLRluhnv9Rf2yj70NsD8uVGqrpwTqJGKpIF8VTRR9fQAl62CZ1eNIEMk3A== - dependencies: - lru-cache "2" - sigmund "~1.0.0" - minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@~0.2.11: version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" integrity sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA== dependencies: lru-cache "2" sigmund "~1.0.0" -minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.6: +minimatch@0.2.12: + version "0.2.12" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-0.2.12.tgz" + integrity sha512-jeVdfKmlomLerf8ecetSr6gLS0OXnLRluhnv9Rf2yj70NsD8uVGqrpwTqJGKpIF8VTRR9fQAl62CZ1eNIEMk3A== + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@^0.2.0: + version "0.2.4" + resolved "https://registry.npmjs.org/minimist/-/minimist-0.2.4.tgz" + integrity sha512-Pkrrm8NjyQ8yVt8Am9M+yUt74zE3iokhzbG1bFVNjLB92vwM71hf40RkEsryg98BujhVOncKm/C1xROxZ030LQ== + +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw== - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.0: +mkdirp@^0.5.1: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -multipipe@^0.1.2: +multipipe@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + resolved "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz" integrity sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q== dependencies: duplexer2 "0.0.2" -mute-stdout@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" - integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== +mute-stdout@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mute-stdout/-/mute-stdout-2.0.0.tgz" + integrity sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ== mute-stream@0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.12.1: - version "2.19.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0" - integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +nanoid@^3.3.8: + version "3.3.11" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -neo-async@^2.5.0, neo-async@^2.6.1: +neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - nice-try@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-libs-browser@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-0.7.0.tgz#3e272c0819e308935e26674408d7af0e1491b83b" - integrity sha512-V0EeBff5/nauAta4yGYMdn/CYXpn2KYcE8r6rwU9qJDXG6wMrBhtWVfoKWphSvsnX+mZk6DzaGSO+Yz/MGBAGQ== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.1.4" - buffer "^4.9.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "3.3.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "0.0.1" - os-browserify "^0.2.0" - path-browserify "0.0.0" - process "^0.11.0" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.0.5" - stream-browserify "^2.0.1" - stream-http "^2.3.1" - string_decoder "^0.10.25" - timers-browserify "^2.0.2" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== node-uuid@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.0.tgz#07f9b2337572ff6275c775e1d48513f3a45d7a65" + resolved "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz" integrity sha512-Vns3Mj1WBYNwPchf2T/pt9q2GUpM97JvLekAkAwWYX1H2kIxYQ+jUb3GWmaNRboP5XoS3p3nxptIv00I+cOtLg== -normalize-package-data@^2.3.2: +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -4734,94 +3306,36 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0, normalize-path@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -now-and-later@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" - integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== - dependencies: - once "^1.3.2" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - -object-assign@^3.0.0: +now-and-later@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - integrity sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ== + resolved "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz" + integrity sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg== + dependencies: + once "^1.4.0" object-assign@^4.0.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - object-hash@^2.0.3: version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@^4.0.4, object.assign@^4.1.0, object.assign@^4.1.4: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.defaults@^1.0.0, object.defaults@^1.1.0: +object.defaults@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + resolved "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz" integrity sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA== dependencies: array-each "^1.0.1" @@ -4829,62 +3343,30 @@ object.defaults@^1.0.0, object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" -object.map@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" - integrity sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w== - dependencies: - for-own "^1.0.0" - make-iterator "^1.0.0" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA== - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.2.0, object.pick@^1.3.0: +object.pick@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" -object.reduce@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" - integrity sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw== - dependencies: - for-own "^1.0.0" - make-iterator "^1.0.0" - -once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -optimist@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g== - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optionator@^0.8.3: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -4894,285 +3376,162 @@ optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -ordered-read-streams@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" - integrity sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw== - dependencies: - readable-stream "^2.0.1" - -os-browserify@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" - integrity sha512-vHbnbzdqWJWvGOm7aOMDXHVUykPG0GdhfLkn5ZDmvbRI+wPj/XoB0/CRAkP9v28eZ7REIPPHJa+8ZEYixsWKmQ== - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== - dependencies: - lcid "^1.0.0" - os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" - integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== - dependencies: - asn1.js "^4.10.1" - browserify-aes "^1.2.0" - evp_bytestokey "^1.0.3" - hash-base "~3.0" - pbkdf2 "^3.1.2" - safe-buffer "^5.2.1" - -parse-filepath@^1.0.1: +parse-filepath@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + resolved "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz" integrity sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== dependencies: is-absolute "^1.0.0" map-cache "^0.2.0" path-root "^0.1.1" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA== - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - parse-json@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== dependencies: error-ex "^1.2.0" -parse-node-version@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - parse-passwd@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha512-WA3pxi1olUQcsl82W576vkqhUSGp0uBtr/381pxx5WXLp3NC+AB99hUG3aGW7H0Kg9PFr1D8wv1iJeICe+9Mhw== - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== - path-exists@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== dependencies: pinkie-promise "^2.0.0" -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-root-regex@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + resolved "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz" integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== path-root@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + resolved "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz" integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== dependencies: path-root-regex "^0.1.0" path-type@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== dependencies: graceful-fs "^4.1.2" pify "^2.0.0" pinkie-promise "^2.0.0" -pbkdf2-compat@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288" - integrity sha512-JYubxYhymODUUWVq9/Tmo9VQFZ8LyrD/pbXVpwmt1Npr2z29KZwp7+IBT3/PRjr1xpecX4W1EcbjFjp8nE3stQ== +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -pbkdf2@^3.0.3, pbkdf2@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - pinkie-promise@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== pkg-dir@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" integrity sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg== dependencies: find-up "^1.0.0" -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - pkg-dir@^4.1.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" -plugin-error@1.0.1, plugin-error@^1.0.1: +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +plugin-error@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + resolved "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz" integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== dependencies: ansi-colors "^1.0.1" @@ -5180,202 +3539,81 @@ plugin-error@1.0.1, plugin-error@^1.0.1: arr-union "^3.1.0" extend-shallow "^3.0.2" -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - integrity sha512-WzZHcm4+GO34sjFMxQMqZbsz3xiNEgonCskQ9v+IroMmYgk/tas8dG+Hr2D6IbRPybZ12oWpzE/w3cGJ6FJzOw== - dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== +postcss-modules-local-by-default@^4.0.5: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz" + integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== dependencies: - postcss "^7.0.5" - -postcss-modules-local-by-default@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" - postcss-selector-parser "^6.0.2" + icss-utils "^5.0.0" + postcss-selector-parser "^7.0.0" postcss-value-parser "^4.1.0" -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== +postcss-modules-scope@^3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" + postcss-selector-parser "^7.0.0" -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" + icss-utils "^5.0.0" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" - integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== +postcss-selector-parser@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-value-parser@^4.1.0: +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== +postcss@^8.1.0, postcss@^8.4.31, postcss@^8.4.33: + version "8.5.3" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz" + integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ== - -pretty-hrtime@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== - -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.0, process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - progress@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3, pumpify@^1.3.5: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@^1.2.4, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@^6.11.2: - version "6.12.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.0.tgz#edd40c3b823995946a8a0b1f208669c7a200db77" - integrity sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg== - dependencies: - side-channel "^1.0.6" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== - -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - read-pkg-up@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== dependencies: find-up "^1.0.0" @@ -5383,38 +3621,35 @@ read-pkg-up@^1.0.1: read-pkg@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@^2.3.8, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -"readable-stream@2 || 3", readable-stream@^3.6.0: +readable-stream@^3.4.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@~1.0.17: + version "1.0.34" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@~1.1.9: version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== dependencies: core-util-is "~1.0.0" @@ -5422,86 +3657,79 @@ readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" -readdirp@^2.0.0, readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== +"readable-stream@2 || 3": + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== dependencies: - resolve "^1.1.6" + resolve "^1.20.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz" + integrity sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g== + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" regenerate-unicode-properties@^10.1.0: version "10.1.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz" integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.10.5: version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" integrity sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w== regenerator-runtime@^0.11.0: version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.2: version "0.15.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - regexpp@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpu-core@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: "@babel/regjsgen" "^0.8.0" @@ -5513,117 +3741,78 @@ regexpu-core@^5.3.1: regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" -remove-bom-buffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" - integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== - dependencies: - is-buffer "^1.1.5" - is-utf8 "^0.2.1" - -remove-bom-stream@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" - integrity sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA== - dependencies: - remove-bom-buffer "^3.0.0" - safe-buffer "^5.1.0" - through2 "^2.0.3" - -remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: +remove-trailing-separator@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - integrity sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ== - -replace-ext@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" - integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== - -replace-homedir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" - integrity sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg== +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== dependencies: - homedir-polyfill "^1.0.1" - is-absolute "^1.0.0" - remove-trailing-separator "^1.1.0" + is-finite "^1.0.0" + +replace-ext@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz" + integrity sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug== + +replace-homedir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/replace-homedir/-/replace-homedir-2.0.0.tgz" + integrity sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw== require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg== +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: - resolve-from "^3.0.0" + resolve-from "^5.0.0" resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== dependencies: expand-tilde "^2.0.0" global-modules "^1.0.0" -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== - resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-options@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" - integrity sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-options@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz" + integrity sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A== dependencies: - value-or-function "^3.0.0" + value-or-function "^4.0.0" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.4.0: +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0: version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -5632,324 +3821,190 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14. restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg== - dependencies: - align-text "^0.1.1" +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rimraf@2.6.3: version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" - integrity sha512-JJsJ74Mw4sUDDisXGDnNNyN9xWmt5HcH6Kwvb/0m/IvTKjnLAtZfzeoLdpxk44AxQZki54oCCd+Kt0nPQ2AF2g== - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - run-async@^2.4.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== - dependencies: - aproba "^1.1.1" - rxjs@^6.6.0: version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - schema-utils@^2.6.5, schema-utils@^2.7.0: version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: "@types/json-schema" "^7.0.5" ajv "^6.12.4" ajv-keywords "^3.5.2" -semver-greatest-satisfied-range@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" - integrity sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ== +schema-utils@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz" + integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== dependencies: - sver-compat "^1.5.0" + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: +semver-greatest-satisfied-range@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-2.0.0.tgz" + integrity sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g== + dependencies: + sver "^1.8.3" + +semver@^5.5.0: version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.0.0, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -serialize-javascript@^1.7.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" - integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== +semver@^7.5.4: + version "7.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== +"semver@2 || 3 || 4 || 5": + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -sha.js@2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" - integrity sha512-GC+qN4sf/O6bDwz6CHaz8HVQfLbbNyIsXpTZLiD5c1badnWA63WVAH1msoCq+fXcV0dZ50jxTqKA8seu40845A== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + kind-of "^6.0.2" shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== sigmund@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + resolved "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g== -signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== slice-ansi@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz" integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== dependencies: ansi-styles "^3.2.0" astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - sortablejs@^1.10.2: version "1.15.2" - resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.15.2.tgz#4e9f7bda4718bd1838add9f1866ec77169149809" + resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.2.tgz" integrity sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA== -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +source-map-js@^1.2.1: + 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== -source-list-map@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" - integrity sha512-cabwdhnSNf/tTDMh/DXZXlkeQLvdYT5xfGYBohqHG7wb3bBQrQlHQNWM9NWSOboXXK1zgwz6JzS5e4hZq9vxMw== - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.12: +source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== +source-map@^0.5.1: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.0.tgz#0fe96503ac86a5adb5de63f4e412ae4872cdbe86" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.0.tgz" integrity sha512-gjGnxNN0K+/Pr4Mi4fs/pOtda10dKB6Wn9QvjOrH6v5TWsI7ghHuJUHoIgyM6DkUL5kr2GtPFGererzKpMBWfA== -source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@~0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A== - dependencies: - amdefine ">=0.0.4" - -sparkles@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" - integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== +sparkles@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz" + integrity sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg== spdx-correct@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" @@ -5957,103 +4012,64 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.17" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" - integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" + version "3.0.21" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz" + integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - -stack-trace@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-exhaust@^1.0.1: +stream-composer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" + resolved "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz" + integrity sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w== + dependencies: + streamx "^2.13.2" + +stream-exhaust@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz" integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== -stream-http@^2.3.1, stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== +streamx@^2.12.0, streamx@^2.12.5, streamx@^2.13.2, streamx@^2.14.0: + version "2.22.0" + resolved "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz" + integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" + fast-fifo "^1.3.2" + text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" -stream-shift@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" - integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" + safe-buffer "~5.2.0" -string-width@^3.0.0, string-width@^3.1.0: +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + +string-width@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: emoji-regex "^7.0.1" @@ -6062,122 +4078,127 @@ string-width@^3.0.0, string-width@^3.1.0: string-width@^4.1.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string_decoder@^0.10.25, string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== +string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - safe-buffer "~5.2.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - safe-buffer "~5.1.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz" + integrity sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ== dependencies: - ansi-regex "^2.0.0" + ansi-regex "^0.2.1" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.1.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== dependencies: is-utf8 "^0.2.0" +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" + integrity sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA== + dependencies: + get-stdin "^4.0.1" + strip-json-comments@^3.0.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== style-loader@^1.1.3: version "1.3.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz" integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== dependencies: loader-utils "^2.0.0" schema-utils "^2.7.0" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== - -supports-color@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== - dependencies: - has-flag "^1.0.0" +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" + integrity sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -sver-compat@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" - integrity sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg== - dependencies: - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" +sver@^1.8.3: + version "1.8.4" + resolved "https://registry.npmjs.org/sver/-/sver-1.8.4.tgz" + integrity sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA== + optionalDependencies: + semver "^6.3.0" table@^5.2.3: version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + resolved "https://registry.npmjs.org/table/-/table-5.4.6.tgz" integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== dependencies: ajv "^6.10.2" @@ -6185,263 +4206,152 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -tapable@^0.1.8, tapable@~0.1.8: - version "0.1.10" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" - integrity sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ== +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== +teex@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz" + integrity sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg== dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" + streamx "^2.12.5" -terser@^4.1.2: - version "4.8.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" - integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== +terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.11: + version "5.3.14" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + jest-worker "^27.4.5" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" + +terser@^5.31.1: + version "5.39.0" + resolved "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz" + integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" + source-map-support "~0.5.20" + +text-decoder@^1.1.0: + version "1.2.3" + resolved "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -through2-filter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" - integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== +through@^2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +through2@^0.5.0: + version "0.5.1" + resolved "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz" + integrity sha512-zexCrAOTbjkBCXGyozn7hhS3aEaqdrc59mAD2E3dKYzV1vFuEGQ1hEDJN2oQMQFwy4he2zyLqPZV+AlfS8ZWJA== dependencies: - through2 "~2.0.0" - xtend "~4.0.0" + readable-stream "~1.0.17" + xtend "~3.0.0" through2@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + resolved "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz" integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== dependencies: readable-stream "2 || 3" -through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through2@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" - integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== - dependencies: - inherits "^2.0.4" - readable-stream "2 || 3" - -"through@>=2.3.4 <2.4.0-0", through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw== - -timers-browserify@^2.0.2, timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - tmp@^0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" -to-absolute-glob@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" - integrity sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA== - dependencies: - is-absolute "^1.0.0" - is-negated-glob "^1.0.0" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== +to-through@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz" + integrity sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw== dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" + streamx "^2.12.5" -to-through@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" - integrity sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q== - dependencies: - through2 "^2.0.3" +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" + integrity sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw== tslib@^1.9.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== - type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.8.1: version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -uglify-js@^3.6.0: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - -uglify-js@~2.7.3: - version "2.7.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" - integrity sha512-RvbIYn4DIadCg1MV7YP7OrpxnVrtEieZzbK0KSQvwWGAHojqWJxInkQhmtYGRo9PTwwkJkljIgzMyA1VitEc4Q== - dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q== - -uglifyjs-webpack-plugin@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz#e75bc80e7f1937f725954c9b4c5a1e967ea9d0d7" - integrity sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^1.7.0" - source-map "^0.6.1" - uglify-js "^3.6.0" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - unc-path-regex@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + resolved "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz" integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== -undertaker-registry@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" - integrity sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw== +undertaker-registry@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-2.0.0.tgz" + integrity sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew== -undertaker@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.3.0.tgz#363a6e541f27954d5791d6fa3c1d321666f86d18" - integrity sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg== +undertaker@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/undertaker/-/undertaker-2.0.0.tgz" + integrity sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ== dependencies: - arr-flatten "^1.0.1" - arr-map "^2.0.0" - bach "^1.0.0" - collection-map "^1.0.0" - es6-weak-map "^2.0.1" - fast-levenshtein "^1.0.0" - last-run "^1.1.0" - object.defaults "^1.0.0" - object.reduce "^1.0.0" - undertaker-registry "^1.0.0" + bach "^2.0.1" + fast-levenshtein "^3.0.0" + last-run "^2.0.0" + undertaker-registry "^2.0.0" + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" @@ -6449,220 +4359,130 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unique-stream@^2.0.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" - integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== - dependencies: - json-stable-stringify-without-jsonify "^1.0.1" - through2-filter "^3.0.0" - universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== +update-browserslist-db@^1.1.1: + version "1.1.3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.2.0" + picocolors "^1.1.1" uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - -url@^0.11.0: - version "0.11.3" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" - integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== - dependencies: - punycode "^1.4.1" - qs "^6.11.2" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.10.3, util@^0.10.4: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== - dependencies: - inherits "2.0.3" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: +v8-compile-cache@^2.0.3: version "2.4.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz" integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== -v8flags@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" - integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== - dependencies: - homedir-polyfill "^1.0.1" +v8flags@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz" + integrity sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg== validate-npm-package-license@^3.0.1: version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -value-or-function@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" - integrity sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg== +value-or-function@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz" + integrity sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg== -vinyl-fs@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" - integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== +vinyl-contents@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz" + integrity sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q== dependencies: - fs-mkdirp-stream "^1.0.0" - glob-stream "^6.1.0" - graceful-fs "^4.0.0" + bl "^5.0.0" + vinyl "^3.0.0" + +vinyl-fs@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz" + integrity sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw== + dependencies: + fs-mkdirp-stream "^2.0.1" + glob-stream "^8.0.0" + graceful-fs "^4.2.11" + iconv-lite "^0.6.3" is-valid-glob "^1.0.0" - lazystream "^1.0.0" - lead "^1.0.0" - object.assign "^4.0.4" - pumpify "^1.3.5" - readable-stream "^2.3.3" - remove-bom-buffer "^3.0.0" - remove-bom-stream "^1.2.0" - resolve-options "^1.1.0" - through2 "^2.0.0" - to-through "^2.0.0" - value-or-function "^3.0.0" - vinyl "^2.0.0" - vinyl-sourcemap "^1.1.0" + lead "^4.0.0" + normalize-path "3.0.0" + resolve-options "^2.0.0" + stream-composer "^1.0.2" + streamx "^2.14.0" + to-through "^3.0.0" + value-or-function "^4.0.0" + vinyl "^3.0.0" + vinyl-sourcemap "^2.0.0" -vinyl-sourcemap@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" - integrity sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA== +vinyl-sourcemap@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz" + integrity sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q== dependencies: - append-buffer "^1.0.2" - convert-source-map "^1.5.0" - graceful-fs "^4.1.6" - normalize-path "^2.1.1" - now-and-later "^2.0.0" - remove-bom-buffer "^3.0.0" - vinyl "^2.0.0" + convert-source-map "^2.0.0" + graceful-fs "^4.2.10" + now-and-later "^3.0.0" + streamx "^2.12.5" + vinyl "^3.0.0" + vinyl-contents "^2.0.0" -vinyl-sourcemaps-apply@0.2.1, vinyl-sourcemaps-apply@^0.2.1: +vinyl-sourcemaps-apply@^0.2.1, vinyl-sourcemaps-apply@0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + resolved "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz" integrity sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw== dependencies: source-map "^0.5.1" -"vinyl@>=0.5.0 <0.6.0-0", vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - integrity sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA== +vinyl@^0.2.1: + version "0.2.3" + resolved "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz" + integrity sha512-4gFk9xrecazOTuFKcUYrE1TjHSYL63dio72D+q0d1mHF51FEcxTT2RHFpHbN5TNJgmPYHuVsBdhvXEOCDcytSA== dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" + clone-stats "~0.0.1" -vinyl@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" - integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== +vinyl@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz" + integrity sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g== dependencies: - clone "^2.1.1" - clone-buffer "^1.0.0" + clone "^2.1.2" clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha512-NyZNR3WDah+NPkjh/YmhuWSsT4a0mF0BJYgUmvrJ70zxjTXh5Y2Asobxlh0Nfs0PCFB5FVpRJft7NozAWFMwLQ== - dependencies: - indexof "0.0.1" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + remove-trailing-separator "^1.1.0" + replace-ext "^2.0.0" + teex "^1.0.1" vow-fs@0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/vow-fs/-/vow-fs-0.3.2.tgz#ea2b034d85e1db8c277eb2e9a86d1c15f5d38e7a" + resolved "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.2.tgz" integrity sha512-raT20j8SL2sCX3MlLCv6SWw3IeFU+3AuCDjGh5Q8Xs4EoT5GDjftg/a8r0PPr6gV7qyJET0OtPQ1hOvE7imEcw== dependencies: glob "3.2.8" @@ -6672,281 +4492,160 @@ vow-fs@0.3.2: vow-queue@0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/vow-queue/-/vow-queue-0.3.1.tgz#598c51a15b0a81a6d5fc05f4761ceb462de1e868" + resolved "https://registry.npmjs.org/vow-queue/-/vow-queue-0.3.1.tgz" integrity sha512-rX8acYHR7w/aQohdBkb+ihVY1MZpBlsrDVgNT95+m8V0Mc1YVffn4TjxX3gAQ7nZoWw7LusnaYywSb2gmekpXQ== dependencies: vow "~0.4.0" -vow@0.4.4: +vow@~0.4.0, vow@0.4.4: version "0.4.4" - resolved "https://registry.yarnpkg.com/vow/-/vow-0.4.4.tgz#c9fe4609129d7f5aa621508ebe64b51c95bc7b98" + resolved "https://registry.npmjs.org/vow/-/vow-0.4.4.tgz" integrity sha512-r2f2JN12F0VSJLb+6HIyyGnbZt4kgxzMf1bgHaa5fQp6Cq2HyQNQ+UOcFH2H3rfzOOSTPM3ebnZ7COaYf4AYnw== -vow@~0.4.0: - version "0.4.20" - resolved "https://registry.yarnpkg.com/vow/-/vow-0.4.20.tgz#77ca6ef0828e0043a93e55dc37030226519ce711" - integrity sha512-YYoSYXUYABqY08D/WrjcWJxJSErcILRRTQpcPyUc0SFfgIPKSUFzVt7u1HC3TXGJZM/qhsSjCLNQstxqf7asgQ== - -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: - chokidar "^2.1.8" - -watchpack@^0.2.1: - version "0.2.9" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b" - integrity sha512-hmLWdxNfe0Ou1xaRj+ublbOYUaZJfVz1VuHQfERLVlUrLS21gUaGa2gWRl8L5Ej1aUS3KxFN+1qoWK4kZLMvKw== - dependencies: - async "^0.9.0" - chokidar "^1.0.0" + glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -watchpack@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== +webpack-cli@^6.0.1, webpack-cli@6.x.x: + version "6.0.1" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz" + integrity sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw== dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" + "@discoveryjs/json-ext" "^0.6.1" + "@webpack-cli/configtest" "^3.0.1" + "@webpack-cli/info" "^3.0.1" + "@webpack-cli/serve" "^3.0.1" + colorette "^2.0.14" + commander "^12.1.0" + cross-spawn "^7.0.3" + envinfo "^7.14.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^6.0.1" -webpack-cli@^3.3.11: - version "3.3.12" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" - integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== +webpack-merge@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz" + integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== dependencies: - chalk "^2.4.2" - cross-spawn "^6.0.5" - enhanced-resolve "^4.1.1" - findup-sync "^3.0.0" - global-modules "^2.0.0" - import-local "^2.0.0" - interpret "^1.4.0" - loader-utils "^1.4.0" - supports-color "^6.1.0" - v8-compile-cache "^2.1.1" - yargs "^13.3.2" + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.1" -webpack-core@~0.6.9: - version "0.6.9" - resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" - integrity sha512-P6ZUGXn5buTEZyTStCHHLwtWGKSm/jA629Zgp4pcHSsy60CCsT9MaHDxNIPL+GGJ2KwOgI6ORwQtHcrYHAt2UQ== - dependencies: - source-list-map "~0.1.7" - source-map "~0.4.1" +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack-sources@^1.4.0, webpack-sources@^1.4.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== +"webpack@^4.0.0 || ^5.0.0", webpack@^5.1.0, webpack@^5.27.0, webpack@^5.82.0, webpack@^5.98.0, webpack@>=2: + version "5.98.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz" + integrity sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA== dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -"webpack@>=1.9.0 <2.0.0-0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.15.0.tgz#4ff31f53db03339e55164a9d468ee0324968fe98" - integrity sha512-+8bxNSHMZCWBa6hi++2A2pw9GmLUWY6lII+aIXlgUPpB+ClNrUKgP8hx0w+hxjWhX81hclUYPGFg+7NxgLTUYQ== - dependencies: - acorn "^3.0.0" - async "^1.3.0" - clone "^1.0.2" - enhanced-resolve "~0.9.0" - interpret "^0.6.4" - loader-utils "^0.2.11" - memory-fs "~0.3.0" - mkdirp "~0.5.0" - node-libs-browser "^0.7.0" - optimist "~0.6.0" - supports-color "^3.1.0" - tapable "~0.1.8" - uglify-js "~2.7.3" - watchpack "^0.2.1" - webpack-core "~0.6.9" - -webpack@^4.42.1: - version "4.47.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.47.0.tgz#8b8a02152d7076aeb03b61b47dad2eeed9810ebc" - integrity sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.14.0" + browserslist "^4.24.0" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.5.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" + enhanced-resolve "^5.17.1" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^4.3.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.11" + watchpack "^2.4.1" + webpack-sources "^3.2.3" -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== - -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - -which@^1.2.14, which@^1.2.9, which@^1.3.1: +which@^1.2.14, which@^1.2.9: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg== +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== word-wrap@~1.2.3: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q== - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw== - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - errno "~0.1.7" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + resolved "https://registry.npmjs.org/write/-/write-1.0.3.tgz" integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== dependencies: mkdirp "^0.5.1" -xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" + integrity sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg== -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.1.tgz#7ede329c1d8cdbbe209bd25cdb990e9b1ebbb394" - integrity sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA== +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: - camelcase "^3.0.0" - object.assign "^4.1.0" - -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yargs@^7.1.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.2.tgz#63a0a5d42143879fdbb30370741374e0641d55db" - integrity sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA== - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^5.0.1" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A== - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" diff --git a/plugins/git-sync/CHANGELOG.md b/plugins/git-sync/CHANGELOG.md index 834a436..43db974 100644 --- a/plugins/git-sync/CHANGELOG.md +++ b/plugins/git-sync/CHANGELOG.md @@ -1,3 +1,12 @@ +# v3.0.0 +## 10/19/2025 + +1. [](#improved) + * Grav 1.8 support + * Use `{$var}` instead of `${var}` causing deprecation notices + * Prevent accepting webhooks when they are disabled in config [#216](https://github.com/trilbymedia/grav-plugin-git-sync/issues/216) + * Updated FAQ link to discussion + # v2.3.2 ## 06/03/2021 diff --git a/plugins/git-sync/README.md b/plugins/git-sync/README.md index f712a3b..853de3f 100644 --- a/plugins/git-sync/README.md +++ b/plugins/git-sync/README.md @@ -81,10 +81,10 @@ Example: private_key: `/home/www-data/.ssh/id_rsa` > **IMPORTANT**: SSH keys with passphrase are **NOT** supported. To remove a passphrase, run the `ssh-keygen -p` command and when asked for the new passphrase leave blank and return. # Known Issues and Resolutions -**Q:** `error: The requested URL returned error: 403 Forbidden while accessing...` [#39](https://github.com/trilbymedia/grav-plugin-git-sync/issues/39) +**Q:** `error: The requested URL returned error: 403 Forbidden while accessing...` (reference, [#39](https://github.com/trilbymedia/grav-plugin-git-sync/issues/39)) **A:** This might be caused by your computer having stored in the registry a user/password that might conflict with the one you are intending to use. -[Follow the instructions for resolving the issue...](https://github.com/trilbymedia/grav-plugin-git-sync/issues/39#issuecomment-538867548) +[Follow the instructions for resolving the issue...](https://github.com/trilbymedia/grav-plugin-git-sync/discussions/202#discussioncomment-869460) # Sponsored by -This plugin could not have been realized without the sponsorship of [Hibbitts Design](http://www.hibbittsdesign.org/blog/) and the development of [Trilby Media](http://trilby.media). +This plugin could not have been realized without the sponsorship of [HibbittsDesign.org](http://www.hibbittsdesign.org) and the development of [Trilby Media](http://trilby.media). diff --git a/plugins/git-sync/blueprints.yaml b/plugins/git-sync/blueprints.yaml index fe6c5ee..bafe743 100644 --- a/plugins/git-sync/blueprints.yaml +++ b/plugins/git-sync/blueprints.yaml @@ -1,7 +1,7 @@ name: Git Sync type: plugin slug: git-sync -version: 2.3.2 +version: 3.0.0 description: Allows to synchronize portions of Grav with Git Repositories (GitHub, BitBucket, GitLab) icon: git author: @@ -15,8 +15,8 @@ docs: https://github.com/trilbymedia/grav-plugin-git-sync license: MIT dependencies: -- { name: grav, version: '>=1.6.0' } -- { name: form, version: '>=2.16.3' } +- { name: grav, version: '>=1.7.0' } +- { name: form, version: '>=3.0.0' } form: validation: strict diff --git a/plugins/git-sync/classes/GitSync.php b/plugins/git-sync/classes/GitSync.php index e6aaa91..aba5226 100644 --- a/plugins/git-sync/classes/GitSync.php +++ b/plugins/git-sync/classes/GitSync.php @@ -502,6 +502,8 @@ class GitSync extends Git throw new \RuntimeException($message); } + + return 0; } /** diff --git a/plugins/git-sync/classes/Helper.php b/plugins/git-sync/classes/Helper.php index 9dac08f..7e3ebef 100644 --- a/plugins/git-sync/classes/Helper.php +++ b/plugins/git-sync/classes/Helper.php @@ -77,7 +77,7 @@ class Helper return $repository; } - return str_replace('://', "://${user}${password}@", $repository); + return str_replace('://', "://{$user}{$password}@", $repository); } /** diff --git a/plugins/git-sync/cli/InitCommand.php b/plugins/git-sync/cli/InitCommand.php index 858b7b8..db3d101 100644 --- a/plugins/git-sync/cli/InitCommand.php +++ b/plugins/git-sync/cli/InitCommand.php @@ -41,5 +41,7 @@ class InitCommand extends ConsoleCommand $plugin->addRemote(); $this->output->writeln('completed.'); + + return 0; } } diff --git a/plugins/git-sync/cli/PasswdCommand.php b/plugins/git-sync/cli/PasswdCommand.php index 0ca921a..6b645d3 100644 --- a/plugins/git-sync/cli/PasswdCommand.php +++ b/plugins/git-sync/cli/PasswdCommand.php @@ -71,6 +71,8 @@ class PasswdCommand extends ConsoleCommand $this->output->writeln(''); $this->output->writeln('User / Password updated.'); $this->output->writeln(''); + + return 0; } private function console_header($readable, $cmd = '', $remote_action = false) diff --git a/plugins/git-sync/cli/StatusCommand.php b/plugins/git-sync/cli/StatusCommand.php index a3d5c71..d76b06f 100644 --- a/plugins/git-sync/cli/StatusCommand.php +++ b/plugins/git-sync/cli/StatusCommand.php @@ -129,6 +129,8 @@ EOF } else { $this->console_header('Looks good: use --fetch option to check for updates.'); } + + return 0; } private function console_header($readable, $cmd = '', $remote_action = false) diff --git a/plugins/git-sync/cli/SyncCommand.php b/plugins/git-sync/cli/SyncCommand.php index 3fca0af..bc03e76 100644 --- a/plugins/git-sync/cli/SyncCommand.php +++ b/plugins/git-sync/cli/SyncCommand.php @@ -46,6 +46,8 @@ class SyncCommand extends ConsoleCommand $plugin->sync(); $this->output->writeln('completed.'); + + return 0; } } diff --git a/plugins/git-sync/git-sync.php b/plugins/git-sync/git-sync.php index 2a1b0f5..068475a 100644 --- a/plugins/git-sync/git-sync.php +++ b/plugins/git-sync/git-sync.php @@ -98,8 +98,8 @@ class GitSyncPlugin extends Plugin $secret = $config['webhook_secret'] ?? false; $enabled = $config['webhook_enabled'] ?? false; - if ($route === $webhook && $_SERVER['REQUEST_METHOD'] === 'POST') { - if ($secret && $enabled) { + if ($enabled && $route === $webhook && $_SERVER['REQUEST_METHOD'] === 'POST') { + if ($secret) { if (!$this->isRequestAuthorized($secret)) { http_response_code(401); header('Content-Type: application/json'); diff --git a/plugins/login/CHANGELOG.md b/plugins/login/CHANGELOG.md index ceb523a..4bf0b18 100644 --- a/plugins/login/CHANGELOG.md +++ b/plugins/login/CHANGELOG.md @@ -1,3 +1,12 @@ +# v3.8.0 +## 08/25/2025 + +1. [](#new) + * PHP 8.4 compatibility +1. [](#improved) + * Updated vendor libraries to latest + * Updated Support links + # v3.7.9 ## 05/15/2024 diff --git a/plugins/login/README.md b/plugins/login/README.md index b5c63bc..e6ce332 100644 --- a/plugins/login/README.md +++ b/plugins/login/README.md @@ -85,7 +85,7 @@ The simplest way to create a new user is to simply run the `bin/plugin login new ### Commands -| Command | Arguments | Explination | +| Command | Arguments | Explanation | |---------------|--------------------------------------|----------------------------| |`new-user`||Creates a new user (creates file in `user/accounts/`) || [ -u, --user=USER ] | The username. | diff --git a/plugins/login/blueprints.yaml b/plugins/login/blueprints.yaml index 4702e04..85c87a4 100644 --- a/plugins/login/blueprints.yaml +++ b/plugins/login/blueprints.yaml @@ -1,7 +1,7 @@ name: Login slug: login type: plugin -version: 3.7.9 +version: 3.8.0 testing: false description: Enables user authentication and login screen. icon: sign-in diff --git a/plugins/login/classes/Email.php b/plugins/login/classes/Email.php index dbf9cda..2b10193 100644 --- a/plugins/login/classes/Email.php +++ b/plugins/login/classes/Email.php @@ -18,7 +18,7 @@ class Email * @return void * @throws \Exception */ - public static function sendActivationEmail(UserInterface $user, UserInterface $actor = null): void + public static function sendActivationEmail(UserInterface $user, ?UserInterface $actor = null): void { $email = $user->email; $token = (string)$user->get('activation_token', ''); @@ -73,7 +73,7 @@ class Email * @return void * @throws \Exception */ - public static function sendResetPasswordEmail(UserInterface $user, UserInterface $actor = null): void + public static function sendResetPasswordEmail(UserInterface $user, ?UserInterface $actor = null): void { $email = $user->email; $token = (string)$user->get('reset', ''); @@ -125,7 +125,7 @@ class Email * @return void * @throws \Exception */ - public static function sendWelcomeEmail(UserInterface $user, UserInterface $actor = null): void + public static function sendWelcomeEmail(UserInterface $user, ?UserInterface $actor = null): void { if (!$user->email) { return; @@ -152,7 +152,7 @@ class Email * @return void * @throws \Exception */ - public static function sendNotificationEmail(UserInterface $user, UserInterface $actor = null): void + public static function sendNotificationEmail(UserInterface $user, ?UserInterface $actor = null): void { try { $to = static::getConfig()->get('plugins.email.to'); @@ -181,7 +181,7 @@ class Email * @return void * @throws \Exception */ - public static function sendInvitationEmail(Invitation $invitation, string $message = null, UserInterface $actor = null): void + public static function sendInvitationEmail(Invitation $invitation, ?string $message = null, ?UserInterface $actor = null): void { if (!$invitation->email) { return; @@ -215,7 +215,7 @@ class Email } } - protected static function sendEmail(string $template, array $context, array $params, UserInterface $user = null, UserInterface $actor = null): void + protected static function sendEmail(string $template, array $context, array $params, ?UserInterface $user = null, ?UserInterface $actor = null): void { $actor = $actor ?? static::getUser(); diff --git a/plugins/login/classes/Events/PageAuthorizeEvent.php b/plugins/login/classes/Events/PageAuthorizeEvent.php index 8ee041c..08150d2 100644 --- a/plugins/login/classes/Events/PageAuthorizeEvent.php +++ b/plugins/login/classes/Events/PageAuthorizeEvent.php @@ -37,7 +37,7 @@ class PageAuthorizeEvent extends Event * @param UserInterface $user * @param Data|null $config */ - public function __construct(PageInterface $page, UserInterface $user, Data $config = null) + public function __construct(PageInterface $page, UserInterface $user, ?Data $config = null) { $this->page = $page; $this->user = $user; diff --git a/plugins/login/classes/Login.php b/plugins/login/classes/Login.php index f31eea4..338b12b 100644 --- a/plugins/login/classes/Login.php +++ b/plugins/login/classes/Login.php @@ -311,7 +311,7 @@ class Login * @param string|null $ip * @return int Return positive number if rate limited, otherwise return 0. */ - public function checkLoginRateLimit(string $username, string $ip = null): int + public function checkLoginRateLimit(string $username, ?string $ip = null): int { $ipKey = $this->getIpKey($ip); $rateLimiter = $this->getRateLimiter('login_attempts'); @@ -330,7 +330,7 @@ class Login * @param string $username * @param string|null $ip */ - public function resetLoginRateLimit(string $username, string $ip = null): void + public function resetLoginRateLimit(string $username, ?string $ip = null): void { $ipKey = $this->getIpKey($ip); $rateLimiter = $this->getRateLimiter('login_attempts'); @@ -341,7 +341,7 @@ class Login * @param string|null $ip * @return string */ - public function getIpKey(string $ip = null): string + public function getIpKey(?string $ip = null): string { if (null === $ip) { $ip = Uri::ip(); @@ -520,7 +520,7 @@ class Login * @return bool True if the action was performed. * @throws \RuntimeException */ - public function sendInviteEmail(Invitation $invitation, string $message = null, UserInterface $user = null) + public function sendInviteEmail(Invitation $invitation, ?string $message = null, ?UserInterface $user = null) { try { Email::sendInvitationEmail($invitation, $message, $user); @@ -623,7 +623,7 @@ class Login * @param PageInterface|null $page * @return PageInterface|null */ - public function getPage(string $type, string $route = null, PageInterface $page = null): ?PageInterface + public function getPage(string $type, ?string $route = null, ?PageInterface $page = null): ?PageInterface { $route = $route ?? $this->getRoute($type, true); if (null === $route) { @@ -663,7 +663,7 @@ class Login * @param PageInterface|null $page * @return PageInterface|null */ - public function addPage(string $type, string $route = null, PageInterface $page = null): ?PageInterface + public function addPage(string $type, ?string $route = null, ?PageInterface $page = null): ?PageInterface { $page = $this->getPage($type, $route, $page); if (null === $page) { @@ -685,7 +685,7 @@ class Login * @param bool|null $enabled * @return string|null Returns route or null if the route has been disabled. */ - public function getRoute(string $type, bool $enabled = null): ?string + public function getRoute(string $type, ?bool $enabled = null): ?string { switch ($type) { case 'login': @@ -732,7 +732,7 @@ class Login * @param Data|null $config * @return bool */ - public function isUserAuthorizedForPage(UserInterface $user, PageInterface $page, Data $config = null): bool + public function isUserAuthorizedForPage(UserInterface $user, PageInterface $page, ?Data $config = null): bool { /** @var PageAuthorizeEvent $event */ $event = $this->grav->dispatchEvent(new PageAuthorizeEvent($page, $user, $config)); diff --git a/plugins/login/composer.json b/plugins/login/composer.json index d70d2f5..06eb548 100644 --- a/plugins/login/composer.json +++ b/plugins/login/composer.json @@ -19,16 +19,15 @@ } ], "support": { - "email": "support@example.org", "issues": "https://github.com/getgrav/grav-plugin-login/issues", - "irc": "https://gitter.im/getgrav/grav", - "forum": "http://getgrav.org/forum", + "chat": "https://getgrav.org/discord", + "forum": "https://getgrav.org/forum", "docs": "https://github.com/getgrav/grav-plugin-login/blob/master/README.md" }, "require": { "php": ">=7.3.6", "ext-json": "*", - "birke/rememberme": "^1.0", + "mober/rememberme": "^1.0", "robthree/twofactorauth": "^1.8", "bacon/bacon-qr-code": "^2.0" }, diff --git a/plugins/login/composer.lock b/plugins/login/composer.lock index e17f2c2..8dc05a8 100644 --- a/plugins/login/composer.lock +++ b/plugins/login/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4b4e3b2b0fa4e83f6fd0a4b487242525", + "content-hash": "1678b42239c4c53eaa1d73847b5c4039", "packages": [ { "name": "bacon/bacon-qr-code", @@ -61,16 +61,66 @@ "time": "2022-12-07T17:46:57+00:00" }, { - "name": "birke/rememberme", + "name": "dasprid/enum", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.6" + }, + "time": "2024-08-09T14:30:48+00:00" + }, + { + "name": "mober/rememberme", "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/gbirke/rememberme.git", + "url": "https://github.com/m-ober/rememberme.git", "reference": "810473852eb4823098e47e23376a19b77ba0c165" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gbirke/rememberme/zipball/810473852eb4823098e47e23376a19b77ba0c165", + "url": "https://api.github.com/repos/m-ober/rememberme/zipball/810473852eb4823098e47e23376a19b77ba0c165", "reference": "810473852eb4823098e47e23376a19b77ba0c165", "shasum": "" }, @@ -104,61 +154,11 @@ "security" ], "support": { - "issues": "https://github.com/gbirke/rememberme/issues", - "source": "https://github.com/gbirke/rememberme/tree/master" + "issues": "https://github.com/m-ober/rememberme/issues", + "source": "https://github.com/m-ober/rememberme/tree/1.0.5" }, "time": "2017-02-12T12:43:00+00:00" }, - { - "name": "dasprid/enum", - "version": "1.0.4", - "source": { - "type": "git", - "url": "https://github.com/DASPRiD/Enum.git", - "reference": "8e6b6ea76eabbf19ea2bf5b67b98e1860474012f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8e6b6ea76eabbf19ea2bf5b67b98e1860474012f", - "reference": "8e6b6ea76eabbf19ea2bf5b67b98e1860474012f", - "shasum": "" - }, - "require": { - "php": ">=7.1 <9.0" - }, - "require-dev": { - "phpunit/phpunit": "^7 | ^8 | ^9", - "squizlabs/php_codesniffer": "*" - }, - "type": "library", - "autoload": { - "psr-4": { - "DASPRiD\\Enum\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Ben Scholzen 'DASPRiD'", - "email": "mail@dasprids.de", - "homepage": "https://dasprids.de/", - "role": "Developer" - } - ], - "description": "PHP 7.1 enum implementation", - "keywords": [ - "enum", - "map" - ], - "support": { - "issues": "https://github.com/DASPRiD/Enum/issues", - "source": "https://github.com/DASPRiD/Enum/tree/1.0.4" - }, - "time": "2023-03-01T18:44:03+00:00" - }, { "name": "paragonie/random_compat", "version": "v1.4.3", @@ -286,16 +286,16 @@ "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=7.3.6", "ext-json": "*" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { "php": "7.3.6" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/plugins/login/vendor/autoload.php b/plugins/login/vendor/autoload.php index d50d591..57ba62c 100644 --- a/plugins/login/vendor/autoload.php +++ b/plugins/login/vendor/autoload.php @@ -14,10 +14,7 @@ if (PHP_VERSION_ID < 50600) { echo $err; } } - trigger_error( - $err, - E_USER_ERROR - ); + throw new RuntimeException($err); } require_once __DIR__ . '/composer/autoload_real.php'; diff --git a/plugins/login/vendor/bacon/bacon-qr-code/src/Common/BitMatrix.php b/plugins/login/vendor/bacon/bacon-qr-code/src/Common/BitMatrix.php index 10bf8fe..00f04a2 100644 --- a/plugins/login/vendor/bacon/bacon-qr-code/src/Common/BitMatrix.php +++ b/plugins/login/vendor/bacon/bacon-qr-code/src/Common/BitMatrix.php @@ -46,7 +46,7 @@ class BitMatrix /** * @throws InvalidArgumentException if a dimension is smaller than zero */ - public function __construct(int $width, int $height = null) + public function __construct(int $width, ?int $height = null) { if (null === $height) { $height = $width; @@ -138,7 +138,7 @@ class BitMatrix /** * A fast method to retrieve one row of data from the matrix as a BitArray. */ - public function getRow(int $y, BitArray $row = null) : BitArray + public function getRow(int $y, ?BitArray $row = null) : BitArray { if (null === $row || $row->getSize() < $this->width) { $row = new BitArray($this->width); diff --git a/plugins/login/vendor/bacon/bacon-qr-code/src/Common/ReedSolomonCodec.php b/plugins/login/vendor/bacon/bacon-qr-code/src/Common/ReedSolomonCodec.php index a5aad0b..5d986e6 100644 --- a/plugins/login/vendor/bacon/bacon-qr-code/src/Common/ReedSolomonCodec.php +++ b/plugins/login/vendor/bacon/bacon-qr-code/src/Common/ReedSolomonCodec.php @@ -222,7 +222,7 @@ final class ReedSolomonCodec /** * Decodes received data. */ - public function decode(SplFixedArray $data, SplFixedArray $erasures = null) : ?int + public function decode(SplFixedArray $data, ?SplFixedArray $erasures = null) : ?int { // This speeds up the initialization a bit. $numRootsPlusOne = SplFixedArray::fromArray(array_fill(0, $this->numRoots + 1, 0), false); diff --git a/plugins/login/vendor/bacon/bacon-qr-code/src/Encoder/Encoder.php b/plugins/login/vendor/bacon/bacon-qr-code/src/Encoder/Encoder.php index 3208460..fece2c8 100644 --- a/plugins/login/vendor/bacon/bacon-qr-code/src/Encoder/Encoder.php +++ b/plugins/login/vendor/bacon/bacon-qr-code/src/Encoder/Encoder.php @@ -155,7 +155,7 @@ final class Encoder /** * Chooses the best mode for a given content. */ - private static function chooseMode(string $content, string $encoding = null) : Mode + private static function chooseMode(string $content, ?string $encoding = null) : Mode { if (null !== $encoding && 0 === strcasecmp($encoding, 'SHIFT-JIS')) { return self::isOnlyDoubleByteKanji($content) ? Mode::KANJI() : Mode::BYTE(); diff --git a/plugins/login/vendor/composer/ClassLoader.php b/plugins/login/vendor/composer/ClassLoader.php index a72151c..7824d8f 100644 --- a/plugins/login/vendor/composer/ClassLoader.php +++ b/plugins/login/vendor/composer/ClassLoader.php @@ -45,35 +45,34 @@ class ClassLoader /** @var \Closure(string):void */ private static $includeFile; - /** @var ?string */ + /** @var string|null */ private $vendorDir; // PSR-4 /** - * @var array[] - * @psalm-var array> + * @var array> */ private $prefixLengthsPsr4 = array(); /** - * @var array[] - * @psalm-var array> + * @var array> */ private $prefixDirsPsr4 = array(); /** - * @var array[] - * @psalm-var array + * @var list */ private $fallbackDirsPsr4 = array(); // PSR-0 /** - * @var array[] - * @psalm-var array> + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> */ private $prefixesPsr0 = array(); /** - * @var array[] - * @psalm-var array + * @var list */ private $fallbackDirsPsr0 = array(); @@ -81,8 +80,7 @@ class ClassLoader private $useIncludePath = false; /** - * @var string[] - * @psalm-var array + * @var array */ private $classMap = array(); @@ -90,21 +88,20 @@ class ClassLoader private $classMapAuthoritative = false; /** - * @var bool[] - * @psalm-var array + * @var array */ private $missingClasses = array(); - /** @var ?string */ + /** @var string|null */ private $apcuPrefix; /** - * @var self[] + * @var array */ private static $registeredLoaders = array(); /** - * @param ?string $vendorDir + * @param string|null $vendorDir */ public function __construct($vendorDir = null) { @@ -113,7 +110,7 @@ class ClassLoader } /** - * @return string[] + * @return array> */ public function getPrefixes() { @@ -125,8 +122,7 @@ class ClassLoader } /** - * @return array[] - * @psalm-return array> + * @return array> */ public function getPrefixesPsr4() { @@ -134,8 +130,7 @@ class ClassLoader } /** - * @return array[] - * @psalm-return array + * @return list */ public function getFallbackDirs() { @@ -143,8 +138,7 @@ class ClassLoader } /** - * @return array[] - * @psalm-return array + * @return list */ public function getFallbackDirsPsr4() { @@ -152,8 +146,7 @@ class ClassLoader } /** - * @return string[] Array of classname => path - * @psalm-return array + * @return array Array of classname => path */ public function getClassMap() { @@ -161,8 +154,7 @@ class ClassLoader } /** - * @param string[] $classMap Class to filename map - * @psalm-param array $classMap + * @param array $classMap Class to filename map * * @return void */ @@ -179,24 +171,25 @@ class ClassLoader * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { + $paths = (array) $paths; if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( - (array) $paths, + $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, - (array) $paths + $paths ); } @@ -205,19 +198,19 @@ class ClassLoader $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; + $this->prefixesPsr0[$first][$prefix] = $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, + $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], - (array) $paths + $paths ); } } @@ -226,9 +219,9 @@ class ClassLoader * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * @@ -236,17 +229,18 @@ class ClassLoader */ public function addPsr4($prefix, $paths, $prepend = false) { + $paths = (array) $paths; if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( - (array) $paths, + $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, - (array) $paths + $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { @@ -256,18 +250,18 @@ class ClassLoader throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; + $this->prefixDirsPsr4[$prefix] = $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, + $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], - (array) $paths + $paths ); } } @@ -276,8 +270,8 @@ class ClassLoader * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 base directories + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories * * @return void */ @@ -294,8 +288,8 @@ class ClassLoader * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * @@ -481,9 +475,9 @@ class ClassLoader } /** - * Returns the currently registered loaders indexed by their corresponding vendor directories. + * Returns the currently registered loaders keyed by their corresponding vendor directories. * - * @return self[] + * @return array */ public static function getRegisteredLoaders() { diff --git a/plugins/login/vendor/composer/InstalledVersions.php b/plugins/login/vendor/composer/InstalledVersions.php index 51e734a..2052022 100644 --- a/plugins/login/vendor/composer/InstalledVersions.php +++ b/plugins/login/vendor/composer/InstalledVersions.php @@ -26,12 +26,23 @@ use Composer\Semver\VersionParser; */ class InstalledVersions { + /** + * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to + * @internal + */ + private static $selfDir = null; + /** * @var mixed[]|null * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null */ private static $installed; + /** + * @var bool + */ + private static $installedIsLocalDir; + /** * @var bool|null */ @@ -309,6 +320,24 @@ class InstalledVersions { self::$installed = $data; self::$installedByVendor = array(); + + // when using reload, we disable the duplicate protection to ensure that self::$installed data is + // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, + // so we have to assume it does not, and that may result in duplicate data being returned when listing + // all installed packages for example + self::$installedIsLocalDir = false; + } + + /** + * @return string + */ + private static function getSelfDir() + { + if (self::$selfDir === null) { + self::$selfDir = strtr(__DIR__, '\\', '/'); + } + + return self::$selfDir; } /** @@ -322,19 +351,27 @@ class InstalledVersions } $installed = array(); + $copiedLocalDir = false; if (self::$canGetVendors) { + $selfDir = self::getSelfDir(); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + $vendorDir = strtr($vendorDir, '\\', '/'); if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ $required = require $vendorDir.'/composer/installed.php'; - $installed[] = self::$installedByVendor[$vendorDir] = $required; - if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { - self::$installed = $installed[count($installed) - 1]; + self::$installedByVendor[$vendorDir] = $required; + $installed[] = $required; + if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { + self::$installed = $required; + self::$installedIsLocalDir = true; } } + if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { + $copiedLocalDir = true; + } } } @@ -350,7 +387,7 @@ class InstalledVersions } } - if (self::$installed !== array()) { + if (self::$installed !== array() && !$copiedLocalDir) { $installed[] = self::$installed; } diff --git a/plugins/login/vendor/composer/autoload_psr4.php b/plugins/login/vendor/composer/autoload_psr4.php index f0fc8a1..cd42515 100644 --- a/plugins/login/vendor/composer/autoload_psr4.php +++ b/plugins/login/vendor/composer/autoload_psr4.php @@ -10,6 +10,6 @@ return array( 'Grav\\Plugin\\Login\\' => array($baseDir . '/classes'), 'Grav\\Plugin\\Console\\' => array($baseDir . '/cli'), 'DASPRiD\\Enum\\' => array($vendorDir . '/dasprid/enum/src'), - 'Birke\\' => array($vendorDir . '/birke/rememberme/src'), + 'Birke\\' => array($vendorDir . '/mober/rememberme/src'), 'BaconQrCode\\' => array($vendorDir . '/bacon/bacon-qr-code/src'), ); diff --git a/plugins/login/vendor/composer/autoload_static.php b/plugins/login/vendor/composer/autoload_static.php index 0fe183b..23a207f 100644 --- a/plugins/login/vendor/composer/autoload_static.php +++ b/plugins/login/vendor/composer/autoload_static.php @@ -50,7 +50,7 @@ class ComposerStaticIniteed5e5cf0aa1e2139f2db7445511e366 ), 'Birke\\' => array ( - 0 => __DIR__ . '/..' . '/birke/rememberme/src', + 0 => __DIR__ . '/..' . '/mober/rememberme/src', ), 'BaconQrCode\\' => array ( diff --git a/plugins/login/vendor/composer/installed.json b/plugins/login/vendor/composer/installed.json index 69e393c..835b047 100644 --- a/plugins/login/vendor/composer/installed.json +++ b/plugins/login/vendor/composer/installed.json @@ -58,17 +58,70 @@ "install-path": "../bacon/bacon-qr-code" }, { - "name": "birke/rememberme", + "name": "dasprid/enum", + "version": "1.0.6", + "version_normalized": "1.0.6.0", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "*" + }, + "time": "2024-08-09T14:30:48+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.6" + }, + "install-path": "../dasprid/enum" + }, + { + "name": "mober/rememberme", "version": "1.0.5", "version_normalized": "1.0.5.0", "source": { "type": "git", - "url": "https://github.com/gbirke/rememberme.git", + "url": "https://github.com/m-ober/rememberme.git", "reference": "810473852eb4823098e47e23376a19b77ba0c165" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gbirke/rememberme/zipball/810473852eb4823098e47e23376a19b77ba0c165", + "url": "https://api.github.com/repos/m-ober/rememberme/zipball/810473852eb4823098e47e23376a19b77ba0c165", "reference": "810473852eb4823098e47e23376a19b77ba0c165", "shasum": "" }, @@ -103,60 +156,11 @@ "remember", "security" ], - "install-path": "../birke/rememberme" - }, - { - "name": "dasprid/enum", - "version": "1.0.4", - "version_normalized": "1.0.4.0", - "source": { - "type": "git", - "url": "https://github.com/DASPRiD/Enum.git", - "reference": "8e6b6ea76eabbf19ea2bf5b67b98e1860474012f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8e6b6ea76eabbf19ea2bf5b67b98e1860474012f", - "reference": "8e6b6ea76eabbf19ea2bf5b67b98e1860474012f", - "shasum": "" - }, - "require": { - "php": ">=7.1 <9.0" - }, - "require-dev": { - "phpunit/phpunit": "^7 | ^8 | ^9", - "squizlabs/php_codesniffer": "*" - }, - "time": "2023-03-01T18:44:03+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "DASPRiD\\Enum\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Ben Scholzen 'DASPRiD'", - "email": "mail@dasprids.de", - "homepage": "https://dasprids.de/", - "role": "Developer" - } - ], - "description": "PHP 7.1 enum implementation", - "keywords": [ - "enum", - "map" - ], "support": { - "issues": "https://github.com/DASPRiD/Enum/issues", - "source": "https://github.com/DASPRiD/Enum/tree/1.0.4" + "issues": "https://github.com/m-ober/rememberme/issues", + "source": "https://github.com/m-ober/rememberme/tree/1.0.5" }, - "install-path": "../dasprid/enum" + "install-path": "../mober/rememberme" }, { "name": "paragonie/random_compat", diff --git a/plugins/login/vendor/composer/installed.php b/plugins/login/vendor/composer/installed.php index 3706baa..99315a2 100644 --- a/plugins/login/vendor/composer/installed.php +++ b/plugins/login/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'getgrav/grav-plugin-login', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '7752526595e5fa1aba7881e206537064ec48522d', + 'reference' => '329036f90794e6dcbacff3a9ac73bb1772a0b6b3', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -19,19 +19,10 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'birke/rememberme' => array( - 'pretty_version' => '1.0.5', - 'version' => '1.0.5.0', - 'reference' => '810473852eb4823098e47e23376a19b77ba0c165', - 'type' => 'library', - 'install_path' => __DIR__ . '/../birke/rememberme', - 'aliases' => array(), - 'dev_requirement' => false, - ), 'dasprid/enum' => array( - 'pretty_version' => '1.0.4', - 'version' => '1.0.4.0', - 'reference' => '8e6b6ea76eabbf19ea2bf5b67b98e1860474012f', + 'pretty_version' => '1.0.6', + 'version' => '1.0.6.0', + 'reference' => '8dfd07c6d2cf31c8da90c53b83c026c7696dda90', 'type' => 'library', 'install_path' => __DIR__ . '/../dasprid/enum', 'aliases' => array(), @@ -40,12 +31,21 @@ 'getgrav/grav-plugin-login' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '7752526595e5fa1aba7881e206537064ec48522d', + 'reference' => '329036f90794e6dcbacff3a9ac73bb1772a0b6b3', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), + 'mober/rememberme' => array( + 'pretty_version' => '1.0.5', + 'version' => '1.0.5.0', + 'reference' => '810473852eb4823098e47e23376a19b77ba0c165', + 'type' => 'library', + 'install_path' => __DIR__ . '/../mober/rememberme', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'paragonie/random_compat' => array( 'pretty_version' => 'v1.4.3', 'version' => '1.4.3.0', diff --git a/plugins/login/vendor/composer/platform_check.php b/plugins/login/vendor/composer/platform_check.php index 0109125..c051a36 100644 --- a/plugins/login/vendor/composer/platform_check.php +++ b/plugins/login/vendor/composer/platform_check.php @@ -19,8 +19,7 @@ if ($issues) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR + throw new \RuntimeException( + 'Composer detected issues in your platform: ' . implode(' ', $issues) ); } diff --git a/plugins/login/vendor/dasprid/enum/.github/workflows/tests.yml b/plugins/login/vendor/dasprid/enum/.github/workflows/tests.yml deleted file mode 100644 index 94b2562..0000000 --- a/plugins/login/vendor/dasprid/enum/.github/workflows/tests.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Tests - -on: [push, pull_request] - -jobs: - php-tests: - runs-on: ${{ matrix.os }} - strategy: - fail-fast: true - matrix: - php: [8.2, 8.1, 8.0, 7.4, 7.3, 7.2, 7.1] - dependency-version: [prefer-stable] - os: [ubuntu-latest, windows-latest] - - name: ${{ matrix.os }} - PHP${{ matrix.php }} - ${{ matrix.dependency-version }} - - steps: - - name: Set git to use LF - run: | - git config --global core.autocrlf false - git config --global core.eol lf - - - name: Checkout code - uses: actions/checkout@v3 - - - name: Cache dependencies - uses: actions/cache@v3 - with: - path: ~/.composer/cache/files - key: dependencies-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }} - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php }} - coverage: none - - - name: Install dependencies - run: | - composer update --${{ matrix.dependency-version }} --prefer-dist --no-interaction - - - name: Execute tests - run: vendor/bin/phpunit - - - name: Code Sniffer - run: vendor/bin/phpcs - diff --git a/plugins/login/vendor/dasprid/enum/composer.json b/plugins/login/vendor/dasprid/enum/composer.json index 133e279..a099aba 100644 --- a/plugins/login/vendor/dasprid/enum/composer.json +++ b/plugins/login/vendor/dasprid/enum/composer.json @@ -18,7 +18,7 @@ "php": ">=7.1 <9.0" }, "require-dev": { - "phpunit/phpunit": "^7 | ^8 | ^9", + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", "squizlabs/php_codesniffer": "*" }, "autoload": { diff --git a/plugins/login/vendor/dasprid/enum/phpunit.xml.dist b/plugins/login/vendor/dasprid/enum/phpunit.xml.dist deleted file mode 100644 index 307a430..0000000 --- a/plugins/login/vendor/dasprid/enum/phpunit.xml.dist +++ /dev/null @@ -1,17 +0,0 @@ - - - - - ./test - - - - - - src - - - diff --git a/plugins/login/vendor/dasprid/enum/test/AbstractEnumTest.php b/plugins/login/vendor/dasprid/enum/test/AbstractEnumTest.php deleted file mode 100644 index 58ca913..0000000 --- a/plugins/login/vendor/dasprid/enum/test/AbstractEnumTest.php +++ /dev/null @@ -1,121 +0,0 @@ -getProperty('constants'); - $constantsProperty->setAccessible(true); - $constantsProperty->setValue([]); - - $valuesProperty = $reflectionClass->getProperty('values'); - $valuesProperty->setAccessible(true); - $valuesProperty->setValue([]); - - $allValuesLoadedProperty = $reflectionClass->getProperty('allValuesLoaded'); - $allValuesLoadedProperty->setAccessible(true); - $allValuesLoadedProperty->setValue([]); - } - - public function testToString() : void - { - $weekday = WeekDay::FRIDAY(); - self::assertSame('FRIDAY', (string) $weekday); - } - - public function testName() : void - { - $this->assertSame('WEDNESDAY', WeekDay::WEDNESDAY()->name()); - } - - public function testOrdinal() : void - { - $this->assertSame(2, WeekDay::WEDNESDAY()->ordinal()); - } - - public function testSameInstanceIsReturned() : void - { - self::assertSame(WeekDay::FRIDAY(), WeekDay::FRIDAY()); - } - - public static function testValueOf() : void - { - self::assertSame(WeekDay::FRIDAY(), WeekDay::valueOf('FRIDAY')); - } - - public function testValueOfInvalidConstant() : void - { - $this->expectException(IllegalArgumentException::class); - WeekDay::valueOf('CATURDAY'); - } - - public function testExceptionOnCloneAttempt() : void - { - $this->expectException(CloneNotSupportedException::class); - clone WeekDay::FRIDAY(); - } - - public function testExceptionOnSerializeAttempt() : void - { - $this->expectException(SerializeNotSupportedException::class); - serialize(WeekDay::FRIDAY()); - } - - public function testExceptionOnUnserializeAttempt() : void - { - $this->expectException(UnserializeNotSupportedException::class); - unserialize('O:24:"DASPRiD\\EnumTest\\WeekDay":0:{}'); - } - - public function testReturnValueOfValuesIsSortedByOrdinal() : void - { - // Initialize some week days out of order - WeekDay::SATURDAY(); - WeekDay::TUESDAY(); - - $ordinals = array_values(array_map(function (WeekDay $weekDay) : int { - return $weekDay->ordinal(); - }, WeekDay::values())); - - self::assertSame([0, 1, 2, 3, 4, 5, 6], $ordinals); - - $cachedOrdinals = array_values(array_map(function (WeekDay $weekDay) : int { - return $weekDay->ordinal(); - }, WeekDay::values())); - $this->assertSame($ordinals, $cachedOrdinals); - } - - public function testCompareTo() : void - { - $this->assertSame(-4, WeekDay::WEDNESDAY()->compareTo(WeekDay::SUNDAY())); - $this->assertSame(4, WeekDay::SUNDAY()->compareTo(WeekDay::WEDNESDAY())); - $this->assertSame(0, WeekDay::WEDNESDAY()->compareTo(WeekDay::WEDNESDAY())); - } - - public function testCompareToWrongEnum() : void - { - $this->expectException(MismatchException::class); - WeekDay::MONDAY()->compareTo(Planet::EARTH()); - } - - public function testParameterizedEnum() : void - { - $planet = Planet::EARTH(); - $this->assertSame(5.976e+24, $planet->mass()); - $this->assertSame(6.37814e6, $planet->radius()); - } -} diff --git a/plugins/login/vendor/dasprid/enum/test/EnumMapTest.php b/plugins/login/vendor/dasprid/enum/test/EnumMapTest.php deleted file mode 100644 index d51a86c..0000000 --- a/plugins/login/vendor/dasprid/enum/test/EnumMapTest.php +++ /dev/null @@ -1,243 +0,0 @@ -expectException(IllegalArgumentException::class); - new EnumMap(stdClass::class, 'string', false); - } - - public function testUnexpectedKeyType() : void - { - $this->expectException(ExpectationException::class); - $map = new EnumMap(WeekDay::class, 'string', false); - $map->expect(Planet::class, 'string', false); - } - - public function testUnexpectedValueType() : void - { - $this->expectException(ExpectationException::class); - $map = new EnumMap(WeekDay::class, 'string', false); - $map->expect(WeekDay::class, 'int', false); - } - - public function testUnexpectedNullableValueType() : void - { - $this->expectException(ExpectationException::class); - $map = new EnumMap(WeekDay::class, 'string', true); - $map->expect(WeekDay::class, 'string', false); - } - - public function testExpectedTypes() : void - { - $map = new EnumMap(WeekDay::class, 'string', true); - $map->expect(WeekDay::class, 'string', true); - $this->addToAssertionCount(1); - } - - public function testSize() : void - { - $map = new EnumMap(WeekDay::class, 'string', true); - $this->assertSame(0, $map->size()); - $map->put(WeekDay::MONDAY(), 'foo'); - $this->assertSame(1, $map->size()); - } - - public function testContainsValue() : void - { - $map = new EnumMap(WeekDay::class, 'string', true); - $this->assertFalse($map->containsValue('foo')); - $map->put(WeekDay::TUESDAY(), 'foo'); - $this->assertTrue($map->containsValue('foo')); - $this->assertFalse($map->containsValue(null)); - $map->put(WeekDay::WEDNESDAY(), null); - $this->assertTrue($map->containsValue(null)); - } - - public function testContainsKey() : void - { - $map = new EnumMap(WeekDay::class, 'string', true); - $this->assertFalse($map->containsKey(WeekDay::TUESDAY())); - $map->put(WeekDay::TUESDAY(), 'foo'); - $this->assertTrue($map->containsKey(WeekDay::TUESDAY())); - $map->put(WeekDay::WEDNESDAY(), null); - $this->assertTrue($map->containsKey(WeekDay::WEDNESDAY())); - } - - public function testPutAndGet() : void - { - $map = new EnumMap(WeekDay::class, 'string', true); - $map->put(WeekDay::TUESDAY(), 'foo'); - $map->put(WeekDay::FRIDAY(), null); - $this->assertSame('foo', $map->get(WeekDay::TUESDAY())); - $this->assertSame(null, $map->get(WeekDay::WEDNESDAY())); - $this->assertSame(null, $map->get(WeekDay::FRIDAY())); - } - - public function testPutInvalidKey() : void - { - $this->expectException(IllegalArgumentException::class); - $map = new EnumMap(WeekDay::class, 'string', true); - $map->put(Planet::MARS(), 'foo'); - } - - public function invalidValues() : array - { - return [ - ['bool', null, false], - ['bool', 0], - ['boolean', 0], - ['int', 2.4], - ['integer', 5.3], - ['float', 3], - ['double', 7], - ['string', 1], - ['object', 1], - ['array', 1], - [stdClass::class, 1], - ]; - } - - /** - * @dataProvider invalidValues - * @param mixed $value - */ - public function testPutInvalidValue(string $valueType, $value, bool $allowNull = true) : void - { - $this->expectException(IllegalArgumentException::class); - $map = new EnumMap(WeekDay::class, $valueType, $allowNull); - $map->put(WeekDay::TUESDAY(), $value); - } - - public function validValues() : array - { - return [ - ['bool', null], - ['mixed', 'foo'], - ['mixed', 1], - ['mixed', new stdClass()], - ['bool', true], - ['boolean', false], - ['int', 1], - ['integer', 4], - ['float', 2.5], - ['double', 6.4], - ['string', 'foo'], - ['object', new stdClass()], - ['array', ['foo']], - [stdClass::class, new stdClass()], - ]; - } - - /** - * @dataProvider validValues - * @param mixed $value - */ - public function testPutValidValue(string $valueType, $value, bool $allowNull = true) : void - { - $map = new EnumMap(WeekDay::class, $valueType, $allowNull); - $map->put(WeekDay::TUESDAY(), $value); - $this->addToAssertionCount(1); - } - - public function testRemove() : void - { - $map = new EnumMap(WeekDay::class, 'string', true); - $map->put(WeekDay::TUESDAY(), 'foo'); - $map->remove(WeekDay::TUESDAY()); - $map->remove(WeekDay::WEDNESDAY()); - $this->assertSame(null, $map->get(WeekDay::TUESDAY())); - $this->assertSame(0, $map->size()); - } - - public function testClear() : void - { - $map = new EnumMap(WeekDay::class, 'string', true); - $map->put(WeekDay::TUESDAY(), 'foo'); - $map->clear(); - $this->assertSame(null, $map->get(WeekDay::TUESDAY())); - $this->assertSame(0, $map->size()); - } - - public function testEqualsWithSameInstance() : void - { - $map = new EnumMap(WeekDay::class, 'string', true); - $this->assertTrue($map->equals($map)); - } - - public function testEqualsWithDifferentSize() : void - { - $mapA = new EnumMap(WeekDay::class, 'string', true); - $mapB = new EnumMap(WeekDay::class, 'string', true); - $mapB->put(WeekDay::MONDAY(), 'foo'); - - $this->assertFalse($mapA->equals($mapB)); - } - - public function testEqualsWithDifferentValues() : void - { - $mapA = new EnumMap(WeekDay::class, 'string', true); - $mapA->put(WeekDay::MONDAY(), 'foo'); - $mapB = new EnumMap(WeekDay::class, 'string', true); - $mapB->put(WeekDay::MONDAY(), 'bar'); - - $this->assertFalse($mapA->equals($mapB)); - } - - public function testEqualsWithDifferentConstants() : void - { - $mapA = new EnumMap(WeekDay::class, 'string', true); - $mapA->put(WeekDay::MONDAY(), 'foo'); - $mapB = new EnumMap(WeekDay::class, 'string', true); - $mapB->put(WeekDay::TUESDAY(), 'foo'); - - $this->assertFalse($mapA->equals($mapB)); - } - - public function testValues() : void - { - $map = new EnumMap(WeekDay::class, 'string', true); - $this->assertSame([], $map->values()); - - $map->put(WeekDay::FRIDAY(), 'foo'); - $map->put(WeekDay::TUESDAY(), 'bar'); - $map->put(WeekDay::SUNDAY(), null); - - $this->assertSame(['bar', 'foo', null], $map->values()); - } - - public function testSerializeAndUnserialize() : void - { - $mapA = new EnumMap(WeekDay::class, 'string', true); - $mapA->put(WeekDay::MONDAY(), 'foo'); - $mapB = unserialize(serialize($mapA)); - - $this->assertTrue($mapA->equals($mapB)); - } - - public function testIterator() : void - { - $map = new EnumMap(WeekDay::class, 'string', true); - $map->put(WeekDay::FRIDAY(), 'foo'); - $map->put(WeekDay::TUESDAY(), 'bar'); - $map->put(WeekDay::SUNDAY(), null); - - $result = []; - - foreach ($map as $key => $value) { - $result[$key->ordinal()] = $value; - } - - $this->assertSame([1 => 'bar', 4 => 'foo', 6 => null], $result); - } -} diff --git a/plugins/login/vendor/dasprid/enum/test/NullValueTest.php b/plugins/login/vendor/dasprid/enum/test/NullValueTest.php deleted file mode 100644 index 9f70640..0000000 --- a/plugins/login/vendor/dasprid/enum/test/NullValueTest.php +++ /dev/null @@ -1,31 +0,0 @@ -expectException(CloneNotSupportedException::class); - clone NullValue::instance(); - } - - public function testExceptionOnSerializeAttempt() : void - { - $this->expectException(SerializeNotSupportedException::class); - serialize(NullValue::instance()); - } - - public function testExceptionOnUnserializeAttempt() : void - { - $this->expectException(UnserializeNotSupportedException::class); - unserialize('O:22:"DASPRiD\\Enum\\NullValue":0:{}'); - } -} diff --git a/plugins/login/vendor/dasprid/enum/test/Planet.php b/plugins/login/vendor/dasprid/enum/test/Planet.php deleted file mode 100644 index 3c44c1d..0000000 --- a/plugins/login/vendor/dasprid/enum/test/Planet.php +++ /dev/null @@ -1,73 +0,0 @@ -mass = $mass; - $this->radius = $radius; - } - - public function mass() : float - { - return $this->mass; - } - - public function radius() : float - { - return $this->radius; - } - - public function surfaceGravity() : float - { - return self::G * $this->mass / ($this->radius * $this->radius); - } - - public function surfaceWeight(float $otherMass) : float - { - return $otherMass * $this->surfaceGravity(); - } -} diff --git a/plugins/login/vendor/dasprid/enum/test/WeekDay.php b/plugins/login/vendor/dasprid/enum/test/WeekDay.php deleted file mode 100644 index 70b8db5..0000000 --- a/plugins/login/vendor/dasprid/enum/test/WeekDay.php +++ /dev/null @@ -1,26 +0,0 @@ -url = $url; $this->expectedtimeformat = $expectedtimeformat; diff --git a/plugins/login/vendor/robthree/twofactorauth/lib/TwoFactorAuth.php b/plugins/login/vendor/robthree/twofactorauth/lib/TwoFactorAuth.php index c94f806..facb076 100644 --- a/plugins/login/vendor/robthree/twofactorauth/lib/TwoFactorAuth.php +++ b/plugins/login/vendor/robthree/twofactorauth/lib/TwoFactorAuth.php @@ -60,7 +60,7 @@ class TwoFactorAuth * @param ?IRNGProvider $rngprovider * @param ?ITimeProvider $timeprovider */ - public function __construct($issuer = null, $digits = 6, $period = 30, $algorithm = 'sha1', IQRCodeProvider $qrcodeprovider = null, IRNGProvider $rngprovider = null, ITimeProvider $timeprovider = null) + public function __construct($issuer = null, $digits = 6, $period = 30, $algorithm = 'sha1', ?IQRCodeProvider $qrcodeprovider = null, ?IRNGProvider $rngprovider = null, ?ITimeProvider $timeprovider = null) { $this->issuer = $issuer; if (!is_int($digits) || $digits <= 0) { @@ -214,7 +214,7 @@ class TwoFactorAuth * * @return void */ - public function ensureCorrectTime(array $timeproviders = null, $leniency = 5) + public function ensureCorrectTime(?array $timeproviders = null, $leniency = 5) { if ($timeproviders === null) { $timeproviders = array( diff --git a/plugins/problems/CHANGELOG.md b/plugins/problems/CHANGELOG.md index 7b9c7a5..e89e8cb 100644 --- a/plugins/problems/CHANGELOG.md +++ b/plugins/problems/CHANGELOG.md @@ -1,3 +1,32 @@ +# v2.2.3 +## 10/29/2025 + +1. [](#improved) + * `intl` php package is no longer required to install Grav + +# v2.2.2 +## 03/21/2025 + +1. [](#bugfix) + * Fix permission warning on Windows [#46](https://github.com/getgrav/grav-plugin-problems/pull/46) + +# v2.2.1 +## 03/21/2025 + +1. [](#bugfix) + * Fix path check on windows [#44](https://github.com/getgrav/grav-plugin-problems/pull/44) + +# v2.2.0 +## 03/20/2025 + +1. [](#new) + * Extended php module checks [#38](https://github.com/getgrav/grav-plugin-problems/pull/38) +1. [](#improved) + * Make sure the Essential Folders are listed without extra '/' in front of them + * Updated `http://` links to `https://` across files [#41](https://github.com/getgrav/grav-plugin-problems/pull/41) + * Clarify Apache module detection text [#40](https://github.com/getgrav/grav-plugin-problems/pull/40) + * Ensure essential folder are listed without extra `/` [#39](https://github.com/getgrav/grav-plugin-problems/pull/39) + # v2.1.2 ## 10/22/2024 diff --git a/plugins/problems/README.md b/plugins/problems/README.md index ad7fd6f..342632a 100644 --- a/plugins/problems/README.md +++ b/plugins/problems/README.md @@ -4,7 +4,7 @@ ![Problems](assets/readme_1.jpg) -`Problems` is a [Grav](http://github.com/getgrav/grav) Plugin and allows to detect issues. +`Problems` is a [Grav](https://github.com/getgrav/grav) Plugin and allows to detect issues. This plugin is included in any package distributed that contains Grav. If you decide to clone Grav from GitHub, you will most likely want to install this. @@ -14,7 +14,7 @@ Installing the Problems plugin can be done in one of two ways. Our GPM (Grav Pac ## GPM Installation (Preferred) -The simplest way to install this plugin is via the [Grav Package Manager (GPM)](http://learn.getgrav.org/advanced/grav-gpm) through your system's Terminal (also called the command line). From the root of your Grav install type: +The simplest way to install this plugin is via the [Grav Package Manager (GPM)](https://learn.getgrav.org/advanced/grav-gpm) through your system's Terminal (also called the command line). From the root of your Grav install type: bin/gpm install problems @@ -22,13 +22,13 @@ This will install the Problems plugin into your `/user/plugins` directory within ## Manual Installation -To install this plugin, just download the zip version of this repository and unzip it under `/your/site/grav/user/plugins`. Then, rename the folder to `problems`. You can find these files either on [GitHub](https://github.com/getgrav/grav-plugin-problems) or via [GetGrav.org](http://getgrav.org/downloads/plugins#extras). +To install this plugin, just download the zip version of this repository and unzip it under `/your/site/grav/user/plugins`. Then, rename the folder to `problems`. You can find these files either on [GitHub](https://github.com/getgrav/grav-plugin-problems) or via [GetGrav.org](https://getgrav.org/downloads/plugins#extras). You should now have all the plugin files under /your/site/grav/user/plugins/problems -> NOTE: This plugin is a modular component for Grav which requires [Grav](http://github.com/getgrav/grav), the [Error](https://github.com/getgrav/grav-plugin-error) and [Problems](https://github.com/getgrav/grav-plugin-problems) plugins, and a theme to be installed in order to operate. +> NOTE: This plugin is a modular component for Grav which requires [Grav](https://github.com/getgrav/grav), the [Error](https://github.com/getgrav/grav-plugin-error) and [Problems](https://github.com/getgrav/grav-plugin-problems) plugins, and a theme to be installed in order to operate. # Usage diff --git a/plugins/problems/blueprints.yaml b/plugins/problems/blueprints.yaml index 09aa5b5..857ae64 100644 --- a/plugins/problems/blueprints.yaml +++ b/plugins/problems/blueprints.yaml @@ -1,13 +1,13 @@ name: Problems slug: problems type: plugin -version: 2.1.2 +version: 2.2.3 description: Detects and reports problems found in the site. icon: exclamation-circle author: name: Team Grav email: devs@getgrav.org - url: http://getgrav.org + url: https://getgrav.org homepage: https://github.com/getgrav/grav-plugin-problems keywords: problems, plugin, detector, assistant, required bugs: https://github.com/getgrav/grav-plugin-problems/issues diff --git a/plugins/problems/classes/Problems/Apache.php b/plugins/problems/classes/Problems/Apache.php index 443ed66..f18d2c6 100644 --- a/plugins/problems/classes/Problems/Apache.php +++ b/plugins/problems/classes/Problems/Apache.php @@ -52,7 +52,7 @@ class Apache extends Problem $this->details = ['errors' => $apache_errors, 'success' => $apache_success]; } else { - $this->msg = 'Apache not installed, skipping...'; + $this->msg = 'Apache is not installed or PHP is not installed as Apache module, skipping...'; } return $this; diff --git a/plugins/problems/classes/Problems/EssentialFolders.php b/plugins/problems/classes/Problems/EssentialFolders.php index 6491fea..80197ac 100644 --- a/plugins/problems/classes/Problems/EssentialFolders.php +++ b/plugins/problems/classes/Problems/EssentialFolders.php @@ -51,6 +51,7 @@ class EssentialFolders extends Problem foreach ($essential_folders as $file => $check_writable) { $file_path = (!preg_match('`^(/|[a-z]:[\\\/])`ui', $file) ? GRAV_ROOT . '/' : '') . $file; + $file_path = preg_replace('`^/+`', '/', $file_path); if (!is_dir($file_path)) { $file_errors[$file_path] = 'does not exist'; diff --git a/plugins/problems/classes/Problems/PHPModules.php b/plugins/problems/classes/Problems/PHPModules.php index 6abdc52..bea2515 100644 --- a/plugins/problems/classes/Problems/PHPModules.php +++ b/plugins/problems/classes/Problems/PHPModules.php @@ -11,6 +11,10 @@ use Grav\Plugin\Problems\Base\Problem; */ class PHPModules extends Problem { + protected $modules_errors = []; + protected $modules_warning = []; + protected $modules_success = []; + public function __construct() { $this->id = 'PHP Modules'; @@ -21,37 +25,57 @@ class PHPModules extends Problem $this->help = 'https://learn.getgrav.org/basics/requirements#php-requirements'; } + /** + * @param string $module PHP module name. + * @param bool $required If it is required for grav. + * @param string $module_show_name More common module name to display. + * @return void + */ + protected function check_php_module(string $module, bool $required, string $module_show_name = ''): void{ + $msg = 'PHP '; + $msg .= (($module_show_name!=='') ? $module_show_name : $module); + $msg .= ' is %s installed'; + if(extension_loaded($module)){ + $this->modules_success[$module] = sprintf($msg, 'successfully'); + }else if($required){ + $this->modules_errors[$module] = sprintf($msg, 'required but not'); + }else{ + $this->modules_warning[$module] = sprintf($msg, 'recommended but not'); + } + } + + /** + * @param string $module PHP cache module name. + * @param string $module_show_name More common module name to display. + * @return void + */ + protected function check_cache_module(string $module, string $module_show_name = ''): void{ + $msg = 'PHP (optional) Cache '; + $msg .= (($module_show_name!=='') ? $module_show_name : $module); + $msg .= ' is %s installed'; + if( extension_loaded($module) ){ + $this->modules_success[$module] = sprintf($msg, 'successfully'); + } else { + $this->modules_warning[$module] = sprintf($msg, 'not'); + } + } + /** * @return $this */ public function process() { - $modules_errors = []; - $modules_success = []; - // Check for PHP CURL library - $msg = 'PHP Curl (Data Transfer Library) is %s installed'; - if (function_exists('curl_version')) { - $modules_success['curl'] = sprintf($msg, 'successfully'); - } else { - $modules_errors['curl'] = sprintf($msg, 'required but not'); - } + $this->check_php_module('curl', true, 'Curl (Data Transfer Library)'); // Check for PHP Ctype library - $msg = 'PHP Ctype is %s installed'; - if (function_exists('ctype_print')) { - $modules_success['ctype'] = sprintf($msg, 'successfully'); - } else { - $modules_errors['ctype'] = sprintf($msg, 'required but not'); - } + $this->check_php_module('ctype', true, 'Ctype'); // Check for PHP Dom library - $msg = 'PHP DOM is %s installed'; - if (class_exists('DOMDocument')) { - $modules_success['dom'] = sprintf($msg, 'successfully'); - } else { - $modules_errors['dom'] = sprintf($msg, 'required but not'); - } + $this->check_php_module('dom', true, 'DOM'); + + // Check for PHP fileinfo library + $this->check_php_module('fileinfo', false); // Check for GD library $msg = 'PHP GD (Image Manipulation Library) is %s installed'; @@ -76,73 +100,68 @@ class PHPModules extends Problem } if ($problems_found) { - $msg .= ' but missing ' . $gda_msg; + $this->modules_warning['gd'] = $msg . ' but missing ' . $gda_msg; } - $modules_success['gd'] = $msg; + $this->modules_success['gd'] = $msg; } else { - $modules_errors['gd'] = sprintf($msg, 'required but not'); + $this->modules_errors['gd'] = sprintf($msg, 'required but not'); } // Check for PHP MbString library - $msg = 'PHP Mbstring (Multibyte String Library) is %s installed'; - if (extension_loaded('mbstring')) { - $modules_success['mbstring'] = sprintf($msg, 'successfully'); - } else { - $modules_errors['mbstring'] = sprintf($msg, 'required but not'); - } + $this->check_php_module('mbstring', true, 'Mbstring (Multibyte String Library)'); + + // Check for PHP iconv library + $this->check_php_module('iconv', false); + + // Check for PHP intl library + $this->check_php_module('intl', false, 'intl (Internationalization Functions)'); // Check for PHP Open SSL library - $msg = 'PHP OpenSSL (Secure Sockets Library) is %s installed'; - if (defined('OPENSSL_VERSION_TEXT') && extension_loaded('openssl')) { - $modules_success['openssl'] = sprintf($msg, 'successfully'); - } else { - $modules_errors['openssl'] = sprintf($msg, 'required but not'); - } + $this->check_php_module('openssl', true, 'OpenSSL (Secure Sockets Library)'); - // Check for PHP XML library - $msg = 'PHP JSON Library is %s installed'; - if (extension_loaded('json')) { - $modules_success['json'] = sprintf($msg, 'successfully'); - } else { - $modules_errors['json'] = sprintf($msg, 'required but not'); - } + // Check for PHP JSON library + $this->check_php_module('json', true, 'JSON Library'); - // Check for PHP XML library - $msg = 'PHP XML Library is %s installed'; - if (extension_loaded('xml')) { - $modules_success['xml'] = sprintf($msg, 'successfully'); - } else { - $modules_errors['xml'] = sprintf($msg, 'required but not'); - } + // Check for PHP libraries for symfony + $this->check_php_module('PCRE', true, 'PCRE (Perl Compatible Regular Expressions)'); + $this->check_php_module('session', true); + + // Check for PHP XML libraries + $this->check_php_module('libxml', true, 'libxml Library'); + $this->check_php_module('simplexml', true, 'SimpleXML Library'); + $this->check_php_module('xml', true, 'XML Library'); + + // Check for PHP yaml library + $this->check_php_module('yaml', false); // Check for PHP Zip library - $msg = 'PHP Zip extension is %s installed'; - if (extension_loaded('zip')) { - $modules_success['zip'] = sprintf($msg, 'successfully'); - } else { - $modules_errors['zip'] = sprintf($msg, 'required but not'); - } + $this->check_php_module('zip', true, 'Zip extension'); // Check Exif if enabled - if (Grav::instance()['config']->get('system.media.auto_metadata_exif')) { - $msg = 'PHP Exif (Exchangeable Image File Format) is %s installed'; - if (extension_loaded('exif')) { - $modules_success['exif'] = sprintf($msg, 'successfully'); - } else { - $modules_errors['exif'] = sprintf($msg, 'required but not'); - } - } + $required = Grav::instance()['config']->get('system.media.auto_metadata_exif'); + $this->check_php_module('exif', $required, 'Exif (Exchangeable Image File Format)'); - if (empty($modules_errors)) { + // Check cache modules + $this->check_cache_module('apcu', 'APC User Cache'); + $this->check_cache_module('memcache'); + $this->check_cache_module('memcached'); + $this->check_cache_module('redis'); + $this->check_cache_module('wincache', 'WinCache'); + $this->check_cache_module('zend opcache', 'Zend OPcache'); + + if (empty($this->modules_errors)) { $this->status = true; - $this->msg = 'All modules look good!'; + $this->msg = 'All required modules look good!'; + if(!empty($this->modules_warning)) { + $this->msg .= ' Some recommendations do exist.'; + } } else { $this->status = false; $this->msg = 'There were problems with required modules:'; } - $this->details = ['errors' => $modules_errors, 'success' => $modules_success]; + $this->details = ['errors' => $this->modules_errors, 'warning' => $this->modules_warning, 'success' => $this->modules_success]; return $this; } diff --git a/plugins/problems/classes/Problems/Permissions.php b/plugins/problems/classes/Problems/Permissions.php index 30eaa61..0578603 100644 --- a/plugins/problems/classes/Problems/Permissions.php +++ b/plugins/problems/classes/Problems/Permissions.php @@ -25,6 +25,12 @@ class Permissions extends Problem */ public function process() { + if (PHP_OS_FAMILY === 'Windows') { + $this->msg = 'Permission check is not available for Windows.'; + $this->status = true; + return $this; + } + umask($umask = umask(022)); $msg = 'Your default file umask is %s which %s'; diff --git a/plugins/problems/cli/CheckCommand.php b/plugins/problems/cli/CheckCommand.php index f8d0d77..6716dde 100644 --- a/plugins/problems/cli/CheckCommand.php +++ b/plugins/problems/cli/CheckCommand.php @@ -69,6 +69,7 @@ class CheckCommand extends ConsoleCommand if (is_array($details)) { $errors_row = []; + $warning_row = []; $success_row = []; if (isset($details['errors'])) { @@ -77,6 +78,12 @@ class CheckCommand extends ConsoleCommand } } + if (isset($details['warning'])) { + foreach ($details['warning'] as $key => $value) { + $warning_row[] = " {$key} → {$value}"; + } + } + if (isset($details['success'])) { foreach ($details['success'] as $key => $value) { $success_row[] = " {$key} → {$value}"; @@ -86,6 +93,10 @@ class CheckCommand extends ConsoleCommand foreach($errors_row as $e_row) { $rows[] = ['', new TableCell($e_row, array('colspan' => 3)), ]; } + + foreach($warning_row as $e_row) { + $rows[] = ['', new TableCell($e_row, array('colspan' => 3)), ]; + } foreach($success_row as $e_row) { $rows[] = ['', new TableCell($e_row, array('colspan' => 3)), ]; diff --git a/plugins/problems/templates/problems.html.twig b/plugins/problems/templates/problems.html.twig index b6f0e82..c564278 100644 --- a/plugins/problems/templates/problems.html.twig +++ b/plugins/problems/templates/problems.html.twig @@ -24,7 +24,7 @@ {% include 'reports/problems-report.html.twig' %}
diff --git a/plugins/problems/templates/reports/problems-report.html.twig b/plugins/problems/templates/reports/problems-report.html.twig index 19d212a..82e1605 100644 --- a/plugins/problems/templates/reports/problems-report.html.twig +++ b/plugins/problems/templates/reports/problems-report.html.twig @@ -18,6 +18,15 @@ {% endfor %} + {% for key,value in problem.details.warning %} + + {% endfor %} + {% for key,value in problem.details.success %}
  • - + {% if archives_show_count %} {{ items|length }} {% endif %} diff --git a/themes/quark/templates/partials/base.html.twig b/themes/quark/templates/partials/base.html.twig index 06ce352..0bcd815 100644 --- a/themes/quark/templates/partials/base.html.twig +++ b/themes/quark/templates/partials/base.html.twig @@ -19,8 +19,8 @@ {% block stylesheets %} {% do assets.addCss('theme://css-compiled/spectre'~compress) %} - {% if theme_var('spectre.exp') %}{% do assets.addCss('theme://css-compiled/spectre-exp'~compress) %}{% endif %} - {% if theme_var('spectre.icons') %}{% do assets.addCss('theme://css-compiled/spectre-icons'~compress) %}{% endif %} + {% if theme_var('spectre.exp') %}{% do assets.addCss('theme://css-compiled/spectre-exp'~compress) %}{% endif %} + {% if theme_var('spectre.icons') %}{% do assets.addCss('theme://css-compiled/spectre-icons'~compress) %}{% endif %} {% do assets.addCss('theme://css-compiled/theme'~compress) %} {% do assets.addCss('theme://css/custom.css') %} {% do assets.addCss('theme://css/line-awesome.min.css') %} @@ -55,7 +55,7 @@ {% if config.plugins.login.enabled and grav.user.username %} - + {% endif %} diff --git a/themes/quark/templates/partials/footer.html.twig b/themes/quark/templates/partials/footer.html.twig index 20f4fa8..af2f8b5 100644 --- a/themes/quark/templates/partials/footer.html.twig +++ b/themes/quark/templates/partials/footer.html.twig @@ -1,6 +1,5 @@ diff --git a/themes/quark/templates/partials/relatedpages.html.twig b/themes/quark/templates/partials/relatedpages.html.twig index c2e4daf..99e6563 100644 --- a/themes/quark/templates/partials/relatedpages.html.twig +++ b/themes/quark/templates/partials/relatedpages.html.twig @@ -5,7 +5,7 @@
  • )v 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