From 15b5dc33ae9aded412155b6b478c8040438a1df3 Mon Sep 17 00:00:00 2001 From: Riny van Tiggelen Date: Tue, 3 Sep 2024 17:44:35 +0200 Subject: [PATCH 1/4] [FEATURE] Added support for TYPO3 13, dropped support for 10 and PHP7 --- .Build/phpstan.cms10.neon | 9 - .Build/phpstan.cms11.neon | 4 + .Build/phpstan.cms12.neon | 2 + .Build/phpstan.cms13.neon | 10 + .ddev/apache/apache-site.conf | 64 ++-- .ddev/commands/host/launch-docs | 3 +- .ddev/commands/web/composer-install-dashboard | 10 + .ddev/commands/web/composer-remove-dashboard | 10 + .ddev/commands/web/composer-update-all | 10 + .ddev/commands/web/install-all | 4 +- .ddev/commands/web/install-v10 | 33 -- .ddev/commands/web/install-v11 | 13 +- .ddev/commands/web/install-v12 | 32 ++ .ddev/commands/web/install-v13 | 33 ++ .ddev/commands/web/install-v9 | 34 -- .ddev/config.yaml | 290 +++++++++++++++++- .ddev/docker-compose.docs.yaml | 3 +- .ddev/docker-compose.web.yaml | 30 +- .ddev/web-build/Dockerfile | 25 +- .github/workflows/ci.yml | 9 +- .gitignore | 3 +- CHANGELOG.md | 16 + Classes/Backend/PageLayoutHeader.php | 52 ++-- .../Controller/AbstractBackendController.php | 36 ++- Classes/Controller/AjaxController.php | 76 ++--- Classes/Controller/CrawlerController.php | 36 +-- Classes/Controller/DashboardController.php | 4 - Classes/Controller/OverviewController.php | 53 +--- .../AbstractOverviewDataProvider.php | 4 +- .../CornerstoneOverviewDataProvider.php | 2 +- .../OrphanedContentDataProvider.php | 12 +- ...WithoutDescriptionOverviewDataProvider.php | 4 +- Classes/EventListener/AbstractListener.php | 12 +- .../EventListener/RecordCanonicalListener.php | 1 - Classes/Form/Element/Cornerstone.php | 1 - .../Element/InternalLinkingSuggestion.php | 78 ++--- Classes/Form/Element/SnippetPreview.php | 18 +- Classes/Frontend/AdditionalPreviewData.php | 25 +- Classes/Hooks/BackendYoastConfig.php | 1 - Classes/MetaTag/AdvancedRobotsGenerator.php | 10 +- Classes/Pagination/ArrayPaginator.php | 135 -------- Classes/Pagination/Pagination.php | 6 +- Classes/Record/RecordRegistry.php | 4 +- Classes/Record/RecordService.php | 14 +- Classes/Service/CrawlerService.php | 32 +- Classes/Service/DbalService.php | 37 --- Classes/Service/LinkingSuggestionsService.php | 39 +-- Classes/Service/LocaleService.php | 7 +- Classes/Service/PreviewService.php | 2 +- Classes/Service/ProminentWordsService.php | 25 +- Classes/Service/SnippetPreviewService.php | 24 +- Classes/Service/UrlService.php | 8 +- .../BreadcrumbStructuredDataProvider.php | 104 ++++--- .../SiteStructuredDataProvider.php | 50 ++- .../StructuredDataProviderManager.php | 145 ++++----- Classes/Updates/MigrateDashboardWidget.php | 77 +++++ .../Updates/MigratePremiumFocusKeywords.php | 30 +- Classes/Updates/MigrateRedirects.php | 14 +- Classes/Utility/JavascriptUtility.php | 11 +- Classes/Utility/JsonConfigUtility.php | 8 +- Classes/Utility/PageAccessUtility.php | 65 ++-- Classes/Utility/YoastUtility.php | 9 +- .../ViewHelpers/CrawlerProgressViewHelper.php | 21 +- Classes/ViewHelpers/RecordIconViewHelper.php | 9 - Classes/ViewHelpers/RecordLinksViewHelper.php | 9 +- .../Widgets/AbstractPageOverviewWidget.php | 77 +++++ Classes/Widgets/PageOverviewWidget.php | 43 +-- .../Provider/OrphanedContentDataProvider.php | 13 +- .../PagesWithoutDescriptionDataProvider.php | 14 +- Configuration/Backend/AjaxRoutes.php | 14 +- Configuration/Icons.php | 28 ++ Configuration/JavascriptModules.php | 8 + Configuration/RequestMiddlewares.php | 4 +- Configuration/Services.php | 88 +++--- Configuration/Services.yaml | 10 + Configuration/TCA/Overrides/pages.php | 9 +- Configuration/TCA/Overrides/tt_content.php | 4 +- .../TCA/tx_yoastseo_related_focuskeyword.php | 5 +- Documentation/Development/Index.rst | 6 +- .../Private/Templates/Crawler/Index.html | 6 +- .../Private/Templates/Dashboard/Index.html | 2 +- .../Private/Templates/Overview/List.html | 2 +- Resources/Public/JavaScript/dist/plugin.js | 42 +-- Resources/Public/JavaScript/dist/worker.js | 16 +- Resources/Public/JavaScript/yoastModalEs6.js | 37 +++ composer.json | 22 +- ext_emconf.php | 4 +- ext_localconf.php | 66 ++-- ext_tables.php | 133 ++++---- 89 files changed, 1451 insertions(+), 1159 deletions(-) delete mode 100644 .Build/phpstan.cms10.neon create mode 100644 .Build/phpstan.cms13.neon create mode 100755 .ddev/commands/web/composer-install-dashboard create mode 100755 .ddev/commands/web/composer-remove-dashboard create mode 100755 .ddev/commands/web/composer-update-all delete mode 100755 .ddev/commands/web/install-v10 create mode 100755 .ddev/commands/web/install-v12 create mode 100755 .ddev/commands/web/install-v13 delete mode 100755 .ddev/commands/web/install-v9 delete mode 100644 Classes/Pagination/ArrayPaginator.php delete mode 100644 Classes/Service/DbalService.php create mode 100644 Classes/Updates/MigrateDashboardWidget.php create mode 100644 Classes/Widgets/AbstractPageOverviewWidget.php create mode 100644 Configuration/Icons.php create mode 100644 Configuration/JavascriptModules.php create mode 100644 Resources/Public/JavaScript/yoastModalEs6.js diff --git a/.Build/phpstan.cms10.neon b/.Build/phpstan.cms10.neon deleted file mode 100644 index 308eabf3..00000000 --- a/.Build/phpstan.cms10.neon +++ /dev/null @@ -1,9 +0,0 @@ -parameters: - level: 0 - paths: - - ../Classes - - ../Configuration - ignoreErrors: - - '#Parameter \$event of method#' - - '#undefined method YoastSeoForTypo3\\YoastSeo\\Controller\\AbstractBackendController::htmlResponse\(\)#' - - '#Class TYPO3\\CMS\\Backend\\Template\\ModuleTemplateFactory not found#' diff --git a/.Build/phpstan.cms11.neon b/.Build/phpstan.cms11.neon index b140d92f..31836d7c 100644 --- a/.Build/phpstan.cms11.neon +++ b/.Build/phpstan.cms11.neon @@ -5,3 +5,7 @@ parameters: - ../Configuration ignoreErrors: - '#Parameter \$event of method#' + - '#TYPO3\\CMS\\Frontend\\Page\\PageInformation#' + - '#TYPO3\\CMS\\Backend\\View\\BackendViewFactory#' + - '#TYPO3\\CMS\\Install\\Attribute\\UpgradeWizard#' + - '#frontend.page.information#' diff --git a/.Build/phpstan.cms12.neon b/.Build/phpstan.cms12.neon index dfa9e63c..6d3cb5ed 100644 --- a/.Build/phpstan.cms12.neon +++ b/.Build/phpstan.cms12.neon @@ -5,3 +5,5 @@ parameters: - ../Configuration ignoreErrors: - '#TYPO3\\CMS\\Backend\\ViewHelpers\\ModuleLayoutViewHelper#' + - '#TYPO3\\CMS\\Frontend\\Page\\PageInformation#' + - '#frontend.page.information#' diff --git a/.Build/phpstan.cms13.neon b/.Build/phpstan.cms13.neon new file mode 100644 index 00000000..4a89c28a --- /dev/null +++ b/.Build/phpstan.cms13.neon @@ -0,0 +1,10 @@ +parameters: + level: 0 + paths: + - ../Classes + - ../Configuration + ignoreErrors: + - '#TYPO3\\CMS\\Backend\\ViewHelpers\\ModuleLayoutViewHelper#' + typo3: + requestGetAttributeMapping: + frontend.page.information: TYPO3\CMS\Frontend\Page\PageInformation \ No newline at end of file diff --git a/.ddev/apache/apache-site.conf b/.ddev/apache/apache-site.conf index 3e94594f..ea6c1505 100644 --- a/.ddev/apache/apache-site.conf +++ b/.ddev/apache/apache-site.conf @@ -6,8 +6,8 @@ ServerName yoast-seo.ddev.site RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =https - RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d - RewriteRule ^(.+[^/])$ https://%{HTTP_HOST}$1/ [redirect,last] + RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d + RewriteRule ^(.+[^/])$ https://%{HTTP_HOST}$1/ [redirect,last] SetEnvIf X-Forwarded-Proto "https" HTTPS=on @@ -47,8 +47,8 @@ ServerName yoast-seo.ddev.site RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =https - RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d - RewriteRule ^(.+[^/])$ https://%{HTTP_HOST}$1/ [redirect,last] + RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d + RewriteRule ^(.+[^/])$ https://%{HTTP_HOST}$1/ [redirect,last] SetEnvIf X-Forwarded-Proto "https" HTTPS=on @@ -78,16 +78,35 @@ ServerName yoast-seo.ddev.site + + SetEnvIf X-Forwarded-Proto "https" HTTPS=on + + DocumentRoot /var/www/yoast_seo/Documentation-GENERATED-temp/Result/project/0.0.0 + ServerAlias docs.yoast-seo.ddev.site + + + AllowOverride All + Allow from All + + DirectoryIndex Index.html + + + ErrorLog /dev/stdout + Alias "/phpstatus" "/var/www/phpstatus.php" + + RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =https - RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d - RewriteRule ^(.+[^/])$ https://%{HTTP_HOST}$1/ [redirect,last] + RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d + RewriteRule ^(.+[^/])$ https://%{HTTP_HOST}$1/ [redirect,last] - DocumentRoot /var/www/html/v9/public - ServerAlias v9.yoast-seo.ddev.site + SetEnvIf X-Forwarded-Proto "https" HTTPS=on + + DocumentRoot /var/www/html/v11/public + ServerAlias v11.yoast-seo.ddev.site - + AllowOverride All Allow from All @@ -100,13 +119,15 @@ ServerName yoast-seo.ddev.site RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =https - RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d - RewriteRule ^(.+[^/])$ https://%{HTTP_HOST}$1/ [redirect,last] + RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d + RewriteRule ^(.+[^/])$ https://%{HTTP_HOST}$1/ [redirect,last] + + SetEnvIf X-Forwarded-Proto "https" HTTPS=on - DocumentRoot /var/www/html/v10/public - ServerAlias v10.yoast-seo.ddev.site + DocumentRoot /var/www/html/v12/public + ServerAlias v12.yoast-seo.ddev.site - + AllowOverride All Allow from All @@ -119,13 +140,15 @@ ServerName yoast-seo.ddev.site RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =https - RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d - RewriteRule ^(.+[^/])$ https://%{HTTP_HOST}$1/ [redirect,last] + RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d + RewriteRule ^(.+[^/])$ https://%{HTTP_HOST}$1/ [redirect,last] - DocumentRoot /var/www/html/v11/public - ServerAlias v11.yoast-seo.ddev.site + SetEnvIf X-Forwarded-Proto "https" HTTPS=on - + DocumentRoot /var/www/html/v13/public + ServerAlias v13.yoast-seo.ddev.site + + AllowOverride All Allow from All @@ -134,4 +157,5 @@ ServerName yoast-seo.ddev.site CustomLog ${APACHE_LOG_DIR}/access.log combined Alias "/phpstatus" "/var/www/phpstatus.php" -# vim: syntax=apache ts=4 sw=4 sts=4 sr noet + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet \ No newline at end of file diff --git a/.ddev/commands/host/launch-docs b/.ddev/commands/host/launch-docs index ccaf5b6e..dd3d3e06 100755 --- a/.ddev/commands/host/launch-docs +++ b/.ddev/commands/host/launch-docs @@ -1,7 +1,8 @@ #!/bin/bash +FULLURL="https://docs.${DDEV_SITENAME}.ddev.site" -FULLURL="Documentation-GENERATED-temp/Result/project/0.0.0/Index.html" +echo "Opening \"https://docs.${DDEV_SITENAME}.ddev.site\"..." case $OSTYPE in linux-gnu) diff --git a/.ddev/commands/web/composer-install-dashboard b/.ddev/commands/web/composer-install-dashboard new file mode 100755 index 00000000..a32fbdfb --- /dev/null +++ b/.ddev/commands/web/composer-install-dashboard @@ -0,0 +1,10 @@ +#!/bin/bash + +valid_versions=("11" "12" "13") + +if [[ ! " ${valid_versions[@]} " =~ " $1 " ]]; then + echo "Invalid version. Please use one of the following: ${valid_versions[@]}" + exit 1 +fi + +composer req typo3/cms-dashboard:"^$1" -n -d /var/www/html/v$1 \ No newline at end of file diff --git a/.ddev/commands/web/composer-remove-dashboard b/.ddev/commands/web/composer-remove-dashboard new file mode 100755 index 00000000..3c8cc657 --- /dev/null +++ b/.ddev/commands/web/composer-remove-dashboard @@ -0,0 +1,10 @@ +#!/bin/bash + +valid_versions=("11" "12" "13") + +if [[ ! " ${valid_versions[@]} " =~ " $1 " ]]; then + echo "Invalid version. Please use one of the following: ${valid_versions[@]}" + exit 1 +fi + +composer remove typo3/cms-dashboard -n -d /var/www/html/v$1 \ No newline at end of file diff --git a/.ddev/commands/web/composer-update-all b/.ddev/commands/web/composer-update-all new file mode 100755 index 00000000..529be385 --- /dev/null +++ b/.ddev/commands/web/composer-update-all @@ -0,0 +1,10 @@ +#!/bin/bash + +valid_versions=("11" "12" "13") + +if [[ ! " ${valid_versions[@]} " =~ " $1 " ]]; then + echo "Invalid version. Please use one of the following: ${valid_versions[@]}" + exit 1 +fi + +composer update -n -d /var/www/html/v$1 \ No newline at end of file diff --git a/.ddev/commands/web/install-all b/.ddev/commands/web/install-all index e9d0efcf..8aa204f2 100755 --- a/.ddev/commands/web/install-all +++ b/.ddev/commands/web/install-all @@ -2,6 +2,6 @@ ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}/.")" +$ABSOLUTE_PATH/install-v13 +$ABSOLUTE_PATH/install-v12 $ABSOLUTE_PATH/install-v11 -$ABSOLUTE_PATH/install-v10 -$ABSOLUTE_PATH/install-v9 diff --git a/.ddev/commands/web/install-v10 b/.ddev/commands/web/install-v10 deleted file mode 100755 index dc8669a5..00000000 --- a/.ddev/commands/web/install-v10 +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -VERSION=v10 - -rm -rf /var/www/html/$VERSION/* -composer init -n -d /var/www/html/$VERSION -composer config extra.typo3/cms.web-dir public -d /var/www/html/$VERSION -composer config repositories.$EXTENSION_KEY path ../../$EXTENSION_KEY -d /var/www/html/$VERSION -composer req t3/cms:'^10.4' $PACKAGE_NAME:'*@dev' --no-progress --no-suggest -n -d /var/www/html/$VERSION - - -cd /var/www/html/$VERSION - -TYPO3_INSTALL_DB_DBNAME=$VERSION -vendor/bin/typo3cms install:setup -n --database-name $VERSION -vendor/bin/typo3cms configuration:set 'BE/debug' 1 -vendor/bin/typo3cms configuration:set 'FE/debug' 1 -vendor/bin/typo3cms configuration:set 'SYS/devIPmask' '*' -vendor/bin/typo3cms configuration:set 'SYS/displayErrors' 1 -vendor/bin/typo3cms configuration:set 'SYS/trustedHostsPattern' '.*.*' -vendor/bin/typo3cms configuration:set 'MAIL/transport' 'smtp' -vendor/bin/typo3cms configuration:set 'MAIL/transport_smtp_server' 'localhost:1025' -vendor/bin/typo3cms configuration:set 'GFX/processor' 'ImageMagick' -vendor/bin/typo3cms configuration:set 'GFX/processor_path' '/usr/bin/' -vendor/bin/typo3cms configuration:set 'GFX/processor_path_lzw' '/usr/bin/' -vendor/bin/typo3cms install:generatepackagestates - -sed -i -e "s/base: ht\//base: \//g" /var/www/html/$VERSION/config/sites/main/config.yaml -sed -i -e 's/base: \/en\//base: \//g' /var/www/html/$VERSION/config/sites/main/config.yaml - -cp ~/favicon.ico ./public - -vendor/bin/typo3cms cache:flush diff --git a/.ddev/commands/web/install-v11 b/.ddev/commands/web/install-v11 index 9429b666..7f154760 100755 --- a/.ddev/commands/web/install-v11 +++ b/.ddev/commands/web/install-v11 @@ -3,11 +3,13 @@ VERSION=v11 rm -rf /var/www/html/$VERSION/* -composer init -n -d /var/www/html/$VERSION +mkdir -p /var/www/html/$VERSION/ +echo "{}" > /var/www/html/$VERSION/composer.json composer config extra.typo3/cms.web-dir public -d /var/www/html/$VERSION composer config repositories.$EXTENSION_KEY path ../../$EXTENSION_KEY -d /var/www/html/$VERSION -composer req t3/cms:'^11.0' $PACKAGE_NAME:'*@dev' --no-progress --no-suggest -n -d /var/www/html/$VERSION - +composer config --no-plugins allow-plugins.typo3/cms-composer-installers true -d /var/www/html/$VERSION +composer config --no-plugins allow-plugins.typo3/class-alias-loader true -d /var/www/html/$VERSION +composer req t3/cms:'^11' $PACKAGE_NAME:'*@dev' --no-progress -n -d /var/www/html/$VERSION cd /var/www/html/$VERSION @@ -23,11 +25,8 @@ vendor/bin/typo3cms configuration:set 'MAIL/transport_smtp_server' 'localhost:10 vendor/bin/typo3cms configuration:set 'GFX/processor' 'ImageMagick' vendor/bin/typo3cms configuration:set 'GFX/processor_path' '/usr/bin/' vendor/bin/typo3cms configuration:set 'GFX/processor_path_lzw' '/usr/bin/' -vendor/bin/typo3cms install:generatepackagestates sed -i -e "s/base: ht\//base: \//g" /var/www/html/$VERSION/config/sites/main/config.yaml sed -i -e 's/base: \/en\//base: \//g' /var/www/html/$VERSION/config/sites/main/config.yaml -cp ~/favicon.ico ./public - -vendor/bin/typo3cms cache:flush +vendor/bin/typo3cms cache:flush \ No newline at end of file diff --git a/.ddev/commands/web/install-v12 b/.ddev/commands/web/install-v12 new file mode 100755 index 00000000..6fb02929 --- /dev/null +++ b/.ddev/commands/web/install-v12 @@ -0,0 +1,32 @@ +#!/bin/bash + +VERSION=v12 + +rm -rf /var/www/html/$VERSION/* +mkdir -p /var/www/html/$VERSION/ +echo "{}" > /var/www/html/$VERSION/composer.json +composer config extra.typo3/cms.web-dir public -d /var/www/html/$VERSION +composer config repositories.$EXTENSION_KEY path ../../$EXTENSION_KEY -d /var/www/html/$VERSION +composer config --no-plugins allow-plugins.typo3/cms-composer-installers true -d /var/www/html/$VERSION +composer config --no-plugins allow-plugins.typo3/class-alias-loader true -d /var/www/html/$VERSION +composer req t3/cms:'^12' $PACKAGE_NAME:'*@dev' --no-progress -n -d /var/www/html/$VERSION + +cd /var/www/html/$VERSION + +TYPO3_INSTALL_DB_DBNAME=$VERSION +vendor/bin/typo3 install:setup -n --database-name $VERSION +vendor/bin/typo3 configuration:set 'BE/debug' 1 +vendor/bin/typo3 configuration:set 'FE/debug' 1 +vendor/bin/typo3 configuration:set 'SYS/devIPmask' '*' +vendor/bin/typo3 configuration:set 'SYS/displayErrors' 1 +vendor/bin/typo3 configuration:set 'SYS/trustedHostsPattern' '.*.*' +vendor/bin/typo3 configuration:set 'MAIL/transport' 'smtp' +vendor/bin/typo3 configuration:set 'MAIL/transport_smtp_server' 'localhost:1025' +vendor/bin/typo3 configuration:set 'MAIL/defaultMailFromAddress' 'admin@example.com' +vendor/bin/typo3 configuration:set 'GFX/processor' 'ImageMagick' +vendor/bin/typo3 configuration:set 'GFX/processor_path' '/usr/bin/' + +sed -i -e "s/base: ht\//base: \//g" /var/www/html/$VERSION/config/sites/main/config.yaml +sed -i -e 's/base: \/en\//base: \//g' /var/www/html/$VERSION/config/sites/main/config.yaml + +vendor/bin/typo3 cache:flush diff --git a/.ddev/commands/web/install-v13 b/.ddev/commands/web/install-v13 new file mode 100755 index 00000000..d56f0291 --- /dev/null +++ b/.ddev/commands/web/install-v13 @@ -0,0 +1,33 @@ +#!/bin/bash + +VERSION=v13 + +rm -rf /var/www/html/$VERSION/* +mkdir -p /var/www/html/$VERSION/ +echo "{}" > /var/www/html/$VERSION/composer.json +composer config extra.typo3/cms.web-dir public -d /var/www/html/$VERSION +composer config repositories.$EXTENSION_KEY path ../../$EXTENSION_KEY -d /var/www/html/$VERSION +composer config --no-plugins allow-plugins.typo3/cms-composer-installers true -d /var/www/html/$VERSION +composer config --no-plugins allow-plugins.typo3/class-alias-loader true -d /var/www/html/$VERSION +composer req t3/cms:'^13' $PACKAGE_NAME:'*@dev' --no-progress -n -d /var/www/html/$VERSION + +cd /var/www/html/$VERSION + +mysql -h db -u root -p"root" -e "CREATE DATABASE ${VERSION};" + +TYPO3_INSTALL_DB_DBNAME=$VERSION +vendor/bin/typo3 setup -n --dbname=$VERSION --password=$TYPO3_DB_PASSWORD --create-site="https://${VERSION}.yoast-seo.ddev.site" --admin-user-password=$TYPO3_SETUP_ADMIN_PASSWORD +vendor/bin/typo3 configuration:set 'BE/debug' 1 +vendor/bin/typo3 configuration:set 'FE/debug' 1 +vendor/bin/typo3 configuration:set 'SYS/devIPmask' '*' +vendor/bin/typo3 configuration:set 'SYS/displayErrors' 1 +vendor/bin/typo3 configuration:set 'SYS/trustedHostsPattern' '.*.*' +vendor/bin/typo3 configuration:set 'MAIL/transport' 'smtp' +vendor/bin/typo3 configuration:set 'MAIL/transport_smtp_server' 'localhost:1025' +vendor/bin/typo3 configuration:set 'GFX/processor' 'ImageMagick' +vendor/bin/typo3 configuration:set 'GFX/processor_path' '/usr/bin/' +vendor/bin/typo3 configuration:set 'SYS/features/security.backend.enforceReferrer' 0 + +cp ~/favicon.ico ./public + +vendor/bin/typo3 cache:flush diff --git a/.ddev/commands/web/install-v9 b/.ddev/commands/web/install-v9 deleted file mode 100755 index bc0a3138..00000000 --- a/.ddev/commands/web/install-v9 +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -VERSION=v9 - -rm -rf /var/www/html/$VERSION/* -composer init -n -d /var/www/html/$VERSION -composer config extra.typo3/cms.web-dir public -d /var/www/html/$VERSION -composer config repositories.$EXTENSION_KEY path ../../$EXTENSION_KEY -d /var/www/html/$VERSION -composer req t3/cms:'^9.5' $PACKAGE_NAME:'*@dev' --no-progress --no-suggest -n -d /var/www/html/$VERSION - - -cd /var/www/html/$VERSION - -TYPO3_INSTALL_DB_DBNAME=$VERSION -vendor/bin/typo3cms install:setup -n --database-name $VERSION -vendor/bin/typo3cms configuration:set 'BE/debug' 1 -vendor/bin/typo3cms configuration:set 'FE/debug' 1 -vendor/bin/typo3cms configuration:set 'SYS/devIPmask' '*' -vendor/bin/typo3cms configuration:set 'SYS/displayErrors' 1 -vendor/bin/typo3cms configuration:set 'SYS/systemLogLevel' 0 -vendor/bin/typo3cms configuration:set 'SYS/trustedHostsPattern' '.*.*' -vendor/bin/typo3cms configuration:set 'MAIL/transport' 'smtp' -vendor/bin/typo3cms configuration:set 'MAIL/transport_smtp_server' 'localhost:1025' -vendor/bin/typo3cms configuration:set 'GFX/processor' 'ImageMagick' -vendor/bin/typo3cms configuration:set 'GFX/processor_path' '/usr/bin/' -vendor/bin/typo3cms configuration:set 'GFX/processor_path_lzw' '/usr/bin/' -vendor/bin/typo3cms install:generatepackagestates - -sed -i -e "s/base: ht\//base: \//g" /var/www/html/$VERSION/config/sites/main/config.yaml -sed -i -e 's/base: \/en\//base: \//g' /var/www/html/$VERSION/config/sites/main/config.yaml - -cp ~/favicon.ico ./public - -vendor/bin/typo3cms cache:flush diff --git a/.ddev/config.yaml b/.ddev/config.yaml index e0cd7109..e6d07be9 100644 --- a/.ddev/config.yaml +++ b/.ddev/config.yaml @@ -1,23 +1,287 @@ name: yoast-seo type: php -docroot: ~ -no_project_mount: true -php_version: "7.4" +docroot: public +php_version: "8.2" webserver_type: apache-fpm router_http_port: "80" router_https_port: "443" xdebug_enabled: false +no_project_mount: true additional_hostnames: - - v9.yoast-seo - - v10.yoast-seo + - docs.yoast-seo - v11.yoast-seo + - v12.yoast-seo + - v13.yoast-seo additional_fqdns: [] -provider: default +database: + type: mariadb + version: "10.4" +performance_mode: none use_dns_when_possible: true -nfs_mount_enabled: true -omit_containers: - - dba -extra_services: - - v9-data - - v10-data - - v11-data +composer_version: "2" +web_environment: [] +corepack_enable: false + +# Key features of DDEV's config.yaml: + +# name: # Name of the project, automatically provides +# http://projectname.ddev.site and https://projectname.ddev.site + +# type: # backdrop, craftcms, django4, drupal, drupal6, drupal7, laravel, magento, magento2, php, python, shopware6, silverstripe, typo3, wordpress +# See https://ddev.readthedocs.io/en/stable/users/quickstart/ for more +# information on the different project types +# "drupal" covers recent Drupal 8+ + +# docroot: # Relative path to the directory containing index.php. + +# php_version: "8.2" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3", "8.4" + +# You can explicitly specify the webimage but this +# is not recommended, as the images are often closely tied to DDEV's' behavior, +# so this can break upgrades. + +# webimage: # nginx/php docker image. + +# database: +# type: # mysql, mariadb, postgres +# version: # database version, like "10.11" or "8.0" +# MariaDB versions can be 5.5-10.8, 10.11, and 11.4. +# MySQL versions can be 5.5-8.0. +# PostgreSQL versions can be 9-16. + +# router_http_port: # Port to be used for http (defaults to global configuration, usually 80) +# router_https_port: # Port for https (defaults to global configuration, usually 443) + +# xdebug_enabled: false # Set to true to enable Xdebug and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xdebug" to enable Xdebug and "ddev xdebug off" to disable it work better, +# as leaving Xdebug enabled all the time is a big performance hit. + +# xhprof_enabled: false # Set to true to enable Xhprof and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xhprof" to enable Xhprof and "ddev xhprof off" to disable it work better, +# as leaving Xhprof enabled all the time is a big performance hit. + +# webserver_type: nginx-fpm, apache-fpm, or nginx-gunicorn + +# timezone: Europe/Berlin +# This is the timezone used in the containers and by PHP; +# it can be set to any valid timezone, +# see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +# For example Europe/Dublin or MST7MDT + +# composer_root: +# Relative path to the Composer root directory from the project root. This is +# the directory which contains the composer.json and where all Composer related +# commands are executed. + +# composer_version: "2" +# You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1 +# to use the latest major version available at the time your container is built. +# It is also possible to use each other Composer version channel. This includes: +# - 2.2 (latest Composer LTS version) +# - stable +# - preview +# - snapshot +# Alternatively, an explicit Composer version may be specified, for example "2.2.18". +# To reinstall Composer after the image was built, run "ddev debug refresh". + +# nodejs_version: "20" +# change from the default system Node.js version to any other version. +# See https://ddev.readthedocs.io/en/stable/users/configuration/config/#nodejs_version for more information +# and https://www.npmjs.com/package/n#specifying-nodejs-versions for the full documentation, +# Note that using of 'ddev nvm' is discouraged because "nodejs_version" is much easier to use, +# can specify any version, and is more robust than using 'nvm'. + +# corepack_enable: false +# Change to 'true' to 'corepack enable' and gain access to latest versions of yarn/pnpm + +# additional_hostnames: +# - somename +# - someothername +# would provide http and https URLs for "somename.ddev.site" +# and "someothername.ddev.site". + +# additional_fqdns: +# - example.com +# - sub1.example.com +# would provide http and https URLs for "example.com" and "sub1.example.com" +# Please take care with this because it can cause great confusion. + +# upload_dirs: "custom/upload/dir" +# +# upload_dirs: +# - custom/upload/dir +# - ../private +# +# would set the destination paths for ddev import-files to /custom/upload/dir +# When Mutagen is enabled this path is bind-mounted so that all the files +# in the upload_dirs don't have to be synced into Mutagen. + +# disable_upload_dirs_warning: false +# If true, turns off the normal warning that says +# "You have Mutagen enabled and your 'php' project type doesn't have upload_dirs set" + +# ddev_version_constraint: "" +# Example: +# ddev_version_constraint: ">= 1.22.4" +# This will enforce that the running ddev version is within this constraint. +# See https://github.com/Masterminds/semver#checking-version-constraints for +# supported constraint formats + +# working_dir: +# web: /var/www/html +# db: /home +# would set the default working directory for the web and db services. +# These values specify the destination directory for ddev ssh and the +# directory in which commands passed into ddev exec are run. + +# omit_containers: [db, ddev-ssh-agent] +# Currently only these containers are supported. Some containers can also be +# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit +# the "db" container, several standard features of DDEV that access the +# database container will be unusable. In the global configuration it is also +# possible to omit ddev-router, but not here. + +# performance_mode: "global" +# DDEV offers performance optimization strategies to improve the filesystem +# performance depending on your host system. Should be configured globally. +# +# If set, will override the global config. Possible values are: +# - "global": uses the value from the global config. +# - "none": disables performance optimization for this project. +# - "mutagen": enables Mutagen for this project. +# - "nfs": enables NFS for this project. +# +# See https://ddev.readthedocs.io/en/stable/users/install/performance/#nfs +# See https://ddev.readthedocs.io/en/stable/users/install/performance/#mutagen + +# fail_on_hook_fail: False +# Decide whether 'ddev start' should be interrupted by a failing hook + +# host_https_port: "59002" +# The host port binding for https can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_webserver_port: "59001" +# The host port binding for the ddev-webserver can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_db_port: "59002" +# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic +# unless explicitly specified. + +# mailpit_http_port: "8025" +# mailpit_https_port: "8026" +# The Mailpit ports can be changed from the default 8025 and 8026 + +# host_mailpit_port: "8025" +# The mailpit port is not normally bound on the host at all, instead being routed +# through ddev-router, but it can be bound directly to localhost if specified here. + +# webimage_extra_packages: [php7.4-tidy, php-bcmath] +# Extra Debian packages that are needed in the webimage can be added here + +# dbimage_extra_packages: [telnet,netcat] +# Extra Debian packages that are needed in the dbimage can be added here + +# use_dns_when_possible: true +# If the host has internet access and the domain configured can +# successfully be looked up, DNS will be used for hostname resolution +# instead of editing /etc/hosts +# Defaults to true + +# project_tld: ddev.site +# The top-level domain used for project URLs +# The default "ddev.site" allows DNS lookup via a wildcard +# If you prefer you can change this to "ddev.local" to preserve +# pre-v1.9 behavior. + +# ngrok_args: --basic-auth username:pass1234 +# Provide extra flags to the "ngrok http" command, see +# https://ngrok.com/docs/ngrok-agent/config or run "ngrok http -h" + +# disable_settings_management: false +# If true, DDEV will not create CMS-specific settings files like +# Drupal's settings.php/settings.ddev.php or TYPO3's additional.php +# In this case the user must provide all such settings. + +# You can inject environment variables into the web container with: +# web_environment: +# - SOMEENV=somevalue +# - SOMEOTHERENV=someothervalue + +# no_project_mount: false +# (Experimental) If true, DDEV will not mount the project into the web container; +# the user is responsible for mounting it manually or via a script. +# This is to enable experimentation with alternate file mounting strategies. +# For advanced users only! + +# bind_all_interfaces: false +# If true, host ports will be bound on all network interfaces, +# not the localhost interface only. This means that ports +# will be available on the local network if the host firewall +# allows it. + +# default_container_timeout: 120 +# The default time that DDEV waits for all containers to become ready can be increased from +# the default 120. This helps in importing huge databases, for example. + +#web_extra_exposed_ports: +#- name: nodejs +# container_port: 3000 +# http_port: 2999 +# https_port: 3000 +#- name: something +# container_port: 4000 +# https_port: 4000 +# http_port: 3999 +# Allows a set of extra ports to be exposed via ddev-router +# Fill in all three fields even if you don’t intend to use the https_port! +# If you don’t add https_port, then it defaults to 0 and ddev-router will fail to start. +# +# The port behavior on the ddev-webserver must be arranged separately, for example +# using web_extra_daemons. +# For example, with a web app on port 3000 inside the container, this config would +# expose that web app on https://.ddev.site:9999 and http://.ddev.site:9998 +# web_extra_exposed_ports: +# - name: myapp +# container_port: 3000 +# http_port: 9998 +# https_port: 9999 + +#web_extra_daemons: +#- name: "http-1" +# command: "/var/www/html/node_modules/.bin/http-server -p 3000" +# directory: /var/www/html +#- name: "http-2" +# command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000" +# directory: /var/www/html + +# override_config: false +# By default, config.*.yaml files are *merged* into the configuration +# But this means that some things can't be overridden +# For example, if you have 'use_dns_when_possible: true'' you can't override it with a merge +# and you can't erase existing hooks or all environment variables. +# However, with "override_config: true" in a particular config.*.yaml file, +# 'use_dns_when_possible: false' can override the existing values, and +# hooks: +# post-start: [] +# or +# web_environment: [] +# or +# additional_hostnames: [] +# can have their intended affect. 'override_config' affects only behavior of the +# config.*.yaml file it exists in. + +# Many DDEV commands can be extended to run tasks before or after the +# DDEV command is executed, for example "post-start", "post-import-db", +# "pre-composer", "post-composer" +# See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more +# information on the commands that can be extended and the tasks you can define +# for them. Example: +#hooks: diff --git a/.ddev/docker-compose.docs.yaml b/.ddev/docker-compose.docs.yaml index d430ca99..e148406c 100644 --- a/.ddev/docker-compose.docs.yaml +++ b/.ddev/docker-compose.docs.yaml @@ -1,7 +1,6 @@ -version: "3.6" services: docs: - image: t3docs/render-documentation:latest + image: ghcr.io/t3docs/render-documentation:latest command: makehtml volumes: - ../:/PROJECT:ro diff --git a/.ddev/docker-compose.web.yaml b/.ddev/docker-compose.web.yaml index 0da007ad..613ba788 100644 --- a/.ddev/docker-compose.web.yaml +++ b/.ddev/docker-compose.web.yaml @@ -1,34 +1,38 @@ -version: "3.6" services: web: environment: - EXTENSION_KEY=yoast_seo - PACKAGE_NAME=yoast-seo-for-typo3/yoast_seo + - TYPO3_CONTEXT=Development + # TYPO3 v11 and v12 configuration - TYPO3_INSTALL_DB_DRIVER=mysqli - TYPO3_INSTALL_DB_USER=root - TYPO3_INSTALL_DB_PASSWORD=root - TYPO3_INSTALL_DB_HOST=db - - TYPO3_INSTALL_DB_PORT=3306 - TYPO3_INSTALL_DB_UNIX_SOCKET= - TYPO3_INSTALL_DB_USE_EXISTING=0 - TYPO3_INSTALL_ADMIN_USER=admin - - TYPO3_INSTALL_ADMIN_PASSWORD=password + - TYPO3_INSTALL_ADMIN_PASSWORD=Password:joh316 - TYPO3_INSTALL_SITE_NAME=EXT:yoast_seo Dev Environment - TYPO3_INSTALL_SITE_SETUP_TYPE=site - TYPO3_INSTALL_WEB_SERVER_CONFIG=apache + + - TYPO3_DB_DRIVER=mysqli + - TYPO3_DB_USERNAME=root + - TYPO3_DB_PASSWORD=root + - TYPO3_DB_HOST=db + - TYPO3_DB_PORT=3306 + - TYPO3_SETUP_ADMIN_USERNAME=admin + - TYPO3_SETUP_ADMIN_EMAIL=admin@admin.com + - TYPO3_SETUP_ADMIN_PASSWORD=Password:joh316 + - TYPO3_PROJECT_NAME=EXT:yoast_seo Dev Environment + - TYPO3_SERVER_TYPE=apache volumes: - type: bind source: ../ target: /var/www/yoast_seo consistency: cached - - v9-data:/var/www/html/v9 - - v10-data:/var/www/html/v10 - - v11-data:/var/www/html/v11 -volumes: - v9-data: - name: "${DDEV_SITENAME}-v9-data" - v10-data: - name: "${DDEV_SITENAME}-v10-data" - v11-data: - name: "${DDEV_SITENAME}-v11-data" + - ../.Build/v11:/var/www/html/v11 + - ../.Build/v12:/var/www/html/v12 + - ../.Build/v13:/var/www/html/v13 \ No newline at end of file diff --git a/.ddev/web-build/Dockerfile b/.ddev/web-build/Dockerfile index 6f5830d6..f6d92fe7 100644 --- a/.ddev/web-build/Dockerfile +++ b/.ddev/web-build/Dockerfile @@ -6,24 +6,27 @@ ENV DDEV_SITENAME "yoast-seo" RUN echo "" > /var/www/html/index.html RUN echo "

EXT:${EXTENSION_KEY} Dev Environments

    " >> /var/www/html/index.html -RUN echo "
  • TYPO3 9.5 LTS

    Frontend | Backend
  • " >> /var/www/html/index.html -RUN echo "
  • TYPO3 10.4 LTS

    Frontend | Backend
  • " >> /var/www/html/index.html -RUN echo "
  • TYPO3 11.0

    Frontend | Backend
  • " >> /var/www/html/index.html +RUN echo "
  • TYPO3 11.5 LTS

    Frontend | Backend
  • " >> /var/www/html/index.html +RUN echo "
  • TYPO3 12.4 LTS

    Frontend | Backend
  • " >> /var/www/html/index.html +RUN echo "
  • TYPO3 13.x

    Frontend | Backend
  • " >> /var/www/html/index.html RUN echo "
" >> /var/www/html/index.html RUN echo "
" >> /var/www/html/index.html -RUN echo "

TYPO3 Backend

  • User: admin
  • Password: password (also Install Tool)
" >> /var/www/html/index.html +RUN echo "

TYPO3 Backend

  • User: admin
  • Password: Password:joh316 (also Install Tool)
" >> /var/www/html/index.html +RUN echo "
" >> /var/www/html/index.html +RUN echo "

Documentation

  • First, perform $ ddev docs on CLI
  • Then visit URL: https://docs.${DDEV_SITENAME}.ddev.site/
" >> /var/www/html/index.html RUN echo "" >> /var/www/html/index.html -RUN mkdir -p /var/www/html/v9/public/typo3 -RUN echo "

Perform this first

ddev install-v9" > /var/www/html/v9/public/index.html -RUN echo "

Perform this first

ddev install-v9" > /var/www/html/v9/public/typo3/index.html -RUN mkdir -p /var/www/html/v10/public/typo3 -RUN echo "

Perform this first

ddev install-v10" > /var/www/html/v10/public/index.html -RUN echo "

Perform this first

ddev install-v10" > /var/www/html/v10/public/typo3/index.html + RUN mkdir -p /var/www/html/v11/public/typo3 RUN echo "

Perform this first

ddev install-v11" > /var/www/html/v11/public/index.html RUN echo "

Perform this first

ddev install-v11" > /var/www/html/v11/public/typo3/index.html +RUN mkdir -p /var/www/html/v12/public/typo3 +RUN echo "

Perform this first

ddev install-v12" > /var/www/html/v12/public/index.html +RUN echo "

Perform this first

ddev install-v12" > /var/www/html/v12/public/typo3/index.html +RUN mkdir -p /var/www/html/v13/public/typo3 +RUN echo "

Perform this first

ddev install-v13" > /var/www/html/v13/public/index.html +RUN echo "

Perform this first

ddev install-v13" > /var/www/html/v13/public/typo3/index.html ARG uid ARG gid -RUN chown -R $uid:$gid /var/www/html +RUN chown -R $uid:$gid /var/www/html \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2bd40c3e..882c9d40 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,15 +11,12 @@ jobs: max-parallel: 6 fail-fast: false matrix: - typo3: ['10', '11'] - php: ['php7.4'] + typo3: ['11', '12', '13'] + php: ['php8.2'] experimental: [false] include: - typo3: '11' - php: 'php8.1' - experimental: false - - typo3: '12' - php: 'php8.1' + php: 'php8.0' experimental: false steps: - uses: actions/checkout@v1 diff --git a/.gitignore b/.gitignore index 79d650e4..4e4214d2 100644 --- a/.gitignore +++ b/.gitignore @@ -11,10 +11,9 @@ yarn.lock !.Build/ExcludeFromPackaging.php !.Build/.php-cs-fixer.php !.Build/.phplint.yml -!.Build/phpstan.cms9.neon -!.Build/phpstan.cms10.neon !.Build/phpstan.cms11.neon !.Build/phpstan.cms12.neon +!.Build/phpstan.cms13.neon Documentation-GENERATED-temp /public .phplint.cache diff --git a/CHANGELOG.md b/CHANGELOG.md index f58fff01..7747dbe1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,22 @@ This changelog is according to [Keep a Changelog](http://keepachangelog.com). All notable changes to this project will be documented in this file. We will follow [Semantic Versioning](http://semver.org/). +## UNRELEASED +### Breaking +- Dropped support for TYPO3 10 +- Dropped support for PHP 7 +- Removed `DbalService` which was used to support older `doctrine/dbal` versions for TYPO3 10 +- Removed `ArrayPaginator` which was used to support TYPO3 10 + +### Added +- Support for TYPO3 13 +- Upgrade wizard to migrate the dashboard widget "Pages without meta description" to the core widget + +#### Changed +- Update ddev configuration with latest changes from https://github.com/a-r-m-i-n/ddev-for-typo3-extensions + - Added `ddev composer-install-dashboard $VERSION` and `ddev composer-remove-dashboard $VERSION` commands to simplify testing dashboard widgets + - Added `ddev composer-update-all $VERSION` to update all composer dependencies to the latest version + ## 9.0.3 December 18, 2023 ### Fixed - Prevent undefined array key warning within `LinkingSuggestionsService` diff --git a/Classes/Backend/PageLayoutHeader.php b/Classes/Backend/PageLayoutHeader.php index 13dfc41c..4f2cb0bc 100644 --- a/Classes/Backend/PageLayoutHeader.php +++ b/Classes/Backend/PageLayoutHeader.php @@ -15,21 +15,16 @@ class PageLayoutHeader { - protected UrlService $urlService; - protected SnippetPreviewService $snippetPreviewService; - public function __construct( - UrlService $urlService, - SnippetPreviewService $snippetPreviewService + protected UrlService $urlService, + protected SnippetPreviewService $snippetPreviewService ) { - $this->urlService = $urlService; - $this->snippetPreviewService = $snippetPreviewService; } public function render(array $params = null, $parentObj = null): string { $languageId = $this->getLanguageId(); - $pageId = (int)GeneralUtility::_GET('id'); + $pageId = (int)$_GET['id']; $currentPage = $this->getCurrentPage($pageId, $languageId, $parentObj); if (!is_array($currentPage) || !$this->shouldShowPreview($pageId, $currentPage)) { @@ -67,27 +62,30 @@ protected function renderHtml(): string protected function getCurrentPage(int $pageId, int $languageId, object $parentObj): ?array { - $currentPage = null; - - if (($parentObj instanceof PageLayoutController || $parentObj instanceof ModuleTemplate) && $pageId > 0) { - if ($languageId === 0) { - $currentPage = BackendUtility::getRecord( - 'pages', - $pageId - ); - } elseif ($languageId > 0) { - $overlayRecords = BackendUtility::getRecordLocalization( - 'pages', - $pageId, - $languageId - ); - - if (is_array($overlayRecords) && array_key_exists(0, $overlayRecords) && is_array($overlayRecords[0])) { - $currentPage = $overlayRecords[0]; - } + if ((!$parentObj instanceof PageLayoutController && !$parentObj instanceof ModuleTemplate) || $pageId <= 0) { + return null; + } + + if ($languageId === 0) { + return BackendUtility::getRecord( + 'pages', + $pageId + ); + } + + if ($languageId > 0) { + $overlayRecords = BackendUtility::getRecordLocalization( + 'pages', + $pageId, + $languageId + ); + + if (is_array($overlayRecords) && array_key_exists(0, $overlayRecords) && is_array($overlayRecords[0])) { + return $overlayRecords[0]; } } - return $currentPage; + + return null; } protected function shouldShowPreview(int $pageId, array $pageRecord): bool diff --git a/Classes/Controller/AbstractBackendController.php b/Classes/Controller/AbstractBackendController.php index 6175f76b..7ccfed86 100644 --- a/Classes/Controller/AbstractBackendController.php +++ b/Classes/Controller/AbstractBackendController.php @@ -7,6 +7,10 @@ use Psr\Http\Message\ResponseInterface; use TYPO3\CMS\Backend\Template\ModuleTemplate; use TYPO3\CMS\Backend\Template\ModuleTemplateFactory; +use TYPO3\CMS\Backend\Utility\BackendUtility; +use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; +use TYPO3\CMS\Core\Information\Typo3Version; +use TYPO3\CMS\Core\Type\Bitmask\Permission; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; @@ -14,12 +18,22 @@ abstract class AbstractBackendController extends ActionController { protected function returnResponse(array $data = [], ModuleTemplate $moduleTemplate = null): ResponseInterface { + $data['layout'] = GeneralUtility::makeInstance(Typo3Version::class) + ->getMajorVersion() < 13 ? 'Default' : 'Module'; $this->view->assignMultiple($data); + if ($moduleTemplate === null) { $moduleTemplate = $this->getModuleTemplate(); } - $moduleTemplate->setContent($this->view->render()); - return $this->htmlResponse($moduleTemplate->renderContent()); + + if (method_exists($moduleTemplate, 'setContent')) { + $moduleTemplate->setContent($this->view->render()); + return $this->htmlResponse($moduleTemplate->renderContent()); + } + $moduleTemplate->getDocHeaderComponent()->setMetaInformation($this->getPageInformation()); + + $moduleTemplate->assignMultiple($data); + return $moduleTemplate->renderResponse(); } protected function getModuleTemplate(): ModuleTemplate @@ -27,4 +41,22 @@ protected function getModuleTemplate(): ModuleTemplate $moduleTemplateFactory = GeneralUtility::makeInstance(ModuleTemplateFactory::class); return $moduleTemplateFactory->create($this->request); } + + protected function getPageInformation(): array + { + $id = (int)($this->request->getQueryParams()['id'] ?? 0); + if ($id === 0) { + return []; + } + $pageInformation = BackendUtility::readPageAccess( + $id, + $this->getBackendUser()->getPagePermsClause(Permission::PAGE_SHOW) + ); + return is_array($pageInformation) ? $pageInformation : []; + } + + protected function getBackendUser(): BackendUserAuthentication + { + return $GLOBALS['BE_USER']; + } } diff --git a/Classes/Controller/AjaxController.php b/Classes/Controller/AjaxController.php index 6af9c01d..144d6107 100644 --- a/Classes/Controller/AjaxController.php +++ b/Classes/Controller/AjaxController.php @@ -11,7 +11,6 @@ use TYPO3\CMS\Core\Http\JsonResponse; use TYPO3\CMS\Core\Utility\GeneralUtility; use YoastSeoForTypo3\YoastSeo\Service\CrawlerService; -use YoastSeoForTypo3\YoastSeo\Service\DbalService; use YoastSeoForTypo3\YoastSeo\Service\LinkingSuggestionsService; use YoastSeoForTypo3\YoastSeo\Service\PreviewService; use YoastSeoForTypo3\YoastSeo\Service\ProminentWordsService; @@ -19,24 +18,13 @@ class AjaxController { - protected PreviewService $previewService; - protected UrlService $urlService; - protected ProminentWordsService $prominentWordsService; - protected LinkingSuggestionsService $linkingSuggestionsService; - protected CrawlerService $crawlerService; - public function __construct( - PreviewService $previewService, - UrlService $urlService, - ProminentWordsService $prominentWordsService, - LinkingSuggestionsService $linkingSuggestionsService, - CrawlerService $crawlerService + protected PreviewService $previewService, + protected UrlService $urlService, + protected ProminentWordsService $prominentWordsService, + protected LinkingSuggestionsService $linkingSuggestionsService, + protected CrawlerService $crawlerService ) { - $this->previewService = $previewService; - $this->urlService = $urlService; - $this->prominentWordsService = $prominentWordsService; - $this->linkingSuggestionsService = $linkingSuggestionsService; - $this->crawlerService = $crawlerService; } public function previewAction( @@ -45,7 +33,7 @@ public function previewAction( $queryParams = $request->getQueryParams(); if (!isset($queryParams['pageId'], $queryParams['languageId'], $queryParams['additionalGetVars'])) { - $json = json_decode($request->getBody()->getContents(), true); + $json = $this->getJsonData($request); if (isset($json['pageId'], $json['languageId'], $json['additionalGetVars'])) { $queryParams = $json; } else { @@ -68,9 +56,7 @@ public function previewAction( public function saveScoresAction( ServerRequestInterface $request ): ResponseInterface { - $json = $request->getBody()->getContents(); - $data = json_decode($json, true); - + $data = $this->getJsonData($request); if (!empty($data['table']) && !empty($data['uid'])) { $this->saveScores($data); } @@ -80,14 +66,12 @@ public function saveScoresAction( protected function saveScores(array $data): void { $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($data['table']); - $row = GeneralUtility::makeInstance(DbalService::class)->getSingleResult( - $connection->select(['*'], $data['table'], ['uid' => (int)$data['uid']], [], [], 1) - ); + $row = $connection->select(['*'], $data['table'], ['uid' => (int)$data['uid']], [], [], 1)->fetchAssociative(); if ($row !== false && isset($row['tx_yoastseo_score_readability'], $row['tx_yoastseo_score_seo'])) { $connection->update($data['table'], [ 'tx_yoastseo_score_readability' => (string)$data['readabilityScore'], - 'tx_yoastseo_score_seo' => (string)$data['seoScore'] + 'tx_yoastseo_score_seo' => (string)$data['seoScore'], ], ['uid' => (int)$data['uid']]); } } @@ -95,16 +79,15 @@ protected function saveScores(array $data): void public function promimentWordsAction( ServerRequestInterface $request ): ResponseInterface { - $body = $request->getBody()->getContents(); - $data = json_decode($body); + $data = $this->getJsonData($request); - if (isset($data->words, $data->uid)) { + if (isset($data['words'], $data['uid'])) { $this->prominentWordsService->saveProminentWords( - (int)$data->uid, - isset($data->pid) ? (int)$data->pid : null, - $data->table ?? 'pages', - (int)($data->languageId ?? 0), - (array)$data->words + (int)$data['uid'], + isset($data['pid']) ? (int)$data['pid'] : null, + $data['table'] ?? 'pages', + (int)($data['languageId'] ?? 0), + (array)$data['words'] ); } @@ -114,13 +97,12 @@ public function promimentWordsAction( public function internalLinkingSuggestionsAction( ServerRequestInterface $request ): ResponseInterface { - $body = $request->getBody()->getContents(); - $data = json_decode($body); + $data = $this->getJsonData($request); - $words = $data->words ?? []; - $excludedPageId = (int)($data->excludedPage ?? 0); - $languageId = (int)($data->languageId ?? 0); - $content = (string)($data->content ?? ''); + $words = $data['words'] ?? []; + $excludedPageId = (int)($data['excludedPage'] ?? 0); + $languageId = (int)($data['languageId'] ?? 0); + $content = (string)($data['content'] ?? ''); $links = $this->linkingSuggestionsService->getLinkingSuggestions( $words, @@ -133,7 +115,7 @@ public function internalLinkingSuggestionsAction( 'OK', 'links' => $links, 'excludedPage' => $excludedPageId, - 'languageId' => $languageId + 'languageId' => $languageId, ]); } @@ -144,11 +126,11 @@ public function crawlerDeterminePages( $amount = $this->crawlerService->getAmountOfPages($crawlerData['site'], $crawlerData['language']); if ($amount > 0) { return new JsonResponse([ - 'amount' => $amount + 'amount' => $amount, ]); } return new JsonResponse([ - 'error' => 'No pages found to analyse' + 'error' => 'No pages found to analyse', ]); } @@ -169,14 +151,20 @@ public function crawlerIndexPages( protected function getCrawlerRequestData(ServerRequestInterface $request): array { - $crawlerData = json_decode($request->getBody()->getContents(), true); + $crawlerData = $this->getJsonData($request); if (!isset($crawlerData['site'], $crawlerData['language'])) { die(json_encode(['error' => 'No site and language provided by request'])); } return [ 'site' => (int)$crawlerData['site'], 'language' => (int)$crawlerData['language'], - 'offset' => (int)($crawlerData['offset'] ?? 0) + 'offset' => (int)($crawlerData['offset'] ?? 0), ]; } + + protected function getJsonData(ServerRequestInterface $request): array + { + $body = $request->getBody()->getContents(); + return json_decode($body, true); + } } diff --git a/Classes/Controller/CrawlerController.php b/Classes/Controller/CrawlerController.php index ecb4b636..4016e0ff 100644 --- a/Classes/Controller/CrawlerController.php +++ b/Classes/Controller/CrawlerController.php @@ -6,9 +6,6 @@ use Psr\Http\Message\ResponseInterface; use TYPO3\CMS\Backend\Routing\UriBuilder; -use TYPO3\CMS\Core\Http\RedirectResponse; -use TYPO3\CMS\Core\Information\Typo3Version; -use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Site\SiteFinder; use TYPO3\CMS\Core\Utility\GeneralUtility; use YoastSeoForTypo3\YoastSeo\Utility\JavascriptUtility; @@ -18,35 +15,22 @@ class CrawlerController extends AbstractBackendController { - public function indexAction(): ResponseInterface - { - $this->addYoastJavascriptConfig(); - return $this->returnResponse(['sites' => $this->getAllSites()]); - } + public function __construct( + protected CrawlerService $crawlerService, + protected SiteFinder $siteFinder, + ) {} - public function legacyAction(): void + public function indexAction(): ResponseInterface { $this->addYoastJavascriptConfig(); - $this->view->assign('sites', $this->getAllSites()); + return $this->returnResponse(['sites' => $this->siteFinder->getAllSites()]); } public function resetProgressAction(int $site, int $language):? ResponseInterface { - $crawlerService = GeneralUtility::makeInstance(CrawlerService::class); - $crawlerService->resetProgressInformation($site, $language); - - if (GeneralUtility::makeInstance(Typo3Version::class) - ->getMajorVersion() === 10) { - $this->redirect('legacy'); - } else { - return $this->redirect('index'); - } - } + $this->crawlerService->resetProgressInformation($site, $language); - protected function getAllSites(): array - { - return GeneralUtility::makeInstance(SiteFinder::class) - ->getAllSites(); + return $this->redirect('index'); } protected function addYoastJavascriptConfig(): void @@ -61,8 +45,8 @@ protected function addYoastJavascriptConfig(): void 'preview' => (string)$uriBuilder->buildUriFromRoute('ajax_yoast_preview'), 'determinePages' => (string)$uriBuilder->buildUriFromRoute('ajax_yoast_crawler_determine_pages'), 'indexPages' => (string)$uriBuilder->buildUriFromRoute('ajax_yoast_crawler_index_pages'), - 'prominentWords' => (string)$uriBuilder->buildUriFromRoute('ajax_yoast_prominent_words') - ] + 'prominentWords' => (string)$uriBuilder->buildUriFromRoute('ajax_yoast_prominent_words'), + ], ]); } } diff --git a/Classes/Controller/DashboardController.php b/Classes/Controller/DashboardController.php index 39a75ac7..c1b3b732 100644 --- a/Classes/Controller/DashboardController.php +++ b/Classes/Controller/DashboardController.php @@ -12,8 +12,4 @@ public function indexAction(): ResponseInterface { return $this->returnResponse(); } - - public function legacyAction(): void - { - } } diff --git a/Classes/Controller/OverviewController.php b/Classes/Controller/OverviewController.php index 100698b0..82954581 100644 --- a/Classes/Controller/OverviewController.php +++ b/Classes/Controller/OverviewController.php @@ -5,15 +5,12 @@ namespace YoastSeoForTypo3\YoastSeo\Controller; use Psr\Http\Message\ResponseInterface; -use TYPO3\CMS\Backend\Utility\BackendUtility; -use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; use TYPO3\CMS\Core\Exception\SiteNotFoundException; use TYPO3\CMS\Core\Localization\LanguageService; +use TYPO3\CMS\Core\Pagination\ArrayPaginator; use TYPO3\CMS\Core\Site\Entity\Site; use TYPO3\CMS\Core\Site\SiteFinder; -use TYPO3\CMS\Core\Type\Bitmask\Permission; use TYPO3\CMS\Core\Utility\GeneralUtility; -use YoastSeoForTypo3\YoastSeo\Pagination\ArrayPaginator; use YoastSeoForTypo3\YoastSeo\Pagination\Pagination; class OverviewController extends AbstractBackendController @@ -47,15 +44,6 @@ public function listAction(int $currentPage = 1): ResponseInterface return $this->returnResponse($overviewData, $moduleTemplate); } - public function legacyAction(int $currentPage = 1): void - { - $overviewData = $this->getOverviewData($currentPage) + ['action' => 'legacy']; - if (isset($overviewData['pageInformation'])) { - $overviewData['languageMenuItems'] = $this->getLanguageMenuItems($overviewData['pageInformation']); - } - $this->view->assignMultiple($overviewData); - } - protected function getOverviewData(int $currentPage): array { $pageInformation = $this->getPageInformation(); @@ -94,21 +82,19 @@ protected function getOverviewData(int $currentPage): array public function getAvailableFilters(): ?array { - if (array_key_exists('overview_filters', $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['yoast_seo']) - && is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['yoast_seo']['overview_filters']) - ) { - $params = $this->getParams(); - foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['yoast_seo']['overview_filters'] as &$filter) { - $filter['numberOfItems'] = (int)GeneralUtility::callUserFunction( - $filter['countProvider'], - $params, - $this - ); - } - return (array)$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['yoast_seo']['overview_filters']; + if (!is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['yoast_seo']['overview_filters'] ?? false)) { + return null; } - return null; + $params = $this->getParams(); + foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['yoast_seo']['overview_filters'] as &$filter) { + $filter['numberOfItems'] = (int)GeneralUtility::callUserFunction( + $filter['countProvider'], + $params, + $this + ); + } + return (array)$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['yoast_seo']['overview_filters']; } protected function getActiveFilter(array $filters): string @@ -170,16 +156,6 @@ protected function getLanguageMenuItems(array $pageInformation): ?array return $items; } - protected function getPageInformation(): ?array - { - $id = GeneralUtility::_GET('id'); - $pageInformation = BackendUtility::readPageAccess( - $id, - $this->getBackendUser()->getPagePermsClause(Permission::PAGE_SHOW) - ); - return is_array($pageInformation) ? $pageInformation : null; - } - protected function getSite(int $pageUid): ?Site { $siteFinder = GeneralUtility::makeInstance(SiteFinder::class); @@ -207,9 +183,4 @@ public function getLanguageService(): LanguageService { return $GLOBALS['LANG']; } - - protected function getBackendUser(): BackendUserAuthentication - { - return $GLOBALS['BE_USER']; - } } diff --git a/Classes/DataProviders/AbstractOverviewDataProvider.php b/Classes/DataProviders/AbstractOverviewDataProvider.php index 73f1568d..90a8a210 100644 --- a/Classes/DataProviders/AbstractOverviewDataProvider.php +++ b/Classes/DataProviders/AbstractOverviewDataProvider.php @@ -51,7 +51,7 @@ public function numberOfItems(array $params): int protected function getRestrictedPagesResults(bool $returnOnlyCount = false) { - $pageIds = PageAccessUtility::getPageIds((int)GeneralUtility::_GET('id')); + $pageIds = PageAccessUtility::getPageIds((int)$_GET['id']); $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable(self::PAGES_TABLE); $maxBindParameters = PlatformInformation::getMaxBindParameters($connection->getDatabasePlatform()); @@ -69,7 +69,7 @@ protected function getRestrictedPagesResults(bool $returnOnlyCount = false) continue; } - foreach ($query->fetchAll() as $page) { + foreach ($query->fetchAllAssociative() as $page) { $pages[] = $page; } } diff --git a/Classes/DataProviders/CornerstoneOverviewDataProvider.php b/Classes/DataProviders/CornerstoneOverviewDataProvider.php index 416860d2..489fa639 100644 --- a/Classes/DataProviders/CornerstoneOverviewDataProvider.php +++ b/Classes/DataProviders/CornerstoneOverviewDataProvider.php @@ -29,6 +29,6 @@ public function getResults(array $pageIds = []): ?Result return $queryBuilder->select('*') ->from(self::PAGES_TABLE) ->where(...$constraints) - ->execute(); + ->executeQuery(); } } diff --git a/Classes/DataProviders/OrphanedContentDataProvider.php b/Classes/DataProviders/OrphanedContentDataProvider.php index d6efdab5..c141ad1e 100644 --- a/Classes/DataProviders/OrphanedContentDataProvider.php +++ b/Classes/DataProviders/OrphanedContentDataProvider.php @@ -8,7 +8,6 @@ use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; -use YoastSeoForTypo3\YoastSeo\Service\DbalService; use YoastSeoForTypo3\YoastSeo\Utility\YoastUtility; class OrphanedContentDataProvider extends AbstractOverviewDataProvider @@ -40,7 +39,7 @@ public function getResults(array $pageIds = []): ?Result return $qb->select('*') ->from('pages') ->where(...$constraints) - ->execute(); + ->executeQuery(); } protected function setReferencedPages(): void @@ -58,15 +57,14 @@ protected function setReferencedPages(): void ) ]; - $statement = $qb->select('ref_uid') + $references = $qb->select('ref_uid') ->from('sys_refindex') ->where(...$constraints) ->groupBy('ref_uid') - ->execute(); + ->executeQuery() + ->fetchAllAssociative(); - $refs = GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); - - foreach ($refs as $ref) { + foreach ($references as $ref) { $this->referencedPages[] = $ref['ref_uid']; } } diff --git a/Classes/DataProviders/PagesWithoutDescriptionOverviewDataProvider.php b/Classes/DataProviders/PagesWithoutDescriptionOverviewDataProvider.php index bd499ad9..cc34dd8c 100644 --- a/Classes/DataProviders/PagesWithoutDescriptionOverviewDataProvider.php +++ b/Classes/DataProviders/PagesWithoutDescriptionOverviewDataProvider.php @@ -18,7 +18,7 @@ public function getResults(array $pageIds = []): ?Result $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(self::PAGES_TABLE); $constraints = [ - $queryBuilder->expr()->orX( + $queryBuilder->expr()->or( $queryBuilder->expr()->eq('description', $queryBuilder->createNamedParameter('')), $queryBuilder->expr()->isNull('description') ), @@ -37,6 +37,6 @@ public function getResults(array $pageIds = []): ?Result return $queryBuilder->select(...self::PAGES_FIELDS) ->from(self::PAGES_TABLE) ->where(...$constraints) - ->execute(); + ->executeQuery(); } } diff --git a/Classes/EventListener/AbstractListener.php b/Classes/EventListener/AbstractListener.php index 2a0dc990..5e1c715f 100644 --- a/Classes/EventListener/AbstractListener.php +++ b/Classes/EventListener/AbstractListener.php @@ -8,13 +8,7 @@ abstract class AbstractListener { - /** - * @var \YoastSeoForTypo3\YoastSeo\Record\Builder\AbstractBuilder - */ - protected AbstractBuilder $builder; - - public function __construct(AbstractBuilder $builder) - { - $this->builder = $builder; - } + public function __construct( + protected AbstractBuilder $builder + ) {} } diff --git a/Classes/EventListener/RecordCanonicalListener.php b/Classes/EventListener/RecordCanonicalListener.php index 2dfbe8a8..0d1162a4 100644 --- a/Classes/EventListener/RecordCanonicalListener.php +++ b/Classes/EventListener/RecordCanonicalListener.php @@ -5,7 +5,6 @@ namespace YoastSeoForTypo3\YoastSeo\EventListener; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController; use TYPO3\CMS\Seo\Event\ModifyUrlForCanonicalTagEvent; use YoastSeoForTypo3\YoastSeo\Record\Record; use YoastSeoForTypo3\YoastSeo\Record\RecordService; diff --git a/Classes/Form/Element/Cornerstone.php b/Classes/Form/Element/Cornerstone.php index 08133813..c78487b1 100644 --- a/Classes/Form/Element/Cornerstone.php +++ b/Classes/Form/Element/Cornerstone.php @@ -5,7 +5,6 @@ namespace YoastSeoForTypo3\YoastSeo\Form\Element; use TYPO3\CMS\Backend\Form\AbstractNode; -use TYPO3\CMS\Backend\Form\NodeFactory; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Fluid\View\StandaloneView; diff --git a/Classes/Form/Element/InternalLinkingSuggestion.php b/Classes/Form/Element/InternalLinkingSuggestion.php index 1c21cc70..f5d77873 100644 --- a/Classes/Form/Element/InternalLinkingSuggestion.php +++ b/Classes/Form/Element/InternalLinkingSuggestion.php @@ -5,10 +5,10 @@ namespace YoastSeoForTypo3\YoastSeo\Form\Element; use TYPO3\CMS\Backend\Form\AbstractNode; -use TYPO3\CMS\Backend\Form\NodeFactory; use TYPO3\CMS\Backend\Routing\UriBuilder; use TYPO3\CMS\Core\Exception\SiteNotFoundException; use TYPO3\CMS\Core\Page\PageRenderer; +use TYPO3\CMS\Core\Site\Entity\SiteLanguage; use TYPO3\CMS\Core\Site\SiteFinder; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Fluid\View\StandaloneView; @@ -22,32 +22,10 @@ class InternalLinkingSuggestion extends AbstractNode protected int $languageId; protected int $currentPage; - public function __construct(NodeFactory $nodeFactory, array $data) - { - parent::__construct($nodeFactory, $data); - - $this->currentPage = $data['parentPageRow']['uid']; - - if (isset($data['databaseRow']['sys_language_uid'])) { - if (is_array($data['databaseRow']['sys_language_uid']) && count( - $data['databaseRow']['sys_language_uid'] - ) > 0) { - $this->languageId = (int)current($data['databaseRow']['sys_language_uid']); - } else { - $this->languageId = (int)$data['databaseRow']['sys_language_uid']; - } - } - - $this->templateView = GeneralUtility::makeInstance(StandaloneView::class); - $this->templateView->setTemplatePathAndFilename( - GeneralUtility::getFileAbsFileName( - 'EXT:yoast_seo/Resources/Private/Templates/TCA/InternalLinkingSuggestion.html' - ) - ); - } - public function render(): array { + $this->init(); + $locale = $this->getLocale($this->currentPage); if ($locale === null) { $this->templateView->assign('languageError', true); @@ -67,29 +45,24 @@ public function render(): array 'isCornerstoneContent' => false, 'focusKeyphrase' => [ 'keyword' => '', - 'synonyms' => '' + 'synonyms' => '', ], 'data' => [ - 'languageId' => $this->languageId + 'languageId' => $this->languageId, ], 'linkingSuggestions' => [ 'excludedPage' => $this->currentPage, - 'locale' => $locale + 'locale' => $locale, ], 'urls' => [ 'workerUrl' => $workerUrl, 'linkingSuggestions' => (string)GeneralUtility::makeInstance(UriBuilder::class) - ->buildUriFromRoute('ajax_yoast_internal_linking_suggestions') - ] + ->buildUriFromRoute('ajax_yoast_internal_linking_suggestions'), + ], ]; $jsonConfigUtility->addConfig($config); $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class); - $pageRenderer->addRequireJsConfiguration([ - 'paths' => [ - 'YoastSEO' => $publicResourcesPath . '/JavaScript/', - ] - ]); JavascriptUtility::loadJavascript($pageRenderer); $resultArray['html'] = $this->templateView->render(); @@ -104,11 +77,42 @@ protected function getLocale(int $pageId): ?string $site = $siteFinder->getSiteByPageId($pageId); if ($this->languageId === -1) { $this->languageId = $site->getDefaultLanguage()->getLanguageId(); - return $site->getDefaultLanguage()->getTwoLetterIsoCode(); + return $this->getLanguageCode($site->getDefaultLanguage()); } - return $site->getLanguageById($this->languageId)->getTwoLetterIsoCode(); + return $this->getLanguageCode($site->getLanguageById($this->languageId)); } catch (SiteNotFoundException|\InvalidArgumentException $e) { return null; } } + + protected function getLanguageCode(SiteLanguage $siteLanguage): string + { + // Support for v11 + if (method_exists($siteLanguage, 'getTwoLetterIsoCode')) { + return $siteLanguage->getTwoLetterIsoCode(); + } + return $siteLanguage->getLocale()->getLanguageCode(); + } + + protected function init(): void + { + $this->currentPage = $this->data['parentPageRow']['uid']; + + if (isset($this->data['databaseRow']['sys_language_uid'])) { + if (is_array($this->data['databaseRow']['sys_language_uid']) && count( + $this->data['databaseRow']['sys_language_uid'] + ) > 0) { + $this->languageId = (int)current($this->data['databaseRow']['sys_language_uid']); + } else { + $this->languageId = (int)$this->data['databaseRow']['sys_language_uid']; + } + } + + $this->templateView = GeneralUtility::makeInstance(StandaloneView::class); + $this->templateView->setTemplatePathAndFilename( + GeneralUtility::getFileAbsFileName( + 'EXT:yoast_seo/Resources/Private/Templates/TCA/InternalLinkingSuggestion.html' + ) + ); + } } diff --git a/Classes/Form/Element/SnippetPreview.php b/Classes/Form/Element/SnippetPreview.php index b868aab3..a522640a 100644 --- a/Classes/Form/Element/SnippetPreview.php +++ b/Classes/Form/Element/SnippetPreview.php @@ -100,27 +100,15 @@ protected function initialize(): void { $this->urlService = GeneralUtility::makeInstance(UrlService::class); - if (array_key_exists('titleField', (array)$this->data['parameterArray']['fieldConf']['config']['settings']) && - $this->data['parameterArray']['fieldConf']['config']['settings']['titleField'] - ) { + if (!empty($this->data['parameterArray']['fieldConf']['config']['settings']['titleField'] ?? '')) { $this->titleField = $this->data['parameterArray']['fieldConf']['config']['settings']['titleField']; } - if (array_key_exists( - 'pageTitleField', - (array)$this->data['parameterArray']['fieldConf']['config']['settings'] - ) && - $this->data['parameterArray']['fieldConf']['config']['settings']['pageTitleField'] - ) { + if (!empty($this->data['parameterArray']['fieldConf']['config']['settings']['pageTitleField'] ?? '')) { $this->pageTitleField = $this->data['parameterArray']['fieldConf']['config']['settings']['pageTitleField']; } - if (array_key_exists( - 'descriptionField', - (array)$this->data['parameterArray']['fieldConf']['config']['settings'] - ) - && $this->data['parameterArray']['fieldConf']['config']['settings']['descriptionField'] - ) { + if (!empty($this->data['parameterArray']['fieldConf']['config']['settings']['descriptionField'] ?? '')) { $this->descriptionField = $this->data['parameterArray']['fieldConf']['config']['settings']['descriptionField']; } diff --git a/Classes/Frontend/AdditionalPreviewData.php b/Classes/Frontend/AdditionalPreviewData.php index 56c021ec..b5347859 100644 --- a/Classes/Frontend/AdditionalPreviewData.php +++ b/Classes/Frontend/AdditionalPreviewData.php @@ -76,24 +76,15 @@ protected function getPageTitlePrependAppend(): array protected function getPageTitleSeparator(): string { - $pageTitleSeparator = ''; - // Check for a custom pageTitleSeparator, and perform stdWrap on it - if (isset($this->config['pageTitleSeparator']) - && $this->config['pageTitleSeparator'] !== '') { - $pageTitleSeparator = $this->config['pageTitleSeparator']; - - if (isset($this->config['pageTitleSeparator.']) - && is_array($this->config['pageTitleSeparator.'])) { - $cObj = GeneralUtility::makeInstance(ContentObjectRenderer::class); - $pageTitleSeparator = $cObj->stdWrap( - $pageTitleSeparator, - $this->config['pageTitleSeparator.'] - ); - } else { - $pageTitleSeparator .= ' '; - } + if (!isset($this->config['pageTitleSeparator']) || $this->config['pageTitleSeparator'] === '') { + return ''; } - return $pageTitleSeparator; + if (is_array($this->config['pageTitleSeparator.'] ?? null)) { + return GeneralUtility::makeInstance(ContentObjectRenderer::class) + ->stdWrap($this->config['pageTitleSeparator'], $this->config['pageTitleSeparator.']); + } + + return $this->config['pageTitleSeparator'] . ' '; } } diff --git a/Classes/Hooks/BackendYoastConfig.php b/Classes/Hooks/BackendYoastConfig.php index 538d0577..0533e71f 100644 --- a/Classes/Hooks/BackendYoastConfig.php +++ b/Classes/Hooks/BackendYoastConfig.php @@ -9,7 +9,6 @@ use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Utility\GeneralUtility; use YoastSeoForTypo3\YoastSeo\Utility\JsonConfigUtility; -use YoastSeoForTypo3\YoastSeo\Utility\PathUtility; class BackendYoastConfig { diff --git a/Classes/MetaTag/AdvancedRobotsGenerator.php b/Classes/MetaTag/AdvancedRobotsGenerator.php index 1be866aa..cb51ae2c 100644 --- a/Classes/MetaTag/AdvancedRobotsGenerator.php +++ b/Classes/MetaTag/AdvancedRobotsGenerator.php @@ -4,8 +4,10 @@ namespace YoastSeoForTypo3\YoastSeo\MetaTag; +use TYPO3\CMS\Core\Http\ServerRequest; use TYPO3\CMS\Core\MetaTag\MetaTagManagerRegistry; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Frontend\Page\PageInformation; use YoastSeoForTypo3\YoastSeo\Record\Record; use YoastSeoForTypo3\YoastSeo\Record\RecordService; @@ -26,8 +28,14 @@ public function generate(array $params): void $activeRecord = $this->recordService->getActiveRecord(); if ($activeRecord instanceof Record && $activeRecord->shouldGenerateRobotsTag()) { $record = $activeRecord->getRecordData(); + } elseif (isset($params['request']) && $params['request'] instanceof ServerRequest && $params['request']->getAttribute('frontend.page.information') instanceof PageInformation) { + $record = $params['request']->getAttribute('frontend.page.information')->getPageRecord(); } else { - $record = $params['page']; + $record = $params['page'] ?? null; + } + + if ($record === null) { + return; } $noImageIndex = (bool)($record['tx_yoastseo_robots_noimageindex'] ?? false); diff --git a/Classes/Pagination/ArrayPaginator.php b/Classes/Pagination/ArrayPaginator.php deleted file mode 100644 index c319f259..00000000 --- a/Classes/Pagination/ArrayPaginator.php +++ /dev/null @@ -1,135 +0,0 @@ -items = $items; - $this->setCurrentPageNumber($currentPageNumber); - $this->setItemsPerPage($itemsPerPage); - - $this->updateInternalState(); - } - - /** - * @return iterable|array - */ - public function getPaginatedItems(): iterable - { - return $this->paginatedItems; - } - - protected function updatePaginatedItems(int $itemsPerPage, int $offset): void - { - $this->paginatedItems = array_slice($this->items, $offset, $itemsPerPage); - } - - protected function getTotalAmountOfItems(): int - { - return count($this->items); - } - - public function getNumberOfPages(): int - { - return $this->numberOfPages; - } - - public function getCurrentPageNumber(): int - { - return $this->currentPageNumber; - } - - /** - * This method is the heart of the pagination. It updates all internal params and then calls the - * {@see updatePaginatedItems} method which must update the set of paginated items. - */ - protected function updateInternalState(): void - { - $offset = (int)($this->itemsPerPage * ($this->currentPageNumber - 1)); - $totalAmountOfItems = $this->getTotalAmountOfItems(); - - /* - * If the total amount of items is zero, then the number of pages is mathematically zero as - * well. As that looks strange in the frontend, the number of pages is forced to be at least - * one. - */ - $this->numberOfPages = max(1, (int)ceil($totalAmountOfItems / $this->itemsPerPage)); - - /* - * To prevent empty results in case the given current page number exceeds the maximum number - * of pages, we set the current page number to the last page and update the internal state - * with this value again. Such situation should in the first place be prevented by not allowing - * those values to be passed, e.g. by using the "max" attribute in the view. However there are - * valid cases. For example when a user deletes a record while the pagination is already visible - * to another user with, until then, a valid "max" value. Passing invalid values unintentionally - * should therefore just silently be resolved. - */ - if ($this->currentPageNumber > $this->numberOfPages) { - $this->currentPageNumber = $this->numberOfPages; - $this->updateInternalState(); - return; - } - - $this->updatePaginatedItems($this->itemsPerPage, $offset); - } - - protected function setItemsPerPage(int $itemsPerPage): void - { - if ($itemsPerPage < 1) { - throw new \InvalidArgumentException( - 'Argument $itemsPerPage must be greater than 0', - 1573061766 - ); - } - - $this->itemsPerPage = $itemsPerPage; - } - - protected function setCurrentPageNumber(int $currentPageNumber): void - { - if ($currentPageNumber < 1) { - throw new \InvalidArgumentException( - 'Argument $currentPageNumber must be greater than 0', - 1573047338 - ); - } - - $this->currentPageNumber = $currentPageNumber; - } -} diff --git a/Classes/Pagination/Pagination.php b/Classes/Pagination/Pagination.php index 533713f1..d4fdfa1f 100644 --- a/Classes/Pagination/Pagination.php +++ b/Classes/Pagination/Pagination.php @@ -4,17 +4,17 @@ namespace YoastSeoForTypo3\YoastSeo\Pagination; +use TYPO3\CMS\Core\Pagination\ArrayPaginator; + /** * Class Pagination * * Functionality ported from the old fluid widget paginate, to support huge overviews * (prevent long lists of numbered links) + * TODO: Can be removed once CMS11 support is dropped */ class Pagination { - /** - * @var \YoastSeoForTypo3\YoastSeo\Pagination\ArrayPaginator - */ protected ArrayPaginator $paginator; protected int $maximumNumberOfLinks = 15; diff --git a/Classes/Record/RecordRegistry.php b/Classes/Record/RecordRegistry.php index ad5cd539..d5722bff 100644 --- a/Classes/Record/RecordRegistry.php +++ b/Classes/Record/RecordRegistry.php @@ -11,7 +11,7 @@ class RecordRegistry implements SingletonInterface { /** - * @var \YoastSeoForTypo3\YoastSeo\Record\Record[] + * @var Record[] */ protected ?array $records = null; @@ -34,7 +34,7 @@ public function removeRecord(string $tableName): void } /** - * @return \YoastSeoForTypo3\YoastSeo\Record\Record[] + * @return Record[] */ public function getRecords(bool $useCache = false): array { diff --git a/Classes/Record/RecordService.php b/Classes/Record/RecordService.php index bc924da6..82c3fd23 100644 --- a/Classes/Record/RecordService.php +++ b/Classes/Record/RecordService.php @@ -10,7 +10,6 @@ use TYPO3\CMS\Core\Utility\ArrayUtility; use TYPO3\CMS\Core\Utility\Exception\MissingArrayPathException; use TYPO3\CMS\Core\Utility\GeneralUtility; -use YoastSeoForTypo3\YoastSeo\Service\DbalService; class RecordService implements SingletonInterface { @@ -41,12 +40,12 @@ public function getActiveRecord(): ?Record } /** - * @param \YoastSeoForTypo3\YoastSeo\Record\Record[] $records - * @return \YoastSeoForTypo3\YoastSeo\Record\Record|null + * @param Record[] $records + * @return Record|null */ protected function findRecord(array $records): ?Record { - $currentGetParameters = GeneralUtility::_GET(); + $currentGetParameters = $_GET; foreach ($records as $record) { if (empty($record->getGetParameters())) { @@ -71,11 +70,10 @@ protected function findRecord(array $records): ?Record protected function getRecordData(Record $record): array { - $statement = GeneralUtility::makeInstance(ConnectionPool::class) + $recordRow = GeneralUtility::makeInstance(ConnectionPool::class) ->getConnectionForTable($record->getTableName()) - ->select(['*'], $record->getTableName(), ['uid' => $record->getRecordUid()]); - - $recordRow = GeneralUtility::makeInstance(DbalService::class)->getSingleResult($statement); + ->select(['*'], $record->getTableName(), ['uid' => $record->getRecordUid()]) + ->fetchAssociative(); return (array)GeneralUtility::makeInstance(PageRepository::class) ->getLanguageOverlay($record->getTableName(), (array)$recordRow); diff --git a/Classes/Service/CrawlerService.php b/Classes/Service/CrawlerService.php index 9157c28d..494fa612 100644 --- a/Classes/Service/CrawlerService.php +++ b/Classes/Service/CrawlerService.php @@ -4,7 +4,7 @@ namespace YoastSeoForTypo3\YoastSeo\Service; -use TYPO3\CMS\Core\Cache\CacheManager; +use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Registry; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -17,21 +17,10 @@ class CrawlerService protected const REGISTRY_KEY = 'crawler-%d-%d'; protected const INDEX_CHUNK = 50; - /** - * @var \TYPO3\CMS\Core\Cache\Frontend\FrontendInterface - */ - protected $cache; - - /** - * @var \TYPO3\CMS\Core\Registry - */ - protected $registry; - - public function __construct() - { - $this->cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('pages'); - $this->registry = GeneralUtility::makeInstance(Registry::class); - } + public function __construct( + protected FrontendInterface $cache, + protected Registry $registry + ) {} public function getAmountOfPages(int $site, int $languageId): int { @@ -51,7 +40,7 @@ public function getIndexInformation(int $site, int $languageId, $offset = 0): ar 'pages' => array_splice($pagesToIndex, $currentOffset, self::INDEX_CHUNK), 'current' => $currentOffset, 'nextOffset' => $currentOffset + self::INDEX_CHUNK, - 'total' => $total + 'total' => $total, ]; } @@ -71,7 +60,7 @@ protected function setProgressInformation(int $site, int $languageId, int $offse sprintf(self::REGISTRY_KEY, $site, $languageId), [ 'offset' => $offset, - 'total' => $total + 'total' => $total, ] ); } @@ -106,11 +95,11 @@ protected function getPagesToIndex(int $site, int $languageId): array $queryBuilder->expr()->in( 'uid', $treeChunk - ) + ), ]; } - $statement = $queryBuilder->select($select) + $pages = $queryBuilder->select($select) ->from('pages') ->where( $queryBuilder->expr()->in( @@ -118,8 +107,7 @@ protected function getPagesToIndex(int $site, int $languageId): array YoastUtility::getAllowedDoktypes() ), ...$constraints - )->execute(); - $pages = GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); + )->executeQuery()->fetchAllAssociative(); $pagesToIndex = array_merge($pagesToIndex, array_column($pages, $select)); } } diff --git a/Classes/Service/DbalService.php b/Classes/Service/DbalService.php deleted file mode 100644 index 6aebc84d..00000000 --- a/Classes/Service/DbalService.php +++ /dev/null @@ -1,37 +0,0 @@ -getMajorVersion() === 10) { - return $statement->fetch(); - } - return $statement->fetchAssociative(); - } - - /** - * @param Statement|\Doctrine\DBAL\ForwardCompatibility\Result|\Doctrine\DBAL\Driver\ResultStatement $statement - */ - public function getAllResults($statement) - { - if (GeneralUtility::makeInstance(Typo3Version::class)->getMajorVersion() === 10) { - return $statement->fetchAll(); - } - return $statement->fetchAllAssociative(); - } -} diff --git a/Classes/Service/LinkingSuggestionsService.php b/Classes/Service/LinkingSuggestionsService.php index ad278175..b0204d68 100644 --- a/Classes/Service/LinkingSuggestionsService.php +++ b/Classes/Service/LinkingSuggestionsService.php @@ -21,15 +21,10 @@ class LinkingSuggestionsService protected int $site; protected int $languageId; - protected ConnectionPool $connectionPool; - protected PageRepository $pageRepository; - public function __construct( - ConnectionPool $connectionPool, - PageRepository $pageRepository + protected ConnectionPool $connectionPool, + protected PageRepository $pageRepository ) { - $this->connectionPool = $connectionPool; - $this->pageRepository = $pageRepository; } public function getLinkingSuggestions( @@ -109,7 +104,7 @@ protected function countDocumentFrequencies(array $stems): array } $queryBuilder = $this->connectionPool->getQueryBuilderForTable(self::PROMINENT_WORDS_TABLE); - $statement = $queryBuilder->select('stem') + $rawDocFrequencies = $queryBuilder->select('stem') ->addSelectLiteral('COUNT(stem) AS document_frequency') ->from(self::PROMINENT_WORDS_TABLE) ->where( @@ -121,9 +116,8 @@ protected function countDocumentFrequencies(array $stems): array $queryBuilder->expr()->eq('site', $this->site) ) ->groupBy('stem') - ->execute(); - - $rawDocFrequencies = GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); + ->executeQuery() + ->fetchAllAssociative(); $stems = array_map( static function ($item) { @@ -177,7 +171,7 @@ protected function findStemsByRecords(array $records): array $prominentStems = array_column($prominentWords, 'stem'); $queryBuilder = $this->connectionPool->getQueryBuilderForTable(self::PROMINENT_WORDS_TABLE); - $statement = $queryBuilder->select('stem') + $documentFreqs = $queryBuilder->select('stem') ->addSelectLiteral('COUNT(uid) AS count') ->from(self::PROMINENT_WORDS_TABLE) ->where( @@ -189,9 +183,8 @@ protected function findStemsByRecords(array $records): array $queryBuilder->expr()->eq('sys_language_uid', $this->languageId) ) ->groupBy('stem') - ->execute(); - - $documentFreqs = GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); + ->executeQuery() + ->fetchAllAssociative(); $stemCounts = []; foreach ($documentFreqs as $documentFreq) { @@ -210,7 +203,7 @@ protected function findStemsByRecords(array $records): array protected function findRecordsByStems(array $stems, int $batchSize, int $page): array { $queryBuilder = $this->connectionPool->getQueryBuilderForTable(self::PROMINENT_WORDS_TABLE); - $statement = $queryBuilder->select('pid', 'tablenames') + return $queryBuilder->select('pid', 'tablenames') ->from(self::PROMINENT_WORDS_TABLE) ->where( $queryBuilder->expr()->in( @@ -222,8 +215,8 @@ protected function findRecordsByStems(array $stems, int $batchSize, int $page): ) ->setMaxResults($batchSize) ->setFirstResult(($page - 1) * $batchSize) - ->execute(); - return GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); + ->executeQuery() + ->fetchAllAssociative(); } protected function getProminentWords(array $records): array @@ -231,7 +224,7 @@ protected function getProminentWords(array $records): array $queryBuilder = $this->connectionPool->getQueryBuilderForTable(self::PROMINENT_WORDS_TABLE); $orStatements = []; foreach ($records as $record) { - $orStatements[] = $queryBuilder->expr()->andX( + $orStatements[] = $queryBuilder->expr()->and( $queryBuilder->expr()->eq('pid', $record['pid']), $queryBuilder->expr()->eq('tablenames', $queryBuilder->createNamedParameter($record['tablenames'])), $queryBuilder->expr()->eq( @@ -240,13 +233,13 @@ protected function getProminentWords(array $records): array ) ); } - $statement = $queryBuilder->select('stem', 'weight', 'pid', 'tablenames', 'uid_foreign') + return $queryBuilder->select('stem', 'weight', 'pid', 'tablenames', 'uid_foreign') ->from(self::PROMINENT_WORDS_TABLE) ->where( - $queryBuilder->expr()->orX(...$orStatements) + $queryBuilder->expr()->or(...$orStatements) ) - ->execute(); - return GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); + ->executeQuery() + ->fetchAllAssociative(); } protected function groupWordsByRecord(array $candidateWords): array diff --git a/Classes/Service/LocaleService.php b/Classes/Service/LocaleService.php index 3b77961c..06a82300 100644 --- a/Classes/Service/LocaleService.php +++ b/Classes/Service/LocaleService.php @@ -11,11 +11,10 @@ class LocaleService { protected const APP_TRANSLATION_FILE_PATTERN = 'EXT:yoast_seo/Resources/Private/Language/wordpress-seo-%s.json'; - protected Locales $locales; - public function __construct(Locales $locales) - { - $this->locales = $locales; + public function __construct( + protected Locales $locales + ) { } public function getTranslations(): array diff --git a/Classes/Service/PreviewService.php b/Classes/Service/PreviewService.php index 64137459..57336174 100644 --- a/Classes/Service/PreviewService.php +++ b/Classes/Service/PreviewService.php @@ -62,7 +62,7 @@ protected function getContentFromUrl(string $uriToCheck): ?string if ($response->getStatusCode() === 200) { return $response->getBody()->getContents(); } - throw new Exception($response->getStatusCode()); + throw new Exception((string)$response->getStatusCode()); } protected function getDataFromContent(?string $content, string $uriToCheck): array diff --git a/Classes/Service/ProminentWordsService.php b/Classes/Service/ProminentWordsService.php index 28c721d9..ff69193f 100644 --- a/Classes/Service/ProminentWordsService.php +++ b/Classes/Service/ProminentWordsService.php @@ -20,12 +20,9 @@ class ProminentWordsService protected string $table; protected int $languageId; - protected ConnectionPool $connectionPool; - - public function __construct(ConnectionPool $connectionPool) - { - $this->connectionPool = $connectionPool; - } + public function __construct( + protected ConnectionPool $connectionPool + ) {} public function saveProminentWords( int $uid, @@ -68,7 +65,7 @@ protected function updateIfWeightHasChanged(array $oldWord, int $weight): void $queryBuilder->expr()->eq('uid', $oldWord['uid']) ) ->setMaxResults(1) - ->execute(); + ->executeQuery(); } protected function deleteProminentWords(array $wordsToDelete): void @@ -85,13 +82,13 @@ protected function deleteProminentWords(array $wordsToDelete): void $queryBuilder->createNamedParameter($wordsToDelete, Connection::PARAM_INT_ARRAY) ) ) - ->execute(); + ->executeQuery(); } protected function createNewWords(array $prominentWords): void { $site = $this->getSiteRootPageId(); - foreach ($prominentWords ?? [] as $word => $weight) { + foreach ($prominentWords as $word => $weight) { $data = [ 'pid' => $this->table === 'pages' ? $this->uid : $this->pid, 'sys_language_uid' => $this->languageId, @@ -109,23 +106,21 @@ protected function createNewWords(array $prominentWords): void protected function getOldWords(): array { $queryBuilder = $this->getQueryBuilder(); - $statement = $queryBuilder->select('uid', 'stem', 'weight') + return $queryBuilder->select('uid', 'stem', 'weight') ->from(self::PROMINENT_WORDS_TABLE) ->where( $queryBuilder->expr()->eq('uid_foreign', $this->uid), $queryBuilder->expr()->eq('tablenames', $queryBuilder->createNamedParameter($this->table)), $queryBuilder->expr()->eq('sys_language_uid', $this->languageId) ) - ->execute(); - return GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); + ->executeQuery() + ->fetchAllAssociative(); } protected function getPidForRecord(int $uid, string $table): int { $connection = $this->connectionPool->getConnectionForTable($table); - $record = GeneralUtility::makeInstance(DbalService::class)->getSingleResult( - $connection->select(['pid'], $table, ['uid' => $uid]) - ); + $record = $connection->select(['pid'], $table, ['uid' => $uid])->fetchAssociative(); return (int)($record['pid'] ?? 0); } diff --git a/Classes/Service/SnippetPreviewService.php b/Classes/Service/SnippetPreviewService.php index 8a99f29a..90e06953 100644 --- a/Classes/Service/SnippetPreviewService.php +++ b/Classes/Service/SnippetPreviewService.php @@ -4,6 +4,7 @@ namespace YoastSeoForTypo3\YoastSeo\Service; +use TYPO3\CMS\Core\Information\Typo3Version; use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Utility\GeneralUtility; use YoastSeoForTypo3\YoastSeo\Utility\JavascriptUtility; @@ -12,18 +13,11 @@ class SnippetPreviewService { - protected UrlService $urlService; - protected PageRenderer $pageRenderer; - protected LocaleService $localeService; - public function __construct( - UrlService $urlService, - PageRenderer $pageRenderer, - LocaleService $localeService + protected UrlService $urlService, + protected PageRenderer $pageRenderer, + protected LocaleService $localeService ) { - $this->urlService = $urlService; - $this->pageRenderer = $pageRenderer; - $this->localeService = $localeService; } public function buildSnippetPreview( @@ -53,7 +47,15 @@ public function buildSnippetPreview( JavascriptUtility::loadJavascript($this->pageRenderer); - $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/YoastSeo/yoastModal'); + if (GeneralUtility::makeInstance(Typo3Version::class)->getMajorVersion() >= 13) { + $this->pageRenderer->loadJavaScriptModule( + '@yoast/yoast-seo-for-typo3/yoastModalEs6.js', + ); + } else { + $this->pageRenderer->loadRequireJsModule( + 'TYPO3/CMS/YoastSeo/yoastModal', + ); + } $this->pageRenderer->addCssFile('EXT:yoast_seo/Resources/Public/CSS/yoast.min.css'); } } diff --git a/Classes/Service/UrlService.php b/Classes/Service/UrlService.php index f0c7f200..a2d1cf20 100644 --- a/Classes/Service/UrlService.php +++ b/Classes/Service/UrlService.php @@ -18,11 +18,9 @@ class UrlService implements SingletonInterface { - protected UriBuilder $uriBuilder; - - public function __construct(UriBuilder $uriBuilder) - { - $this->uriBuilder = $uriBuilder; + public function __construct( + protected UriBuilder $uriBuilder + ) { } public function getPreviewUrl( diff --git a/Classes/StructuredData/BreadcrumbStructuredDataProvider.php b/Classes/StructuredData/BreadcrumbStructuredDataProvider.php index 0355e13d..425c8e18 100644 --- a/Classes/StructuredData/BreadcrumbStructuredDataProvider.php +++ b/Classes/StructuredData/BreadcrumbStructuredDataProvider.php @@ -8,88 +8,94 @@ use TYPO3\CMS\Core\Exception\SiteNotFoundException; use TYPO3\CMS\Core\Site\SiteFinder; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController; class BreadcrumbStructuredDataProvider implements StructuredDataProviderInterface { - protected TypoScriptFrontendController $tsfe; - protected SiteFinder $siteFinder; protected array $configuration; public function __construct( - TypoScriptFrontendController $tsfe = null, - SiteFinder $siteFinder = null - ) { - $this->tsfe = $tsfe ?? $GLOBALS['TSFE']; - $this->siteFinder = $siteFinder ?? GeneralUtility::makeInstance(SiteFinder::class); - } + protected SiteFinder $siteFinder, + protected Context $context, + ) {} public function getData(): array { - $data = []; - - $rootLine = $this->tsfe->rootLine ?: []; - ksort($rootLine); - - $excludedDoktypes = $this->configuration['excludedDoktypes'] - ? GeneralUtility::intExplode(',', $this->configuration['excludedDoktypes']) - : []; $breadcrumbs = []; + $excludedDoktypes = $this->getExcludedDoktypes(); $iterator = 1; $siteRootFound = false; - foreach ($rootLine as $k => $page) { + foreach ($this->getRootLine() as $page) { if ($page['hidden'] === 1) { continue; } $siteRootFound = $siteRootFound || $page['is_siteroot']; - if ($siteRootFound && !in_array((int)$page['doktype'], $excludedDoktypes, true)) { - $url = $this->getUrlForPage($page['uid']); - if (!empty($url)) { - $breadcrumbs[] = [ - '@type' => 'ListItem', - 'position' => $iterator, - 'item' => [ - '@id' => $url, - 'name' => $page['nav_title'] ?: $page['title'] - ] - ]; - $iterator++; - } + if (!$siteRootFound || in_array((int)$page['doktype'], $excludedDoktypes, true)) { + continue; + } + $url = $this->getUrlForPage($page['uid']); + if (empty($url)) { + continue; } + $breadcrumbs[] = [ + '@type' => 'ListItem', + 'position' => $iterator, + 'item' => [ + '@id' => $url, + 'name' => $page['nav_title'] ?: $page['title'], + ], + ]; + $iterator++; } - if (!empty($breadcrumbs)) { - $data[] = [ + return $this->getBreadcrumbList($breadcrumbs); + } + + protected function getBreadcrumbList(array $breadcrumbs): array + { + if (empty($breadcrumbs)) { + return []; + } + + return [ + [ '@context' => 'https://www.schema.org', '@type' => 'BreadcrumbList', 'itemListElement' => $breadcrumbs, - ]; + ], + ]; + } + + protected function getExcludedDoktypes(): array + { + if (!empty($this->configuration['excludedDoktypes'] ?? '')) { + return GeneralUtility::intExplode(',', $this->configuration['excludedDoktypes']); } + return []; + } - return (array)$data; + protected function getRootLine(): array + { + $rootLine = $this->getTyposcriptFrontendController()->rootLine ?: []; + ksort($rootLine); + return $rootLine; } protected function getUrlForPage(int $pageId): string { - if (class_exists(SiteFinder::class)) { - try { - $site = $this->siteFinder->getSiteByPageId($pageId); - return (string)$site->getRouter()->generateUri($pageId, ['_language' => $this->getLanguage()]); - } catch (SiteNotFoundException | \InvalidArgumentException $e) { - return ''; - } + try { + $site = $this->siteFinder->getSiteByPageId($pageId); + return (string)$site->getRouter()->generateUri( + $pageId, ['_language' => (int)$this->context->getPropertyFromAspect('language', 'id')] + ); + } catch (SiteNotFoundException|\InvalidArgumentException) { + return ''; } - - $cObj = GeneralUtility::makeInstance(ContentObjectRenderer::class); - return (string)$cObj->typoLink('', ['parameter' => $pageId, 'returnLast' => 'url', 'forceAbsoluteUrl' => true]); } - protected function getLanguage(): int + protected function getTyposcriptFrontendController(): TypoScriptFrontendController { - $context = GeneralUtility::makeInstance(Context::class); - - return (int)$context->getPropertyFromAspect('language', 'id'); + return $GLOBALS['TSFE']; } public function setConfiguration(array $configuration): void diff --git a/Classes/StructuredData/SiteStructuredDataProvider.php b/Classes/StructuredData/SiteStructuredDataProvider.php index 4c17c702..6e82ee5f 100644 --- a/Classes/StructuredData/SiteStructuredDataProvider.php +++ b/Classes/StructuredData/SiteStructuredDataProvider.php @@ -6,61 +6,49 @@ use TYPO3\CMS\Core\Domain\Repository\PageRepository; use TYPO3\CMS\Core\Site\SiteFinder; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController; class SiteStructuredDataProvider implements StructuredDataProviderInterface { - protected TypoScriptFrontendController $tsfe; - protected PageRepository $pageRepository; - protected SiteFinder $siteFinder; protected array $configuration = []; public function __construct( - TypoScriptFrontendController $tsfe = null, - PageRepository $pageRepository = null, - SiteFinder $siteFinder = null - ) { - $this->tsfe = $tsfe ?? $GLOBALS['TSFE']; - $this->pageRepository = $pageRepository ?? GeneralUtility::makeInstance(PageRepository::class); - $this->siteFinder = $siteFinder ?? GeneralUtility::makeInstance(SiteFinder::class); - } + protected SiteFinder $siteFinder, + protected PageRepository $pageRepository, + ) {} public function getData(): array { - $data = []; - if ((int)$this->tsfe->page['is_siteroot'] === 1) { - $data[] = [ + if ((int)$this->getTyposcriptFrontendController()->page['is_siteroot'] !== 1) { + return []; + } + return [ + [ '@context' => 'https://www.schema.org', '@type' => 'WebSite', - 'url' => $this->getUrl((int)$this->tsfe->page['uid']), - 'name' => $this->getName((int)$this->tsfe->page['uid']), - ]; - } - - return $data; + 'url' => $this->getUrl((int)$this->getTyposcriptFrontendController()->page['uid']), + 'name' => $this->getName((int)$this->getTyposcriptFrontendController()->page['uid']), + ], + ]; } protected function getUrl(int $pageId): string { - if (class_exists(SiteFinder::class)) { - $site = $this->siteFinder->getSiteByPageId($pageId); - - return (string)$site->getBase(); - } - - $cObj = GeneralUtility::makeInstance(ContentObjectRenderer::class); - return (string)$cObj->typoLink('', ['parameter' => $pageId, 'returnLast' => 'url', 'forceAbsoluteUrl' => true]); + $site = $this->siteFinder->getSiteByPageId($pageId); + return (string)$site->getBase(); } protected function getName(int $pageId): string { $rootPageRecord = $this->pageRepository->getPage($pageId); - return $rootPageRecord['seo_title'] ?: $rootPageRecord['title'] ?: $this->getUrl($pageId); } + protected function getTyposcriptFrontendController(): TypoScriptFrontendController + { + return $GLOBALS['TSFE']; + } + public function setConfiguration(array $configuration): void { $this->configuration = $configuration; diff --git a/Classes/StructuredData/StructuredDataProviderManager.php b/Classes/StructuredData/StructuredDataProviderManager.php index 919575b2..d21345c7 100644 --- a/Classes/StructuredData/StructuredDataProviderManager.php +++ b/Classes/StructuredData/StructuredDataProviderManager.php @@ -5,8 +5,6 @@ namespace YoastSeoForTypo3\YoastSeo\StructuredData; use Psr\Http\Message\ServerRequestInterface; -use TYPO3\CMS\Core\Cache\CacheManager; -use TYPO3\CMS\Core\Cache\Exception\NoSuchCacheException; use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface; use TYPO3\CMS\Core\Http\ApplicationType; use TYPO3\CMS\Core\Service\DependencyOrderingService; @@ -21,33 +19,26 @@ */ class StructuredDataProviderManager implements SingletonInterface { - protected FrontendInterface $pageCache; - protected string $sourceComment = ''; - - public function __construct() - { - $this->initCaches(); - $this->sourceComment = ''; - } + public function __construct( + protected FrontendInterface $pageCache + ) {} public function render(array &$params, $pObj): void { - if (!($GLOBALS['TYPO3_REQUEST'] ?? null) instanceof ServerRequestInterface - || !ApplicationType::fromRequest($GLOBALS['TYPO3_REQUEST'])->isFrontend() - ) { + if (!$this->isFrontendRequest()) { return; } $data = $this->getStructuredData(); - $params['headerData']['StructuredDataManager'] = $this->sourceComment . - PHP_EOL . $this->buildJsonLdBlob($data); + $params['headerData']['StructuredDataManager'] + = $this->getSourceComment() . PHP_EOL . $this->buildJsonLdBlob($data); } protected function buildJsonLdBlob(array $src): string { $data = []; - foreach ($src as $provider => $dataItems) { + foreach ($src as $dataItems) { foreach ($dataItems as $item) { $data[] = $item; } @@ -63,54 +54,64 @@ protected function buildJsonLdBlob(array $src): string public function getStructuredData(): array { $structuredData = []; - - $structuredDataProviders = $this->getStructuredDataProviderConfiguration(); - $structuredDataProviders = $this->setProviderOrder($structuredDataProviders); - - $orderedStructuredDataProviders = GeneralUtility::makeInstance(DependencyOrderingService::class) - ->orderByDependencies($structuredDataProviders); - - foreach ($orderedStructuredDataProviders as $provider => $configuration) { + foreach ($this->getOrderedStructuredDataProviders() as $provider => $configuration) { $cacheIdentifier = $this->getTypoScriptFrontendController()->newHash . '-structured-data-' . $provider; - if ($this->pageCache instanceof FrontendInterface && - $data = $this->pageCache->get($cacheIdentifier) - ) { + if ($this->pageCache instanceof FrontendInterface && $data = $this->pageCache->get($cacheIdentifier)) { if (!empty($data)) { $structuredData[$provider] = $data; } continue; } - if (class_exists($configuration['provider']) - && is_subclass_of($configuration['provider'], StructuredDataProviderInterface::class)) { - /** @var StructuredDataProviderInterface $structuredDataProviderObject */ - $structuredDataProviderObject = GeneralUtility::makeInstance($configuration['provider']); - if (method_exists($structuredDataProviderObject, 'setConfiguration')) { - $structuredDataProviderObject->setConfiguration($configuration); - } + $structuredDataProviderObject = $this->getStructuredDataProviderObject($configuration); + if ($structuredDataProviderObject === null) { + continue; + } - if ($data = $structuredDataProviderObject->getData()) { - $this->pageCache->set( - $cacheIdentifier, - $data, - ['pageId_' . $this->getTypoScriptFrontendController()->page['uid']], - $this->getTypoScriptFrontendController()->get_cache_timeout() - ); - } + if ($data = $structuredDataProviderObject->getData()) { + $this->pageCache->set( + $cacheIdentifier, + $data, + ['pageId_' . $this->getTypoScriptFrontendController()->page['uid']], + // TODO: Fix this call, protected method since v13 + //$this->getTypoScriptFrontendController()->get_cache_timeout() + ); + } - if (!empty($data)) { - $structuredData[$provider] = $data; - } + if (!empty($data)) { + $structuredData[$provider] = $data; } } return $structuredData; } + protected function getStructuredDataProviderObject(array $configuration): StructuredDataProviderInterface|null + { + if (!class_exists($configuration['provider']) || !is_subclass_of($configuration['provider'], StructuredDataProviderInterface::class)) { + return null; + } + + $providerObject = GeneralUtility::makeInstance($configuration['provider']); + if (method_exists($providerObject, 'setConfiguration')) { + $providerObject->setConfiguration($configuration); + } + return $providerObject; + } + private function getTypoScriptFrontendController(): TypoScriptFrontendController { return $GLOBALS['TSFE']; } + private function getOrderedStructuredDataProviders(): array + { + $structuredDataProviders = $this->getStructuredDataProviderConfiguration(); + $structuredDataProviders = $this->setProviderOrder($structuredDataProviders); + + return GeneralUtility::makeInstance(DependencyOrderingService::class) + ->orderByDependencies($structuredDataProviders); + } + private function getStructuredDataProviderConfiguration(): array { $typoscriptService = GeneralUtility::makeInstance(TypoScriptService::class); @@ -121,41 +122,41 @@ private function getStructuredDataProviderConfiguration(): array return $config['structuredData']['providers'] ?? []; } - protected function initCaches() - { - try { - $this->pageCache = GeneralUtility::makeInstance(CacheManager::class)->getCache( - 'pages' - ); - } catch (NoSuchCacheException $e) { - // @ignoreException - } - } - protected function setProviderOrder(array $orderInformation): array { foreach ($orderInformation as $provider => &$configuration) { if (isset($configuration['before'])) { - if (is_string($configuration['before'])) { - $configuration['before'] = GeneralUtility::trimExplode(',', $configuration['before'], true); - } elseif (!is_array($configuration['before'])) { - throw new \UnexpectedValueException( - 'The specified "before" order configuration for provider "' . $provider . '" is invalid.', - 1551014599 - ); - } + $configuration['before'] = $this->getOrderConfiguration($provider, $configuration, 'before'); } if (isset($configuration['after'])) { - if (is_string($configuration['after'])) { - $configuration['after'] = GeneralUtility::trimExplode(',', $configuration['after'], true); - } elseif (!is_array($configuration['after'])) { - throw new \UnexpectedValueException( - 'The specified "after" order configuration for provider "' . $provider . '" is invalid.', - 1551014604 - ); - } + $configuration['after'] = $this->getOrderConfiguration($provider, $configuration, 'after'); } } return $orderInformation; } + + private function getOrderConfiguration(string $provider, array $configuration, string $key): array + { + if (is_string($configuration[$key])) { + return GeneralUtility::trimExplode(',', $configuration[$key], true); + } + if (!is_array($configuration[$key])) { + throw new \UnexpectedValueException( + 'The specified "' . $key . '" order configuration for provider "' . $provider . '" is invalid.', + 1551014599 + ); + } + return $configuration[$key]; + } + + protected function isFrontendRequest(): bool + { + return ($GLOBALS['TYPO3_REQUEST'] ?? null) instanceof ServerRequestInterface + && ApplicationType::fromRequest($GLOBALS['TYPO3_REQUEST'])->isFrontend(); + } + + protected function getSourceComment(): string + { + return ''; + } } diff --git a/Classes/Updates/MigrateDashboardWidget.php b/Classes/Updates/MigrateDashboardWidget.php new file mode 100644 index 00000000..fe3bbbbd --- /dev/null +++ b/Classes/Updates/MigrateDashboardWidget.php @@ -0,0 +1,77 @@ +connectionPool = GeneralUtility::makeInstance(ConnectionPool::class); + } + + public function getIdentifier(): string + { + return 'yoastDashboardWidgetMigrate'; + } + + public function getTitle(): string + { + return 'Yoast SEO for TYPO3 - Migrate dashboard widget'; + } + + public function getDescription(): string + { + return 'Migrate the Yoast SEO "Pages without meta description" widget to the widget from core'; + } + + public function executeUpdate(): bool + { + $this->connectionPool->getConnectionForTable(self::DASHBOARD_TABLE) + ->executeQuery( + 'UPDATE ' . self::DASHBOARD_TABLE . ' SET widgets = REPLACE(widgets, "yoastseo-pagesWithoutMetaDescription", "seo-pagesWithoutMetaDescription")' + ); + return true; + } + + protected function dashboardTableExists(): bool + { + try { + $connection = $this->connectionPool->getConnectionForTable(self::DASHBOARD_TABLE); + if (method_exists($connection, 'getSchemaManager')) { + $schemaManager = $connection->getSchemaManager(); + } else { + $schemaManager = $connection->createSchemaManager(); + } + return $schemaManager->tablesExist([self::DASHBOARD_TABLE]); + } catch (Exception $e) { + return false; + } + } + + public function updateNecessary(): bool + { + if (GeneralUtility::makeInstance(Typo3Version::class)->getMajorVersion() < 12) { + return false; + } + return $this->dashboardTableExists(); + } + + public function getPrerequisites(): array + { + return []; + } +} diff --git a/Classes/Updates/MigratePremiumFocusKeywords.php b/Classes/Updates/MigratePremiumFocusKeywords.php index 9e35526e..52b78e96 100644 --- a/Classes/Updates/MigratePremiumFocusKeywords.php +++ b/Classes/Updates/MigratePremiumFocusKeywords.php @@ -8,10 +8,11 @@ use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Attribute\UpgradeWizard; use TYPO3\CMS\Install\Updates\DatabaseUpdatedPrerequisite; use TYPO3\CMS\Install\Updates\UpgradeWizardInterface; -use YoastSeoForTypo3\YoastSeo\Service\DbalService; +#[UpgradeWizard('yoastPremiumFocusKeywordsMigrate')] class MigratePremiumFocusKeywords implements UpgradeWizardInterface { protected const PREMIUM_TABLE = 'tx_yoast_seo_premium_focus_keywords'; @@ -70,28 +71,35 @@ protected function getPremiumFocusKeywords(): array { $queryBuilder = $this->connectionPool->getQueryBuilderForTable(self::PREMIUM_TABLE); $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); - $statement = $queryBuilder + return $queryBuilder ->select('*') ->from(self::PREMIUM_TABLE) - ->execute(); - return GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); + ->executeQuery() + ->fetchAllAssociative(); } protected function getRelatedTableColumns(): array { - $columns = $this->connectionPool->getConnectionForTable(self::NEW_TABLE) - ->getSchemaManager() - ->listTableColumns(self::NEW_TABLE); + $connection = $this->connectionPool->getConnectionForTable(self::NEW_TABLE); + if (method_exists($connection, 'getSchemaManager')) { + $schemaManager = $connection->getSchemaManager(); + } else { + $schemaManager = $connection->createSchemaManager(); + } + $columns = $schemaManager->listTableColumns(self::NEW_TABLE); return array_flip(array_keys($columns)); } protected function premiumTableExists(): bool { try { - return GeneralUtility::makeInstance(ConnectionPool::class) - ->getConnectionForTable(self::PREMIUM_TABLE) - ->getSchemaManager() - ->tablesExist([self::PREMIUM_TABLE]); + $connection = $this->connectionPool->getConnectionForTable(self::PREMIUM_TABLE); + if (method_exists($connection, 'getSchemaManager')) { + $schemaManager = $connection->getSchemaManager(); + } else { + $schemaManager = $connection->createSchemaManager(); + } + return $schemaManager->tablesExist([self::PREMIUM_TABLE]); } catch (Exception $e) { return false; } diff --git a/Classes/Updates/MigrateRedirects.php b/Classes/Updates/MigrateRedirects.php index 7c663952..09e3c48a 100644 --- a/Classes/Updates/MigrateRedirects.php +++ b/Classes/Updates/MigrateRedirects.php @@ -8,10 +8,11 @@ use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; +use TYPO3\CMS\Install\Attribute\UpgradeWizard; use TYPO3\CMS\Install\Updates\DatabaseUpdatedPrerequisite; use TYPO3\CMS\Install\Updates\UpgradeWizardInterface; -use YoastSeoForTypo3\YoastSeo\Service\DbalService; +#[UpgradeWizard('yoastRedirectsMigrate')] class MigrateRedirects implements UpgradeWizardInterface { protected const PAGE_LINK_PROTOCOL = 't3://page?uid='; @@ -88,10 +89,9 @@ protected function getDomains(): array $queryBuilder->getRestrictions()->removeAll(); try { - $statement = $queryBuilder->select('*') + $domains = $queryBuilder->select('*') ->from('sys_domain') - ->execute(); - $domains = GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); + ->executeQuery()->fetchAllAssociative(); } catch (TableNotFoundException $e) { return []; } @@ -110,13 +110,13 @@ protected function getRedirects(): array $queryBuilder->getRestrictions()->removeAll(); try { - $statement = $queryBuilder->select('*') + return $queryBuilder->select('*') ->from('tx_yoast_seo_premium_redirect') ->where( $queryBuilder->expr()->eq('deleted', 0) ) - ->execute(); - return GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); + ->executeQuery() + ->fetchAllAssociative(); } catch (TableNotFoundException $e) { return []; } diff --git a/Classes/Utility/JavascriptUtility.php b/Classes/Utility/JavascriptUtility.php index 923aaa76..327f9bb4 100644 --- a/Classes/Utility/JavascriptUtility.php +++ b/Classes/Utility/JavascriptUtility.php @@ -4,6 +4,7 @@ namespace YoastSeoForTypo3\YoastSeo\Utility; +use TYPO3\CMS\Core\Information\Typo3Version; use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -16,7 +17,15 @@ public static function loadJavascript(PageRenderer $pageRenderer = null): void } if (YoastUtility::inProductionMode() === true) { - $pageRenderer->loadRequireJsModule('TYPO3/CMS/YoastSeo/dist/plugin'); + if (GeneralUtility::makeInstance(Typo3Version::class)->getMajorVersion() >= 13) { + $pageRenderer->loadJavaScriptModule( + '@yoast/yoast-seo-for-typo3/dist/plugin.js', + ); + } else { + $pageRenderer->loadRequireJsModule( + 'TYPO3/CMS/YoastSeo/dist/plugin', + ); + } } else { $pageRenderer->addHeaderData( '' diff --git a/Classes/Utility/JsonConfigUtility.php b/Classes/Utility/JsonConfigUtility.php index 785296a5..5dbd1097 100644 --- a/Classes/Utility/JsonConfigUtility.php +++ b/Classes/Utility/JsonConfigUtility.php @@ -11,17 +11,11 @@ class JsonConfigUtility implements SingletonInterface { protected array $config = []; - /** - * @param array $config - */ - public function addConfig(array $config) + public function addConfig(array $config): void { ArrayUtility::mergeRecursiveWithOverrule($this->config, $config, true, false); } - /** - * @return string - */ public function render(): string { return 'const YoastConfig = ' . json_encode($this->config) . ';'; diff --git a/Classes/Utility/PageAccessUtility.php b/Classes/Utility/PageAccessUtility.php index 4b9ae3f6..e77fa07f 100644 --- a/Classes/Utility/PageAccessUtility.php +++ b/Classes/Utility/PageAccessUtility.php @@ -5,12 +5,12 @@ namespace YoastSeoForTypo3\YoastSeo\Utility; use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; +use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\QueryHelper; use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction; use TYPO3\CMS\Core\Type\Bitmask\Permission; use TYPO3\CMS\Core\Utility\GeneralUtility; -use YoastSeoForTypo3\YoastSeo\Service\DbalService; class PageAccessUtility { @@ -34,51 +34,44 @@ public static function getPageIds(int $pid): array /** * Copied from EXT:core, removed in v12 * - * @param $id - * @param $depth - * @param $begin - * @param $permClause + * @param int $id + * @param int $depth + * @param int $begin + * @param string $permClause * @return string */ protected static function getTreeList(int $id, int $depth, int $begin = 0, string $permClause = ''): string { - $depth = (int)$depth; - $begin = (int)$begin; - $id = (int)$id; if ($id < 0) { $id = abs($id); } - if ($begin === 0) { - $theList = $id; - } else { - $theList = ''; + $theList = $begin === 0 ? $id : ''; + if (!($id && $depth > 0)) { + return (string)$theList; } - if ($id && $depth > 0) { - $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); - $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); - $queryBuilder->select('uid') - ->from('pages') - ->where( - $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($id, \PDO::PARAM_INT)), - $queryBuilder->expr()->eq('sys_language_uid', 0) - ) - ->orderBy('uid'); - if ($permClause !== '') { - $queryBuilder->andWhere(QueryHelper::stripLogicalOperatorPrefix($permClause)); + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); + $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $queryBuilder->select('uid') + ->from('pages') + ->where( + $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($id, Connection::PARAM_INT)), + $queryBuilder->expr()->eq('sys_language_uid', 0) + ) + ->orderBy('uid'); + if ($permClause !== '') { + $queryBuilder->andWhere(QueryHelper::stripLogicalOperatorPrefix($permClause)); + } + foreach ($queryBuilder->executeQuery()->fetchAllAssociative() as $row) { + if ($begin <= 0) { + $theList .= ',' . $row['uid']; } - $statement = $queryBuilder->execute(); - $rows = GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); - foreach ($rows as $row) { - if ($begin <= 0) { - $theList .= ',' . $row['uid']; - } - if ($depth > 1) { - $theSubList = self::getTreeList($row['uid'], $depth - 1, $begin - 1, $permClause); - if (!empty($theList) && !empty($theSubList) && ($theSubList[0] !== ',')) { - $theList .= ','; - } - $theList .= $theSubList; + if ($depth > 1) { + $theSubList = self::getTreeList($row['uid'], $depth - 1, $begin - 1, $permClause); + if (!empty($theList) && !empty($theSubList) && ($theSubList[0] !== ',')) { + $theList .= ','; } + $theList .= $theSubList; } } return (string)$theList; diff --git a/Classes/Utility/YoastUtility.php b/Classes/Utility/YoastUtility.php index 3b2fd1a5..bb4377db 100644 --- a/Classes/Utility/YoastUtility.php +++ b/Classes/Utility/YoastUtility.php @@ -10,7 +10,6 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Configuration\ConfigurationManager; use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface; -use YoastSeoForTypo3\YoastSeo\Service\DbalService; class YoastUtility { @@ -85,14 +84,14 @@ public static function getRelatedKeyphrases(string $parentTable, int $parentId): $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable( 'tx_yoastseo_related_focuskeyword' ); - $statement = $queryBuilder->select('*') + $relatedKeyphrases = $queryBuilder->select('*') ->from('tx_yoastseo_related_focuskeyword') ->where( $queryBuilder->expr()->eq('tablenames', $queryBuilder->createNamedParameter($parentTable)), $queryBuilder->expr()->eq('uid_foreign', $parentId) ) - ->execute(); - $relatedKeyphrases = GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); + ->executeQuery() + ->fetchAllAssociative(); foreach ($relatedKeyphrases as $relatedKeyphrase) { $config['rk' . (int)$relatedKeyphrase['uid']] = [ @@ -139,7 +138,7 @@ protected static function getTypoScriptConfiguration(): array */ public static function fixAbsoluteUrl(string $url): string { - if (strpos($url, '/') === 0) { + if (str_starts_with($url, '/')) { $url = GeneralUtility::getIndpEnv('TYPO3_REQUEST_HOST') . $url; } return $url; diff --git a/Classes/ViewHelpers/CrawlerProgressViewHelper.php b/Classes/ViewHelpers/CrawlerProgressViewHelper.php index dff832b7..7ff3c14e 100644 --- a/Classes/ViewHelpers/CrawlerProgressViewHelper.php +++ b/Classes/ViewHelpers/CrawlerProgressViewHelper.php @@ -4,26 +4,27 @@ namespace YoastSeoForTypo3\YoastSeo\ViewHelpers; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface; use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper; use YoastSeoForTypo3\YoastSeo\Service\CrawlerService; class CrawlerProgressViewHelper extends AbstractViewHelper { + public function __construct( + protected CrawlerService $crawlerService + ) {} + public function initializeArguments(): void { $this->registerArgument('site', 'integer', 'Site root pageid', true); $this->registerArgument('language', 'integer', 'Language id', true); } - public static function renderStatic( - array $arguments, - \Closure $renderChildrenClosure, - RenderingContextInterface $renderingContext - ): ?array { - $crawlerService = GeneralUtility::makeInstance(CrawlerService::class); - $progressInformation = $crawlerService->getProgressInformation($arguments['site'], $arguments['language']); + public function render(): ?array + { + $progressInformation = $this->crawlerService->getProgressInformation( + $this->arguments['site'], + $this->arguments['language'] + ); if (!isset($progressInformation['offset'], $progressInformation['total'])) { return null; @@ -39,7 +40,7 @@ public static function renderStatic( return [ 'percentage' => round(($progressInformation['offset'] / $progressInformation['total']) * 100), 'offset' => $progressInformation['offset'], - 'total' => $progressInformation['total'] + 'total' => $progressInformation['total'], ]; } } diff --git a/Classes/ViewHelpers/RecordIconViewHelper.php b/Classes/ViewHelpers/RecordIconViewHelper.php index 07ba5b1c..13d7e242 100644 --- a/Classes/ViewHelpers/RecordIconViewHelper.php +++ b/Classes/ViewHelpers/RecordIconViewHelper.php @@ -10,9 +10,6 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface; use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper; -/** - * Class RecordIconViewHelper - */ class RecordIconViewHelper extends AbstractViewHelper { protected $escapeOutput = false; @@ -24,12 +21,6 @@ public function initializeArguments(): void $this->registerArgument('size', 'string', '', false, Icon::SIZE_DEFAULT); } - /** - * @param array $arguments - * @param \Closure $renderChildrenClosure - * @param \TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface $renderingContext - * @return string - */ public static function renderStatic( array $arguments, \Closure $renderChildrenClosure, diff --git a/Classes/ViewHelpers/RecordLinksViewHelper.php b/Classes/ViewHelpers/RecordLinksViewHelper.php index 333eed94..dd5e1d25 100644 --- a/Classes/ViewHelpers/RecordLinksViewHelper.php +++ b/Classes/ViewHelpers/RecordLinksViewHelper.php @@ -19,13 +19,6 @@ public function initializeArguments(): void $this->registerArgument('module', 'string', '', true, ''); } - /** - * @param array $arguments - * @param \Closure $renderChildrenClosure - * @param \TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface $renderingContext - * @throws \TYPO3\CMS\Backend\Routing\Exception\RouteNotFoundException - * @return string - */ public static function renderStatic( array $arguments, \Closure $renderChildrenClosure, @@ -33,7 +26,7 @@ public static function renderStatic( ): string { $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class); - $returnUri = $uriBuilder->buildUriFromRoute($arguments['module'], GeneralUtility::_GET()); + $returnUri = $uriBuilder->buildUriFromRoute($arguments['module'], $_GET); $module = ''; $urlParameters = []; diff --git a/Classes/Widgets/AbstractPageOverviewWidget.php b/Classes/Widgets/AbstractPageOverviewWidget.php new file mode 100644 index 00000000..bc7449e1 --- /dev/null +++ b/Classes/Widgets/AbstractPageOverviewWidget.php @@ -0,0 +1,77 @@ +options = array_merge( + [ + 'template' => 'Widget/ExtendedListWidget', + ], + $options + ); + } + + public function setRequest(ServerRequestInterface $request): void + { + $this->request = $request; + } + + public function renderWidgetContent(): string + { + $view = $this->view->create($this->request, ['typo3/cms-dashboard', 'yoast-seo-for-typo3/yoast_seo']); + $this->assignToView($view); + return $view->render($this->options['template']); + } + + abstract protected function assignToView($view): void; + } +} else { + abstract class AbstractPageOverviewWidget implements WidgetInterface + { + protected array $options; + + public function __construct( + protected WidgetConfigurationInterface $configuration, + protected PageProviderInterface $dataProvider, + protected StandaloneView $view, + array $options = [] + ) { + $this->options = array_merge( + [ + 'template' => 'Widget/ExtendedListWidget', + ], + $options + ); + } + + public function renderWidgetContent(): string + { + $this->view->setTemplate($this->options['template']); + $this->assignToView($this->view); + return $this->view->render(); + } + + abstract protected function assignToView($view): void; + } +} diff --git a/Classes/Widgets/PageOverviewWidget.php b/Classes/Widgets/PageOverviewWidget.php index da1e5f79..625a53eb 100644 --- a/Classes/Widgets/PageOverviewWidget.php +++ b/Classes/Widgets/PageOverviewWidget.php @@ -5,59 +5,24 @@ namespace YoastSeoForTypo3\YoastSeo\Widgets; use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; -use TYPO3\CMS\Dashboard\Widgets\WidgetConfigurationInterface; -use TYPO3\CMS\Dashboard\Widgets\WidgetInterface; -use TYPO3\CMS\Fluid\View\StandaloneView; -use YoastSeoForTypo3\YoastSeo\Widgets\Provider\PageProviderInterface; -class PageOverviewWidget implements WidgetInterface +class PageOverviewWidget extends AbstractPageOverviewWidget { - protected WidgetConfigurationInterface $configuration; - protected PageProviderInterface $dataProvider; - protected StandaloneView $view; - protected $buttonProvider; - /** - * @var array - */ - private $options; - - public function __construct( - WidgetConfigurationInterface $configuration, - PageProviderInterface $dataProvider, - StandaloneView $view, - $buttonProvider = null, - array $options = [] - ) { - $this->configuration = $configuration; - $this->dataProvider = $dataProvider; - $this->view = $view; - $this->buttonProvider = $buttonProvider; - $this->options = array_merge( - [ - 'template' => 'Widget/ExtendedListWidget', - ], - $options - ); - } - public function getOptions(): array { return []; } - public function renderWidgetContent(): string + protected function assignToView($view): void { - $this->view->setTemplate($this->options['template']); - - $this->view->assignMultiple([ + $view->assignMultiple([ 'pages' => $this->dataProvider->getPages(), 'options' => $this->options, - 'button' => $this->buttonProvider, + 'button' => null, 'configuration' => $this->configuration, 'dateFormat' => $GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'], 'timeFormat' => $GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'], ]); - return $this->view->render(); } protected function getBackendUser(): BackendUserAuthentication diff --git a/Classes/Widgets/Provider/OrphanedContentDataProvider.php b/Classes/Widgets/Provider/OrphanedContentDataProvider.php index 76f24231..0fc8fea0 100644 --- a/Classes/Widgets/Provider/OrphanedContentDataProvider.php +++ b/Classes/Widgets/Provider/OrphanedContentDataProvider.php @@ -9,7 +9,6 @@ use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Type\Bitmask\Permission; use TYPO3\CMS\Core\Utility\GeneralUtility; -use YoastSeoForTypo3\YoastSeo\Service\DbalService; class OrphanedContentDataProvider implements PageProviderInterface { @@ -37,12 +36,12 @@ public function getPages(): array ) ]; - $statement = $qb->select('ref_uid') + $refs = $qb->select('ref_uid') ->from('sys_refindex') ->where(...$constraints) ->groupBy('ref_uid') - ->execute(); - $refs = GeneralUtility::makeInstance(DbalService::class)->getAllResults($statement); + ->executeQuery() + ->fetchAllAssociative(); $pageIds = []; foreach ($refs as $ref) { @@ -63,14 +62,14 @@ public function getPages(): array $qb = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); while ($counter < $this->limit) { - $statement = $qb->select('p.*') + $row = $qb->select('p.*') ->from('pages', 'p') ->where(...$constraints) ->orderBy('tstamp', 'DESC') ->setFirstResult($iterator) ->setMaxResults(1) - ->execute(); - $row = GeneralUtility::makeInstance(DbalService::class)->getSingleResult($statement); + ->executeQuery() + ->fetchAssociative(); if ($row === false) { // Likely fewer pages than the limit, prevent infinite loop diff --git a/Classes/Widgets/Provider/PagesWithoutDescriptionDataProvider.php b/Classes/Widgets/Provider/PagesWithoutDescriptionDataProvider.php index bdada92c..19d404a3 100644 --- a/Classes/Widgets/Provider/PagesWithoutDescriptionDataProvider.php +++ b/Classes/Widgets/Provider/PagesWithoutDescriptionDataProvider.php @@ -8,8 +8,10 @@ use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Type\Bitmask\Permission; use TYPO3\CMS\Core\Utility\GeneralUtility; -use YoastSeoForTypo3\YoastSeo\Service\DbalService; +/** + * @deprecated Will be removed once TYPO3 v11 support is dropped + */ class PagesWithoutDescriptionDataProvider implements PageProviderInterface { private array $excludedDoktypes; @@ -28,7 +30,7 @@ public function getPages(): array $constraints = [ $queryBuilder->expr()->notIn('doktype', $this->excludedDoktypes), $queryBuilder->expr()->eq('no_index', 0), - $queryBuilder->expr()->orX( + $queryBuilder->expr()->or( $queryBuilder->expr()->eq('description', $queryBuilder->createNamedParameter('')), $queryBuilder->expr()->isNull('description') ), @@ -39,18 +41,18 @@ public function getPages(): array $iterator = 0; while ($counter < $this->limit) { - $statement = $queryBuilder + $row = $queryBuilder ->select('*') ->from('pages') ->where(...$constraints) ->orderBy('tstamp', 'DESC') ->setFirstResult($iterator) ->setMaxResults(1) - ->execute(); - $row = GeneralUtility::makeInstance(DbalService::class)->getSingleResult($statement); + ->executeQuery() + ->fetchAssociative(); if ($row === false) { - // Likely less pages than the limit, prevent infinite loop + // Likely fewer pages than the limit, prevent infinite loop break; } diff --git a/Configuration/Backend/AjaxRoutes.php b/Configuration/Backend/AjaxRoutes.php index 62521319..f6959e2e 100644 --- a/Configuration/Backend/AjaxRoutes.php +++ b/Configuration/Backend/AjaxRoutes.php @@ -1,28 +1,30 @@ [ 'path' => 'yoast/preview', - 'target' => \YoastSeoForTypo3\YoastSeo\Controller\AjaxController::class . '::previewAction' + 'target' => AjaxController::class . '::previewAction' ], 'yoast_save_scores' => [ 'path' => 'yoast/savescores', - 'target' => \YoastSeoForTypo3\YoastSeo\Controller\AjaxController::class . '::saveScoresAction' + 'target' => AjaxController::class . '::saveScoresAction' ], 'yoast_prominent_words' => [ 'path' => 'yoast/prominentwords', - 'target' => \YoastSeoForTypo3\YoastSeo\Controller\AjaxController::class . '::promimentWordsAction' + 'target' => AjaxController::class . '::promimentWordsAction' ], 'yoast_internal_linking_suggestions' => [ 'path' => 'yoast/internallinkingsuggestions', - 'target' => \YoastSeoForTypo3\YoastSeo\Controller\AjaxController::class . '::internalLinkingSuggestionsAction' + 'target' => AjaxController::class . '::internalLinkingSuggestionsAction' ], 'yoast_crawler_determine_pages' => [ 'path' => 'yoast/crawlerdeterminepages', - 'target' => \YoastSeoForTypo3\YoastSeo\Controller\AjaxController::class . '::crawlerDeterminePages', + 'target' => AjaxController::class . '::crawlerDeterminePages', ], 'yoast_crawler_index_pages' => [ 'path' => 'yoast/crawlerindexpages', - 'target' => \YoastSeoForTypo3\YoastSeo\Controller\AjaxController::class . '::crawlerIndexPages' + 'target' => AjaxController::class . '::crawlerIndexPages' ] ]; diff --git a/Configuration/Icons.php b/Configuration/Icons.php new file mode 100644 index 00000000..d4ac09fe --- /dev/null +++ b/Configuration/Icons.php @@ -0,0 +1,28 @@ + [ + 'provider' => SvgIconProvider::class, + 'source' => 'EXT:yoast_seo/Resources/Public/Icons/Extension.svg' + ], + 'module-yoast' => [ + 'provider' => SvgIconProvider::class, + 'source' => 'EXT:yoast_seo/Resources/Public/Images/Yoast-module-container.svg' + ], + 'module-yoast-dashboard' => [ + 'provider' => SvgIconProvider::class, + 'source' => 'EXT:yoast_seo/Resources/Public/Images/Yoast-module-dashboard.svg' + ], + 'module-yoast-overview' => [ + 'provider' => SvgIconProvider::class, + 'source' => 'EXT:yoast_seo/Resources/Public/Images/Yoast-module-overview.svg' + ], + 'module-yoast-crawler' => [ + 'provider' => SvgIconProvider::class, + 'source' => 'EXT:yoast_seo/Resources/Public/Images/Yoast-module-crawler.svg' + ] +]; diff --git a/Configuration/JavascriptModules.php b/Configuration/JavascriptModules.php new file mode 100644 index 00000000..54900146 --- /dev/null +++ b/Configuration/JavascriptModules.php @@ -0,0 +1,8 @@ + ['core', 'backend'], + 'imports' => [ + '@yoast/yoast-seo-for-typo3/' => 'EXT:yoast_seo/Resources/Public/JavaScript/', + ], +]; diff --git a/Configuration/RequestMiddlewares.php b/Configuration/RequestMiddlewares.php index 3a060c8a..b8e49362 100644 --- a/Configuration/RequestMiddlewares.php +++ b/Configuration/RequestMiddlewares.php @@ -1,9 +1,11 @@ [ 'yoast-seo-page-request' => [ - 'target' => \YoastSeoForTypo3\YoastSeo\Middleware\PageRequestMiddleware::class, + 'target' => PageRequestMiddleware::class, 'before' => [ 'typo3/cms-frontend/tsfe' ], diff --git a/Configuration/Services.php b/Configuration/Services.php index 9d9472c9..07044ebd 100644 --- a/Configuration/Services.php +++ b/Configuration/Services.php @@ -5,51 +5,61 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use Symfony\Component\DependencyInjection\Reference; +use TYPO3\CMS\Backend\View\BackendViewFactory; use TYPO3\CMS\Dashboard\Dashboard; +use YoastSeoForTypo3\YoastSeo\StructuredData\StructuredDataProviderInterface; use YoastSeoForTypo3\YoastSeo\Widgets\PageOverviewWidget; use YoastSeoForTypo3\YoastSeo\Widgets\Provider\OrphanedContentDataProvider; use YoastSeoForTypo3\YoastSeo\Widgets\Provider\PagesWithoutDescriptionDataProvider; -return function (ContainerConfigurator $configurator, ContainerBuilder $containerBuilder) { +return static function (ContainerConfigurator $configurator, ContainerBuilder $containerBuilder) { + $containerBuilder->registerForAutoconfiguration(StructuredDataProviderInterface::class)->setPublic(true); + $services = $configurator->services(); - if ($containerBuilder->hasDefinition(Dashboard::class)) { - $services->set('yoast_seo.dashboard.widget.pagesWithoutMetaDescription') - ->class(PageOverviewWidget::class) - ->arg('$dataProvider', new Reference(PagesWithoutDescriptionDataProvider::class)) - ->arg('$view', new Reference('dashboard.views.widget')) - ->arg('$buttonProvider', null) - ->arg('$options', ['template' => 'Widget/PageWithoutMetaDescriptionWidget']) - ->tag( - 'dashboard.widget', - [ - 'identifier' => 'yoastseo-pagesWithoutMetaDescription', - 'groupNames' => 'seo', - 'title' => 'LLL:EXT:yoast_seo/Resources/Private/Language/BackendModule.xlf:dashboard.widget.pagesWithoutMetaDescription.title', - 'description' => 'LLL:EXT:yoast_seo/Resources/Private/Language/BackendModule.xlf:dashboard.widget.pagesWithoutMetaDescription.description', - 'iconIdentifier' => 'extension-yoast', - 'height' => 'large', - 'width' => 'medium' - ] - ); - - $services->set('yoast_seo.dashboard.widget.orphanedContent') - ->class(PageOverviewWidget::class) - ->arg('$dataProvider', new Reference(OrphanedContentDataProvider::class)) - ->arg('$view', new Reference('dashboard.views.widget')) - ->arg('$buttonProvider', null) - ->arg('$options', ['template' => 'Widget/OrphanedContentWidget']) - ->tag( - 'dashboard.widget', - [ - 'identifier' => 'yoastseo-orphanedContent', - 'groupNames' => 'seo', - 'title' => 'LLL:EXT:yoast_seo/Resources/Private/Language/BackendModule.xlf:dashboard.widget.orphanedContent.title', - 'description' => 'LLL:EXT:yoast_seo/Resources/Private/Language/BackendModule.xlf:dashboard.widget.orphanedContent.description', - 'iconIdentifier' => 'extension-yoast', - 'height' => 'large', - 'width' => 'medium' - ] - ); + if (!$containerBuilder->hasDefinition(Dashboard::class)) { + return; + } + + $orphanedContentWidget = $services->set('yoast_seo.dashboard.widget.orphanedContent') + ->class(PageOverviewWidget::class) + ->arg('$dataProvider', new Reference(OrphanedContentDataProvider::class)) + ->arg('$options', ['template' => 'Widget/OrphanedContentWidget']) + ->tag( + 'dashboard.widget', + [ + 'identifier' => 'yoastseo-orphanedContent', + 'groupNames' => 'seo', + 'title' => 'LLL:EXT:yoast_seo/Resources/Private/Language/BackendModule.xlf:dashboard.widget.orphanedContent.title', + 'description' => 'LLL:EXT:yoast_seo/Resources/Private/Language/BackendModule.xlf:dashboard.widget.orphanedContent.description', + 'iconIdentifier' => 'extension-yoast', + 'height' => 'large', + 'width' => 'medium' + ] + ); + + if ($containerBuilder->hasDefinition(BackendViewFactory::class)) { + $orphanedContentWidget->arg('$view', new Reference(BackendViewFactory::class)); + return; } + + $orphanedContentWidget->arg('$view', new Reference('dashboard.views.widget')); + + $services->set('yoast_seo.dashboard.widget.pagesWithoutMetaDescription') + ->class(PageOverviewWidget::class) + ->arg('$dataProvider', new Reference(PagesWithoutDescriptionDataProvider::class)) + ->arg('$options', ['template' => 'Widget/PageWithoutMetaDescriptionWidget']) + ->arg('$view', new Reference('dashboard.views.widget')) + ->tag( + 'dashboard.widget', + [ + 'identifier' => 'yoastseo-pagesWithoutMetaDescription', + 'groupNames' => 'seo', + 'title' => 'LLL:EXT:yoast_seo/Resources/Private/Language/BackendModule.xlf:dashboard.widget.pagesWithoutMetaDescription.title', + 'description' => 'LLL:EXT:yoast_seo/Resources/Private/Language/BackendModule.xlf:dashboard.widget.pagesWithoutMetaDescription.description', + 'iconIdentifier' => 'extension-yoast', + 'height' => 'large', + 'width' => 'medium' + ] + ); }; diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml index 930b5558..c71de403 100644 --- a/Configuration/Services.yaml +++ b/Configuration/Services.yaml @@ -19,6 +19,16 @@ services: YoastSeoForTypo3\YoastSeo\Controller\AjaxController: public: true + YoastSeoForTypo3\YoastSeo\Service\CrawlerService: + public: true + arguments: + $cache: '@cache.pages' + + YoastSeoForTypo3\YoastSeo\StructuredData\StructuredDataProviderManager: + public: true + arguments: + $pageCache: '@cache.pages' + YoastSeoForTypo3\YoastSeo\EventListener\TcaBuiltListener: arguments: - '@YoastSeoForTypo3\YoastSeo\Record\Builder\TcaBuilder' diff --git a/Configuration/TCA/Overrides/pages.php b/Configuration/TCA/Overrides/pages.php index 187c5437..4db397cc 100644 --- a/Configuration/TCA/Overrides/pages.php +++ b/Configuration/TCA/Overrides/pages.php @@ -1,10 +1,13 @@ addYoastFields( 'pages', - \YoastSeoForTypo3\YoastSeo\Utility\YoastUtility::getAllowedDoktypes(null, true) + YoastUtility::getAllowedDoktypes(null, true) ); // Remove description from metatags tab diff --git a/Configuration/TCA/Overrides/tt_content.php b/Configuration/TCA/Overrides/tt_content.php index 31b7af33..ee5f7fe4 100644 --- a/Configuration/TCA/Overrides/tt_content.php +++ b/Configuration/TCA/Overrides/tt_content.php @@ -1,8 +1,10 @@ [ diff --git a/Configuration/TCA/tx_yoastseo_related_focuskeyword.php b/Configuration/TCA/tx_yoastseo_related_focuskeyword.php index 8f93d468..4b2da38a 100644 --- a/Configuration/TCA/tx_yoastseo_related_focuskeyword.php +++ b/Configuration/TCA/tx_yoastseo_related_focuskeyword.php @@ -8,7 +8,6 @@ 'label' => 'keyword', 'tstamp' => 'tstamp', 'crdate' => 'crdate', - 'cruser_id' => 'cruser_id', 'languageField' => 'sys_language_uid', 'transOrigPointerField' => 'l10n_parent', 'transOrigDiffSourceField' => 'l10n_diffsource', @@ -21,6 +20,9 @@ ], 'versioningWS' => true, 'origUid' => 't3_origuid', + 'security' => [ + 'ignorePageTypeRestriction' => true, + ], ], 'columns' => [ 'sys_language_uid' => $GLOBALS['TCA']['tt_content']['columns']['sys_language_uid'], @@ -41,6 +43,7 @@ 'type' => 'input', 'size' => 30, 'eval' => 'required', + 'required' => true, ] ], 'synonyms' => [ diff --git a/Documentation/Development/Index.rst b/Documentation/Development/Index.rst index 405cda79..044a534a 100644 --- a/Documentation/Development/Index.rst +++ b/Documentation/Development/Index.rst @@ -38,9 +38,9 @@ Instances The following instances will be up and running for you after you have installed the DDEV setup. -- https://v9.yoast-seo.ddev.site -- https://v10.yoast-seo.ddev.site - https://v11.yoast-seo.ddev.site +- https://v12.yoast-seo.ddev.site +- https://v13.yoast-seo.ddev.site Login ----- @@ -65,7 +65,7 @@ and after that: .. code-block:: bash - docker volume rm yoast-seo-v9-data yoast-seo-v10-data yoast-seo-v11-data + rm -rf .Build/v11 .Build/v12 .Build/v13 If you change the code, you can directly see the changes in all the installations of your DDEV setup. diff --git a/Resources/Private/Templates/Crawler/Index.html b/Resources/Private/Templates/Crawler/Index.html index 0b768762..134376d6 100644 --- a/Resources/Private/Templates/Crawler/Index.html +++ b/Resources/Private/Templates/Crawler/Index.html @@ -1,6 +1,10 @@ - + + + + + diff --git a/Resources/Private/Templates/Dashboard/Index.html b/Resources/Private/Templates/Dashboard/Index.html index af5f8d65..31ec977f 100644 --- a/Resources/Private/Templates/Dashboard/Index.html +++ b/Resources/Private/Templates/Dashboard/Index.html @@ -1,7 +1,7 @@ - + diff --git a/Resources/Private/Templates/Overview/List.html b/Resources/Private/Templates/Overview/List.html index 88905bdb..e2e155a0 100644 --- a/Resources/Private/Templates/Overview/List.html +++ b/Resources/Private/Templates/Overview/List.html @@ -1,7 +1,7 @@ - + diff --git a/Resources/Public/JavaScript/dist/plugin.js b/Resources/Public/JavaScript/dist/plugin.js index 052f7f0d..3ac71c18 100644 --- a/Resources/Public/JavaScript/dist/plugin.js +++ b/Resources/Public/JavaScript/dist/plugin.js @@ -1,4 +1,4 @@ -!function(a){var e={};function t(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return a[n].call(i.exports,i,i.exports,t),i.l=!0,i.exports}t.m=a,t.c=e,t.d=function(a,e,n){t.o(a,e)||Object.defineProperty(a,e,{enumerable:!0,get:n})},t.r=function(a){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})},t.t=function(a,e){if(1&e&&(a=t(a)),8&e)return a;if(4&e&&"object"==typeof a&&a&&a.__esModule)return a;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:a}),2&e&&"string"!=typeof a)for(var i in a)t.d(n,i,function(e){return a[e]}.bind(null,i));return n},t.n=function(a){var e=a&&a.__esModule?function(){return a.default}:function(){return a};return t.d(e,"a",e),e},t.o=function(a,e){return Object.prototype.hasOwnProperty.call(a,e)},t.p="https://localhost:3333/typo3conf/ext/yoast_seo/Resources/Public/JavaScript/dist/",t(t.s=1057)}([function(a,e,t){"use strict";a.exports=t(1058)},function(a,e,t){a.exports=t(1094)()},function(a,e,t){"use strict";t.r(e),t.d(e,"add",(function(){return g})),t.d(e,"after",(function(){return E})),t.d(e,"ary",(function(){return Fa})),t.d(e,"assign",(function(){return te})),t.d(e,"assignIn",(function(){return le})),t.d(e,"assignInWith",(function(){return de})),t.d(e,"assignWith",(function(){return ce})),t.d(e,"at",(function(){return Ee})),t.d(e,"attempt",(function(){return Ie})),t.d(e,"before",(function(){return Ne})),t.d(e,"bind",(function(){return Le})),t.d(e,"bindAll",(function(){return Be})),t.d(e,"bindKey",(function(){return Ue})),t.d(e,"camelCase",(function(){return Ft})),t.d(e,"capitalize",(function(){return ct})),t.d(e,"castArray",(function(){return Lt})),t.d(e,"ceil",(function(){return Vt})),t.d(e,"chain",(function(){return Ht})),t.d(e,"chunk",(function(){return Gt})),t.d(e,"clamp",(function(){return Zt})),t.d(e,"clone",(function(){return ri})),t.d(e,"cloneDeep",(function(){return oi})),t.d(e,"cloneDeepWith",(function(){return si})),t.d(e,"cloneWith",(function(){return li})),t.d(e,"commit",(function(){return di})),t.d(e,"compact",(function(){return ci})),t.d(e,"concat",(function(){return ui})),t.d(e,"cond",(function(){return Hi})),t.d(e,"conforms",(function(){return Gi})),t.d(e,"conformsTo",(function(){return Qi})),t.d(e,"constant",(function(){return ga})),t.d(e,"countBy",(function(){return tr})),t.d(e,"create",(function(){return nr})),t.d(e,"curry",(function(){return rr})),t.d(e,"curryRight",(function(){return sr})),t.d(e,"debounce",(function(){return ur})),t.d(e,"deburr",(function(){return yt})),t.d(e,"defaultTo",(function(){return pr})),t.d(e,"defaults",(function(){return gr})),t.d(e,"defaultsDeep",(function(){return Or})),t.d(e,"defer",(function(){return Er})),t.d(e,"delay",(function(){return Pr})),t.d(e,"difference",(function(){return Cr})),t.d(e,"differenceBy",(function(){return Rr})),t.d(e,"differenceWith",(function(){return Mr})),t.d(e,"divide",(function(){return $r})),t.d(e,"drop",(function(){return Dr})),t.d(e,"dropRight",(function(){return Ir})),t.d(e,"dropRightWhile",(function(){return Fr})),t.d(e,"dropWhile",(function(){return Lr})),t.d(e,"each",(function(){return Br.a})),t.d(e,"eachRight",(function(){return Qr})),t.d(e,"endsWith",(function(){return Zr})),t.d(e,"entries",(function(){return eo})),t.d(e,"entriesIn",(function(){return to})),t.d(e,"eq",(function(){return Ba.a})),t.d(e,"escape",(function(){return oo})),t.d(e,"escapeRegExp",(function(){return co})),t.d(e,"every",(function(){return fo})),t.d(e,"extend",(function(){return le})),t.d(e,"extendWith",(function(){return de})),t.d(e,"fill",(function(){return yo})),t.d(e,"filter",(function(){return ho})),t.d(e,"find",(function(){return ko})),t.d(e,"findIndex",(function(){return vo})),t.d(e,"findKey",(function(){return xo})),t.d(e,"findLast",(function(){return Po})),t.d(e,"findLastIndex",(function(){return Eo})),t.d(e,"findLastKey",(function(){return To})),t.d(e,"first",(function(){return Ao})),t.d(e,"flatMap",(function(){return Ro})),t.d(e,"flatMapDeep",(function(){return Mo})),t.d(e,"flatMapDepth",(function(){return $o})),t.d(e,"flatten",(function(){return Oe})),t.d(e,"flattenDeep",(function(){return Do.default})),t.d(e,"flattenDepth",(function(){return Io})),t.d(e,"flip",(function(){return No})),t.d(e,"floor",(function(){return Fo})),t.d(e,"flow",(function(){return Bo})),t.d(e,"flowRight",(function(){return Wo})),t.d(e,"forEach",(function(){return Br.a})),t.d(e,"forEachRight",(function(){return Qr})),t.d(e,"forIn",(function(){return Uo})),t.d(e,"forInRight",(function(){return Vo})),t.d(e,"forOwn",(function(){return Ho})),t.d(e,"forOwnRight",(function(){return Ko})),t.d(e,"fromPairs",(function(){return Yo})),t.d(e,"functions",(function(){return Qo})),t.d(e,"functionsIn",(function(){return Zo})),t.d(e,"get",(function(){return _e})),t.d(e,"groupBy",(function(){return Xo})),t.d(e,"gt",(function(){return ts})),t.d(e,"gte",(function(){return ns})),t.d(e,"has",(function(){return os})),t.d(e,"hasIn",(function(){return Ni})),t.d(e,"head",(function(){return Ao})),t.d(e,"identity",(function(){return P.a})),t.d(e,"inRange",(function(){return cs})),t.d(e,"includes",(function(){return gs})),t.d(e,"indexOf",(function(){return zs})),t.d(e,"initial",(function(){return hs})),t.d(e,"intersection",(function(){return ks})),t.d(e,"intersectionBy",(function(){return _s})),t.d(e,"intersectionWith",(function(){return js})),t.d(e,"invert",(function(){return Es})),t.d(e,"invertBy",(function(){return Cs})),t.d(e,"invoke",(function(){return Ms})),t.d(e,"invokeMap",(function(){return $s})),t.d(e,"isArguments",(function(){return $i.a})),t.d(e,"isArray",(function(){return c.a})),t.d(e,"isArrayBuffer",(function(){return Ns})),t.d(e,"isArrayLike",(function(){return Ga.a})),t.d(e,"isArrayLikeObject",(function(){return hr})),t.d(e,"isBoolean",(function(){return Fs})),t.d(e,"isBuffer",(function(){return Yn.a})),t.d(e,"isDate",(function(){return Ws})),t.d(e,"isElement",(function(){return Us})),t.d(e,"isEmpty",(function(){return Ks})),t.d(e,"isEqual",(function(){return Ys})),t.d(e,"isEqualWith",(function(){return Gs})),t.d(e,"isError",(function(){return De})),t.d(e,"isFinite",(function(){return Zs})),t.d(e,"isFunction",(function(){return br.a})),t.d(e,"isInteger",(function(){return Js})),t.d(e,"isLength",(function(){return Di.a})),t.d(e,"isMap",(function(){return Xn})),t.d(e,"isMatch",(function(){return Xs})),t.d(e,"isMatchWith",(function(){return al})),t.d(e,"isNaN",(function(){return tl})),t.d(e,"isNative",(function(){return sl})),t.d(e,"isNil",(function(){return ll})),t.d(e,"isNull",(function(){return dl})),t.d(e,"isNumber",(function(){return el})),t.d(e,"isObject",(function(){return w.a})),t.d(e,"isObjectLike",(function(){return i.a})),t.d(e,"isPlainObject",(function(){return $e})),t.d(e,"isRegExp",(function(){return pl})),t.d(e,"isSafeInteger",(function(){return fl})),t.d(e,"isSet",(function(){return ti})),t.d(e,"isString",(function(){return us})),t.d(e,"isSymbol",(function(){return o})),t.d(e,"isTypedArray",(function(){return Oi.a})),t.d(e,"isUndefined",(function(){return ml})),t.d(e,"isWeakMap",(function(){return gl})),t.d(e,"isWeakSet",(function(){return yl})),t.d(e,"iteratee",(function(){return zl})),t.d(e,"join",(function(){return bl})),t.d(e,"kebabCase",(function(){return wl})),t.d(e,"keyBy",(function(){return vl})),t.d(e,"keys",(function(){return ae.a})),t.d(e,"keysIn",(function(){return se})),t.d(e,"last",(function(){return qr})),t.d(e,"lastIndexOf",(function(){return xl})),t.d(e,"lodash",(function(){return ra})),t.d(e,"lowerCase",(function(){return Ol})),t.d(e,"lowerFirst",(function(){return Sl})),t.d(e,"lt",(function(){return Pl})),t.d(e,"lte",(function(){return Tl})),t.d(e,"map",(function(){return qo})),t.d(e,"mapKeys",(function(){return Al})),t.d(e,"mapValues",(function(){return Cl})),t.d(e,"matches",(function(){return ql})),t.d(e,"matchesProperty",(function(){return Rl})),t.d(e,"max",(function(){return $l})),t.d(e,"maxBy",(function(){return Dl})),t.d(e,"mean",(function(){return Fl})),t.d(e,"meanBy",(function(){return Ll})),t.d(e,"memoize",(function(){return ge.a})),t.d(e,"merge",(function(){return Bl})),t.d(e,"mergeWith",(function(){return xr})),t.d(e,"method",(function(){return Wl})),t.d(e,"methodOf",(function(){return Ul})),t.d(e,"min",(function(){return Vl})),t.d(e,"minBy",(function(){return Hl})),t.d(e,"mixin",(function(){return Kl})),t.d(e,"multiply",(function(){return Yl})),t.d(e,"negate",(function(){return Gl})),t.d(e,"next",(function(){return Xl})),t.d(e,"noop",(function(){return Y})),t.d(e,"now",(function(){return lr})),t.d(e,"nth",(function(){return ed})),t.d(e,"nthArg",(function(){return td})),t.d(e,"omit",(function(){return rd})),t.d(e,"omitBy",(function(){return dd})),t.d(e,"once",(function(){return cd})),t.d(e,"orderBy",(function(){return gd})),t.d(e,"over",(function(){return zd})),t.d(e,"overArgs",(function(){return wd})),t.d(e,"overEvery",(function(){return vd})),t.d(e,"overSome",(function(){return kd})),t.d(e,"pad",(function(){return Ld})),t.d(e,"padEnd",(function(){return Bd})),t.d(e,"padStart",(function(){return Wd})),t.d(e,"parseInt",(function(){return Hd})),t.d(e,"partial",(function(){return Yd})),t.d(e,"partialRight",(function(){return Qd})),t.d(e,"partition",(function(){return Zd})),t.d(e,"pick",(function(){return Xd})),t.d(e,"pickBy",(function(){return ld})),t.d(e,"plant",(function(){return ac})),t.d(e,"property",(function(){return Wi})),t.d(e,"propertyOf",(function(){return ec})),t.d(e,"pull",(function(){return oc})),t.d(e,"pullAll",(function(){return rc})),t.d(e,"pullAllBy",(function(){return sc})),t.d(e,"pullAllWith",(function(){return lc})),t.d(e,"pullAt",(function(){return uc})),t.d(e,"random",(function(){return hc})),t.d(e,"range",(function(){return _c})),t.d(e,"rangeRight",(function(){return jc})),t.d(e,"rearg",(function(){return xc})),t.d(e,"reduce",(function(){return Sc})),t.d(e,"reduceRight",(function(){return Pc})),t.d(e,"reject",(function(){return Tc})),t.d(e,"remove",(function(){return Ac})),t.d(e,"repeat",(function(){return Cc})),t.d(e,"replace",(function(){return qc})),t.d(e,"rest",(function(){return Rc})),t.d(e,"result",(function(){return Mc})),t.d(e,"reverse",(function(){return Dc})),t.d(e,"round",(function(){return Ic})),t.d(e,"sample",(function(){return Lc})),t.d(e,"sampleSize",(function(){return Vc})),t.d(e,"set",(function(){return Hc})),t.d(e,"setWith",(function(){return Kc})),t.d(e,"shuffle",(function(){return Qc})),t.d(e,"size",(function(){return Zc})),t.d(e,"slice",(function(){return Jc})),t.d(e,"snakeCase",(function(){return Xc})),t.d(e,"some",(function(){return eu})),t.d(e,"sortBy",(function(){return tu})),t.d(e,"sortedIndex",(function(){return su})),t.d(e,"sortedIndexBy",(function(){return lu})),t.d(e,"sortedIndexOf",(function(){return du})),t.d(e,"sortedLastIndex",(function(){return cu})),t.d(e,"sortedLastIndexBy",(function(){return uu})),t.d(e,"sortedLastIndexOf",(function(){return pu})),t.d(e,"sortedUniq",(function(){return mu})),t.d(e,"sortedUniqBy",(function(){return gu})),t.d(e,"split",(function(){return yu})),t.d(e,"spread",(function(){return hu})),t.d(e,"startCase",(function(){return bu})),t.d(e,"startsWith",(function(){return wu})),t.d(e,"stubArray",(function(){return fn})),t.d(e,"stubFalse",(function(){return rl.a})),t.d(e,"stubObject",(function(){return vu})),t.d(e,"stubString",(function(){return ku})),t.d(e,"stubTrue",(function(){return _u})),t.d(e,"subtract",(function(){return ju})),t.d(e,"sum",(function(){return xu})),t.d(e,"sumBy",(function(){return Ou})),t.d(e,"tail",(function(){return Su})),t.d(e,"take",(function(){return Eu})),t.d(e,"takeRight",(function(){return Pu})),t.d(e,"takeRightWhile",(function(){return Tu})),t.d(e,"takeWhile",(function(){return Au})),t.d(e,"tap",(function(){return Cu})),t.d(e,"template",(function(){return Yu})),t.d(e,"templateSettings",(function(){return Nu})),t.d(e,"throttle",(function(){return Gu})),t.d(e,"thru",(function(){return Qu})),t.d(e,"times",(function(){return Xu})),t.d(e,"toArray",(function(){return Jl})),t.d(e,"toFinite",(function(){return O})),t.d(e,"toInteger",(function(){return S})),t.d(e,"toIterator",(function(){return ap})),t.d(e,"toJSON",(function(){return tp})),t.d(e,"toLength",(function(){return mo})),t.d(e,"toLower",(function(){return np})),t.d(e,"toNumber",(function(){return x})),t.d(e,"toPairs",(function(){return eo})),t.d(e,"toPairsIn",(function(){return to})),t.d(e,"toPath",(function(){return ip})),t.d(e,"toPlainObject",(function(){return vr})),t.d(e,"toSafeInteger",(function(){return rp})),t.d(e,"toString",(function(){return be})),t.d(e,"toUpper",(function(){return op})),t.d(e,"transform",(function(){return sp})),t.d(e,"trim",(function(){return cp})),t.d(e,"trimEnd",(function(){return up})),t.d(e,"trimStart",(function(){return fp})),t.d(e,"truncate",(function(){return gp})),t.d(e,"unary",(function(){return yp})),t.d(e,"unescape",(function(){return wp})),t.d(e,"union",(function(){return _p})),t.d(e,"unionBy",(function(){return jp})),t.d(e,"unionWith",(function(){return xp})),t.d(e,"uniq",(function(){return Op})),t.d(e,"uniqBy",(function(){return Sp})),t.d(e,"uniqWith",(function(){return Ep})),t.d(e,"uniqueId",(function(){return Tp})),t.d(e,"unset",(function(){return Ap})),t.d(e,"unzip",(function(){return qp})),t.d(e,"unzipWith",(function(){return Rp})),t.d(e,"update",(function(){return $p})),t.d(e,"updateWith",(function(){return Dp})),t.d(e,"upperCase",(function(){return Ip})),t.d(e,"upperFirst",(function(){return dt})),t.d(e,"value",(function(){return tp})),t.d(e,"valueOf",(function(){return tp})),t.d(e,"values",(function(){return fs})),t.d(e,"valuesIn",(function(){return Np})),t.d(e,"without",(function(){return Fp})),t.d(e,"words",(function(){return Dt})),t.d(e,"wrap",(function(){return Lp})),t.d(e,"wrapperAt",(function(){return Bp})),t.d(e,"wrapperChain",(function(){return Wp})),t.d(e,"wrapperCommit",(function(){return di})),t.d(e,"wrapperLodash",(function(){return ra})),t.d(e,"wrapperNext",(function(){return Xl})),t.d(e,"wrapperPlant",(function(){return ac})),t.d(e,"wrapperReverse",(function(){return Up})),t.d(e,"wrapperToIterator",(function(){return ap})),t.d(e,"wrapperValue",(function(){return tp})),t.d(e,"xor",(function(){return Hp})),t.d(e,"xorBy",(function(){return Kp})),t.d(e,"xorWith",(function(){return Yp})),t.d(e,"zip",(function(){return Gp})),t.d(e,"zipObject",(function(){return Zp})),t.d(e,"zipObjectDeep",(function(){return Jp})),t.d(e,"zipWith",(function(){return Xp})),t.d(e,"default",(function(){return Sf}));var n=t(19),i=t(7);function r(a){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a})(a)}var o=function(a){return"symbol"==r(a)||Object(i.a)(a)&&"[object Symbol]"==Object(n.a)(a)};var s=function(a){return"number"==typeof a?a:o(a)?NaN:+a},l=t(25);var d=function(a,e){for(var t=-1,n=null==a?0:a.length,i=Array(n);++t0){if(++e>=800)return arguments[0]}else e=0;return a.apply(void 0,arguments)}},da=la(R),ca=/\{\n\/\* \[wrapped with (.+)\] \*/,ua=/,? & /;var pa=function(a){var e=a.match(ca);return e?e[1].split(ua):[]},fa=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;var ma=function(a,e){var t=e.length;if(!t)return a;var n=t-1;return e[n]=(t>1?"& ":"")+e[n],e=e.join(t>2?", ":" "),a.replace(fa,"{\n/* [wrapped with "+e+"] */\n")};var ga=function(a){return function(){return a}},ya=function(){try{var a=Object(T.a)(Object,"defineProperty");return a({},"",{}),a}catch(a){}}(),za=la(ya?function(a,e){return ya(a,"toString",{configurable:!0,enumerable:!1,value:ga(e),writable:!0})}:P.a),ha=t(34);var ba=function(a,e,t,n){for(var i=a.length,r=t+(n?1:-1);n?r--:++r-1},ja=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]];var xa=function(a,e){return Object(ha.a)(ja,(function(t){var n="_."+t[0];e&t[1]&&!_a(a,n)&&a.push(n)})),a.sort()};var Oa=function(a,e,t){var n=e+"";return za(a,ma(n,xa(pa(n),t)))};var Sa=function(a,e,t,n,i,r,o,s,l,d){var c=8&e;e|=c?32:64,4&(e&=~(c?64:32))||(e&=-4);var u=[a,e,i,c?r:void 0,c?o:void 0,c?void 0:r,c?void 0:o,s,l,d],p=t.apply(void 0,u);return oa(a)&&da(p,u),p.placeholder=n,Oa(p,a,e)};var Ea=function(a){return a.placeholder},Pa=t(35),Ta=Math.min;var Aa=function(a,e){for(var t=a.length,n=Ta(e.length,t),i=ea(a);n--;){var r=e[n];a[n]=Object(Pa.a)(r,t)?i[r]:void 0}return a};var Ca=function(a,e){for(var t=-1,n=a.length,i=0,r=[];++t1&&b.reverse(),u&&d1?t[i-1]:void 0,o=i>2?t[2]:void 0;for(r=a.length>3&&"function"==typeof r?(i--,r):void 0,o&&Za(t[0],t[1],o)&&(r=i<3?void 0:r,i=1),e=Object(e);++n0&&(t=e.apply(this,arguments)),a<=1&&(e=void 0),t}},Fe=Ya((function(a,e,t){var n=1;if(t.length){var i=Ca(t,Ea(Fe));n|=32}return Na(a,n,e,t,i)}));Fe.placeholder={};var Le=Fe,Be=Se((function(a,e){return Object(ha.a)(e,(function(e){e=ve(e),La(a,e,Le(a[e],a))})),a})),We=Ya((function(a,e,t){var n=3;if(t.length){var i=Ca(t,Ea(We));n|=32}return Na(e,n,a,t,i)}));We.placeholder={};var Ue=We;var Ve=function(a,e,t){var n=-1,i=a.length;e<0&&(e=-e>i?0:i+e),(t=t>i?i:t)<0&&(t+=i),i=e>t?0:t-e>>>0,e>>>=0;for(var r=Array(i);++n=n?a:Ve(a,e,t)},Ke=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var Ye=function(a){return Ke.test(a)};var Ge=function(a){return a.split("")},Qe="[\\ud800-\\udfff]",Ze="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Je="\\ud83c[\\udffb-\\udfff]",Xe="[^\\ud800-\\udfff]",at="(?:\\ud83c[\\udde6-\\uddff]){2}",et="[\\ud800-\\udbff][\\udc00-\\udfff]",tt="(?:"+Ze+"|"+Je+")"+"?",nt="[\\ufe0e\\ufe0f]?"+tt+("(?:\\u200d(?:"+[Xe,at,et].join("|")+")[\\ufe0e\\ufe0f]?"+tt+")*"),it="(?:"+[Xe+Ze+"?",Ze,at,et,Qe].join("|")+")",rt=RegExp(Je+"(?="+Je+")|"+it+nt,"g");var ot=function(a){return a.match(rt)||[]};var st=function(a){return Ye(a)?ot(a):Ge(a)};var lt=function(a){return function(e){e=be(e);var t=Ye(e)?st(e):void 0,n=t?t[0]:e.charAt(0),i=t?He(t,1).join(""):e.slice(1);return n[a]()+i}},dt=lt("toUpperCase");var ct=function(a){return dt(be(a).toLowerCase())};var ut=function(a,e,t,n){var i=-1,r=null==a?0:a.length;for(n&&r&&(t=a[++i]);++i=e?a:e)),a};var Zt=function(a,e,t){return void 0===t&&(t=e,e=void 0),void 0!==t&&(t=(t=x(t))==t?t:0),void 0!==e&&(e=(e=x(e))==e?e:0),Qt(x(a),e,t)},Jt=t(84);var Xt=function(){this.__data__=new Jt.a,this.size=0};var an=function(a){var e=this.__data__,t=e.delete(a);return this.size=e.size,t};var en=function(a){return this.__data__.get(a)};var tn=function(a){return this.__data__.has(a)},nn=t(85),rn=t(110);var on=function(a,e){var t=this.__data__;if(t instanceof Jt.a){var n=t.__data__;if(!nn.a||n.length<199)return n.push([a,e]),this.size=++t.size,this;t=this.__data__=new rn.a(n)}return t.set(a,e),this.size=t.size,this};function sn(a){var e=this.__data__=new Jt.a(a);this.size=e.size}sn.prototype.clear=Xt,sn.prototype.delete=an,sn.prototype.get=en,sn.prototype.has=tn,sn.prototype.set=on;var ln=sn;var dn=function(a,e){return a&&Va(e,Object(ae.a)(e),a)};var cn=function(a,e){return a&&Va(e,se(e),a)},un=t(203);var pn=function(a,e){for(var t=-1,n=null==a?0:a.length,i=0,r=[];++ts))return!1;var d=r.get(a),c=r.get(e);if(d&&c)return d==e&&c==a;var u=-1,p=!0,f=2&t?new gi:void 0;for(r.set(a,e),r.set(e,a);++u=e||t<0||u&&a-d>=r}function y(){var a=lr();if(g(a))return z(a);s=setTimeout(y,function(a){var t=e-(a-l);return u?cr(t,r-(a-d)):t}(a))}function z(a){return s=void 0,p&&n?f(a):(n=i=void 0,o)}function h(){var a=lr(),t=g(a);if(n=arguments,i=this,l=a,t){if(void 0===s)return m(l);if(u)return clearTimeout(s),s=setTimeout(y,e),f(l)}return void 0===s&&(s=setTimeout(y,e)),o}return e=x(e)||0,Object(w.a)(t)&&(c=!!t.leading,r=(u="maxWait"in t)?dr(x(t.maxWait)||0,e):r,p="trailing"in t?!!t.trailing:p),h.cancel=function(){void 0!==s&&clearTimeout(s),d=0,n=l=i=s=void 0},h.flush=function(){return void 0===s?o:z(lr())},h};var pr=function(a,e){return null==a||a!=a?e:a},fr=Object.prototype,mr=fr.hasOwnProperty,gr=Ya((function(a,e){a=Object(a);var t=-1,n=e.length,i=n>2?e[2]:void 0;for(i&&Za(e[0],e[1],i)&&(n=1);++t=200&&(r=zi,o=!1,e=new gi(e));a:for(;++i=0&&a.slice(t,i)==e};var Jr=function(a,e){return d(e,(function(e){return[e,a[e]]}))};var Xr=function(a){var e=-1,t=Array(a.size);return a.forEach((function(a){t[++e]=[a,a]})),t};var ao=function(a){return function(e){var t=Rn(e);return"[object Map]"==t?bi(e):"[object Set]"==t?Xr(e):Jr(e,a(e))}},eo=ao(ae.a),to=ao(se),no=pt({"&":"&","<":"<",">":">",'"':""","'":"'"}),io=/[&<>"']/g,ro=RegExp(io.source);var oo=function(a){return(a=be(a))&&ro.test(a)?a.replace(io,no):a},so=/[\\^$.*+?()[\]{}|]/g,lo=RegExp(so.source);var co=function(a){return(a=be(a))&&lo.test(a)?a.replace(so,"\\$&"):a};var uo=function(a,e){for(var t=-1,n=null==a?0:a.length;++ti?0:i+t),(n=void 0===n||n>i?i:S(n))<0&&(n+=i),n=t>n?0:mo(n);t-1?i[r?e[o]:o]:void 0}},wo=Math.max;var vo=function(a,e,t){var n=null==a?0:a.length;if(!n)return-1;var i=null==t?0:S(t);return i<0&&(i=wo(n+i,0)),ba(a,Vi(e,3),i)},ko=bo(vo);var _o=function(a,e,t){var n;return t(a,(function(a,t,i){if(e(a,t,i))return n=t,!1})),n},jo=t(36);var xo=function(a,e){return _o(a,Vi(e,3),jo.a)},Oo=Math.max,So=Math.min;var Eo=function(a,e,t){var n=null==a?0:a.length;if(!n)return-1;var i=n-1;return void 0!==t&&(i=S(t),i=t<0?Oo(n+i,0):So(i,n-1)),ba(a,Vi(e,3),i,!0)},Po=bo(Eo);var To=function(a,e){return _o(a,Vi(e,3),Hr)};var Ao=function(a){return a&&a.length?a[0]:void 0};var Co=function(a,e){var t=-1,n=Object(Ga.a)(a)?Array(a.length):[];return Object(Ji.a)(a,(function(a,i,r){n[++t]=e(a,i,r)})),n};var qo=function(a,e){return(Object(c.a)(a)?d:Co)(a,Vi(e,3))};var Ro=function(a,e){return Object(xe.a)(qo(a,e),1)};var Mo=function(a,e){return Object(xe.a)(qo(a,e),1/0)};var $o=function(a,e,t){return t=void 0===t?1:S(t),Object(xe.a)(qo(a,e),t)},Do=t(153);var Io=function(a,e){return(null==a?0:a.length)?(e=void 0===e?1:S(e),Object(xe.a)(a,e)):[]};var No=function(a){return Na(a,512)},Fo=Ut("floor");var Lo=function(a){return Se((function(e){var t=e.length,n=t,i=aa.prototype.thru;for(a&&e.reverse();n--;){var r=e[n];if("function"!=typeof r)throw new TypeError("Expected a function");if(i&&!o&&"wrapper"==J(r))var o=new aa([],!0)}for(n=o?n:t;++ne};var es=function(a){return function(e,t){return"string"==typeof e&&"string"==typeof t||(e=x(e),t=x(t)),a(e,t)}},ts=es(as),ns=es((function(a,e){return a>=e})),is=Object.prototype.hasOwnProperty;var rs=function(a,e){return null!=a&&is.call(a,e)};var os=function(a,e){return null!=a&&Ii(a,e,rs)},ss=Math.max,ls=Math.min;var ds=function(a,e,t){return a>=ls(e,t)&&a-1:!!i&&ka(a,e,t)>-1},ys=Math.max;var zs=function(a,e,t){var n=null==a?0:a.length;if(!n)return-1;var i=null==t?0:S(t);return i<0&&(i=ys(n+i,0)),ka(a,e,i)};var hs=function(a){return(null==a?0:a.length)?Ve(a,0,-1):[]},bs=Math.min;var ws=function(a,e,t){for(var n=t?Tr:_a,i=a[0].length,r=a.length,o=r,s=Array(r),l=1/0,c=[];o--;){var u=a[o];o&&e&&(u=d(u,Object(Qn.a)(e))),l=bs(u.length,l),s[o]=!t&&(e||i>=120&&u.length>=120)?new gi(o&&u):void 0}u=a[0];var p=-1,f=s[0];a:for(;++p=-9007199254740991&&a<=9007199254740991};var ml=function(a){return void 0===a};var gl=function(a){return Object(i.a)(a)&&"[object WeakMap]"==Rn(a)};var yl=function(a){return Object(i.a)(a)&&"[object WeakSet]"==Object(n.a)(a)};var zl=function(a){return Vi("function"==typeof a?a:ii(a,1))},hl=Array.prototype.join;var bl=function(a,e){return null==a?"":hl.call(a,e)},wl=Nt((function(a,e,t){return a+(t?"-":"")+e.toLowerCase()})),vl=ar((function(a,e,t){La(a,t,e)}));var kl=function(a,e,t){for(var n=t+1;n--;)if(a[n]===e)return n;return n},_l=Math.max,jl=Math.min;var xl=function(a,e,t){var n=null==a?0:a.length;if(!n)return-1;var i=n;return void 0!==t&&(i=(i=S(t))<0?_l(n+i,0):jl(i,n-1)),e==e?kl(a,e,i):ba(a,wa,i,!0)},Ol=Nt((function(a,e,t){return a+(t?" ":"")+e.toLowerCase()})),Sl=lt("toLowerCase");var El=function(a,e){return a=this.__values__.length;return{done:a,value:a?void 0:this.__values__[this.__index__++]}};var ad=function(a,e){var t=a.length;if(t)return e+=e<0?t:0,Object(Pa.a)(e,t)?a[e]:void 0};var ed=function(a,e){return a&&a.length?ad(a,S(e)):void 0};var td=function(a){return a=S(a),Ya((function(e){return ad(e,a)}))};var nd=function(a,e){return e=we(e,a),null==(a=qs(a,e))||delete a[ve(qr(e))]};var id=function(a){return $e(a)?void 0:a},rd=Se((function(a,e){var t={};if(null==a)return t;var n=!1;e=d(e,(function(e){return e=we(e,a),n||(n=e.length>1),e})),Va(a,_n(a),t),n&&(t=ii(t,7,id));for(var i=e.length;i--;)nd(t,e[i]);return t}));var od=function(a,e,t,n){if(!Object(w.a)(a))return a;for(var i=-1,r=(e=we(e,a)).length,o=r-1,s=a;null!=s&&++ie||r&&s&&d&&!l&&!c||n&&s&&d||!t&&d||!i)return 1;if(!n&&!r&&!c&&a=s?l:l*("desc"==t[n]?-1:1)}return a.index-e.index};var md=function(a,e,t){e=e.length?d(e,(function(a){return Object(c.a)(a)?function(e){return ke(e,1===a.length?a[0]:a)}:a})):[P.a];var n=-1;e=d(e,Object(Qn.a)(Vi));var i=Co(a,(function(a,t,i){return{criteria:d(e,(function(e){return e(a)})),index:++n,value:a}}));return ud(i,(function(a,e){return fd(a,e,t)}))};var gd=function(a,e,t,n){return null==a?[]:(Object(c.a)(e)||(e=null==e?[]:[e]),t=n?void 0:t,Object(c.a)(t)||(t=null==t?[]:[t]),md(a,e,t))};var yd=function(a){return Se((function(e){return e=d(e,Object(Qn.a)(Vi)),Ya((function(t){var n=this;return a(e,(function(a){return N(a,n,t)}))}))}))},zd=yd(d),hd=Ya,bd=Math.min,wd=hd((function(a,e){var t=(e=1==e.length&&Object(c.a)(e[0])?d(e[0],Object(Qn.a)(Vi)):d(Object(xe.a)(e,1),Object(Qn.a)(Vi))).length;return Ya((function(n){for(var i=-1,r=bd(n.length,t);++i9007199254740991)return t;do{e%2&&(t+=a),(e=_d(e/2))&&(a+=a)}while(e);return t},xd=Li("length"),Od="[\\ud800-\\udfff]",Sd="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Ed="[^\\ud800-\\udfff]",Pd="(?:\\ud83c[\\udde6-\\uddff]){2}",Td="[\\ud800-\\udbff][\\udc00-\\udfff]",Ad="(?:"+Sd+"|\\ud83c[\\udffb-\\udfff])"+"?",Cd="[\\ufe0e\\ufe0f]?"+Ad+("(?:\\u200d(?:"+[Ed,Pd,Td].join("|")+")[\\ufe0e\\ufe0f]?"+Ad+")*"),qd="(?:"+[Ed+Sd+"?",Sd,Pd,Td,Od].join("|")+")",Rd=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+qd+Cd,"g");var Md=function(a){for(var e=Rd.lastIndex=0;Rd.test(a);)++e;return e};var $d=function(a){return Ye(a)?Md(a):xd(a)},Dd=Math.ceil;var Id=function(a,e){var t=(e=void 0===e?" ":f(e)).length;if(t<2)return t?jd(e,a):e;var n=jd(e,Dd(a/$d(e)));return Ye(e)?He(st(n),0,a).join(""):n.slice(0,a)},Nd=Math.ceil,Fd=Math.floor;var Ld=function(a,e,t){a=be(a);var n=(e=S(e))?$d(a):0;if(!e||n>=e)return a;var i=(e-n)/2;return Id(Fd(i),t)+a+Id(Nd(i),t)};var Bd=function(a,e,t){a=be(a);var n=(e=S(e))?$d(a):0;return e&&n-1;)s!==a&&nc.call(s,l,1),nc.call(a,l,1);return a};var rc=function(a,e){return a&&a.length&&e&&e.length?ic(a,e):a},oc=Ya(rc);var sc=function(a,e,t){return a&&a.length&&e&&e.length?ic(a,e,Vi(t,2)):a};var lc=function(a,e,t){return a&&a.length&&e&&e.length?ic(a,e,void 0,t):a},dc=Array.prototype.splice;var cc=function(a,e){for(var t=a?e.length:0,n=t-1;t--;){var i=e[t];if(t==n||i!==r){var r=i;Object(Pa.a)(i)?dc.call(a,i,1):nd(a,i)}}return a},uc=Se((function(a,e){var t=null==a?0:a.length,n=je(a,e);return cc(a,d(e,(function(a){return Object(Pa.a)(a,t)?+a:a})).sort(pd)),n})),pc=Math.floor,fc=Math.random;var mc=function(a,e){return a+pc(fc()*(e-a+1))},gc=parseFloat,yc=Math.min,zc=Math.random;var hc=function(a,e,t){if(t&&"boolean"!=typeof t&&Za(a,e,t)&&(e=t=void 0),void 0===t&&("boolean"==typeof e?(t=e,e=void 0):"boolean"==typeof a&&(t=a,a=void 0)),void 0===a&&void 0===e?(a=0,e=1):(a=O(a),void 0===e?(e=a,a=0):e=O(e)),a>e){var n=a;a=e,e=n}if(t||a%1||e%1){var i=zc();return yc(a+i*(e-a+gc("1e-"+((i+"").length-1))),e)}return mc(a,e)},bc=Math.ceil,wc=Math.max;var vc=function(a,e,t,n){for(var i=-1,r=wc(bc((e-a)/(t||1)),0),o=Array(r);r--;)o[n?r:++i]=a,a+=t;return o};var kc=function(a){return function(e,t,n){return n&&"number"!=typeof n&&Za(e,t,n)&&(t=n=void 0),e=O(e),void 0===t?(t=e,e=0):t=O(t),n=void 0===n?e1&&Za(a,e[0],e[1])?e=[]:t>2&&Za(e[0],e[1],e[2])&&(e=[e[0]]),md(a,Object(xe.a)(e,1),[])})),nu=Math.floor,iu=Math.min;var ru=function(a,e,t,n){var i=0,r=null==a?0:a.length;if(0===r)return 0;for(var s=(e=t(e))!=e,l=null===e,d=o(e),c=void 0===e;i>>1,s=a[r];null!==s&&!o(s)&&(t?s<=e:s>>0)?(a=be(a))&&("string"==typeof e||null!=e&&!pl(e))&&!(e=f(e))&&Ye(a)?He(st(a),0,t):a.split(e,t):[]},zu=Math.max;var hu=function(a,e){if("function"!=typeof a)throw new TypeError("Expected a function");return e=null==e?0:zu(S(e),0),Ya((function(t){var n=t[e],i=He(t,0,e);return n&&Object(hn.a)(i,n),N(a,this,i)}))},bu=Nt((function(a,e,t){return a+(t?" ":"")+dt(e)}));var wu=function(a,e,t){return a=be(a),t=null==t?0:Qt(S(t),0,a.length),e=f(e),a.slice(t,t+e.length)==e};var vu=function(){return{}};var ku=function(){return""};var _u=function(){return!0},ju=m((function(a,e){return a-e}),0);var xu=function(a){return a&&a.length?Il(a,P.a):0};var Ou=function(a,e){return a&&a.length?Il(a,Vi(e,2)):0};var Su=function(a){var e=null==a?0:a.length;return e?Ve(a,1,e):[]};var Eu=function(a,e,t){return a&&a.length?(e=t||void 0===e?1:S(e),Ve(a,0,e<0?0:e)):[]};var Pu=function(a,e,t){var n=null==a?0:a.length;return n?(e=t||void 0===e?1:S(e),Ve(a,(e=n-e)<0?0:e,n)):[]};var Tu=function(a,e){return a&&a.length?Nr(a,Vi(e,3),!1,!0):[]};var Au=function(a,e){return a&&a.length?Nr(a,Vi(e,3)):[]};var Cu=function(a,e){return e(a),a},qu=Object.prototype,Ru=qu.hasOwnProperty;var Mu=function(a,e,t,n){return void 0===a||Object(Ba.a)(a,qu[t])&&!Ru.call(n,t)?e:a},$u={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"};var Du=function(a){return"\\"+$u[a]},Iu=/<%=([\s\S]+?)%>/g,Nu={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:Iu,variable:"",imports:{_:{escape:oo}}},Fu=/\b__p \+= '';/g,Lu=/\b(__p \+=) '' \+/g,Bu=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Wu=/[()=,{}\[\]\/\s]/,Uu=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Vu=/($^)/,Hu=/['\n\r\u2028\u2029\\]/g,Ku=Object.prototype.hasOwnProperty;var Yu=function(a,e,t){var n=Nu.imports._.templateSettings||Nu;t&&Za(a,e,t)&&(e=void 0),a=be(a),e=de({},e,n,Mu);var i,r,o=de({},e.imports,n.imports,Mu),s=Object(ae.a)(o),l=ps(o,s),d=0,c=e.interpolate||Vu,u="__p += '",p=RegExp((e.escape||Vu).source+"|"+c.source+"|"+(c===Iu?Uu:Vu).source+"|"+(e.evaluate||Vu).source+"|$","g"),f=Ku.call(e,"sourceURL")?"//# sourceURL="+(e.sourceURL+"").replace(/\s/g," ")+"\n":"";a.replace(p,(function(e,t,n,o,s,l){return n||(n=o),u+=a.slice(d,l).replace(Hu,Du),t&&(i=!0,u+="' +\n__e("+t+") +\n'"),s&&(r=!0,u+="';\n"+s+";\n__p += '"),n&&(u+="' +\n((__t = ("+n+")) == null ? '' : __t) +\n'"),d=l+e.length,e})),u+="';\n";var m=Ku.call(e,"variable")&&e.variable;if(m){if(Wu.test(m))throw new Error("Invalid `variable` option passed into `_.template`")}else u="with (obj) {\n"+u+"\n}\n";u=(r?u.replace(Fu,""):u).replace(Lu,"$1").replace(Bu,"$1;"),u="function("+(m||"obj")+") {\n"+(m?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(i?", __e = _.escape":"")+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+u+"return __p\n}";var g=Ie((function(){return Function(s,f+"return "+u).apply(void 0,l)}));if(g.source=u,De(g))throw g;return g};var Gu=function(a,e,t){var n=!0,i=!0;if("function"!=typeof a)throw new TypeError("Expected a function");return Object(w.a)(t)&&(n="leading"in t?!!t.leading:n,i="trailing"in t?!!t.trailing:i),ur(a,e,{leading:n,maxWait:e,trailing:i})};var Qu=function(a,e){return e(a)},Zu=t(132),Ju=Math.min;var Xu=function(a,e){if((a=S(a))<1||a>9007199254740991)return[];var t=4294967295,n=Ju(a,4294967295);e=Object(Gr.a)(e),a-=4294967295;for(var i=Object(Zu.a)(n,e);++t-1;);return t};var dp=function(a,e){for(var t=-1,n=a.length;++t-1;);return t};var cp=function(a,e,t){if((a=be(a))&&(t||void 0===e))return b(a);if(!a||!(e=f(e)))return a;var n=st(a),i=st(e),r=dp(n,i),o=lp(n,i)+1;return He(n,r,o).join("")};var up=function(a,e,t){if((a=be(a))&&(t||void 0===e))return a.slice(0,z(a)+1);if(!a||!(e=f(e)))return a;var n=st(a),i=lp(n,st(e))+1;return He(n,0,i).join("")},pp=/^\s+/;var fp=function(a,e,t){if((a=be(a))&&(t||void 0===e))return a.replace(pp,"");if(!a||!(e=f(e)))return a;var n=st(a),i=dp(n,st(e));return He(n,i).join("")},mp=/\w*$/;var gp=function(a,e){var t=30,n="...";if(Object(w.a)(e)){var i="separator"in e?e.separator:i;t="length"in e?S(e.length):t,n="omission"in e?f(e.omission):n}var r=(a=be(a)).length;if(Ye(a)){var o=st(a);r=o.length}if(t>=r)return a;var s=t-$d(n);if(s<1)return n;var l=o?He(o,0,s).join(""):a.slice(0,s);if(void 0===i)return l+n;if(o&&(s+=l.length-s),pl(i)){if(a.slice(s).search(i)){var d,c=l;for(i.global||(i=RegExp(i.source,be(mp.exec(i))+"g")),i.lastIndex=0;d=i.exec(c);)var u=d.index;l=l.slice(0,void 0===u?s:u)}}else if(a.indexOf(f(i),s)!=s){var p=l.lastIndexOf(i);p>-1&&(l=l.slice(0,p))}return l+n};var yp=function(a){return Fa(a,1)},zp=pt({"&":"&","<":"<",">":">",""":'"',"'":"'"}),hp=/&(?:amp|lt|gt|quot|#39);/g,bp=RegExp(hp.source);var wp=function(a){return(a=be(a))&&bp.test(a)?a.replace(hp,zp):a},vp=On&&1/wi(new On([,-0]))[1]==1/0?function(a){return new On(a)}:Y;var kp=function(a,e,t){var n=-1,i=_a,r=a.length,o=!0,s=[],l=s;if(t)o=!1,i=Tr;else if(r>=200){var d=e?null:vp(a);if(d)return wi(d);o=!1,i=zi,l=new gi}else l=e?[]:s;a:for(;++n1||this.__actions__.length)&&n instanceof K&&Object(Pa.a)(t)?((n=n.slice(t,+t+(e?1:0))).__actions__.push({func:Qu,args:[i],thisArg:void 0}),new aa(n,this.__chain__).thru((function(a){return e&&!a.length&&a.push(void 0),a}))):this.thru(i)}));var Wp=function(){return Ht(this)};var Up=function(){var a=this.__wrapped__;if(a instanceof K){var e=a;return this.__actions__.length&&(e=new K(this)),(e=e.reverse()).__actions__.push({func:Qu,args:[Dc],thisArg:void 0}),new aa(e,this.__chain__)}return this.thru(Dc)};var Vp=function(a,e,t){var n=a.length;if(n<2)return n?kp(a[0]):[];for(var i=-1,r=Array(n);++i1?a[e-1]:void 0;return t="function"==typeof t?(a.pop(),t):void 0,Rp(a,t)})),af={chunk:Gt,compact:ci,concat:ui,difference:Cr,differenceBy:Rr,differenceWith:Mr,drop:Dr,dropRight:Ir,dropRightWhile:Fr,dropWhile:Lr,fill:yo,findIndex:vo,findLastIndex:Eo,first:Ao,flatten:Oe,flattenDeep:Do.default,flattenDepth:Io,fromPairs:Yo,head:Ao,indexOf:zs,initial:hs,intersection:ks,intersectionBy:_s,intersectionWith:js,join:bl,last:qr,lastIndexOf:xl,nth:ed,pull:oc,pullAll:rc,pullAllBy:sc,pullAllWith:lc,pullAt:uc,remove:Ac,reverse:Dc,slice:Jc,sortedIndex:su,sortedIndexBy:lu,sortedIndexOf:du,sortedLastIndex:cu,sortedLastIndexBy:uu,sortedLastIndexOf:pu,sortedUniq:mu,sortedUniqBy:gu,tail:Su,take:Eu,takeRight:Pu,takeRightWhile:Tu,takeWhile:Au,union:_p,unionBy:jp,unionWith:xp,uniq:Op,uniqBy:Sp,uniqWith:Ep,unzip:qp,unzipWith:Rp,without:Fp,xor:Hp,xorBy:Kp,xorWith:Yp,zip:Gp,zipObject:Zp,zipObjectDeep:Jp,zipWith:Xp},ef={countBy:tr,each:Br.a,eachRight:Qr,every:fo,filter:ho,find:ko,findLast:Po,flatMap:Ro,flatMapDeep:Mo,flatMapDepth:$o,forEach:Br.a,forEachRight:Qr,groupBy:Xo,includes:gs,invokeMap:$s,keyBy:vl,map:qo,orderBy:gd,partition:Zd,reduce:Sc,reduceRight:Pc,reject:Tc,sample:Lc,sampleSize:Vc,shuffle:Qc,size:Zc,some:eu,sortBy:tu},tf={now:lr},nf={after:E,ary:Fa,before:Ne,bind:Le,bindKey:Ue,curry:rr,curryRight:sr,debounce:ur,defer:Er,delay:Pr,flip:No,memoize:ge.a,negate:Gl,once:cd,overArgs:wd,partial:Yd,partialRight:Qd,rearg:xc,rest:Rc,spread:hu,throttle:Gu,unary:yp,wrap:Lp},rf={castArray:Lt,clone:ri,cloneDeep:oi,cloneDeepWith:si,cloneWith:li,conformsTo:Qi,eq:Ba.a,gt:ts,gte:ns,isArguments:$i.a,isArray:c.a,isArrayBuffer:Ns,isArrayLike:Ga.a,isArrayLikeObject:hr,isBoolean:Fs,isBuffer:Yn.a,isDate:Ws,isElement:Us,isEmpty:Ks,isEqual:Ys,isEqualWith:Gs,isError:De,isFinite:Zs,isFunction:br.a,isInteger:Js,isLength:Di.a,isMap:Xn,isMatch:Xs,isMatchWith:al,isNaN:tl,isNative:sl,isNil:ll,isNull:dl,isNumber:el,isObject:w.a,isObjectLike:i.a,isPlainObject:$e,isRegExp:pl,isSafeInteger:fl,isSet:ti,isString:us,isSymbol:o,isTypedArray:Oi.a,isUndefined:ml,isWeakMap:gl,isWeakSet:yl,lt:Pl,lte:Tl,toArray:Jl,toFinite:O,toInteger:S,toLength:mo,toNumber:x,toPlainObject:vr,toSafeInteger:rp,toString:be},of={add:g,ceil:Vt,divide:$r,floor:Fo,max:$l,maxBy:Dl,mean:Fl,meanBy:Ll,min:Vl,minBy:Hl,multiply:Yl,round:Ic,subtract:ju,sum:xu,sumBy:Ou},sf={clamp:Zt,inRange:cs,random:hc},lf={assign:te,assignIn:le,assignInWith:de,assignWith:ce,at:Ee,create:nr,defaults:gr,defaultsDeep:Or,entries:eo,entriesIn:to,extend:le,extendWith:de,findKey:xo,findLastKey:To,forIn:Uo,forInRight:Vo,forOwn:Ho,forOwnRight:Ko,functions:Qo,functionsIn:Zo,get:_e,has:os,hasIn:Ni,invert:Es,invertBy:Cs,invoke:Ms,keys:ae.a,keysIn:se,mapKeys:Al,mapValues:Cl,merge:Bl,mergeWith:xr,omit:rd,omitBy:dd,pick:Xd,pickBy:ld,result:Mc,set:Hc,setWith:Kc,toPairs:eo,toPairsIn:to,transform:sp,unset:Ap,update:$p,updateWith:Dp,values:fs,valuesIn:Np},df={at:Bp,chain:Ht,commit:di,lodash:ra,next:Xl,plant:ac,reverse:Up,tap:Cu,thru:Qu,toIterator:ap,toJSON:tp,value:tp,valueOf:tp,wrapperChain:Wp},cf={camelCase:Ft,capitalize:ct,deburr:yt,endsWith:Zr,escape:oo,escapeRegExp:co,kebabCase:wl,lowerCase:Ol,lowerFirst:Sl,pad:Ld,padEnd:Bd,padStart:Wd,parseInt:Hd,repeat:Cc,replace:qc,snakeCase:Xc,split:yu,startCase:bu,startsWith:wu,template:Yu,templateSettings:Nu,toLower:np,toUpper:op,trim:cp,trimEnd:up,trimStart:fp,truncate:gp,unescape:wp,upperCase:Ip,upperFirst:dt,words:Dt},uf={attempt:Ie,bindAll:Be,cond:Hi,conforms:Gi,constant:ga,defaultTo:pr,flow:Bo,flowRight:Wo,identity:P.a,iteratee:zl,matches:ql,matchesProperty:Rl,method:Wl,methodOf:Ul,mixin:Kl,noop:Y,nthArg:td,over:zd,overEvery:vd,overSome:kd,property:Wi,propertyOf:ec,range:_c,rangeRight:jc,stubArray:fn,stubFalse:rl.a,stubObject:vu,stubString:ku,stubTrue:_u,times:Xu,toPath:ip,uniqueId:Tp};var pf=function(){var a=new K(this.__wrapped__);return a.__actions__=ea(this.__actions__),a.__dir__=this.__dir__,a.__filtered__=this.__filtered__,a.__iteratees__=ea(this.__iteratees__),a.__takeCount__=this.__takeCount__,a.__views__=ea(this.__views__),a};var ff=function(){if(this.__filtered__){var a=new K(this);a.__dir__=-1,a.__filtered__=!0}else(a=this.clone()).__dir__*=-1;return a},mf=Math.max,gf=Math.min;var yf=function(a,e,t){for(var n=-1,i=t.length;++n0){if(++a>=800)return arguments[0]}else a=0;return e.apply(void 0,arguments)}},de=le(M),ce=/\{\n\/\* \[wrapped with (.+)\] \*/,ue=/,? & /;var pe=function(e){var a=e.match(ce);return a?a[1].split(ue):[]},fe=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;var me=function(e,a){var t=a.length;if(!t)return e;var n=t-1;return a[n]=(t>1?"& ":"")+a[n],a=a.join(t>2?", ":" "),e.replace(fe,"{\n/* [wrapped with "+a+"] */\n")};var ge=function(e){return function(){return e}},ye=function(){try{var e=Object(T.a)(Object,"defineProperty");return e({},"",{}),e}catch(e){}}(),be=le(ye?function(e,a){return ye(e,"toString",{configurable:!0,enumerable:!1,value:ge(a),writable:!0})}:P.a),he=t(34);var ze=function(e,a,t,n){for(var i=e.length,r=t+(n?1:-1);n?r--:++r-1},_e=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]];var xe=function(e,a){return Object(he.a)(_e,(function(t){var n="_."+t[0];a&t[1]&&!je(e,n)&&e.push(n)})),e.sort()};var Oe=function(e,a,t){var n=a+"";return be(e,me(n,xe(pe(n),t)))};var Se=function(e,a,t,n,i,r,o,s,l,d){var c=8&a;a|=c?32:64,4&(a&=~(c?64:32))||(a&=-4);var u=[e,a,i,c?r:void 0,c?o:void 0,c?void 0:r,c?void 0:o,s,l,d],p=t.apply(void 0,u);return oe(e)&&de(p,u),p.placeholder=n,Oe(p,e,a)};var Ee=function(e){return e.placeholder},Pe=t(35),Te=Math.min;var Ae=function(e,a){for(var t=e.length,n=Te(a.length,t),i=ae(e);n--;){var r=a[n];e[n]=Object(Pe.a)(r,t)?i[r]:void 0}return e};var Ce=function(e,a){for(var t=-1,n=e.length,i=0,r=[];++t1&&z.reverse(),u&&d1?t[i-1]:void 0,o=i>2?t[2]:void 0;for(r=e.length>3&&"function"==typeof r?(i--,r):void 0,o&&Ze(t[0],t[1],o)&&(r=i<3?void 0:r,i=1),a=Object(a);++n0&&(t=a.apply(this,arguments)),e<=1&&(a=void 0),t}},Fa=Ye((function(e,a,t){var n=1;if(t.length){var i=Ce(t,Ee(Fa));n|=32}return Ne(e,n,a,t,i)}));Fa.placeholder={};var La=Fa,Ba=Sa((function(e,a){return Object(he.a)(a,(function(a){a=va(a),Le(e,a,La(e[a],e))})),e})),Wa=Ye((function(e,a,t){var n=3;if(t.length){var i=Ce(t,Ee(Wa));n|=32}return Ne(a,n,e,t,i)}));Wa.placeholder={};var Ua=Wa;var Va=function(e,a,t){var n=-1,i=e.length;a<0&&(a=-a>i?0:i+a),(t=t>i?i:t)<0&&(t+=i),i=a>t?0:t-a>>>0,a>>>=0;for(var r=Array(i);++n=n?e:Va(e,a,t)},Ka=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var Ya=function(e){return Ka.test(e)};var Ga=function(e){return e.split("")},Qa="[\\ud800-\\udfff]",Za="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Ja="\\ud83c[\\udffb-\\udfff]",Xa="[^\\ud800-\\udfff]",et="(?:\\ud83c[\\udde6-\\uddff]){2}",at="[\\ud800-\\udbff][\\udc00-\\udfff]",tt="(?:"+Za+"|"+Ja+")"+"?",nt="[\\ufe0e\\ufe0f]?"+tt+("(?:\\u200d(?:"+[Xa,et,at].join("|")+")[\\ufe0e\\ufe0f]?"+tt+")*"),it="(?:"+[Xa+Za+"?",Za,et,at,Qa].join("|")+")",rt=RegExp(Ja+"(?="+Ja+")|"+it+nt,"g");var ot=function(e){return e.match(rt)||[]};var st=function(e){return Ya(e)?ot(e):Ga(e)};var lt=function(e){return function(a){a=za(a);var t=Ya(a)?st(a):void 0,n=t?t[0]:a.charAt(0),i=t?Ha(t,1).join(""):a.slice(1);return n[e]()+i}},dt=lt("toUpperCase");var ct=function(e){return dt(za(e).toLowerCase())};var ut=function(e,a,t,n){var i=-1,r=null==e?0:e.length;for(n&&r&&(t=e[++i]);++i=a?e:a)),e};var Zt=function(e,a,t){return void 0===t&&(t=a,a=void 0),void 0!==t&&(t=(t=x(t))==t?t:0),void 0!==a&&(a=(a=x(a))==a?a:0),Qt(x(e),a,t)},Jt=t(85);var Xt=function(){this.__data__=new Jt.a,this.size=0};var en=function(e){var a=this.__data__,t=a.delete(e);return this.size=a.size,t};var an=function(e){return this.__data__.get(e)};var tn=function(e){return this.__data__.has(e)},nn=t(86),rn=t(110);var on=function(e,a){var t=this.__data__;if(t instanceof Jt.a){var n=t.__data__;if(!nn.a||n.length<199)return n.push([e,a]),this.size=++t.size,this;t=this.__data__=new rn.a(n)}return t.set(e,a),this.size=t.size,this};function sn(e){var a=this.__data__=new Jt.a(e);this.size=a.size}sn.prototype.clear=Xt,sn.prototype.delete=en,sn.prototype.get=an,sn.prototype.has=tn,sn.prototype.set=on;var ln=sn;var dn=function(e,a){return e&&Ve(a,Object(ea.a)(a),e)};var cn=function(e,a){return e&&Ve(a,sa(a),e)},un=t(205);var pn=function(e,a){for(var t=-1,n=null==e?0:e.length,i=0,r=[];++ts))return!1;var d=r.get(e),c=r.get(a);if(d&&c)return d==a&&c==e;var u=-1,p=!0,f=2&t?new gi:void 0;for(r.set(e,a),r.set(a,e);++u=a||t<0||u&&e-d>=r}function y(){var e=lr();if(g(e))return b(e);s=setTimeout(y,function(e){var t=a-(e-l);return u?cr(t,r-(e-d)):t}(e))}function b(e){return s=void 0,p&&n?f(e):(n=i=void 0,o)}function h(){var e=lr(),t=g(e);if(n=arguments,i=this,l=e,t){if(void 0===s)return m(l);if(u)return clearTimeout(s),s=setTimeout(y,a),f(l)}return void 0===s&&(s=setTimeout(y,a)),o}return a=x(a)||0,Object(w.a)(t)&&(c=!!t.leading,r=(u="maxWait"in t)?dr(x(t.maxWait)||0,a):r,p="trailing"in t?!!t.trailing:p),h.cancel=function(){void 0!==s&&clearTimeout(s),d=0,n=l=i=s=void 0},h.flush=function(){return void 0===s?o:b(lr())},h};var pr=function(e,a){return null==e||e!=e?a:e},fr=Object.prototype,mr=fr.hasOwnProperty,gr=Ye((function(e,a){e=Object(e);var t=-1,n=a.length,i=n>2?a[2]:void 0;for(i&&Ze(a[0],a[1],i)&&(n=1);++t=200&&(r=bi,o=!1,a=new gi(a));e:for(;++i=0&&e.slice(t,i)==a};var Jr=function(e,a){return d(a,(function(a){return[a,e[a]]}))};var Xr=function(e){var a=-1,t=Array(e.size);return e.forEach((function(e){t[++a]=[e,e]})),t};var eo=function(e){return function(a){var t=Mn(a);return"[object Map]"==t?zi(a):"[object Set]"==t?Xr(a):Jr(a,e(a))}},ao=eo(ea.a),to=eo(sa),no=pt({"&":"&","<":"<",">":">",'"':""","'":"'"}),io=/[&<>"']/g,ro=RegExp(io.source);var oo=function(e){return(e=za(e))&&ro.test(e)?e.replace(io,no):e},so=/[\\^$.*+?()[\]{}|]/g,lo=RegExp(so.source);var co=function(e){return(e=za(e))&&lo.test(e)?e.replace(so,"\\$&"):e};var uo=function(e,a){for(var t=-1,n=null==e?0:e.length;++ti?0:i+t),(n=void 0===n||n>i?i:S(n))<0&&(n+=i),n=t>n?0:mo(n);t-1?i[r?a[o]:o]:void 0}},wo=Math.max;var vo=function(e,a,t){var n=null==e?0:e.length;if(!n)return-1;var i=null==t?0:S(t);return i<0&&(i=wo(n+i,0)),ze(e,Vi(a,3),i)},ko=zo(vo);var jo=function(e,a,t){var n;return t(e,(function(e,t,i){if(a(e,t,i))return n=t,!1})),n},_o=t(36);var xo=function(e,a){return jo(e,Vi(a,3),_o.a)},Oo=Math.max,So=Math.min;var Eo=function(e,a,t){var n=null==e?0:e.length;if(!n)return-1;var i=n-1;return void 0!==t&&(i=S(t),i=t<0?Oo(n+i,0):So(i,n-1)),ze(e,Vi(a,3),i,!0)},Po=zo(Eo);var To=function(e,a){return jo(e,Vi(a,3),Hr)};var Ao=function(e){return e&&e.length?e[0]:void 0};var Co=function(e,a){var t=-1,n=Object(Ge.a)(e)?Array(e.length):[];return Object(Ji.a)(e,(function(e,i,r){n[++t]=a(e,i,r)})),n};var qo=function(e,a){return(Object(c.a)(e)?d:Co)(e,Vi(a,3))};var Mo=function(e,a){return Object(xa.a)(qo(e,a),1)};var Ro=function(e,a){return Object(xa.a)(qo(e,a),1/0)};var $o=function(e,a,t){return t=void 0===t?1:S(t),Object(xa.a)(qo(e,a),t)},Io=t(155);var Do=function(e,a){return(null==e?0:e.length)?(a=void 0===a?1:S(a),Object(xa.a)(e,a)):[]};var No=function(e){return Ne(e,512)},Fo=Ut("floor");var Lo=function(e){return Sa((function(a){var t=a.length,n=t,i=ee.prototype.thru;for(e&&a.reverse();n--;){var r=a[n];if("function"!=typeof r)throw new TypeError("Expected a function");if(i&&!o&&"wrapper"==J(r))var o=new ee([],!0)}for(n=o?n:t;++na};var as=function(e){return function(a,t){return"string"==typeof a&&"string"==typeof t||(a=x(a),t=x(t)),e(a,t)}},ts=as(es),ns=as((function(e,a){return e>=a})),is=Object.prototype.hasOwnProperty;var rs=function(e,a){return null!=e&&is.call(e,a)};var os=function(e,a){return null!=e&&Di(e,a,rs)},ss=Math.max,ls=Math.min;var ds=function(e,a,t){return e>=ls(a,t)&&e-1:!!i&&ke(e,a,t)>-1},ys=Math.max;var bs=function(e,a,t){var n=null==e?0:e.length;if(!n)return-1;var i=null==t?0:S(t);return i<0&&(i=ys(n+i,0)),ke(e,a,i)};var hs=function(e){return(null==e?0:e.length)?Va(e,0,-1):[]},zs=Math.min;var ws=function(e,a,t){for(var n=t?Tr:je,i=e[0].length,r=e.length,o=r,s=Array(r),l=1/0,c=[];o--;){var u=e[o];o&&a&&(u=d(u,Object(Qn.a)(a))),l=zs(u.length,l),s[o]=!t&&(a||i>=120&&u.length>=120)?new gi(o&&u):void 0}u=e[0];var p=-1,f=s[0];e:for(;++p=-9007199254740991&&e<=9007199254740991};var ml=function(e){return void 0===e};var gl=function(e){return Object(i.a)(e)&&"[object WeakMap]"==Mn(e)};var yl=function(e){return Object(i.a)(e)&&"[object WeakSet]"==Object(n.a)(e)};var bl=function(e){return Vi("function"==typeof e?e:ii(e,1))},hl=Array.prototype.join;var zl=function(e,a){return null==e?"":hl.call(e,a)},wl=Nt((function(e,a,t){return e+(t?"-":"")+a.toLowerCase()})),vl=er((function(e,a,t){Le(e,t,a)}));var kl=function(e,a,t){for(var n=t+1;n--;)if(e[n]===a)return n;return n},jl=Math.max,_l=Math.min;var xl=function(e,a,t){var n=null==e?0:e.length;if(!n)return-1;var i=n;return void 0!==t&&(i=(i=S(t))<0?jl(n+i,0):_l(i,n-1)),a==a?kl(e,a,i):ze(e,we,i,!0)},Ol=Nt((function(e,a,t){return e+(t?" ":"")+a.toLowerCase()})),Sl=lt("toLowerCase");var El=function(e,a){return e=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}};var ed=function(e,a){var t=e.length;if(t)return a+=a<0?t:0,Object(Pe.a)(a,t)?e[a]:void 0};var ad=function(e,a){return e&&e.length?ed(e,S(a)):void 0};var td=function(e){return e=S(e),Ye((function(a){return ed(a,e)}))};var nd=function(e,a){return a=wa(a,e),null==(e=qs(e,a))||delete e[va(qr(a))]};var id=function(e){return $a(e)?void 0:e},rd=Sa((function(e,a){var t={};if(null==e)return t;var n=!1;a=d(a,(function(a){return a=wa(a,e),n||(n=a.length>1),a})),Ve(e,jn(e),t),n&&(t=ii(t,7,id));for(var i=a.length;i--;)nd(t,a[i]);return t}));var od=function(e,a,t,n){if(!Object(w.a)(e))return e;for(var i=-1,r=(a=wa(a,e)).length,o=r-1,s=e;null!=s&&++ia||r&&s&&d&&!l&&!c||n&&s&&d||!t&&d||!i)return 1;if(!n&&!r&&!c&&e=s?l:l*("desc"==t[n]?-1:1)}return e.index-a.index};var md=function(e,a,t){a=a.length?d(a,(function(e){return Object(c.a)(e)?function(a){return ka(a,1===e.length?e[0]:e)}:e})):[P.a];var n=-1;a=d(a,Object(Qn.a)(Vi));var i=Co(e,(function(e,t,i){return{criteria:d(a,(function(a){return a(e)})),index:++n,value:e}}));return ud(i,(function(e,a){return fd(e,a,t)}))};var gd=function(e,a,t,n){return null==e?[]:(Object(c.a)(a)||(a=null==a?[]:[a]),t=n?void 0:t,Object(c.a)(t)||(t=null==t?[]:[t]),md(e,a,t))};var yd=function(e){return Sa((function(a){return a=d(a,Object(Qn.a)(Vi)),Ye((function(t){var n=this;return e(a,(function(e){return N(e,n,t)}))}))}))},bd=yd(d),hd=Ye,zd=Math.min,wd=hd((function(e,a){var t=(a=1==a.length&&Object(c.a)(a[0])?d(a[0],Object(Qn.a)(Vi)):d(Object(xa.a)(a,1),Object(Qn.a)(Vi))).length;return Ye((function(n){for(var i=-1,r=zd(n.length,t);++i9007199254740991)return t;do{a%2&&(t+=e),(a=jd(a/2))&&(e+=e)}while(a);return t},xd=Li("length"),Od="[\\ud800-\\udfff]",Sd="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Ed="[^\\ud800-\\udfff]",Pd="(?:\\ud83c[\\udde6-\\uddff]){2}",Td="[\\ud800-\\udbff][\\udc00-\\udfff]",Ad="(?:"+Sd+"|\\ud83c[\\udffb-\\udfff])"+"?",Cd="[\\ufe0e\\ufe0f]?"+Ad+("(?:\\u200d(?:"+[Ed,Pd,Td].join("|")+")[\\ufe0e\\ufe0f]?"+Ad+")*"),qd="(?:"+[Ed+Sd+"?",Sd,Pd,Td,Od].join("|")+")",Md=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+qd+Cd,"g");var Rd=function(e){for(var a=Md.lastIndex=0;Md.test(e);)++a;return a};var $d=function(e){return Ya(e)?Rd(e):xd(e)},Id=Math.ceil;var Dd=function(e,a){var t=(a=void 0===a?" ":f(a)).length;if(t<2)return t?_d(a,e):a;var n=_d(a,Id(e/$d(a)));return Ya(a)?Ha(st(n),0,e).join(""):n.slice(0,e)},Nd=Math.ceil,Fd=Math.floor;var Ld=function(e,a,t){e=za(e);var n=(a=S(a))?$d(e):0;if(!a||n>=a)return e;var i=(a-n)/2;return Dd(Fd(i),t)+e+Dd(Nd(i),t)};var Bd=function(e,a,t){e=za(e);var n=(a=S(a))?$d(e):0;return a&&n-1;)s!==e&&nc.call(s,l,1),nc.call(e,l,1);return e};var rc=function(e,a){return e&&e.length&&a&&a.length?ic(e,a):e},oc=Ye(rc);var sc=function(e,a,t){return e&&e.length&&a&&a.length?ic(e,a,Vi(t,2)):e};var lc=function(e,a,t){return e&&e.length&&a&&a.length?ic(e,a,void 0,t):e},dc=Array.prototype.splice;var cc=function(e,a){for(var t=e?a.length:0,n=t-1;t--;){var i=a[t];if(t==n||i!==r){var r=i;Object(Pe.a)(i)?dc.call(e,i,1):nd(e,i)}}return e},uc=Sa((function(e,a){var t=null==e?0:e.length,n=_a(e,a);return cc(e,d(a,(function(e){return Object(Pe.a)(e,t)?+e:e})).sort(pd)),n})),pc=Math.floor,fc=Math.random;var mc=function(e,a){return e+pc(fc()*(a-e+1))},gc=parseFloat,yc=Math.min,bc=Math.random;var hc=function(e,a,t){if(t&&"boolean"!=typeof t&&Ze(e,a,t)&&(a=t=void 0),void 0===t&&("boolean"==typeof a?(t=a,a=void 0):"boolean"==typeof e&&(t=e,e=void 0)),void 0===e&&void 0===a?(e=0,a=1):(e=O(e),void 0===a?(a=e,e=0):a=O(a)),e>a){var n=e;e=a,a=n}if(t||e%1||a%1){var i=bc();return yc(e+i*(a-e+gc("1e-"+((i+"").length-1))),a)}return mc(e,a)},zc=Math.ceil,wc=Math.max;var vc=function(e,a,t,n){for(var i=-1,r=wc(zc((a-e)/(t||1)),0),o=Array(r);r--;)o[n?r:++i]=e,e+=t;return o};var kc=function(e){return function(a,t,n){return n&&"number"!=typeof n&&Ze(a,t,n)&&(t=n=void 0),a=O(a),void 0===t?(t=a,a=0):t=O(t),n=void 0===n?a1&&Ze(e,a[0],a[1])?a=[]:t>2&&Ze(a[0],a[1],a[2])&&(a=[a[0]]),md(e,Object(xa.a)(a,1),[])})),nu=Math.floor,iu=Math.min;var ru=function(e,a,t,n){var i=0,r=null==e?0:e.length;if(0===r)return 0;for(var s=(a=t(a))!=a,l=null===a,d=o(a),c=void 0===a;i>>1,s=e[r];null!==s&&!o(s)&&(t?s<=a:s>>0)?(e=za(e))&&("string"==typeof a||null!=a&&!pl(a))&&!(a=f(a))&&Ya(e)?Ha(st(e),0,t):e.split(a,t):[]},bu=Math.max;var hu=function(e,a){if("function"!=typeof e)throw new TypeError("Expected a function");return a=null==a?0:bu(S(a),0),Ye((function(t){var n=t[a],i=Ha(t,0,a);return n&&Object(hn.a)(i,n),N(e,this,i)}))},zu=Nt((function(e,a,t){return e+(t?" ":"")+dt(a)}));var wu=function(e,a,t){return e=za(e),t=null==t?0:Qt(S(t),0,e.length),a=f(a),e.slice(t,t+a.length)==a};var vu=function(){return{}};var ku=function(){return""};var ju=function(){return!0},_u=m((function(e,a){return e-a}),0);var xu=function(e){return e&&e.length?Dl(e,P.a):0};var Ou=function(e,a){return e&&e.length?Dl(e,Vi(a,2)):0};var Su=function(e){var a=null==e?0:e.length;return a?Va(e,1,a):[]};var Eu=function(e,a,t){return e&&e.length?(a=t||void 0===a?1:S(a),Va(e,0,a<0?0:a)):[]};var Pu=function(e,a,t){var n=null==e?0:e.length;return n?(a=t||void 0===a?1:S(a),Va(e,(a=n-a)<0?0:a,n)):[]};var Tu=function(e,a){return e&&e.length?Nr(e,Vi(a,3),!1,!0):[]};var Au=function(e,a){return e&&e.length?Nr(e,Vi(a,3)):[]};var Cu=function(e,a){return a(e),e},qu=Object.prototype,Mu=qu.hasOwnProperty;var Ru=function(e,a,t,n){return void 0===e||Object(Be.a)(e,qu[t])&&!Mu.call(n,t)?a:e},$u={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"};var Iu=function(e){return"\\"+$u[e]},Du=/<%=([\s\S]+?)%>/g,Nu={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:Du,variable:"",imports:{_:{escape:oo}}},Fu=/\b__p \+= '';/g,Lu=/\b(__p \+=) '' \+/g,Bu=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Wu=/[()=,{}\[\]\/\s]/,Uu=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Vu=/($^)/,Hu=/['\n\r\u2028\u2029\\]/g,Ku=Object.prototype.hasOwnProperty;var Yu=function(e,a,t){var n=Nu.imports._.templateSettings||Nu;t&&Ze(e,a,t)&&(a=void 0),e=za(e),a=da({},a,n,Ru);var i,r,o=da({},a.imports,n.imports,Ru),s=Object(ea.a)(o),l=ps(o,s),d=0,c=a.interpolate||Vu,u="__p += '",p=RegExp((a.escape||Vu).source+"|"+c.source+"|"+(c===Du?Uu:Vu).source+"|"+(a.evaluate||Vu).source+"|$","g"),f=Ku.call(a,"sourceURL")?"//# sourceURL="+(a.sourceURL+"").replace(/\s/g," ")+"\n":"";e.replace(p,(function(a,t,n,o,s,l){return n||(n=o),u+=e.slice(d,l).replace(Hu,Iu),t&&(i=!0,u+="' +\n__e("+t+") +\n'"),s&&(r=!0,u+="';\n"+s+";\n__p += '"),n&&(u+="' +\n((__t = ("+n+")) == null ? '' : __t) +\n'"),d=l+a.length,a})),u+="';\n";var m=Ku.call(a,"variable")&&a.variable;if(m){if(Wu.test(m))throw new Error("Invalid `variable` option passed into `_.template`")}else u="with (obj) {\n"+u+"\n}\n";u=(r?u.replace(Fu,""):u).replace(Lu,"$1").replace(Bu,"$1;"),u="function("+(m||"obj")+") {\n"+(m?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(i?", __e = _.escape":"")+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+u+"return __p\n}";var g=Da((function(){return Function(s,f+"return "+u).apply(void 0,l)}));if(g.source=u,Ia(g))throw g;return g};var Gu=function(e,a,t){var n=!0,i=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return Object(w.a)(t)&&(n="leading"in t?!!t.leading:n,i="trailing"in t?!!t.trailing:i),ur(e,a,{leading:n,maxWait:a,trailing:i})};var Qu=function(e,a){return a(e)},Zu=t(133),Ju=Math.min;var Xu=function(e,a){if((e=S(e))<1||e>9007199254740991)return[];var t=4294967295,n=Ju(e,4294967295);a=Object(Gr.a)(a),e-=4294967295;for(var i=Object(Zu.a)(n,a);++t-1;);return t};var dp=function(e,a){for(var t=-1,n=e.length;++t-1;);return t};var cp=function(e,a,t){if((e=za(e))&&(t||void 0===a))return z(e);if(!e||!(a=f(a)))return e;var n=st(e),i=st(a),r=dp(n,i),o=lp(n,i)+1;return Ha(n,r,o).join("")};var up=function(e,a,t){if((e=za(e))&&(t||void 0===a))return e.slice(0,b(e)+1);if(!e||!(a=f(a)))return e;var n=st(e),i=lp(n,st(a))+1;return Ha(n,0,i).join("")},pp=/^\s+/;var fp=function(e,a,t){if((e=za(e))&&(t||void 0===a))return e.replace(pp,"");if(!e||!(a=f(a)))return e;var n=st(e),i=dp(n,st(a));return Ha(n,i).join("")},mp=/\w*$/;var gp=function(e,a){var t=30,n="...";if(Object(w.a)(a)){var i="separator"in a?a.separator:i;t="length"in a?S(a.length):t,n="omission"in a?f(a.omission):n}var r=(e=za(e)).length;if(Ya(e)){var o=st(e);r=o.length}if(t>=r)return e;var s=t-$d(n);if(s<1)return n;var l=o?Ha(o,0,s).join(""):e.slice(0,s);if(void 0===i)return l+n;if(o&&(s+=l.length-s),pl(i)){if(e.slice(s).search(i)){var d,c=l;for(i.global||(i=RegExp(i.source,za(mp.exec(i))+"g")),i.lastIndex=0;d=i.exec(c);)var u=d.index;l=l.slice(0,void 0===u?s:u)}}else if(e.indexOf(f(i),s)!=s){var p=l.lastIndexOf(i);p>-1&&(l=l.slice(0,p))}return l+n};var yp=function(e){return Fe(e,1)},bp=pt({"&":"&","<":"<",">":">",""":'"',"'":"'"}),hp=/&(?:amp|lt|gt|quot|#39);/g,zp=RegExp(hp.source);var wp=function(e){return(e=za(e))&&zp.test(e)?e.replace(hp,bp):e},vp=On&&1/wi(new On([,-0]))[1]==1/0?function(e){return new On(e)}:Y;var kp=function(e,a,t){var n=-1,i=je,r=e.length,o=!0,s=[],l=s;if(t)o=!1,i=Tr;else if(r>=200){var d=a?null:vp(e);if(d)return wi(d);o=!1,i=bi,l=new gi}else l=a?[]:s;e:for(;++n1||this.__actions__.length)&&n instanceof K&&Object(Pe.a)(t)?((n=n.slice(t,+t+(a?1:0))).__actions__.push({func:Qu,args:[i],thisArg:void 0}),new ee(n,this.__chain__).thru((function(e){return a&&!e.length&&e.push(void 0),e}))):this.thru(i)}));var Wp=function(){return Ht(this)};var Up=function(){var e=this.__wrapped__;if(e instanceof K){var a=e;return this.__actions__.length&&(a=new K(this)),(a=a.reverse()).__actions__.push({func:Qu,args:[Ic],thisArg:void 0}),new ee(a,this.__chain__)}return this.thru(Ic)};var Vp=function(e,a,t){var n=e.length;if(n<2)return n?kp(e[0]):[];for(var i=-1,r=Array(n);++i1?e[a-1]:void 0;return t="function"==typeof t?(e.pop(),t):void 0,Mp(e,t)})),ef={chunk:Gt,compact:ci,concat:ui,difference:Cr,differenceBy:Mr,differenceWith:Rr,drop:Ir,dropRight:Dr,dropRightWhile:Fr,dropWhile:Lr,fill:yo,findIndex:vo,findLastIndex:Eo,first:Ao,flatten:Oa,flattenDeep:Io.default,flattenDepth:Do,fromPairs:Yo,head:Ao,indexOf:bs,initial:hs,intersection:ks,intersectionBy:js,intersectionWith:_s,join:zl,last:qr,lastIndexOf:xl,nth:ad,pull:oc,pullAll:rc,pullAllBy:sc,pullAllWith:lc,pullAt:uc,remove:Ac,reverse:Ic,slice:Jc,sortedIndex:su,sortedIndexBy:lu,sortedIndexOf:du,sortedLastIndex:cu,sortedLastIndexBy:uu,sortedLastIndexOf:pu,sortedUniq:mu,sortedUniqBy:gu,tail:Su,take:Eu,takeRight:Pu,takeRightWhile:Tu,takeWhile:Au,union:jp,unionBy:_p,unionWith:xp,uniq:Op,uniqBy:Sp,uniqWith:Ep,unzip:qp,unzipWith:Mp,without:Fp,xor:Hp,xorBy:Kp,xorWith:Yp,zip:Gp,zipObject:Zp,zipObjectDeep:Jp,zipWith:Xp},af={countBy:tr,each:Br.a,eachRight:Qr,every:fo,filter:ho,find:ko,findLast:Po,flatMap:Mo,flatMapDeep:Ro,flatMapDepth:$o,forEach:Br.a,forEachRight:Qr,groupBy:Xo,includes:gs,invokeMap:$s,keyBy:vl,map:qo,orderBy:gd,partition:Zd,reduce:Sc,reduceRight:Pc,reject:Tc,sample:Lc,sampleSize:Vc,shuffle:Qc,size:Zc,some:au,sortBy:tu},tf={now:lr},nf={after:E,ary:Fe,before:Na,bind:La,bindKey:Ua,curry:rr,curryRight:sr,debounce:ur,defer:Er,delay:Pr,flip:No,memoize:ga.a,negate:Gl,once:cd,overArgs:wd,partial:Yd,partialRight:Qd,rearg:xc,rest:Mc,spread:hu,throttle:Gu,unary:yp,wrap:Lp},rf={castArray:Lt,clone:ri,cloneDeep:oi,cloneDeepWith:si,cloneWith:li,conformsTo:Qi,eq:Be.a,gt:ts,gte:ns,isArguments:$i.a,isArray:c.a,isArrayBuffer:Ns,isArrayLike:Ge.a,isArrayLikeObject:hr,isBoolean:Fs,isBuffer:Yn.a,isDate:Ws,isElement:Us,isEmpty:Ks,isEqual:Ys,isEqualWith:Gs,isError:Ia,isFinite:Zs,isFunction:zr.a,isInteger:Js,isLength:Ii.a,isMap:Xn,isMatch:Xs,isMatchWith:el,isNaN:tl,isNative:sl,isNil:ll,isNull:dl,isNumber:al,isObject:w.a,isObjectLike:i.a,isPlainObject:$a,isRegExp:pl,isSafeInteger:fl,isSet:ti,isString:us,isSymbol:o,isTypedArray:Oi.a,isUndefined:ml,isWeakMap:gl,isWeakSet:yl,lt:Pl,lte:Tl,toArray:Jl,toFinite:O,toInteger:S,toLength:mo,toNumber:x,toPlainObject:vr,toSafeInteger:rp,toString:za},of={add:g,ceil:Vt,divide:$r,floor:Fo,max:$l,maxBy:Il,mean:Fl,meanBy:Ll,min:Vl,minBy:Hl,multiply:Yl,round:Dc,subtract:_u,sum:xu,sumBy:Ou},sf={clamp:Zt,inRange:cs,random:hc},lf={assign:ta,assignIn:la,assignInWith:da,assignWith:ca,at:Ea,create:nr,defaults:gr,defaultsDeep:Or,entries:ao,entriesIn:to,extend:la,extendWith:da,findKey:xo,findLastKey:To,forIn:Uo,forInRight:Vo,forOwn:Ho,forOwnRight:Ko,functions:Qo,functionsIn:Zo,get:ja,has:os,hasIn:Ni,invert:Es,invertBy:Cs,invoke:Rs,keys:ea.a,keysIn:sa,mapKeys:Al,mapValues:Cl,merge:Bl,mergeWith:xr,omit:rd,omitBy:dd,pick:Xd,pickBy:ld,result:Rc,set:Hc,setWith:Kc,toPairs:ao,toPairsIn:to,transform:sp,unset:Ap,update:$p,updateWith:Ip,values:fs,valuesIn:Np},df={at:Bp,chain:Ht,commit:di,lodash:re,next:Xl,plant:ec,reverse:Up,tap:Cu,thru:Qu,toIterator:ep,toJSON:tp,value:tp,valueOf:tp,wrapperChain:Wp},cf={camelCase:Ft,capitalize:ct,deburr:yt,endsWith:Zr,escape:oo,escapeRegExp:co,kebabCase:wl,lowerCase:Ol,lowerFirst:Sl,pad:Ld,padEnd:Bd,padStart:Wd,parseInt:Hd,repeat:Cc,replace:qc,snakeCase:Xc,split:yu,startCase:zu,startsWith:wu,template:Yu,templateSettings:Nu,toLower:np,toUpper:op,trim:cp,trimEnd:up,trimStart:fp,truncate:gp,unescape:wp,upperCase:Dp,upperFirst:dt,words:It},uf={attempt:Da,bindAll:Ba,cond:Hi,conforms:Gi,constant:ge,defaultTo:pr,flow:Bo,flowRight:Wo,identity:P.a,iteratee:bl,matches:ql,matchesProperty:Ml,method:Wl,methodOf:Ul,mixin:Kl,noop:Y,nthArg:td,over:bd,overEvery:vd,overSome:kd,property:Wi,propertyOf:ac,range:jc,rangeRight:_c,stubArray:fn,stubFalse:rl.a,stubObject:vu,stubString:ku,stubTrue:ju,times:Xu,toPath:ip,uniqueId:Tp};var pf=function(){var e=new K(this.__wrapped__);return e.__actions__=ae(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=ae(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=ae(this.__views__),e};var ff=function(){if(this.__filtered__){var e=new K(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},mf=Math.max,gf=Math.min;var yf=function(e,a,t){for(var n=-1,i=t.length;++n @@ -7,7 +7,7 @@ * Released under MIT license * Based on Underscore.js 1.8.3 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ra.after=nf.after,ra.ary=nf.ary,ra.assign=lf.assign,ra.assignIn=lf.assignIn,ra.assignInWith=lf.assignInWith,ra.assignWith=lf.assignWith,ra.at=lf.at,ra.before=nf.before,ra.bind=nf.bind,ra.bindAll=uf.bindAll,ra.bindKey=nf.bindKey,ra.castArray=rf.castArray,ra.chain=df.chain,ra.chunk=af.chunk,ra.compact=af.compact,ra.concat=af.concat,ra.cond=uf.cond,ra.conforms=uf.conforms,ra.constant=uf.constant,ra.countBy=ef.countBy,ra.create=lf.create,ra.curry=nf.curry,ra.curryRight=nf.curryRight,ra.debounce=nf.debounce,ra.defaults=lf.defaults,ra.defaultsDeep=lf.defaultsDeep,ra.defer=nf.defer,ra.delay=nf.delay,ra.difference=af.difference,ra.differenceBy=af.differenceBy,ra.differenceWith=af.differenceWith,ra.drop=af.drop,ra.dropRight=af.dropRight,ra.dropRightWhile=af.dropRightWhile,ra.dropWhile=af.dropWhile,ra.fill=af.fill,ra.filter=ef.filter,ra.flatMap=ef.flatMap,ra.flatMapDeep=ef.flatMapDeep,ra.flatMapDepth=ef.flatMapDepth,ra.flatten=af.flatten,ra.flattenDeep=af.flattenDeep,ra.flattenDepth=af.flattenDepth,ra.flip=nf.flip,ra.flow=uf.flow,ra.flowRight=uf.flowRight,ra.fromPairs=af.fromPairs,ra.functions=lf.functions,ra.functionsIn=lf.functionsIn,ra.groupBy=ef.groupBy,ra.initial=af.initial,ra.intersection=af.intersection,ra.intersectionBy=af.intersectionBy,ra.intersectionWith=af.intersectionWith,ra.invert=lf.invert,ra.invertBy=lf.invertBy,ra.invokeMap=ef.invokeMap,ra.iteratee=uf.iteratee,ra.keyBy=ef.keyBy,ra.keys=ae.a,ra.keysIn=lf.keysIn,ra.map=ef.map,ra.mapKeys=lf.mapKeys,ra.mapValues=lf.mapValues,ra.matches=uf.matches,ra.matchesProperty=uf.matchesProperty,ra.memoize=nf.memoize,ra.merge=lf.merge,ra.mergeWith=lf.mergeWith,ra.method=uf.method,ra.methodOf=uf.methodOf,ra.mixin=Of,ra.negate=Gl,ra.nthArg=uf.nthArg,ra.omit=lf.omit,ra.omitBy=lf.omitBy,ra.once=nf.once,ra.orderBy=ef.orderBy,ra.over=uf.over,ra.overArgs=nf.overArgs,ra.overEvery=uf.overEvery,ra.overSome=uf.overSome,ra.partial=nf.partial,ra.partialRight=nf.partialRight,ra.partition=ef.partition,ra.pick=lf.pick,ra.pickBy=lf.pickBy,ra.property=uf.property,ra.propertyOf=uf.propertyOf,ra.pull=af.pull,ra.pullAll=af.pullAll,ra.pullAllBy=af.pullAllBy,ra.pullAllWith=af.pullAllWith,ra.pullAt=af.pullAt,ra.range=uf.range,ra.rangeRight=uf.rangeRight,ra.rearg=nf.rearg,ra.reject=ef.reject,ra.remove=af.remove,ra.rest=nf.rest,ra.reverse=af.reverse,ra.sampleSize=ef.sampleSize,ra.set=lf.set,ra.setWith=lf.setWith,ra.shuffle=ef.shuffle,ra.slice=af.slice,ra.sortBy=ef.sortBy,ra.sortedUniq=af.sortedUniq,ra.sortedUniqBy=af.sortedUniqBy,ra.split=cf.split,ra.spread=nf.spread,ra.tail=af.tail,ra.take=af.take,ra.takeRight=af.takeRight,ra.takeRightWhile=af.takeRightWhile,ra.takeWhile=af.takeWhile,ra.tap=df.tap,ra.throttle=nf.throttle,ra.thru=Qu,ra.toArray=rf.toArray,ra.toPairs=lf.toPairs,ra.toPairsIn=lf.toPairsIn,ra.toPath=uf.toPath,ra.toPlainObject=rf.toPlainObject,ra.transform=lf.transform,ra.unary=nf.unary,ra.union=af.union,ra.unionBy=af.unionBy,ra.unionWith=af.unionWith,ra.uniq=af.uniq,ra.uniqBy=af.uniqBy,ra.uniqWith=af.uniqWith,ra.unset=lf.unset,ra.unzip=af.unzip,ra.unzipWith=af.unzipWith,ra.update=lf.update,ra.updateWith=lf.updateWith,ra.values=lf.values,ra.valuesIn=lf.valuesIn,ra.without=af.without,ra.words=cf.words,ra.wrap=nf.wrap,ra.xor=af.xor,ra.xorBy=af.xorBy,ra.xorWith=af.xorWith,ra.zip=af.zip,ra.zipObject=af.zipObject,ra.zipObjectDeep=af.zipObjectDeep,ra.zipWith=af.zipWith,ra.entries=lf.toPairs,ra.entriesIn=lf.toPairsIn,ra.extend=lf.assignIn,ra.extendWith=lf.assignInWith,Of(ra,ra),ra.add=of.add,ra.attempt=uf.attempt,ra.camelCase=cf.camelCase,ra.capitalize=cf.capitalize,ra.ceil=of.ceil,ra.clamp=sf.clamp,ra.clone=rf.clone,ra.cloneDeep=rf.cloneDeep,ra.cloneDeepWith=rf.cloneDeepWith,ra.cloneWith=rf.cloneWith,ra.conformsTo=rf.conformsTo,ra.deburr=cf.deburr,ra.defaultTo=uf.defaultTo,ra.divide=of.divide,ra.endsWith=cf.endsWith,ra.eq=rf.eq,ra.escape=cf.escape,ra.escapeRegExp=cf.escapeRegExp,ra.every=ef.every,ra.find=ef.find,ra.findIndex=af.findIndex,ra.findKey=lf.findKey,ra.findLast=ef.findLast,ra.findLastIndex=af.findLastIndex,ra.findLastKey=lf.findLastKey,ra.floor=of.floor,ra.forEach=ef.forEach,ra.forEachRight=ef.forEachRight,ra.forIn=lf.forIn,ra.forInRight=lf.forInRight,ra.forOwn=lf.forOwn,ra.forOwnRight=lf.forOwnRight,ra.get=lf.get,ra.gt=rf.gt,ra.gte=rf.gte,ra.has=lf.has,ra.hasIn=lf.hasIn,ra.head=af.head,ra.identity=P.a,ra.includes=ef.includes,ra.indexOf=af.indexOf,ra.inRange=sf.inRange,ra.invoke=lf.invoke,ra.isArguments=rf.isArguments,ra.isArray=c.a,ra.isArrayBuffer=rf.isArrayBuffer,ra.isArrayLike=rf.isArrayLike,ra.isArrayLikeObject=rf.isArrayLikeObject,ra.isBoolean=rf.isBoolean,ra.isBuffer=rf.isBuffer,ra.isDate=rf.isDate,ra.isElement=rf.isElement,ra.isEmpty=rf.isEmpty,ra.isEqual=rf.isEqual,ra.isEqualWith=rf.isEqualWith,ra.isError=rf.isError,ra.isFinite=rf.isFinite,ra.isFunction=rf.isFunction,ra.isInteger=rf.isInteger,ra.isLength=rf.isLength,ra.isMap=rf.isMap,ra.isMatch=rf.isMatch,ra.isMatchWith=rf.isMatchWith,ra.isNaN=rf.isNaN,ra.isNative=rf.isNative,ra.isNil=rf.isNil,ra.isNull=rf.isNull,ra.isNumber=rf.isNumber,ra.isObject=w.a,ra.isObjectLike=rf.isObjectLike,ra.isPlainObject=rf.isPlainObject,ra.isRegExp=rf.isRegExp,ra.isSafeInteger=rf.isSafeInteger,ra.isSet=rf.isSet,ra.isString=rf.isString,ra.isSymbol=rf.isSymbol,ra.isTypedArray=rf.isTypedArray,ra.isUndefined=rf.isUndefined,ra.isWeakMap=rf.isWeakMap,ra.isWeakSet=rf.isWeakSet,ra.join=af.join,ra.kebabCase=cf.kebabCase,ra.last=qr,ra.lastIndexOf=af.lastIndexOf,ra.lowerCase=cf.lowerCase,ra.lowerFirst=cf.lowerFirst,ra.lt=rf.lt,ra.lte=rf.lte,ra.max=of.max,ra.maxBy=of.maxBy,ra.mean=of.mean,ra.meanBy=of.meanBy,ra.min=of.min,ra.minBy=of.minBy,ra.stubArray=uf.stubArray,ra.stubFalse=uf.stubFalse,ra.stubObject=uf.stubObject,ra.stubString=uf.stubString,ra.stubTrue=uf.stubTrue,ra.multiply=of.multiply,ra.nth=af.nth,ra.noop=uf.noop,ra.now=tf.now,ra.pad=cf.pad,ra.padEnd=cf.padEnd,ra.padStart=cf.padStart,ra.parseInt=cf.parseInt,ra.random=sf.random,ra.reduce=ef.reduce,ra.reduceRight=ef.reduceRight,ra.repeat=cf.repeat,ra.replace=cf.replace,ra.result=lf.result,ra.round=of.round,ra.sample=ef.sample,ra.size=ef.size,ra.snakeCase=cf.snakeCase,ra.some=ef.some,ra.sortedIndex=af.sortedIndex,ra.sortedIndexBy=af.sortedIndexBy,ra.sortedIndexOf=af.sortedIndexOf,ra.sortedLastIndex=af.sortedLastIndex,ra.sortedLastIndexBy=af.sortedLastIndexBy,ra.sortedLastIndexOf=af.sortedLastIndexOf,ra.startCase=cf.startCase,ra.startsWith=cf.startsWith,ra.subtract=of.subtract,ra.sum=of.sum,ra.sumBy=of.sumBy,ra.template=cf.template,ra.times=uf.times,ra.toFinite=rf.toFinite,ra.toInteger=S,ra.toLength=rf.toLength,ra.toLower=cf.toLower,ra.toNumber=rf.toNumber,ra.toSafeInteger=rf.toSafeInteger,ra.toString=rf.toString,ra.toUpper=cf.toUpper,ra.trim=cf.trim,ra.trimEnd=cf.trimEnd,ra.trimStart=cf.trimStart,ra.truncate=cf.truncate,ra.unescape=cf.unescape,ra.uniqueId=uf.uniqueId,ra.upperCase=cf.upperCase,ra.upperFirst=cf.upperFirst,ra.each=ef.forEach,ra.eachRight=ef.forEachRight,ra.first=af.head,Of(ra,(bf={},Object(jo.a)(ra,(function(a,e){kf.call(ra.prototype,e)||(bf[e]=a)})),bf),{chain:!1}),ra.VERSION="4.17.21",(ra.templateSettings=cf.templateSettings).imports._=ra,Object(ha.a)(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(a){ra[a].placeholder=ra})),Object(ha.a)(["drop","take"],(function(a,e){K.prototype[a]=function(t){t=void 0===t?1:jf(S(t),0);var n=this.__filtered__&&!e?new K(this):this.clone();return n.__filtered__?n.__takeCount__=xf(t,n.__takeCount__):n.__views__.push({size:xf(t,4294967295),type:a+(n.__dir__<0?"Right":"")}),n},K.prototype[a+"Right"]=function(e){return this.reverse()[a](e).reverse()}})),Object(ha.a)(["filter","map","takeWhile"],(function(a,e){var t=e+1,n=1==t||3==t;K.prototype[a]=function(a){var e=this.clone();return e.__iteratees__.push({iteratee:Vi(a,3),type:t}),e.__filtered__=e.__filtered__||n,e}})),Object(ha.a)(["head","last"],(function(a,e){var t="take"+(e?"Right":"");K.prototype[a]=function(){return this[t](1).value()[0]}})),Object(ha.a)(["initial","tail"],(function(a,e){var t="drop"+(e?"":"Right");K.prototype[a]=function(){return this.__filtered__?new K(this):this[t](1)}})),K.prototype.compact=function(){return this.filter(P.a)},K.prototype.find=function(a){return this.filter(a).head()},K.prototype.findLast=function(a){return this.reverse().find(a)},K.prototype.invokeMap=Ya((function(a,e){return"function"==typeof a?new K(this):this.map((function(t){return Rs(t,a,e)}))})),K.prototype.reject=function(a){return this.filter(Gl(Vi(a)))},K.prototype.slice=function(a,e){a=S(a);var t=this;return t.__filtered__&&(a>0||e<0)?new K(t):(a<0?t=t.takeRight(-a):a&&(t=t.drop(a)),void 0!==e&&(t=(e=S(e))<0?t.dropRight(-e):t.take(e-a)),t)},K.prototype.takeRightWhile=function(a){return this.reverse().takeWhile(a).reverse()},K.prototype.toArray=function(){return this.take(4294967295)},Object(jo.a)(K.prototype,(function(a,e){var t=/^(?:filter|find|map|reject)|While$/.test(e),n=/^(?:head|last)$/.test(e),i=ra[n?"take"+("last"==e?"Right":""):e],r=n||/^find/.test(e);i&&(ra.prototype[e]=function(){var e=this.__wrapped__,o=n?[1]:arguments,s=e instanceof K,l=o[0],d=s||Object(c.a)(e),u=function(a){var e=i.apply(ra,Object(hn.a)([a],o));return n&&p?e[0]:e};d&&t&&"function"==typeof l&&1!=l.length&&(s=d=!1);var p=this.__chain__,f=!!this.__actions__.length,m=r&&!p,g=s&&!f;if(!r&&d){e=g?e:new K(this);var y=a.apply(e,o);return y.__actions__.push({func:Qu,args:[u],thisArg:void 0}),new aa(y,p)}return m&&g?a.apply(this,o):(y=this.thru(u),m?n?y.value()[0]:y.value():y)})})),Object(ha.a)(["pop","push","shift","sort","splice","unshift"],(function(a){var e=vf[a],t=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",n=/^(?:pop|shift)$/.test(a);ra.prototype[a]=function(){var a=arguments;if(n&&!this.__chain__){var i=this.value();return e.apply(Object(c.a)(i)?i:[],a)}return this[t]((function(t){return e.apply(Object(c.a)(t)?t:[],a)}))}})),Object(jo.a)(K.prototype,(function(a,e){var t=ra[e];if(t){var n=t.name+"";kf.call(Q,n)||(Q[n]=[]),Q[n].push({name:e,func:t})}})),Q[qa(void 0,2).name]=[{name:"wrapper",func:void 0}],K.prototype.clone=pf,K.prototype.reverse=ff,K.prototype.value=wf,ra.prototype.at=df.at,ra.prototype.chain=df.wrapperChain,ra.prototype.commit=df.commit,ra.prototype.next=df.next,ra.prototype.plant=df.plant,ra.prototype.reverse=df.reverse,ra.prototype.toJSON=ra.prototype.valueOf=ra.prototype.value=df.value,ra.prototype.first=ra.prototype.head,_f&&(ra.prototype[_f]=df.toIterator);var Sf=ra; + */re.after=nf.after,re.ary=nf.ary,re.assign=lf.assign,re.assignIn=lf.assignIn,re.assignInWith=lf.assignInWith,re.assignWith=lf.assignWith,re.at=lf.at,re.before=nf.before,re.bind=nf.bind,re.bindAll=uf.bindAll,re.bindKey=nf.bindKey,re.castArray=rf.castArray,re.chain=df.chain,re.chunk=ef.chunk,re.compact=ef.compact,re.concat=ef.concat,re.cond=uf.cond,re.conforms=uf.conforms,re.constant=uf.constant,re.countBy=af.countBy,re.create=lf.create,re.curry=nf.curry,re.curryRight=nf.curryRight,re.debounce=nf.debounce,re.defaults=lf.defaults,re.defaultsDeep=lf.defaultsDeep,re.defer=nf.defer,re.delay=nf.delay,re.difference=ef.difference,re.differenceBy=ef.differenceBy,re.differenceWith=ef.differenceWith,re.drop=ef.drop,re.dropRight=ef.dropRight,re.dropRightWhile=ef.dropRightWhile,re.dropWhile=ef.dropWhile,re.fill=ef.fill,re.filter=af.filter,re.flatMap=af.flatMap,re.flatMapDeep=af.flatMapDeep,re.flatMapDepth=af.flatMapDepth,re.flatten=ef.flatten,re.flattenDeep=ef.flattenDeep,re.flattenDepth=ef.flattenDepth,re.flip=nf.flip,re.flow=uf.flow,re.flowRight=uf.flowRight,re.fromPairs=ef.fromPairs,re.functions=lf.functions,re.functionsIn=lf.functionsIn,re.groupBy=af.groupBy,re.initial=ef.initial,re.intersection=ef.intersection,re.intersectionBy=ef.intersectionBy,re.intersectionWith=ef.intersectionWith,re.invert=lf.invert,re.invertBy=lf.invertBy,re.invokeMap=af.invokeMap,re.iteratee=uf.iteratee,re.keyBy=af.keyBy,re.keys=ea.a,re.keysIn=lf.keysIn,re.map=af.map,re.mapKeys=lf.mapKeys,re.mapValues=lf.mapValues,re.matches=uf.matches,re.matchesProperty=uf.matchesProperty,re.memoize=nf.memoize,re.merge=lf.merge,re.mergeWith=lf.mergeWith,re.method=uf.method,re.methodOf=uf.methodOf,re.mixin=Of,re.negate=Gl,re.nthArg=uf.nthArg,re.omit=lf.omit,re.omitBy=lf.omitBy,re.once=nf.once,re.orderBy=af.orderBy,re.over=uf.over,re.overArgs=nf.overArgs,re.overEvery=uf.overEvery,re.overSome=uf.overSome,re.partial=nf.partial,re.partialRight=nf.partialRight,re.partition=af.partition,re.pick=lf.pick,re.pickBy=lf.pickBy,re.property=uf.property,re.propertyOf=uf.propertyOf,re.pull=ef.pull,re.pullAll=ef.pullAll,re.pullAllBy=ef.pullAllBy,re.pullAllWith=ef.pullAllWith,re.pullAt=ef.pullAt,re.range=uf.range,re.rangeRight=uf.rangeRight,re.rearg=nf.rearg,re.reject=af.reject,re.remove=ef.remove,re.rest=nf.rest,re.reverse=ef.reverse,re.sampleSize=af.sampleSize,re.set=lf.set,re.setWith=lf.setWith,re.shuffle=af.shuffle,re.slice=ef.slice,re.sortBy=af.sortBy,re.sortedUniq=ef.sortedUniq,re.sortedUniqBy=ef.sortedUniqBy,re.split=cf.split,re.spread=nf.spread,re.tail=ef.tail,re.take=ef.take,re.takeRight=ef.takeRight,re.takeRightWhile=ef.takeRightWhile,re.takeWhile=ef.takeWhile,re.tap=df.tap,re.throttle=nf.throttle,re.thru=Qu,re.toArray=rf.toArray,re.toPairs=lf.toPairs,re.toPairsIn=lf.toPairsIn,re.toPath=uf.toPath,re.toPlainObject=rf.toPlainObject,re.transform=lf.transform,re.unary=nf.unary,re.union=ef.union,re.unionBy=ef.unionBy,re.unionWith=ef.unionWith,re.uniq=ef.uniq,re.uniqBy=ef.uniqBy,re.uniqWith=ef.uniqWith,re.unset=lf.unset,re.unzip=ef.unzip,re.unzipWith=ef.unzipWith,re.update=lf.update,re.updateWith=lf.updateWith,re.values=lf.values,re.valuesIn=lf.valuesIn,re.without=ef.without,re.words=cf.words,re.wrap=nf.wrap,re.xor=ef.xor,re.xorBy=ef.xorBy,re.xorWith=ef.xorWith,re.zip=ef.zip,re.zipObject=ef.zipObject,re.zipObjectDeep=ef.zipObjectDeep,re.zipWith=ef.zipWith,re.entries=lf.toPairs,re.entriesIn=lf.toPairsIn,re.extend=lf.assignIn,re.extendWith=lf.assignInWith,Of(re,re),re.add=of.add,re.attempt=uf.attempt,re.camelCase=cf.camelCase,re.capitalize=cf.capitalize,re.ceil=of.ceil,re.clamp=sf.clamp,re.clone=rf.clone,re.cloneDeep=rf.cloneDeep,re.cloneDeepWith=rf.cloneDeepWith,re.cloneWith=rf.cloneWith,re.conformsTo=rf.conformsTo,re.deburr=cf.deburr,re.defaultTo=uf.defaultTo,re.divide=of.divide,re.endsWith=cf.endsWith,re.eq=rf.eq,re.escape=cf.escape,re.escapeRegExp=cf.escapeRegExp,re.every=af.every,re.find=af.find,re.findIndex=ef.findIndex,re.findKey=lf.findKey,re.findLast=af.findLast,re.findLastIndex=ef.findLastIndex,re.findLastKey=lf.findLastKey,re.floor=of.floor,re.forEach=af.forEach,re.forEachRight=af.forEachRight,re.forIn=lf.forIn,re.forInRight=lf.forInRight,re.forOwn=lf.forOwn,re.forOwnRight=lf.forOwnRight,re.get=lf.get,re.gt=rf.gt,re.gte=rf.gte,re.has=lf.has,re.hasIn=lf.hasIn,re.head=ef.head,re.identity=P.a,re.includes=af.includes,re.indexOf=ef.indexOf,re.inRange=sf.inRange,re.invoke=lf.invoke,re.isArguments=rf.isArguments,re.isArray=c.a,re.isArrayBuffer=rf.isArrayBuffer,re.isArrayLike=rf.isArrayLike,re.isArrayLikeObject=rf.isArrayLikeObject,re.isBoolean=rf.isBoolean,re.isBuffer=rf.isBuffer,re.isDate=rf.isDate,re.isElement=rf.isElement,re.isEmpty=rf.isEmpty,re.isEqual=rf.isEqual,re.isEqualWith=rf.isEqualWith,re.isError=rf.isError,re.isFinite=rf.isFinite,re.isFunction=rf.isFunction,re.isInteger=rf.isInteger,re.isLength=rf.isLength,re.isMap=rf.isMap,re.isMatch=rf.isMatch,re.isMatchWith=rf.isMatchWith,re.isNaN=rf.isNaN,re.isNative=rf.isNative,re.isNil=rf.isNil,re.isNull=rf.isNull,re.isNumber=rf.isNumber,re.isObject=w.a,re.isObjectLike=rf.isObjectLike,re.isPlainObject=rf.isPlainObject,re.isRegExp=rf.isRegExp,re.isSafeInteger=rf.isSafeInteger,re.isSet=rf.isSet,re.isString=rf.isString,re.isSymbol=rf.isSymbol,re.isTypedArray=rf.isTypedArray,re.isUndefined=rf.isUndefined,re.isWeakMap=rf.isWeakMap,re.isWeakSet=rf.isWeakSet,re.join=ef.join,re.kebabCase=cf.kebabCase,re.last=qr,re.lastIndexOf=ef.lastIndexOf,re.lowerCase=cf.lowerCase,re.lowerFirst=cf.lowerFirst,re.lt=rf.lt,re.lte=rf.lte,re.max=of.max,re.maxBy=of.maxBy,re.mean=of.mean,re.meanBy=of.meanBy,re.min=of.min,re.minBy=of.minBy,re.stubArray=uf.stubArray,re.stubFalse=uf.stubFalse,re.stubObject=uf.stubObject,re.stubString=uf.stubString,re.stubTrue=uf.stubTrue,re.multiply=of.multiply,re.nth=ef.nth,re.noop=uf.noop,re.now=tf.now,re.pad=cf.pad,re.padEnd=cf.padEnd,re.padStart=cf.padStart,re.parseInt=cf.parseInt,re.random=sf.random,re.reduce=af.reduce,re.reduceRight=af.reduceRight,re.repeat=cf.repeat,re.replace=cf.replace,re.result=lf.result,re.round=of.round,re.sample=af.sample,re.size=af.size,re.snakeCase=cf.snakeCase,re.some=af.some,re.sortedIndex=ef.sortedIndex,re.sortedIndexBy=ef.sortedIndexBy,re.sortedIndexOf=ef.sortedIndexOf,re.sortedLastIndex=ef.sortedLastIndex,re.sortedLastIndexBy=ef.sortedLastIndexBy,re.sortedLastIndexOf=ef.sortedLastIndexOf,re.startCase=cf.startCase,re.startsWith=cf.startsWith,re.subtract=of.subtract,re.sum=of.sum,re.sumBy=of.sumBy,re.template=cf.template,re.times=uf.times,re.toFinite=rf.toFinite,re.toInteger=S,re.toLength=rf.toLength,re.toLower=cf.toLower,re.toNumber=rf.toNumber,re.toSafeInteger=rf.toSafeInteger,re.toString=rf.toString,re.toUpper=cf.toUpper,re.trim=cf.trim,re.trimEnd=cf.trimEnd,re.trimStart=cf.trimStart,re.truncate=cf.truncate,re.unescape=cf.unescape,re.uniqueId=uf.uniqueId,re.upperCase=cf.upperCase,re.upperFirst=cf.upperFirst,re.each=af.forEach,re.eachRight=af.forEachRight,re.first=ef.head,Of(re,(zf={},Object(_o.a)(re,(function(e,a){kf.call(re.prototype,a)||(zf[a]=e)})),zf),{chain:!1}),re.VERSION="4.17.21",(re.templateSettings=cf.templateSettings).imports._=re,Object(he.a)(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){re[e].placeholder=re})),Object(he.a)(["drop","take"],(function(e,a){K.prototype[e]=function(t){t=void 0===t?1:_f(S(t),0);var n=this.__filtered__&&!a?new K(this):this.clone();return n.__filtered__?n.__takeCount__=xf(t,n.__takeCount__):n.__views__.push({size:xf(t,4294967295),type:e+(n.__dir__<0?"Right":"")}),n},K.prototype[e+"Right"]=function(a){return this.reverse()[e](a).reverse()}})),Object(he.a)(["filter","map","takeWhile"],(function(e,a){var t=a+1,n=1==t||3==t;K.prototype[e]=function(e){var a=this.clone();return a.__iteratees__.push({iteratee:Vi(e,3),type:t}),a.__filtered__=a.__filtered__||n,a}})),Object(he.a)(["head","last"],(function(e,a){var t="take"+(a?"Right":"");K.prototype[e]=function(){return this[t](1).value()[0]}})),Object(he.a)(["initial","tail"],(function(e,a){var t="drop"+(a?"":"Right");K.prototype[e]=function(){return this.__filtered__?new K(this):this[t](1)}})),K.prototype.compact=function(){return this.filter(P.a)},K.prototype.find=function(e){return this.filter(e).head()},K.prototype.findLast=function(e){return this.reverse().find(e)},K.prototype.invokeMap=Ye((function(e,a){return"function"==typeof e?new K(this):this.map((function(t){return Ms(t,e,a)}))})),K.prototype.reject=function(e){return this.filter(Gl(Vi(e)))},K.prototype.slice=function(e,a){e=S(e);var t=this;return t.__filtered__&&(e>0||a<0)?new K(t):(e<0?t=t.takeRight(-e):e&&(t=t.drop(e)),void 0!==a&&(t=(a=S(a))<0?t.dropRight(-a):t.take(a-e)),t)},K.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},K.prototype.toArray=function(){return this.take(4294967295)},Object(_o.a)(K.prototype,(function(e,a){var t=/^(?:filter|find|map|reject)|While$/.test(a),n=/^(?:head|last)$/.test(a),i=re[n?"take"+("last"==a?"Right":""):a],r=n||/^find/.test(a);i&&(re.prototype[a]=function(){var a=this.__wrapped__,o=n?[1]:arguments,s=a instanceof K,l=o[0],d=s||Object(c.a)(a),u=function(e){var a=i.apply(re,Object(hn.a)([e],o));return n&&p?a[0]:a};d&&t&&"function"==typeof l&&1!=l.length&&(s=d=!1);var p=this.__chain__,f=!!this.__actions__.length,m=r&&!p,g=s&&!f;if(!r&&d){a=g?a:new K(this);var y=e.apply(a,o);return y.__actions__.push({func:Qu,args:[u],thisArg:void 0}),new ee(y,p)}return m&&g?e.apply(this,o):(y=this.thru(u),m?n?y.value()[0]:y.value():y)})})),Object(he.a)(["pop","push","shift","sort","splice","unshift"],(function(e){var a=vf[e],t=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",n=/^(?:pop|shift)$/.test(e);re.prototype[e]=function(){var e=arguments;if(n&&!this.__chain__){var i=this.value();return a.apply(Object(c.a)(i)?i:[],e)}return this[t]((function(t){return a.apply(Object(c.a)(t)?t:[],e)}))}})),Object(_o.a)(K.prototype,(function(e,a){var t=re[a];if(t){var n=t.name+"";kf.call(Q,n)||(Q[n]=[]),Q[n].push({name:a,func:t})}})),Q[qe(void 0,2).name]=[{name:"wrapper",func:void 0}],K.prototype.clone=pf,K.prototype.reverse=ff,K.prototype.value=wf,re.prototype.at=df.at,re.prototype.chain=df.wrapperChain,re.prototype.commit=df.commit,re.prototype.next=df.next,re.prototype.plant=df.plant,re.prototype.reverse=df.reverse,re.prototype.toJSON=re.prototype.valueOf=re.prototype.value=df.value,re.prototype.first=re.prototype.head,jf&&(re.prototype[jf]=df.toIterator);var Sf=re; /** * @license * Lodash (Custom Build) @@ -16,7 +16,7 @@ * Released under MIT license * Based on Underscore.js 1.8.3 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */},function(a,e,t){var n=t(14),i=t(28),r=t(52),o=t(49),s=t(60),l=function a(e,t,l){var d,c,u,p,f=e&a.F,m=e&a.G,g=e&a.P,y=e&a.B,z=m?n:e&a.S?n[t]||(n[t]={}):(n[t]||{}).prototype,h=m?i:i[t]||(i[t]={}),b=h.prototype||(h.prototype={});for(d in m&&(l=t),l)u=((c=!f&&z&&void 0!==z[d])?z:l)[d],p=y&&c?s(u,n):g&&"function"==typeof u?s(Function.call,u):u,z&&o(z,d,u,e&a.U),h[d]!=u&&r(h,d,p),g&&b[d]!=u&&(b[d]=u)};n.core=i,l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,a.exports=l},function(a,e,t){"use strict";(function(a){t.d(e,"b",(function(){return ae}));var n=t(1007),i=t.n(n),r=t(1039),o=t.n(r),s=t(0),l=t.n(s),d=t(433),c=t(413),u=t(210),p=t(1040),f=t(1044);function m(a){return(m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a})(a)}var g=function(a,e){for(var t=[a[0]],n=0,i=e.length;n1?n-1:0),r=1;r0?" Additional arguments: "+i.join(", "):"")));return v(o)}return w(e,a),e}(Error),C=/^[^\S\n]*?\/\* sc-component-id:\s*(\S+)\s+\*\//gm,q=function(a){var e=""+(a||""),t=[];return e.replace(C,(function(a,e,n){return t.push({componentId:e,matchIndex:n}),a})),t.map((function(a,n){var i=a.componentId,r=a.matchIndex,o=t[n+1];return{componentId:i,cssFromDOM:o?e.slice(r,o.matchIndex):e.slice(r)}}))},R=/^\s*\/\/.*$/gm,M=new i.a({global:!1,cascade:!0,keyframe:!1,prefix:!1,compress:!1,semicolon:!0}),$=new i.a({global:!1,cascade:!0,keyframe:!1,prefix:!0,compress:!1,semicolon:!1}),D=[],I=function(a){if(-2===a){var e=D;return D=[],e}},N=o()((function(a){D.push(a)})),F=void 0,L=void 0,B=void 0,W=function(a,e,t){return e>0&&-1!==t.slice(0,e).indexOf(L)&&t.slice(e-L.length,e)!==L?"."+F:a};$.use([function(a,e,t){2===a&&t.length&&t[0].lastIndexOf(L)>0&&(t[0]=t[0].replace(B,W))},N,I]),M.use([N,I]);var U=function(a){return M("",a)};function V(a,e,t){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"&",i=a.join("").replace(R,""),r=e&&t?t+" "+e+" { "+i+" }":i;return F=n,L=e,B=new RegExp("\\"+L+"\\b","g"),$(t||!e?"":e,r)}var H=function(){return t.nc},K=function(a,e,t){t&&((a[e]||(a[e]=Object.create(null)))[t]=!0)},Y=function(a,e){a[e]=Object.create(null)},G=function(a){return function(e,t){return void 0!==a[e]&&a[e][t]}},Q=function(a){var e="";for(var t in a)e+=Object.keys(a[t]).join(" ")+" ";return e.trim()},Z=function(a){if(a.sheet)return a.sheet;for(var e=a.ownerDocument.styleSheets.length,t=0;t"+a()+""}},ta=function(a,e){return function(){var t,n=((t={})[E]=Q(e),t["data-styled-version"]="4.4.1",t),i=H();return i&&(n.nonce=i),l.a.createElement("style",b({},n,{dangerouslySetInnerHTML:{__html:a()}}))}},na=function(a){return function(){return Object.keys(a)}},ia=function(a,e){return a.createTextNode(X(e))},ra=function a(e,t){var n=void 0===e?Object.create(null):e,i=void 0===t?Object.create(null):t,r=function(a){var e=i[a];return void 0!==e?e:i[a]=[""]},o=function(){var a="";for(var e in i){var t=i[e][0];t&&(a+=X(e)+t)}return a};return{clone:function(){var e=function(a){var e=Object.create(null);for(var t in a)e[t]=b({},a[t]);return e}(n),t=Object.create(null);for(var r in i)t[r]=[i[r][0]];return a(e,t)},css:o,getIds:na(i),hasNameForId:G(n),insertMarker:r,insertRules:function(a,e,t){r(a)[0]+=e.join(" "),K(n,a,t)},removeRules:function(a){var e=i[a];void 0!==e&&(e[0]="",Y(n,a))},sealed:!1,styleTag:null,toElement:ta(o,n),toHTML:ea(o,n)}},oa=function(a,e,t,n,i){if(P&&!t){var r=function(a,e,t){var n=document;a?n=a.ownerDocument:e&&(n=e.ownerDocument);var i=n.createElement("style");i.setAttribute(E,""),i.setAttribute("data-styled-version","4.4.1");var r=H();if(r&&i.setAttribute("nonce",r),i.appendChild(n.createTextNode("")),a&&!e)a.appendChild(i);else{if(!e||!a||!e.parentNode)throw new A(6);e.parentNode.insertBefore(i,t?e:e.nextSibling)}return i}(a,e,n);return T?function(a,e){var t=Object.create(null),n=Object.create(null),i=void 0!==e,r=!1,o=function(e){var i=n[e];return void 0!==i?i:(n[e]=ia(a.ownerDocument,e),a.appendChild(n[e]),t[e]=Object.create(null),n[e])},s=function(){var a="";for(var e in n)a+=n[e].data;return a};return{clone:function(){throw new A(5)},css:s,getIds:na(n),hasNameForId:G(t),insertMarker:o,insertRules:function(a,n,s){for(var l=o(a),d=[],c=n.length,u=0;u0&&(r=!0,e().insertRules(a+"-import",d))},removeRules:function(o){var s=n[o];if(void 0!==s){var l=ia(a.ownerDocument,o);a.replaceChild(l,s),n[o]=l,Y(t,o),i&&r&&e().removeRules(o+"-import")}},sealed:!1,styleTag:a,toElement:ta(s,t),toHTML:ea(s,t)}}(r,i):function(a,e){var t=Object.create(null),n=Object.create(null),i=[],r=void 0!==e,o=!1,s=function(a){var e=n[a];return void 0!==e?e:(n[a]=i.length,i.push(0),Y(t,a),n[a])},l=function(){var e=Z(a).cssRules,t="";for(var r in n){t+=X(r);for(var o=n[r],s=aa(i,o),l=s-i[o];l0&&(o=!0,e().insertRules(n+"-import",m)),i[c]+=f,K(t,n,d)},removeRules:function(s){var l=n[s];if(void 0!==l&&!1!==a.isConnected){var d=i[l];!function(a,e,t){for(var n=e-t,i=e;i>n;i-=1)a.deleteRule(i)}(Z(a),aa(i,l)-1,d),i[l]=0,Y(t,s),r&&o&&e().removeRules(s+"-import")}},sealed:!1,styleTag:a,toElement:ta(l,t),toHTML:ea(l,t)}}(r,i)}return ra()},sa=/\s+/,la=void 0;la=P?T?40:1e3:-1;var da=0,ca=void 0,ua=function(){function a(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:P?document.head:null,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];z(this,a),this.getImportRuleTag=function(){var a=e.importRuleTag;if(void 0!==a)return a;var t=e.tags[0];return e.importRuleTag=oa(e.target,t?t.styleTag:null,e.forceServer,!0)},da+=1,this.id=da,this.forceServer=n,this.target=n?null:t,this.tagMap={},this.deferred={},this.rehydratedNames={},this.ignoreRehydratedNames={},this.tags=[],this.capacity=1,this.clones=[]}return a.prototype.rehydrate=function(){if(!P||this.forceServer)return this;var a=[],e=[],t=!1,n=document.querySelectorAll("style["+E+'][data-styled-version="4.4.1"]'),i=n.length;if(!i)return this;for(var r=0;r0&&void 0!==arguments[0]&&arguments[0];ca=new a(void 0,e).rehydrate()},a.prototype.clone=function(){var e=new a(this.target,this.forceServer);return this.clones.push(e),e.tags=this.tags.map((function(a){for(var t=a.getIds(),n=a.clone(),i=0;i1?e-1:0),n=1;n=4;)e=1540483477*(65535&(e=255&a.charCodeAt(i)|(255&a.charCodeAt(++i))<<8|(255&a.charCodeAt(++i))<<16|(255&a.charCodeAt(++i))<<24))+((1540483477*(e>>>16)&65535)<<16),n=1540483477*(65535&n)+((1540483477*(n>>>16)&65535)<<16)^(e=1540483477*(65535&(e^=e>>>24))+((1540483477*(e>>>16)&65535)<<16)),t-=4,++i;switch(t){case 3:n^=(255&a.charCodeAt(i+2))<<16;case 2:n^=(255&a.charCodeAt(i+1))<<8;case 1:n=1540483477*(65535&(n^=255&a.charCodeAt(i)))+((1540483477*(n>>>16)&65535)<<16)}return((n=1540483477*(65535&(n^=n>>>13))+((1540483477*(n>>>16)&65535)<<16))^n>>>15)>>>0}var va=function(a){return String.fromCharCode(a+(a>25?39:97))};function ka(a){var e="",t=void 0;for(t=a;t>52;t=Math.floor(t/52))e=va(t%52)+e;return va(t%52)+e}function _a(a,e){for(var t=0;t2&&void 0!==arguments[2]?arguments[2]:j,n=!!t&&a.theme===t.theme,i=a.theme&&!n?a.theme:e||t.theme;return i},Ea=/[[\].#*$><+~=|^:(),"'`-]+/g,Pa=/(^-|-$)/g;function Ta(a){return a.replace(Ea,"-").replace(Pa,"")}function Aa(a){return"string"==typeof a&&!0}var Ca={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDerivedStateFromProps:!0,propTypes:!0,type:!0},qa={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},Ra=((ja={})[c.ForwardRef]={$$typeof:!0,render:!0},ja),Ma=Object.defineProperty,$a=Object.getOwnPropertyNames,Da=Object.getOwnPropertySymbols,Ia=void 0===Da?function(){return[]}:Da,Na=Object.getOwnPropertyDescriptor,Fa=Object.getPrototypeOf,La=Object.prototype,Ba=Array.prototype;function Wa(a,e,t){if("string"!=typeof e){var n=Fa(e);n&&n!==La&&Wa(a,n,t);for(var i=Ba.concat($a(e),Ia(e)),r=Ra[a.$$typeof]||Ca,o=Ra[e.$$typeof]||Ca,s=i.length,l=void 0,d=void 0;s--;)if(d=i[s],!(qa[d]||t&&t[d]||o&&o[d]||r&&r[d])&&(l=Na(e,d)))try{Ma(a,d,l)}catch(a){}return a}return a}var Ua=Object(s.createContext)(),Va=Ua.Consumer,Ha=(function(a){function e(t){z(this,e);var n=v(this,a.call(this,t));return n.getContext=Object(u.a)(n.getContext.bind(n)),n.renderInner=n.renderInner.bind(n),n}w(e,a),e.prototype.render=function(){return this.props.children?l.a.createElement(Ua.Consumer,null,this.renderInner):null},e.prototype.renderInner=function(a){var e=this.getContext(this.props.theme,a);return l.a.createElement(Ua.Provider,{value:e},this.props.children)},e.prototype.getTheme=function(a,e){if(x(a))return a(e);if(null===a||Array.isArray(a)||"object"!==(void 0===a?"undefined":y(a)))throw new A(8);return b({},e,a)},e.prototype.getContext=function(a,e){return this.getTheme(a,e)}}(s.Component),function(){function a(){z(this,a),this.masterSheet=ua.master,this.instance=this.masterSheet.clone(),this.sealed=!1}a.prototype.seal=function(){if(!this.sealed){var a=this.masterSheet.clones.indexOf(this.instance);this.masterSheet.clones.splice(a,1),this.sealed=!0}},a.prototype.collectStyles=function(a){if(this.sealed)throw new A(2);return l.a.createElement(Ya,{sheet:this.instance},a)},a.prototype.getStyleTags=function(){return this.seal(),this.instance.toHTML()},a.prototype.getStyleElement=function(){return this.seal(),this.instance.toReactElements()},a.prototype.interleaveWithNodeStream=function(a){throw new A(3)}}(),Object(s.createContext)()),Ka=Ha.Consumer,Ya=function(a){function e(t){z(this,e);var n=v(this,a.call(this,t));return n.getContext=Object(u.a)(n.getContext),n}return w(e,a),e.prototype.getContext=function(a,e){if(a)return a;if(e)return new ua(e);throw new A(4)},e.prototype.render=function(){var a=this.props,e=a.children,t=a.sheet,n=a.target;return l.a.createElement(Ha.Provider,{value:this.getContext(t,n)},e)},e}(s.Component),Ga={};var Qa=function(a){function e(){z(this,e);var t=v(this,a.call(this));return t.attrs={},t.renderOuter=t.renderOuter.bind(t),t.renderInner=t.renderInner.bind(t),t}return w(e,a),e.prototype.render=function(){return l.a.createElement(Ka,null,this.renderOuter)},e.prototype.renderOuter=function(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ua.master;return this.styleSheet=a,this.props.forwardedComponent.componentStyle.isStatic?this.renderInner():l.a.createElement(Va,null,this.renderInner)},e.prototype.renderInner=function(a){var e=this.props.forwardedComponent,t=e.componentStyle,n=e.defaultProps,i=(e.displayName,e.foldedComponentIds),r=e.styledComponentId,o=e.target,l=void 0;l=t.isStatic?this.generateAndInjectStyles(j,this.props):this.generateAndInjectStyles(Sa(this.props,a,n)||j,this.props);var d=this.props.as||this.attrs.as||o,c=Aa(d),u={},f=b({},this.props,this.attrs),m=void 0;for(m in f)"forwardedComponent"!==m&&"as"!==m&&("forwardedRef"===m?u.ref=f[m]:"forwardedAs"===m?u.as=f[m]:c&&!Object(p.a)(m)||(u[m]=f[m]));return this.props.style&&this.attrs.style&&(u.style=b({},this.attrs.style,this.props.style)),u.className=Array.prototype.concat(i,r,l!==r?l:null,this.props.className,this.attrs.className).filter(Boolean).join(" "),Object(s.createElement)(d,u)},e.prototype.buildExecutionContext=function(a,e,t){var n=this,i=b({},e,{theme:a});return t.length?(this.attrs={},t.forEach((function(a){var e,t=a,r=!1,o=void 0,s=void 0;for(s in x(t)&&(t=t(i),r=!0),t)o=t[s],r||!x(o)||(e=o)&&e.prototype&&e.prototype.isReactComponent||S(o)||(o=o(i)),n.attrs[s]=o,i[s]=o})),i):i},e.prototype.generateAndInjectStyles=function(a,e){var t=e.forwardedComponent,n=t.attrs,i=t.componentStyle;t.warnTooManyClasses;return i.isStatic&&!n.length?i.generateAndInjectStyles(j,this.styleSheet):i.generateAndInjectStyles(this.buildExecutionContext(a,e,n),this.styleSheet)},e}(s.Component);function Za(a,e,t){var n=S(a),i=!Aa(a),r=e.displayName,o=void 0===r?function(a){return Aa(a)?"styled."+a:"Styled("+O(a)+")"}(a):r,s=e.componentId,d=void 0===s?function(a,e,t){var n="string"!=typeof e?"sc":Ta(e),i=(Ga[n]||0)+1;Ga[n]=i;var r=n+"-"+a.generateName(n+i);return t?t+"-"+r:r}(Oa,e.displayName,e.parentComponentId):s,c=e.ParentComponent,u=void 0===c?Qa:c,p=e.attrs,m=void 0===p?_:p,g=e.displayName&&e.componentId?Ta(e.displayName)+"-"+e.componentId:e.componentId||d,y=n&&a.attrs?Array.prototype.concat(a.attrs,m).filter(Boolean):m,z=new Oa(n?a.componentStyle.rules.concat(t):t,y,g),h=void 0,w=function(a,e){return l.a.createElement(u,b({},a,{forwardedComponent:h,forwardedRef:e}))};return w.displayName=o,(h=l.a.forwardRef(w)).displayName=o,h.attrs=y,h.componentStyle=z,h.foldedComponentIds=n?Array.prototype.concat(a.foldedComponentIds,a.styledComponentId):_,h.styledComponentId=g,h.target=n?a.target:a,h.withComponent=function(a){var n=e.componentId,i=function(a,e){var t={};for(var n in a)e.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(a,n)&&(t[n]=a[n]);return t}(e,["componentId"]),r=n&&n+"-"+(Aa(a)?a:Ta(O(a)));return Za(a,b({},i,{attrs:y,componentId:r,ParentComponent:u}),t)},Object.defineProperty(h,"defaultProps",{get:function(){return this._foldedDefaultProps},set:function(e){this._foldedDefaultProps=n?Object(f.a)(a.defaultProps,e):e}}),h.toString=function(){return"."+h.styledComponentId},i&&Wa(h,a,{attrs:!0,componentStyle:!0,displayName:!0,foldedComponentIds:!0,styledComponentId:!0,target:!0,withComponent:!0}),h}var Ja=function(a){return function a(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:j;if(!Object(c.isValidElementType)(t))throw new A(1,String(t));var i=function(){return e(t,n,ba.apply(void 0,arguments))};return i.withConfig=function(i){return a(e,t,b({},n,i))},i.attrs=function(i){return a(e,t,b({},n,{attrs:Array.prototype.concat(n.attrs,i).filter(Boolean)}))},i}(Za,a)};["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"].forEach((function(a){Ja[a]=Ja(a)}));!function(){function a(e,t){z(this,a),this.rules=e,this.componentId=t,this.isStatic=_a(e,_),ua.master.hasId(t)||ua.master.deferredInject(t,[])}a.prototype.createStyles=function(a,e){var t=V(ha(this.rules,a,e),"");e.inject(this.componentId,t)},a.prototype.removeStyles=function(a){var e=this.componentId;a.hasId(e)&&a.remove(e)},a.prototype.renderStyles=function(a,e){this.removeStyles(e),this.createStyles(a,e)}}();P&&(window.scCGSHMRCache={});var Xa=function(a){return a.replace(/\s|\\n/g,"")};function ae(a){for(var e=arguments.length,t=Array(e>1?e-1:0),n=1;n0)},l.prototype.setIdentifier=function(a){this._identifier=a},l.prototype.getIdentifier=function(){return this._identifier},l.prototype.setMarker=function(a){this._marker=a},l.prototype.hasMarker=function(){return this._hasMarks&&this._marker!==this.emptyMarker},l.prototype.getMarker=function(){return this._marker},l.prototype.setHasMarks=function(a){this._hasMarks=a},l.prototype.hasMarks=function(){return this._hasMarks},l.prototype.serialize=function(){return{_parseClass:"AssessmentResult",identifier:this._identifier,score:this.score,text:this.text,marks:this.marks.map((function(a){return a.serialize()}))}},l.parse=function(a){var e=new l({text:a.text,score:a.score,marks:a.marks.map((function(a){return o.default.parse(a)}))});return e.setIdentifier(a.identifier),e},e.default=l},function(a,e,t){"use strict";var n=t(199);function i(a){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a})(a)}var r="object"==("undefined"==typeof self?"undefined":i(self))&&self&&self.Object===Object&&self,o=n.a||r||Function("return this")();e.a=o},function(a,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=t(642);Object.keys(n).forEach((function(a){"default"!==a&&"__esModule"!==a&&Object.defineProperty(e,a,{enumerable:!0,get:function(){return n[a]}})}))},function(a,e,t){"use strict";var n=t(41),i=t(25),r=t(43),o=t(5),s=i.a?i.a.isConcatSpreadable:void 0;var l=function(a){return Object(o.a)(a)||Object(r.a)(a)||!!(s&&a&&a[s])};e.a=function a(e,t,i,r,o){var s=-1,d=e.length;for(i||(i=l),o||(o=[]);++s0&&i(c)?t>1?a(c,t-1,i,r,o):Object(n.a)(o,c):r||(o[o.length]=c)}return o}},function(a,e,t){"use strict";e.a=function(a){return a}},function(a,e){var t=a.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)},function(a,e){a.exports=function(a){try{return!!a()}catch(a){return!0}}},function(a,e,t){var n=t(17);a.exports=function(a){if(!n(a))throw TypeError(a+" is not an object!");return a}},function(a,e){function t(a){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a})(a)}a.exports=function(a){return"object"===t(a)?null!==a:"function"==typeof a}},function(a,e,t){"use strict";var n=t(29),i=t(70);e.a=function(a){return null!=a&&Object(i.a)(a.length)&&!Object(n.a)(a)}},function(a,e,t){"use strict";var n=t(25),i=Object.prototype,r=i.hasOwnProperty,o=i.toString,s=n.a?n.a.toStringTag:void 0;var l=function(a){var e=r.call(a,s),t=a[s];try{a[s]=void 0;var n=!0}catch(a){}var i=o.call(a);return n&&(e?a[s]=t:delete a[s]),i},d=Object.prototype.toString;var c=function(a){return d.call(a)},u=n.a?n.a.toStringTag:void 0;e.a=function(a){return null==a?void 0===a?"[object Undefined]":"[object Null]":u&&u in Object(a)?l(a):c(a)}},function(a,e,t){(function(a){function n(a){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a})(a)}var i=Object.getOwnPropertyDescriptors||function(a){for(var e=Object.keys(a),t={},n=0;n=i)return a;switch(a){case"%s":return String(n[t++]);case"%d":return Number(n[t++]);case"%j":try{return JSON.stringify(n[t++])}catch(a){return"[Circular]"}default:return a}})),s=n[t];t=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),g(t)?n.showHidden=t:t&&e._extend(n,t),b(n.showHidden)&&(n.showHidden=!1),b(n.depth)&&(n.depth=2),b(n.colors)&&(n.colors=!1),b(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=d),u(n,a,n.depth)}function d(a,e){var t=l.styles[e];return t?"["+l.colors[t][0]+"m"+a+"["+l.colors[t][1]+"m":a}function c(a,e){return a}function u(a,t,n){if(a.customInspect&&t&&j(t.inspect)&&t.inspect!==e.inspect&&(!t.constructor||t.constructor.prototype!==t)){var i=t.inspect(n,a);return h(i)||(i=u(a,i,n)),i}var r=function(a,e){if(b(e))return a.stylize("undefined","undefined");if(h(e)){var t="'"+JSON.stringify(e).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return a.stylize(t,"string")}if(z(e))return a.stylize(""+e,"number");if(g(e))return a.stylize(""+e,"boolean");if(y(e))return a.stylize("null","null")}(a,t);if(r)return r;var o=Object.keys(t),s=function(a){var e={};return a.forEach((function(a,t){e[a]=!0})),e}(o);if(a.showHidden&&(o=Object.getOwnPropertyNames(t)),_(t)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return p(t);if(0===o.length){if(j(t)){var l=t.name?": "+t.name:"";return a.stylize("[Function"+l+"]","special")}if(w(t))return a.stylize(RegExp.prototype.toString.call(t),"regexp");if(k(t))return a.stylize(Date.prototype.toString.call(t),"date");if(_(t))return p(t)}var d,c="",v=!1,x=["{","}"];(m(t)&&(v=!0,x=["[","]"]),j(t))&&(c=" [Function"+(t.name?": "+t.name:"")+"]");return w(t)&&(c=" "+RegExp.prototype.toString.call(t)),k(t)&&(c=" "+Date.prototype.toUTCString.call(t)),_(t)&&(c=" "+p(t)),0!==o.length||v&&0!=t.length?n<0?w(t)?a.stylize(RegExp.prototype.toString.call(t),"regexp"):a.stylize("[Object]","special"):(a.seen.push(t),d=v?function(a,e,t,n,i){for(var r=[],o=0,s=e.length;o=0&&0,a+e.replace(/\u001b\[\d\d?m/g,"").length+1}),0)>60)return t[0]+(""===e?"":e+"\n ")+" "+a.join(",\n ")+" "+t[1];return t[0]+e+" "+a.join(", ")+" "+t[1]}(d,c,x)):x[0]+c+x[1]}function p(a){return"["+Error.prototype.toString.call(a)+"]"}function f(a,e,t,n,i,r){var o,s,l;if((l=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]}).get?s=l.set?a.stylize("[Getter/Setter]","special"):a.stylize("[Getter]","special"):l.set&&(s=a.stylize("[Setter]","special")),P(n,i)||(o="["+i+"]"),s||(a.seen.indexOf(l.value)<0?(s=y(t)?u(a,l.value,null):u(a,l.value,t-1)).indexOf("\n")>-1&&(s=r?s.split("\n").map((function(a){return" "+a})).join("\n").substr(2):"\n"+s.split("\n").map((function(a){return" "+a})).join("\n")):s=a.stylize("[Circular]","special")),b(o)){if(r&&i.match(/^\d+$/))return s;(o=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.substr(1,o.length-2),o=a.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=a.stylize(o,"string"))}return o+": "+s}function m(a){return Array.isArray(a)}function g(a){return"boolean"==typeof a}function y(a){return null===a}function z(a){return"number"==typeof a}function h(a){return"string"==typeof a}function b(a){return void 0===a}function w(a){return v(a)&&"[object RegExp]"===x(a)}function v(a){return"object"===n(a)&&null!==a}function k(a){return v(a)&&"[object Date]"===x(a)}function _(a){return v(a)&&("[object Error]"===x(a)||a instanceof Error)}function j(a){return"function"==typeof a}function x(a){return Object.prototype.toString.call(a)}function O(a){return a<10?"0"+a.toString(10):a.toString(10)}e.debuglog=function(t){if(b(o)&&(o=a.env.NODE_DEBUG||""),t=t.toUpperCase(),!s[t])if(new RegExp("\\b"+t+"\\b","i").test(o)){var n=a.pid;s[t]=function(){var a=e.format.apply(e,arguments);console.error("%s %d: %s",t,n,a)}}else s[t]=function(){};return s[t]},e.inspect=l,l.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},l.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},e.isArray=m,e.isBoolean=g,e.isNull=y,e.isNullOrUndefined=function(a){return null==a},e.isNumber=z,e.isString=h,e.isSymbol=function(a){return"symbol"===n(a)},e.isUndefined=b,e.isRegExp=w,e.isObject=v,e.isDate=k,e.isError=_,e.isFunction=j,e.isPrimitive=function(a){return null===a||"boolean"==typeof a||"number"==typeof a||"string"==typeof a||"symbol"===n(a)||void 0===a},e.isBuffer=t(690);var S=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function E(){var a=new Date,e=[O(a.getHours()),O(a.getMinutes()),O(a.getSeconds())].join(":");return[a.getDate(),S[a.getMonth()],e].join(" ")}function P(a,e){return Object.prototype.hasOwnProperty.call(a,e)}e.log=function(){console.log("%s - %s",E(),e.format.apply(e,arguments))},e.inherits=t(144),e._extend=function(a,e){if(!e||!v(e))return a;for(var t=Object.keys(e),n=t.length;n--;)a[t[n]]=e[t[n]];return a};var T="undefined"!=typeof Symbol?Symbol("util.promisify.custom"):void 0;function A(a,e){if(!a){var t=new Error("Promise was rejected with a falsy value");t.reason=a,a=t}return e(a)}e.promisify=function(a){if("function"!=typeof a)throw new TypeError('The "original" argument must be of type Function');if(T&&a[T]){var e;if("function"!=typeof(e=a[T]))throw new TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(e,T,{value:e,enumerable:!1,writable:!1,configurable:!0}),e}function e(){for(var e,t,n=new Promise((function(a,n){e=a,t=n})),i=[],r=0;r0?i(n(a),9007199254740991):0}},function(a,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(a){return a.split("_")[0]}},function(a,e){var t=a.exports={version:"2.6.12"};"number"==typeof __e&&(__e=t)},function(a,e,t){"use strict";var n=t(19),i=t(6);e.a=function(a){if(!Object(i.a)(a))return!1;var e=Object(n.a)(a);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},function(a,e,t){"use strict";var n=t(13);e.a=function(a){return"function"==typeof a?a:n.a}},function(a,e,t){a.exports=!t(15)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(a,e,t){var n=t(16),i=t(292),r=t(79),o=Object.defineProperty;e.f=t(31)?Object.defineProperty:function(a,e,t){if(n(a),e=r(e,!0),n(t),i)try{return o(a,e,t)}catch(a){}if("get"in t||"set"in t)throw TypeError("Accessors not supported!");return"value"in t&&(a[e]=t.value),a}},function(a,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(a){if(""===(a=(0,i.default)((0,n.stripFullTags)(a))))return[];var e=a.split(/\s/g);return e=(0,o.map)(e,(function(a){return(0,r.default)(a)})),(0,o.filter)(e,(function(a){return""!==a.trim()}))};var n=t(44),i=s(t(39)),r=s(t(246)),o=t(2);function s(a){return a&&a.__esModule?a:{default:a}}},function(a,e,t){"use strict";e.a=function(a,e){for(var t=-1,n=null==a?0:a.length;++t-1&&a%1==0&&a]*?>","i"),l=new RegExp("]*?>$","i"),d=function(a){return a=(a=a.replace(/^(<\/([^>]+)>)+/i,"")).replace(/(<([^/>]+)>)+$/i,"")},c=function(a){return a=(a=a.replace(s,"")).replace(l,"")},u=function(a){return a=a.replace(/(<([^>]+)>)/gi," "),a=(0,r.default)(a)};e.stripFullTags=u,e.stripIncompleteTags=d,e.stripBlockTagsAtStartEnd=c,e.default={stripFullTags:u,stripIncompleteTags:d,stripBlockTagsAtStartEnd:c}},function(a,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(a){a=(0,o.unifyNonBreakingSpace)(a);var e=(0,r.getBlocks)(a);e=(0,i.flatMap)(e,(function(a){return a.split(d)}));var t=(0,i.flatMap)(e,c);return(0,i.filter)(t,(0,i.negate)(i.isEmpty))};var n,i=t(2),r=t(172),o=t(326),s=t(647),l=(n=s)&&n.__esModule?n:{default:n};var d=new RegExp("\n\r|\n|\r");var c=(0,i.memoize)((function(a){var e=new l.default,t=e.createTokenizer(),n=t.tokenizer,i=t.tokens;return e.tokenize(n,a),0===i.length?[]:e.getSentencesFromTokens(i)}))},function(a,e,t){"use strict";var n=t(19),i=t(70),r=t(7),o={};o["[object Float32Array]"]=o["[object Float64Array]"]=o["[object Int8Array]"]=o["[object Int16Array]"]=o["[object Int32Array]"]=o["[object Uint8Array]"]=o["[object Uint8ClampedArray]"]=o["[object Uint16Array]"]=o["[object Uint32Array]"]=!0,o["[object Arguments]"]=o["[object Array]"]=o["[object ArrayBuffer]"]=o["[object Boolean]"]=o["[object DataView]"]=o["[object Date]"]=o["[object Error]"]=o["[object Function]"]=o["[object Map]"]=o["[object Number]"]=o["[object Object]"]=o["[object RegExp]"]=o["[object Set]"]=o["[object String]"]=o["[object WeakMap]"]=!1;var s=function(a){return Object(r.a)(a)&&Object(i.a)(a.length)&&!!o[Object(n.a)(a)]},l=t(21),d=t(37),c=d.a&&d.a.isTypedArray,u=c?Object(l.a)(c):s;e.a=u},function(a,e,t){"use strict";var n=t(204);var i=function(a,e){return null==a?void 0:a[e]};e.a=function(a,e){var t=i(a,e);return Object(n.a)(t)?t:void 0}},function(a,e){var t=Array.isArray;a.exports=t},function(a,e,t){var n=t(14),i=t(52),r=t(51),o=t(88)("src"),s=t(449),l=(""+s).split("toString");t(28).inspectSource=function(a){return s.call(a)},(a.exports=function(a,e,t,s){var d="function"==typeof t;d&&(r(t,"name")||i(t,"name",e)),a[e]!==t&&(d&&(r(t,o)||i(t,o,a[e]?""+a[e]:l.join(String(e)))),a===n?a[e]=t:s?a[e]?a[e]=t:i(a,e,t):(delete a[e],i(a,e,t)))})(Function.prototype,"toString",(function(){return"function"==typeof this&&this[o]||s.call(this)}))},function(a,e,t){var n=t(3),i=t(15),r=t(75),o=/"/g,s=function(a,e,t,n){var i=String(r(a)),s="<"+e;return""!==t&&(s+=" "+t+'="'+String(n).replace(o,""")+'"'),s+">"+i+""};a.exports=function(a,e){var t={};t[a]=e(s),n(n.P+n.F*i((function(){var e=""[a]('"');return e!==e.toLowerCase()||e.split('"').length>3})),"String",t)}},function(a,e){var t={}.hasOwnProperty;a.exports=function(a,e){return t.call(a,e)}},function(a,e,t){var n=t(32),i=t(87);a.exports=t(31)?function(a,e,t){return n.f(a,e,i(1,t))}:function(a,e,t){return a[e]=t,a}},function(a,e,t){var n=t(135),i=t(75);a.exports=function(a){return n(i(a))}},function(a,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=d(t(127)),i=d(t(181)),r=d(t(960)),o=d(t(9)),s=t(961),l=t(2);function d(a){return a&&a.__esModule?a:{default:a}}var c=function(a,e){this.type="Assessor",this.setI18n(a),this._assessments=[],this._options=e||{},(0,l.isUndefined)(this._options.researcher)||(this._researcher=this._options.researcher)};c.prototype.setI18n=function(a){if((0,l.isUndefined)(a))throw new i.default("The assessor requires an i18n object.");this.i18n=a},c.prototype.getAvailableAssessments=function(){return this._assessments},c.prototype.isApplicable=function(a,e,t){return!a.hasOwnProperty("isApplicable")&&"function"!=typeof a.isApplicable||a.isApplicable(e,t)},c.prototype.hasMarker=function(a){return(0,l.isFunction)(this._options.marker)&&(a.hasOwnProperty("getMarks")||"function"==typeof a.getMarks)},c.prototype.getSpecificMarker=function(){return this._options.marker},c.prototype.getPaper=function(){return this._lastPaper},c.prototype.getMarker=function(a,e,t){var n=this._options.marker;return function(){var i=a.getMarks(e,t);i=(0,r.default)(i),n(e,i)}},c.prototype.assess=function(a){(0,l.isUndefined)(this._researcher)?this._researcher=new n.default(a):this._researcher.setPaper(a);var e=this.getAvailableAssessments();this.results=[],e=(0,l.filter)(e,function(e){return this.isApplicable(e,a,this._researcher)}.bind(this)),this.setHasMarkers(!1),this.results=(0,l.map)(e,this.executeAssessment.bind(this,a,this._researcher)),this._lastPaper=a},c.prototype.setHasMarkers=function(a){this._hasMarkers=a},c.prototype.hasMarkers=function(){return this._hasMarkers},c.prototype.executeAssessment=function(a,e,t){var n;try{(n=t.getResult(a,e,this.i18n)).setIdentifier(t.identifier),n.hasMarks()&&(n.marks=t.getMarks(a,e),n.marks=(0,r.default)(n.marks)),n.hasMarks()&&this.hasMarker(t)&&(this.setHasMarkers(!0),n.setMarker(this.getMarker(t,a,e)))}catch(a){(0,s.showTrace)(a),(n=new o.default).setScore(-1),n.setText(this.i18n.sprintf(this.i18n.dgettext("js-text-analysis","An error occurred in the '%1$s' assessment"),t.identifier,a))}return n},c.prototype.getValidResults=function(){return(0,l.filter)(this.results,function(a){return this.isValidResult(a)}.bind(this))},c.prototype.isValidResult=function(a){return a.hasScore()&&a.hasText()},c.prototype.calculateOverallScore=function(){var a=this.getValidResults(),e=0;return(0,l.forEach)(a,(function(a){e+=a.getScore()})),Math.round(e/(9*a.length)*100)||0},c.prototype.addAssessment=function(a,e){return e.hasOwnProperty("identifier")||(e.identifier=a),this._assessments.push(e),!0},c.prototype.removeAssessment=function(a){var e=(0,l.findIndex)(this._assessments,(function(e){return e.hasOwnProperty("identifier")&&a===e.identifier}));-1!==e&&this._assessments.splice(e,1)},c.prototype.getAssessment=function(a){return(0,l.find)(this._assessments,(function(e){return e.hasOwnProperty("identifier")&&a===e.identifier}))},c.prototype.getApplicableAssessments=function(){var a=this.getAvailableAssessments();return(0,l.filter)(a,function(a){return this.isApplicable(a,this.getPaper())}.bind(this))},e.default=c},function(a,e,t){"use strict";var n=t(15);a.exports=function(a,e){return!!a&&n((function(){e?a.call(null,(function(){}),1):a.call(null)}))}},function(a,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=Object.assign||function(a){for(var e=1;ee&&a<=t}function i(a,e,t){return a>=e&&a=e&&a<=t}Object.defineProperty(e,"__esModule",{value:!0}),e.inRange=n,e.inRangeStartInclusive=i,e.inRangeEndInclusive=n,e.inRangeStartEndInclusive=r,e.default={inRange:n,inRangeStartInclusive:i,inRangeEndInclusive:n,inRangeStartEndInclusive:r}},function(a,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(a){return(0,r.default)(a).length};var n,i=t(33),r=(n=i)&&n.__esModule?n:{default:n}},function(a,e,t){"use strict";var n=t(109);t.d(e,"a",(function(){return n.AnalysisWebWorker})),t.d(e,"b",(function(){return n.AnalysisWorkerWrapper})),t.d(e,"d",(function(){return n.createWorker}));t(190),t(191);var i=t(192);t.d(e,"e",(function(){return i}));t(193);var r=t(194);t.d(e,"f",(function(){return r}));t(154),t(195);var o=t(279),s=t.n(o),l=t(54),d=t.n(l),c=t(128),u=t.n(c),p=(t(150),t(196)),f=t.n(p),m=t(155),g=t.n(m),y=t(127),z=t.n(y),h=t(156),b=t.n(h),w=t(129),v=t.n(w);t.d(e,"c",(function(){return v.a}));var k=t(9),_=t.n(k);t(23),s.a,d.a,u.a,f.a,g.a,z.a,b.a,v.a,_.a,n.AnalysisWebWorker,n.AnalysisWorkerWrapper,n.createWorker},function(a,e,t){var n=t(61);a.exports=function(a,e,t){if(n(a),void 0===e)return a;switch(t){case 1:return function(t){return a.call(e,t)};case 2:return function(t,n){return a.call(e,t,n)};case 3:return function(t,n,i){return a.call(e,t,n,i)}}return function(){return a.apply(e,arguments)}}},function(a,e){a.exports=function(a){if("function"!=typeof a)throw TypeError(a+" is not a function!");return a}},function(a,e){var t=Math.ceil,n=Math.floor;a.exports=function(a){return isNaN(a=+a)?0:(a>0?n:t)(a)}},function(a,e,t){var n=t(136),i=t(87),r=t(53),o=t(79),s=t(51),l=t(292),d=Object.getOwnPropertyDescriptor;e.f=t(31)?d:function(a,e){if(a=r(a),e=o(e,!0),l)try{return d(a,e)}catch(a){}if(s(a,e))return i(!n.f.call(a,e),a[e])}},function(a,e,t){var n=t(3),i=t(28),r=t(15);a.exports=function(a,e){var t=(i.Object||{})[a]||Object[a],o={};o[a]=e(t),n(n.S+n.F*r((function(){t(1)})),"Object",o)}},function(a,e,t){var n=t(60),i=t(135),r=t(42),o=t(26),s=t(308);a.exports=function(a,e){var t=1==a,l=2==a,d=3==a,c=4==a,u=6==a,p=5==a||u,f=e||s;return function(e,s,m){for(var g,y,z=r(e),h=i(z),b=n(s,m,3),w=o(h.length),v=0,k=t?f(e,w):l?f(e,0):void 0;w>v;v++)if((p||v in h)&&(y=b(g=h[v],v,z),a))if(t)k[v]=y;else if(y)switch(a){case 3:return!0;case 5:return g;case 6:return v;case 2:k.push(g)}else if(c)return!1;return u?-1:d||c?c:k}}},function(a,e,t){function n(a){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a})(a)}var i=t(323),r="object"==("undefined"==typeof self?"undefined":n(self))&&self&&self.Object===Object&&self,o=i||r||Function("return this")();a.exports=o},function(a,e,t){"use strict";function n(a){return a.replace(/[‘’‛`]/g,"'")}function i(a){return a.replace(/[“”〝〞〟‟„]/g,'"')}function r(a){return i(n(a))}Object.defineProperty(e,"__esModule",{value:!0}),e.normalizeSingle=n,e.normalizeDouble=i,e.normalize=r,e.default={normalizeSingle:n,normalizeDouble:i,normalize:r}},function(a,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=t(2),i=t(874),r={auxiliaries:[],type:"",language:""},o=function(a,e,t){this.setParticiple(a),this.setSentencePart(e),this._determinesSentencePartIsPassive=!1,t=t||{},(0,n.defaults)(t,r),function(a){(0,n.forEach)(a,(function(a,e){var t=(0,i.getType)(r[e]);if(!1===(0,i.isSameType)(a,t))throw Error("Attribute "+e+" has invalid type. Expected "+t+", got "+(0,i.getType)(a)+".")}))}(t),this._attributes=t};o.prototype.setParticiple=function(a){if(""===a)throw Error("The participle should not be empty.");if(!(0,n.isString)(a))throw Error("The participle should be a string.");this._participle=a},o.prototype.getParticiple=function(){return this._participle},o.prototype.setSentencePart=function(a){if(""===a)throw Error("The sentence part should not be empty.");this._sentencePart=a},o.prototype.getSentencePart=function(){return this._sentencePart},o.prototype.getType=function(){return this._attributes.type},o.prototype.getAuxiliaries=function(){return this._attributes.auxiliaries},o.prototype.getLanguage=function(){return this._attributes.language},o.prototype.determinesSentencePartIsPassive=function(){return this._determinesSentencePartIsPassive},o.prototype.setSentencePartPassiveness=function(a){if(!(0,i.isSameType)(a,"boolean"))throw Error("Passiveness had invalid type. Expected boolean, got "+(0,i.getType)(a)+".");this._determinesSentencePartIsPassive=a},o.prototype.serialize=function(){return{_parseClass:"Participle",attributes:this._attributes,participle:this._participle,sentencePart:this._sentencePart,determinesSentencePartIsPassive:this._determinesSentencePartIsPassive}},o.parse=function(a){var e=new o(a.participle,a.sentencePart,a.attributes);return e.setSentencePartPassiveness(a.determinesSentencePartIsPassive),e},e.default=o},function(a,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=function(a,e,t){this._sentencePartText=a,this._auxiliaries=e,this._locale=t,this._isPassive=!1};n.prototype.getSentencePartText=function(){return this._sentencePartText},n.prototype.isPassive=function(){return this._isPassive},n.prototype.getAuxiliaries=function(){return this._auxiliaries},n.prototype.getLocale=function(){return this._locale},n.prototype.setPassive=function(a){this._isPassive=a},n.prototype.serialize=function(){return{_parseClass:"SentencePart",sentencePartText:this._sentencePartText,auxiliaries:this._auxiliaries,locale:this._locale,isPassive:this._isPassive}},n.parse=function(a){var e=new n(a.sentencePartText,a.auxiliaries,a.locale);return e.setPassive(a.isPassive),e},e.default=n},function(a,e,t){"use strict";e.a=function(a){return"number"==typeof a&&a>-1&&a%1==0&&a<=9007199254740991}},function(a,e,t){"use strict";var n=Object.prototype;e.a=function(a){var e=a&&a.constructor;return a===("function"==typeof e&&e.prototype||n)}},function(a,e,t){"use strict";a.exports=function(a){var e=[];return e.toString=function(){return this.map((function(e){var t=function(a,e){var t=a[1]||"",n=a[3];if(!n)return t;if(e&&"function"==typeof btoa){var i=(o=n,s=btoa(unescape(encodeURIComponent(JSON.stringify(o)))),l="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(s),"/*# ".concat(l," */")),r=n.sources.map((function(a){return"/*# sourceURL=".concat(n.sourceRoot||"").concat(a," */")}));return[t].concat(r).concat([i]).join("\n")}var o,s,l;return[t].join("\n")}(e,a);return e[2]?"@media ".concat(e[2]," {").concat(t,"}"):t})).join("")},e.i=function(a,t,n){"string"==typeof a&&(a=[[null,a,""]]);var i={};if(n)for(var r=0;rt;)i[t]=e[t++];return i},Ta=function(a,e,t){B(a,e,{get:function(){return this._d[t]}})},Aa=function(a){var e,t,n,i,r,o,s=_(a),l=arguments.length,d=l>1?arguments[1]:void 0,u=void 0!==d,p=E(s);if(null!=p&&!j(p)){for(o=p.call(s),n=[],e=0;!(r=o.next()).done;e++)n.push(r.value);s=n}for(u&&l>2&&(d=c(d,arguments[2],2)),e=0,t=y(s.length),i=Sa(this,t);t>e;e++)i[e]=u?d(s[e],e):s[e];return i},Ca=function(){for(var a=0,e=arguments.length,t=Sa(this,e);e>a;)t[a]=arguments[a++];return t},qa=!!H&&o((function(){ma.call(new H(1))})),Ra=function(){return ma.apply(qa?pa.call(Oa(this)):Oa(this),arguments)},Ma={copyWithin:function(a,e){return N.call(Oa(this),a,e,arguments.length>2?arguments[2]:void 0)},every:function(a){return X(Oa(this),a,arguments.length>1?arguments[1]:void 0)},fill:function(a){return I.apply(Oa(this),arguments)},filter:function(a){return Ea(this,Z(Oa(this),a,arguments.length>1?arguments[1]:void 0))},find:function(a){return aa(Oa(this),a,arguments.length>1?arguments[1]:void 0)},findIndex:function(a){return ea(Oa(this),a,arguments.length>1?arguments[1]:void 0)},forEach:function(a){Q(Oa(this),a,arguments.length>1?arguments[1]:void 0)},indexOf:function(a){return na(Oa(this),a,arguments.length>1?arguments[1]:void 0)},includes:function(a){return ta(Oa(this),a,arguments.length>1?arguments[1]:void 0)},join:function(a){return ca.apply(Oa(this),arguments)},lastIndexOf:function(a){return sa.apply(Oa(this),arguments)},map:function(a){return ka(Oa(this),a,arguments.length>1?arguments[1]:void 0)},reduce:function(a){return la.apply(Oa(this),arguments)},reduceRight:function(a){return da.apply(Oa(this),arguments)},reverse:function(){for(var a,e=Oa(this).length,t=Math.floor(e/2),n=0;n1?arguments[1]:void 0)},sort:function(a){return ua.call(Oa(this),a)},subarray:function(a,e){var t=Oa(this),n=t.length,i=h(a,n);return new(q(t,t[ha]))(t.buffer,t.byteOffset+i*t.BYTES_PER_ELEMENT,y((void 0===e?n:h(e,n))-i))}},$a=function(a,e){return Ea(this,pa.call(Oa(this),a,e))},Da=function(a){Oa(this);var e=xa(arguments[1],1),t=this.length,n=_(a),i=y(n.length),r=0;if(i+e>t)throw U("Wrong length!");for(;r255?255:255&i),r.v[p](t*e+r.o,i,_a)}(this,t,a)},enumerable:!0})};b?(m=t((function(a,t,n,i){u(a,m,d,"_d");var r,o,s,l,c=0,p=0;if(k(t)){if(!(t instanceof Y||"ArrayBuffer"==(l=v(t))||"SharedArrayBuffer"==l))return wa in t?Pa(m,t):Aa.call(m,t);r=t,p=xa(n,e);var g=t.byteLength;if(void 0===i){if(g%e)throw U("Wrong length!");if((o=g-p)<0)throw U("Wrong length!")}else if((o=y(i)*e)+p>g)throw U("Wrong length!");s=o/e}else s=z(t),r=new Y(o=s*e);for(f(a,"_d",{b:r,o:p,l:o,e:s,v:new G(r)});c-1};var c=function(a,e){var t=this.__data__,n=r(t,a);return n<0?(++this.size,t.push([a,e])):t[n][1]=e,this};function u(a){var e=-1,t=null==a?0:a.length;for(this.clear();++e1?n-1:0),r=1;r0?" Additional arguments: "+i.join(", "):"")));return v(o)}return w(a,e),a}(Error),C=/^[^\S\n]*?\/\* sc-component-id:\s*(\S+)\s+\*\//gm,q=function(e){var a=""+(e||""),t=[];return a.replace(C,(function(e,a,n){return t.push({componentId:a,matchIndex:n}),e})),t.map((function(e,n){var i=e.componentId,r=e.matchIndex,o=t[n+1];return{componentId:i,cssFromDOM:o?a.slice(r,o.matchIndex):a.slice(r)}}))},M=/^\s*\/\/.*$/gm,R=new i.a({global:!1,cascade:!0,keyframe:!1,prefix:!1,compress:!1,semicolon:!0}),$=new i.a({global:!1,cascade:!0,keyframe:!1,prefix:!0,compress:!1,semicolon:!1}),I=[],D=function(e){if(-2===e){var a=I;return I=[],a}},N=o()((function(e){I.push(e)})),F=void 0,L=void 0,B=void 0,W=function(e,a,t){return a>0&&-1!==t.slice(0,a).indexOf(L)&&t.slice(a-L.length,a)!==L?"."+F:e};$.use([function(e,a,t){2===e&&t.length&&t[0].lastIndexOf(L)>0&&(t[0]=t[0].replace(B,W))},N,D]),R.use([N,D]);var U=function(e){return R("",e)};function V(e,a,t){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"&",i=e.join("").replace(M,""),r=a&&t?t+" "+a+" { "+i+" }":i;return F=n,L=a,B=new RegExp("\\"+L+"\\b","g"),$(t||!a?"":a,r)}var H=function(){return t.nc},K=function(e,a,t){t&&((e[a]||(e[a]=Object.create(null)))[t]=!0)},Y=function(e,a){e[a]=Object.create(null)},G=function(e){return function(a,t){return void 0!==e[a]&&e[a][t]}},Q=function(e){var a="";for(var t in e)a+=Object.keys(e[t]).join(" ")+" ";return a.trim()},Z=function(e){if(e.sheet)return e.sheet;for(var a=e.ownerDocument.styleSheets.length,t=0;t"+e()+""}},te=function(e,a){return function(){var t,n=((t={})[E]=Q(a),t["data-styled-version"]="4.4.1",t),i=H();return i&&(n.nonce=i),l.a.createElement("style",z({},n,{dangerouslySetInnerHTML:{__html:e()}}))}},ne=function(e){return function(){return Object.keys(e)}},ie=function(e,a){return e.createTextNode(X(a))},re=function e(a,t){var n=void 0===a?Object.create(null):a,i=void 0===t?Object.create(null):t,r=function(e){var a=i[e];return void 0!==a?a:i[e]=[""]},o=function(){var e="";for(var a in i){var t=i[a][0];t&&(e+=X(a)+t)}return e};return{clone:function(){var a=function(e){var a=Object.create(null);for(var t in e)a[t]=z({},e[t]);return a}(n),t=Object.create(null);for(var r in i)t[r]=[i[r][0]];return e(a,t)},css:o,getIds:ne(i),hasNameForId:G(n),insertMarker:r,insertRules:function(e,a,t){r(e)[0]+=a.join(" "),K(n,e,t)},removeRules:function(e){var a=i[e];void 0!==a&&(a[0]="",Y(n,e))},sealed:!1,styleTag:null,toElement:te(o,n),toHTML:ae(o,n)}},oe=function(e,a,t,n,i){if(P&&!t){var r=function(e,a,t){var n=document;e?n=e.ownerDocument:a&&(n=a.ownerDocument);var i=n.createElement("style");i.setAttribute(E,""),i.setAttribute("data-styled-version","4.4.1");var r=H();if(r&&i.setAttribute("nonce",r),i.appendChild(n.createTextNode("")),e&&!a)e.appendChild(i);else{if(!a||!e||!a.parentNode)throw new A(6);a.parentNode.insertBefore(i,t?a:a.nextSibling)}return i}(e,a,n);return T?function(e,a){var t=Object.create(null),n=Object.create(null),i=void 0!==a,r=!1,o=function(a){var i=n[a];return void 0!==i?i:(n[a]=ie(e.ownerDocument,a),e.appendChild(n[a]),t[a]=Object.create(null),n[a])},s=function(){var e="";for(var a in n)e+=n[a].data;return e};return{clone:function(){throw new A(5)},css:s,getIds:ne(n),hasNameForId:G(t),insertMarker:o,insertRules:function(e,n,s){for(var l=o(e),d=[],c=n.length,u=0;u0&&(r=!0,a().insertRules(e+"-import",d))},removeRules:function(o){var s=n[o];if(void 0!==s){var l=ie(e.ownerDocument,o);e.replaceChild(l,s),n[o]=l,Y(t,o),i&&r&&a().removeRules(o+"-import")}},sealed:!1,styleTag:e,toElement:te(s,t),toHTML:ae(s,t)}}(r,i):function(e,a){var t=Object.create(null),n=Object.create(null),i=[],r=void 0!==a,o=!1,s=function(e){var a=n[e];return void 0!==a?a:(n[e]=i.length,i.push(0),Y(t,e),n[e])},l=function(){var a=Z(e).cssRules,t="";for(var r in n){t+=X(r);for(var o=n[r],s=ee(i,o),l=s-i[o];l0&&(o=!0,a().insertRules(n+"-import",m)),i[c]+=f,K(t,n,d)},removeRules:function(s){var l=n[s];if(void 0!==l&&!1!==e.isConnected){var d=i[l];!function(e,a,t){for(var n=a-t,i=a;i>n;i-=1)e.deleteRule(i)}(Z(e),ee(i,l)-1,d),i[l]=0,Y(t,s),r&&o&&a().removeRules(s+"-import")}},sealed:!1,styleTag:e,toElement:te(l,t),toHTML:ae(l,t)}}(r,i)}return re()},se=/\s+/,le=void 0;le=P?T?40:1e3:-1;var de=0,ce=void 0,ue=function(){function e(){var a=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:P?document.head:null,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];b(this,e),this.getImportRuleTag=function(){var e=a.importRuleTag;if(void 0!==e)return e;var t=a.tags[0];return a.importRuleTag=oe(a.target,t?t.styleTag:null,a.forceServer,!0)},de+=1,this.id=de,this.forceServer=n,this.target=n?null:t,this.tagMap={},this.deferred={},this.rehydratedNames={},this.ignoreRehydratedNames={},this.tags=[],this.capacity=1,this.clones=[]}return e.prototype.rehydrate=function(){if(!P||this.forceServer)return this;var e=[],a=[],t=!1,n=document.querySelectorAll("style["+E+'][data-styled-version="4.4.1"]'),i=n.length;if(!i)return this;for(var r=0;r0&&void 0!==arguments[0]&&arguments[0];ce=new e(void 0,a).rehydrate()},e.prototype.clone=function(){var a=new e(this.target,this.forceServer);return this.clones.push(a),a.tags=this.tags.map((function(e){for(var t=e.getIds(),n=e.clone(),i=0;i1?a-1:0),n=1;n=4;)a=1540483477*(65535&(a=255&e.charCodeAt(i)|(255&e.charCodeAt(++i))<<8|(255&e.charCodeAt(++i))<<16|(255&e.charCodeAt(++i))<<24))+((1540483477*(a>>>16)&65535)<<16),n=1540483477*(65535&n)+((1540483477*(n>>>16)&65535)<<16)^(a=1540483477*(65535&(a^=a>>>24))+((1540483477*(a>>>16)&65535)<<16)),t-=4,++i;switch(t){case 3:n^=(255&e.charCodeAt(i+2))<<16;case 2:n^=(255&e.charCodeAt(i+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(i)))+((1540483477*(n>>>16)&65535)<<16)}return((n=1540483477*(65535&(n^=n>>>13))+((1540483477*(n>>>16)&65535)<<16))^n>>>15)>>>0}var ve=function(e){return String.fromCharCode(e+(e>25?39:97))};function ke(e){var a="",t=void 0;for(t=e;t>52;t=Math.floor(t/52))a=ve(t%52)+a;return ve(t%52)+a}function je(e,a){for(var t=0;t2&&void 0!==arguments[2]?arguments[2]:_,n=!!t&&e.theme===t.theme,i=e.theme&&!n?e.theme:a||t.theme;return i},Ee=/[[\].#*$><+~=|^:(),"'`-]+/g,Pe=/(^-|-$)/g;function Te(e){return e.replace(Ee,"-").replace(Pe,"")}function Ae(e){return"string"==typeof e&&!0}var Ce={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDerivedStateFromProps:!0,propTypes:!0,type:!0},qe={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},Me=((_e={})[c.ForwardRef]={$$typeof:!0,render:!0},_e),Re=Object.defineProperty,$e=Object.getOwnPropertyNames,Ie=Object.getOwnPropertySymbols,De=void 0===Ie?function(){return[]}:Ie,Ne=Object.getOwnPropertyDescriptor,Fe=Object.getPrototypeOf,Le=Object.prototype,Be=Array.prototype;function We(e,a,t){if("string"!=typeof a){var n=Fe(a);n&&n!==Le&&We(e,n,t);for(var i=Be.concat($e(a),De(a)),r=Me[e.$$typeof]||Ce,o=Me[a.$$typeof]||Ce,s=i.length,l=void 0,d=void 0;s--;)if(d=i[s],!(qe[d]||t&&t[d]||o&&o[d]||r&&r[d])&&(l=Ne(a,d)))try{Re(e,d,l)}catch(e){}return e}return e}var Ue=Object(s.createContext)(),Ve=Ue.Consumer,He=(function(e){function a(t){b(this,a);var n=v(this,e.call(this,t));return n.getContext=Object(u.a)(n.getContext.bind(n)),n.renderInner=n.renderInner.bind(n),n}w(a,e),a.prototype.render=function(){return this.props.children?l.a.createElement(Ue.Consumer,null,this.renderInner):null},a.prototype.renderInner=function(e){var a=this.getContext(this.props.theme,e);return l.a.createElement(Ue.Provider,{value:a},this.props.children)},a.prototype.getTheme=function(e,a){if(x(e))return e(a);if(null===e||Array.isArray(e)||"object"!==(void 0===e?"undefined":y(e)))throw new A(8);return z({},a,e)},a.prototype.getContext=function(e,a){return this.getTheme(e,a)}}(s.Component),function(){function e(){b(this,e),this.masterSheet=ue.master,this.instance=this.masterSheet.clone(),this.sealed=!1}e.prototype.seal=function(){if(!this.sealed){var e=this.masterSheet.clones.indexOf(this.instance);this.masterSheet.clones.splice(e,1),this.sealed=!0}},e.prototype.collectStyles=function(e){if(this.sealed)throw new A(2);return l.a.createElement(Ye,{sheet:this.instance},e)},e.prototype.getStyleTags=function(){return this.seal(),this.instance.toHTML()},e.prototype.getStyleElement=function(){return this.seal(),this.instance.toReactElements()},e.prototype.interleaveWithNodeStream=function(e){throw new A(3)}}(),Object(s.createContext)()),Ke=He.Consumer,Ye=function(e){function a(t){b(this,a);var n=v(this,e.call(this,t));return n.getContext=Object(u.a)(n.getContext),n}return w(a,e),a.prototype.getContext=function(e,a){if(e)return e;if(a)return new ue(a);throw new A(4)},a.prototype.render=function(){var e=this.props,a=e.children,t=e.sheet,n=e.target;return l.a.createElement(He.Provider,{value:this.getContext(t,n)},a)},a}(s.Component),Ge={};var Qe=function(e){function a(){b(this,a);var t=v(this,e.call(this));return t.attrs={},t.renderOuter=t.renderOuter.bind(t),t.renderInner=t.renderInner.bind(t),t}return w(a,e),a.prototype.render=function(){return l.a.createElement(Ke,null,this.renderOuter)},a.prototype.renderOuter=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ue.master;return this.styleSheet=e,this.props.forwardedComponent.componentStyle.isStatic?this.renderInner():l.a.createElement(Ve,null,this.renderInner)},a.prototype.renderInner=function(e){var a=this.props.forwardedComponent,t=a.componentStyle,n=a.defaultProps,i=(a.displayName,a.foldedComponentIds),r=a.styledComponentId,o=a.target,l=void 0;l=t.isStatic?this.generateAndInjectStyles(_,this.props):this.generateAndInjectStyles(Se(this.props,e,n)||_,this.props);var d=this.props.as||this.attrs.as||o,c=Ae(d),u={},f=z({},this.props,this.attrs),m=void 0;for(m in f)"forwardedComponent"!==m&&"as"!==m&&("forwardedRef"===m?u.ref=f[m]:"forwardedAs"===m?u.as=f[m]:c&&!Object(p.a)(m)||(u[m]=f[m]));return this.props.style&&this.attrs.style&&(u.style=z({},this.attrs.style,this.props.style)),u.className=Array.prototype.concat(i,r,l!==r?l:null,this.props.className,this.attrs.className).filter(Boolean).join(" "),Object(s.createElement)(d,u)},a.prototype.buildExecutionContext=function(e,a,t){var n=this,i=z({},a,{theme:e});return t.length?(this.attrs={},t.forEach((function(e){var a,t=e,r=!1,o=void 0,s=void 0;for(s in x(t)&&(t=t(i),r=!0),t)o=t[s],r||!x(o)||(a=o)&&a.prototype&&a.prototype.isReactComponent||S(o)||(o=o(i)),n.attrs[s]=o,i[s]=o})),i):i},a.prototype.generateAndInjectStyles=function(e,a){var t=a.forwardedComponent,n=t.attrs,i=t.componentStyle;t.warnTooManyClasses;return i.isStatic&&!n.length?i.generateAndInjectStyles(_,this.styleSheet):i.generateAndInjectStyles(this.buildExecutionContext(e,a,n),this.styleSheet)},a}(s.Component);function Ze(e,a,t){var n=S(e),i=!Ae(e),r=a.displayName,o=void 0===r?function(e){return Ae(e)?"styled."+e:"Styled("+O(e)+")"}(e):r,s=a.componentId,d=void 0===s?function(e,a,t){var n="string"!=typeof a?"sc":Te(a),i=(Ge[n]||0)+1;Ge[n]=i;var r=n+"-"+e.generateName(n+i);return t?t+"-"+r:r}(Oe,a.displayName,a.parentComponentId):s,c=a.ParentComponent,u=void 0===c?Qe:c,p=a.attrs,m=void 0===p?j:p,g=a.displayName&&a.componentId?Te(a.displayName)+"-"+a.componentId:a.componentId||d,y=n&&e.attrs?Array.prototype.concat(e.attrs,m).filter(Boolean):m,b=new Oe(n?e.componentStyle.rules.concat(t):t,y,g),h=void 0,w=function(e,a){return l.a.createElement(u,z({},e,{forwardedComponent:h,forwardedRef:a}))};return w.displayName=o,(h=l.a.forwardRef(w)).displayName=o,h.attrs=y,h.componentStyle=b,h.foldedComponentIds=n?Array.prototype.concat(e.foldedComponentIds,e.styledComponentId):j,h.styledComponentId=g,h.target=n?e.target:e,h.withComponent=function(e){var n=a.componentId,i=function(e,a){var t={};for(var n in e)a.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t}(a,["componentId"]),r=n&&n+"-"+(Ae(e)?e:Te(O(e)));return Ze(e,z({},i,{attrs:y,componentId:r,ParentComponent:u}),t)},Object.defineProperty(h,"defaultProps",{get:function(){return this._foldedDefaultProps},set:function(a){this._foldedDefaultProps=n?Object(f.a)(e.defaultProps,a):a}}),h.toString=function(){return"."+h.styledComponentId},i&&We(h,e,{attrs:!0,componentStyle:!0,displayName:!0,foldedComponentIds:!0,styledComponentId:!0,target:!0,withComponent:!0}),h}var Je=function(e){return function e(a,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:_;if(!Object(c.isValidElementType)(t))throw new A(1,String(t));var i=function(){return a(t,n,ze.apply(void 0,arguments))};return i.withConfig=function(i){return e(a,t,z({},n,i))},i.attrs=function(i){return e(a,t,z({},n,{attrs:Array.prototype.concat(n.attrs,i).filter(Boolean)}))},i}(Ze,e)};["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"].forEach((function(e){Je[e]=Je(e)}));!function(){function e(a,t){b(this,e),this.rules=a,this.componentId=t,this.isStatic=je(a,j),ue.master.hasId(t)||ue.master.deferredInject(t,[])}e.prototype.createStyles=function(e,a){var t=V(he(this.rules,e,a),"");a.inject(this.componentId,t)},e.prototype.removeStyles=function(e){var a=this.componentId;e.hasId(a)&&e.remove(a)},e.prototype.renderStyles=function(e,a){this.removeStyles(a),this.createStyles(e,a)}}();P&&(window.scCGSHMRCache={});var Xe=function(e){return e.replace(/\s|\\n/g,"")};function ea(e){for(var a=arguments.length,t=Array(a>1?a-1:0),n=1;n0)},l.prototype.setIdentifier=function(e){this._identifier=e},l.prototype.getIdentifier=function(){return this._identifier},l.prototype.setMarker=function(e){this._marker=e},l.prototype.hasMarker=function(){return this._hasMarks&&this._marker!==this.emptyMarker},l.prototype.getMarker=function(){return this._marker},l.prototype.setHasMarks=function(e){this._hasMarks=e},l.prototype.hasMarks=function(){return this._hasMarks},l.prototype.serialize=function(){return{_parseClass:"AssessmentResult",identifier:this._identifier,score:this.score,text:this.text,marks:this.marks.map((function(e){return e.serialize()}))}},l.parse=function(e){var a=new l({text:e.text,score:e.score,marks:e.marks.map((function(e){return o.default.parse(e)}))});return a.setIdentifier(e.identifier),a},a.default=l},function(e,a,t){"use strict";var n=t(201);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})(e)}var r="object"==("undefined"==typeof self?"undefined":i(self))&&self&&self.Object===Object&&self,o=n.a||r||Function("return this")();a.a=o},function(e,a,t){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var n=t(667);Object.keys(n).forEach((function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(a,e,{enumerable:!0,get:function(){return n[e]}})}))},function(e,a,t){"use strict";var n=t(41),i=t(25),r=t(43),o=t(5),s=i.a?i.a.isConcatSpreadable:void 0;var l=function(e){return Object(o.a)(e)||Object(r.a)(e)||!!(s&&e&&e[s])};a.a=function e(a,t,i,r,o){var s=-1,d=a.length;for(i||(i=l),o||(o=[]);++s0&&i(c)?t>1?e(c,t-1,i,r,o):Object(n.a)(o,c):r||(o[o.length]=c)}return o}},function(e,a,t){"use strict";a.a=function(e){return e}},function(e,a){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)},function(e,a){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,a,t){var n=t(17);e.exports=function(e){if(!n(e))throw TypeError(e+" is not an object!");return e}},function(e,a){function t(e){return(t="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})(e)}e.exports=function(e){return"object"===t(e)?null!==e:"function"==typeof e}},function(e,a,t){"use strict";var n=t(29),i=t(70);a.a=function(e){return null!=e&&Object(i.a)(e.length)&&!Object(n.a)(e)}},function(e,a,t){"use strict";var n=t(25),i=Object.prototype,r=i.hasOwnProperty,o=i.toString,s=n.a?n.a.toStringTag:void 0;var l=function(e){var a=r.call(e,s),t=e[s];try{e[s]=void 0;var n=!0}catch(e){}var i=o.call(e);return n&&(a?e[s]=t:delete e[s]),i},d=Object.prototype.toString;var c=function(e){return d.call(e)},u=n.a?n.a.toStringTag:void 0;a.a=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":u&&u in Object(e)?l(e):c(e)}},function(e,a,t){(function(e){function n(e){return(n="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})(e)}var i=Object.getOwnPropertyDescriptors||function(e){for(var a=Object.keys(e),t={},n=0;n=i)return e;switch(e){case"%s":return String(n[t++]);case"%d":return Number(n[t++]);case"%j":try{return JSON.stringify(n[t++])}catch(e){return"[Circular]"}default:return e}})),s=n[t];t=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),g(t)?n.showHidden=t:t&&a._extend(n,t),z(n.showHidden)&&(n.showHidden=!1),z(n.depth)&&(n.depth=2),z(n.colors)&&(n.colors=!1),z(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=d),u(n,e,n.depth)}function d(e,a){var t=l.styles[a];return t?"["+l.colors[t][0]+"m"+e+"["+l.colors[t][1]+"m":e}function c(e,a){return e}function u(e,t,n){if(e.customInspect&&t&&_(t.inspect)&&t.inspect!==a.inspect&&(!t.constructor||t.constructor.prototype!==t)){var i=t.inspect(n,e);return h(i)||(i=u(e,i,n)),i}var r=function(e,a){if(z(a))return e.stylize("undefined","undefined");if(h(a)){var t="'"+JSON.stringify(a).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(t,"string")}if(b(a))return e.stylize(""+a,"number");if(g(a))return e.stylize(""+a,"boolean");if(y(a))return e.stylize("null","null")}(e,t);if(r)return r;var o=Object.keys(t),s=function(e){var a={};return e.forEach((function(e,t){a[e]=!0})),a}(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(t)),j(t)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return p(t);if(0===o.length){if(_(t)){var l=t.name?": "+t.name:"";return e.stylize("[Function"+l+"]","special")}if(w(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(k(t))return e.stylize(Date.prototype.toString.call(t),"date");if(j(t))return p(t)}var d,c="",v=!1,x=["{","}"];(m(t)&&(v=!0,x=["[","]"]),_(t))&&(c=" [Function"+(t.name?": "+t.name:"")+"]");return w(t)&&(c=" "+RegExp.prototype.toString.call(t)),k(t)&&(c=" "+Date.prototype.toUTCString.call(t)),j(t)&&(c=" "+p(t)),0!==o.length||v&&0!=t.length?n<0?w(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special"):(e.seen.push(t),d=v?function(e,a,t,n,i){for(var r=[],o=0,s=a.length;o=0&&0,e+a.replace(/\u001b\[\d\d?m/g,"").length+1}),0)>60)return t[0]+(""===a?"":a+"\n ")+" "+e.join(",\n ")+" "+t[1];return t[0]+a+" "+e.join(", ")+" "+t[1]}(d,c,x)):x[0]+c+x[1]}function p(e){return"["+Error.prototype.toString.call(e)+"]"}function f(e,a,t,n,i,r){var o,s,l;if((l=Object.getOwnPropertyDescriptor(a,i)||{value:a[i]}).get?s=l.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):l.set&&(s=e.stylize("[Setter]","special")),P(n,i)||(o="["+i+"]"),s||(e.seen.indexOf(l.value)<0?(s=y(t)?u(e,l.value,null):u(e,l.value,t-1)).indexOf("\n")>-1&&(s=r?s.split("\n").map((function(e){return" "+e})).join("\n").substr(2):"\n"+s.split("\n").map((function(e){return" "+e})).join("\n")):s=e.stylize("[Circular]","special")),z(o)){if(r&&i.match(/^\d+$/))return s;(o=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.substr(1,o.length-2),o=e.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=e.stylize(o,"string"))}return o+": "+s}function m(e){return Array.isArray(e)}function g(e){return"boolean"==typeof e}function y(e){return null===e}function b(e){return"number"==typeof e}function h(e){return"string"==typeof e}function z(e){return void 0===e}function w(e){return v(e)&&"[object RegExp]"===x(e)}function v(e){return"object"===n(e)&&null!==e}function k(e){return v(e)&&"[object Date]"===x(e)}function j(e){return v(e)&&("[object Error]"===x(e)||e instanceof Error)}function _(e){return"function"==typeof e}function x(e){return Object.prototype.toString.call(e)}function O(e){return e<10?"0"+e.toString(10):e.toString(10)}a.debuglog=function(t){if(z(o)&&(o=e.env.NODE_DEBUG||""),t=t.toUpperCase(),!s[t])if(new RegExp("\\b"+t+"\\b","i").test(o)){var n=e.pid;s[t]=function(){var e=a.format.apply(a,arguments);console.error("%s %d: %s",t,n,e)}}else s[t]=function(){};return s[t]},a.inspect=l,l.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},l.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},a.isArray=m,a.isBoolean=g,a.isNull=y,a.isNullOrUndefined=function(e){return null==e},a.isNumber=b,a.isString=h,a.isSymbol=function(e){return"symbol"===n(e)},a.isUndefined=z,a.isRegExp=w,a.isObject=v,a.isDate=k,a.isError=j,a.isFunction=_,a.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"===n(e)||void 0===e},a.isBuffer=t(715);var S=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function E(){var e=new Date,a=[O(e.getHours()),O(e.getMinutes()),O(e.getSeconds())].join(":");return[e.getDate(),S[e.getMonth()],a].join(" ")}function P(e,a){return Object.prototype.hasOwnProperty.call(e,a)}a.log=function(){console.log("%s - %s",E(),a.format.apply(a,arguments))},a.inherits=t(146),a._extend=function(e,a){if(!a||!v(a))return e;for(var t=Object.keys(a),n=t.length;n--;)e[t[n]]=a[t[n]];return e};var T="undefined"!=typeof Symbol?Symbol("util.promisify.custom"):void 0;function A(e,a){if(!e){var t=new Error("Promise was rejected with a falsy value");t.reason=e,e=t}return a(e)}a.promisify=function(e){if("function"!=typeof e)throw new TypeError('The "original" argument must be of type Function');if(T&&e[T]){var a;if("function"!=typeof(a=e[T]))throw new TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(a,T,{value:a,enumerable:!1,writable:!1,configurable:!0}),a}function a(){for(var a,t,n=new Promise((function(e,n){a=e,t=n})),i=[],r=0;r0?i(n(e),9007199254740991):0}},function(e,a,t){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=function(e){return e.split("_")[0]}},function(e,a){var t=e.exports={version:"2.6.12"};"number"==typeof __e&&(__e=t)},function(e,a,t){"use strict";var n=t(19),i=t(6);a.a=function(e){if(!Object(i.a)(e))return!1;var a=Object(n.a)(e);return"[object Function]"==a||"[object GeneratorFunction]"==a||"[object AsyncFunction]"==a||"[object Proxy]"==a}},function(e,a,t){"use strict";var n=t(13);a.a=function(e){return"function"==typeof e?e:n.a}},function(e,a,t){e.exports=!t(15)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(e,a,t){var n=t(16),i=t(297),r=t(79),o=Object.defineProperty;a.f=t(31)?Object.defineProperty:function(e,a,t){if(n(e),a=r(a,!0),n(t),i)try{return o(e,a,t)}catch(e){}if("get"in t||"set"in t)throw TypeError("Accessors not supported!");return"value"in t&&(e[a]=t.value),e}},function(e,a,t){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=function(e){if(""===(e=(0,i.default)((0,n.stripFullTags)(e))))return[];var a=e.split(/\s/g);return a=(0,o.map)(a,(function(e){return(0,r.default)(e)})),(0,o.filter)(a,(function(e){return""!==e.trim()}))};var n=t(44),i=s(t(39)),r=s(t(251)),o=t(2);function s(e){return e&&e.__esModule?e:{default:e}}},function(e,a,t){"use strict";a.a=function(e,a){for(var t=-1,n=null==e?0:e.length;++t-1&&e%1==0&&e]*?>","i"),l=new RegExp("]*?>$","i"),d=function(e){return e=(e=e.replace(/^(<\/([^>]+)>)+/i,"")).replace(/(<([^/>]+)>)+$/i,"")},c=function(e){return e=(e=e.replace(s,"")).replace(l,"")},u=function(e){return e=e.replace(/(<([^>]+)>)/gi," "),e=(0,r.default)(e)};a.stripFullTags=u,a.stripIncompleteTags=d,a.stripBlockTagsAtStartEnd=c,a.default={stripFullTags:u,stripIncompleteTags:d,stripBlockTagsAtStartEnd:c}},function(e,a,t){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=function(e){e=(0,o.unifyNonBreakingSpace)(e);var a=(0,r.getBlocks)(e);a=(0,i.flatMap)(a,(function(e){return e.split(d)}));var t=(0,i.flatMap)(a,c);return(0,i.filter)(t,(0,i.negate)(i.isEmpty))};var n,i=t(2),r=t(174),o=t(334),s=t(672),l=(n=s)&&n.__esModule?n:{default:n};var d=new RegExp("\n\r|\n|\r");var c=(0,i.memoize)((function(e){var a=new l.default,t=a.createTokenizer(),n=t.tokenizer,i=t.tokens;return a.tokenize(n,e),0===i.length?[]:a.getSentencesFromTokens(i)}))},function(e,a,t){"use strict";var n=t(19),i=t(70),r=t(7),o={};o["[object Float32Array]"]=o["[object Float64Array]"]=o["[object Int8Array]"]=o["[object Int16Array]"]=o["[object Int32Array]"]=o["[object Uint8Array]"]=o["[object Uint8ClampedArray]"]=o["[object Uint16Array]"]=o["[object Uint32Array]"]=!0,o["[object Arguments]"]=o["[object Array]"]=o["[object ArrayBuffer]"]=o["[object Boolean]"]=o["[object DataView]"]=o["[object Date]"]=o["[object Error]"]=o["[object Function]"]=o["[object Map]"]=o["[object Number]"]=o["[object Object]"]=o["[object RegExp]"]=o["[object Set]"]=o["[object String]"]=o["[object WeakMap]"]=!1;var s=function(e){return Object(r.a)(e)&&Object(i.a)(e.length)&&!!o[Object(n.a)(e)]},l=t(21),d=t(37),c=d.a&&d.a.isTypedArray,u=c?Object(l.a)(c):s;a.a=u},function(e,a,t){"use strict";var n=t(206);var i=function(e,a){return null==e?void 0:e[a]};a.a=function(e,a){var t=i(e,a);return Object(n.a)(t)?t:void 0}},function(e,a){var t=Array.isArray;e.exports=t},function(e,a,t){var n=t(14),i=t(52),r=t(51),o=t(89)("src"),s=t(457),l=(""+s).split("toString");t(28).inspectSource=function(e){return s.call(e)},(e.exports=function(e,a,t,s){var d="function"==typeof t;d&&(r(t,"name")||i(t,"name",a)),e[a]!==t&&(d&&(r(t,o)||i(t,o,e[a]?""+e[a]:l.join(String(a)))),e===n?e[a]=t:s?e[a]?e[a]=t:i(e,a,t):(delete e[a],i(e,a,t)))})(Function.prototype,"toString",(function(){return"function"==typeof this&&this[o]||s.call(this)}))},function(e,a,t){var n=t(3),i=t(15),r=t(75),o=/"/g,s=function(e,a,t,n){var i=String(r(e)),s="<"+a;return""!==t&&(s+=" "+t+'="'+String(n).replace(o,""")+'"'),s+">"+i+""};e.exports=function(e,a){var t={};t[e]=a(s),n(n.P+n.F*i((function(){var a=""[e]('"');return a!==a.toLowerCase()||a.split('"').length>3})),"String",t)}},function(e,a){var t={}.hasOwnProperty;e.exports=function(e,a){return t.call(e,a)}},function(e,a,t){var n=t(32),i=t(88);e.exports=t(31)?function(e,a,t){return n.f(e,a,i(1,t))}:function(e,a,t){return e[a]=t,e}},function(e,a,t){var n=t(136),i=t(75);e.exports=function(e){return n(i(e))}},function(e,a,t){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var n=d(t(128)),i=d(t(183)),r=d(t(985)),o=d(t(9)),s=t(986),l=t(2);function d(e){return e&&e.__esModule?e:{default:e}}var c=function(e,a){this.type="Assessor",this.setI18n(e),this._assessments=[],this._options=a||{},(0,l.isUndefined)(this._options.researcher)||(this._researcher=this._options.researcher)};c.prototype.setI18n=function(e){if((0,l.isUndefined)(e))throw new i.default("The assessor requires an i18n object.");this.i18n=e},c.prototype.getAvailableAssessments=function(){return this._assessments},c.prototype.isApplicable=function(e,a,t){return!e.hasOwnProperty("isApplicable")&&"function"!=typeof e.isApplicable||e.isApplicable(a,t)},c.prototype.hasMarker=function(e){return(0,l.isFunction)(this._options.marker)&&(e.hasOwnProperty("getMarks")||"function"==typeof e.getMarks)},c.prototype.getSpecificMarker=function(){return this._options.marker},c.prototype.getPaper=function(){return this._lastPaper},c.prototype.getMarker=function(e,a,t){var n=this._options.marker;return function(){var i=e.getMarks(a,t);i=(0,r.default)(i),n(a,i)}},c.prototype.assess=function(e){(0,l.isUndefined)(this._researcher)?this._researcher=new n.default(e):this._researcher.setPaper(e);var a=this.getAvailableAssessments();this.results=[],a=(0,l.filter)(a,function(a){return this.isApplicable(a,e,this._researcher)}.bind(this)),this.setHasMarkers(!1),this.results=(0,l.map)(a,this.executeAssessment.bind(this,e,this._researcher)),this._lastPaper=e},c.prototype.setHasMarkers=function(e){this._hasMarkers=e},c.prototype.hasMarkers=function(){return this._hasMarkers},c.prototype.executeAssessment=function(e,a,t){var n;try{(n=t.getResult(e,a,this.i18n)).setIdentifier(t.identifier),n.hasMarks()&&(n.marks=t.getMarks(e,a),n.marks=(0,r.default)(n.marks)),n.hasMarks()&&this.hasMarker(t)&&(this.setHasMarkers(!0),n.setMarker(this.getMarker(t,e,a)))}catch(e){(0,s.showTrace)(e),(n=new o.default).setScore(-1),n.setText(this.i18n.sprintf(this.i18n.dgettext("js-text-analysis","An error occurred in the '%1$s' assessment"),t.identifier,e))}return n},c.prototype.getValidResults=function(){return(0,l.filter)(this.results,function(e){return this.isValidResult(e)}.bind(this))},c.prototype.isValidResult=function(e){return e.hasScore()&&e.hasText()},c.prototype.calculateOverallScore=function(){var e=this.getValidResults(),a=0;return(0,l.forEach)(e,(function(e){a+=e.getScore()})),Math.round(a/(9*e.length)*100)||0},c.prototype.addAssessment=function(e,a){return a.hasOwnProperty("identifier")||(a.identifier=e),this._assessments.push(a),!0},c.prototype.removeAssessment=function(e){var a=(0,l.findIndex)(this._assessments,(function(a){return a.hasOwnProperty("identifier")&&e===a.identifier}));-1!==a&&this._assessments.splice(a,1)},c.prototype.getAssessment=function(e){return(0,l.find)(this._assessments,(function(a){return a.hasOwnProperty("identifier")&&e===a.identifier}))},c.prototype.getApplicableAssessments=function(){var e=this.getAvailableAssessments();return(0,l.filter)(e,function(e){return this.isApplicable(e,this.getPaper())}.bind(this))},a.default=c},function(e,a,t){"use strict";var n=t(15);e.exports=function(e,a){return!!e&&n((function(){a?e.call(null,(function(){}),1):e.call(null)}))}},function(e,a,t){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var n=Object.assign||function(e){for(var a=1;aa&&e<=t}function i(e,a,t){return e>=a&&e=a&&e<=t}Object.defineProperty(a,"__esModule",{value:!0}),a.inRange=n,a.inRangeStartInclusive=i,a.inRangeEndInclusive=n,a.inRangeStartEndInclusive=r,a.default={inRange:n,inRangeStartInclusive:i,inRangeEndInclusive:n,inRangeStartEndInclusive:r}},function(e,a,t){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=function(e){return(0,r.default)(e).length};var n,i=t(33),r=(n=i)&&n.__esModule?n:{default:n}},function(e,a,t){"use strict";var n=t(109);t.d(a,"a",(function(){return n.AnalysisWebWorker})),t.d(a,"b",(function(){return n.AnalysisWorkerWrapper})),t.d(a,"d",(function(){return n.createWorker}));t(192),t(193);var i=t(194);t.d(a,"e",(function(){return i}));t(195);var r=t(196);t.d(a,"f",(function(){return r}));t(156),t(197);var o=t(284),s=t.n(o),l=t(54),d=t.n(l),c=t(129),u=t.n(c),p=(t(152),t(198)),f=t.n(p),m=t(157),g=t.n(m),y=t(128),b=t.n(y),h=t(158),z=t.n(h),w=t(130),v=t.n(w);t.d(a,"c",(function(){return v.a}));var k=t(9),j=t.n(k);t(23),s.a,d.a,u.a,f.a,g.a,b.a,z.a,v.a,j.a,n.AnalysisWebWorker,n.AnalysisWorkerWrapper,n.createWorker},function(e,a,t){var n=t(61);e.exports=function(e,a,t){if(n(e),void 0===a)return e;switch(t){case 1:return function(t){return e.call(a,t)};case 2:return function(t,n){return e.call(a,t,n)};case 3:return function(t,n,i){return e.call(a,t,n,i)}}return function(){return e.apply(a,arguments)}}},function(e,a){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,a){var t=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:t)(e)}},function(e,a,t){var n=t(137),i=t(88),r=t(53),o=t(79),s=t(51),l=t(297),d=Object.getOwnPropertyDescriptor;a.f=t(31)?d:function(e,a){if(e=r(e),a=o(a,!0),l)try{return d(e,a)}catch(e){}if(s(e,a))return i(!n.f.call(e,a),e[a])}},function(e,a,t){var n=t(3),i=t(28),r=t(15);e.exports=function(e,a){var t=(i.Object||{})[e]||Object[e],o={};o[e]=a(t),n(n.S+n.F*r((function(){t(1)})),"Object",o)}},function(e,a,t){var n=t(60),i=t(136),r=t(42),o=t(26),s=t(313);e.exports=function(e,a){var t=1==e,l=2==e,d=3==e,c=4==e,u=6==e,p=5==e||u,f=a||s;return function(a,s,m){for(var g,y,b=r(a),h=i(b),z=n(s,m,3),w=o(h.length),v=0,k=t?f(a,w):l?f(a,0):void 0;w>v;v++)if((p||v in h)&&(y=z(g=h[v],v,b),e))if(t)k[v]=y;else if(y)switch(e){case 3:return!0;case 5:return g;case 6:return v;case 2:k.push(g)}else if(c)return!1;return u?-1:d||c?c:k}}},function(e,a,t){function n(e){return(n="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})(e)}var i=t(328),r="object"==("undefined"==typeof self?"undefined":n(self))&&self&&self.Object===Object&&self,o=i||r||Function("return this")();e.exports=o},function(e,a,t){"use strict";function n(e){return e.replace(/[‘’‛`]/g,"'")}function i(e){return e.replace(/[“”〝〞〟‟„]/g,'"')}function r(e){return i(n(e))}Object.defineProperty(a,"__esModule",{value:!0}),a.normalizeSingle=n,a.normalizeDouble=i,a.normalize=r,a.default={normalizeSingle:n,normalizeDouble:i,normalize:r}},function(e,a,t){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var n=t(2),i=t(899),r={auxiliaries:[],type:"",language:""},o=function(e,a,t){this.setParticiple(e),this.setSentencePart(a),this._determinesSentencePartIsPassive=!1,t=t||{},(0,n.defaults)(t,r),function(e){(0,n.forEach)(e,(function(e,a){var t=(0,i.getType)(r[a]);if(!1===(0,i.isSameType)(e,t))throw Error("Attribute "+a+" has invalid type. Expected "+t+", got "+(0,i.getType)(e)+".")}))}(t),this._attributes=t};o.prototype.setParticiple=function(e){if(""===e)throw Error("The participle should not be empty.");if(!(0,n.isString)(e))throw Error("The participle should be a string.");this._participle=e},o.prototype.getParticiple=function(){return this._participle},o.prototype.setSentencePart=function(e){if(""===e)throw Error("The sentence part should not be empty.");this._sentencePart=e},o.prototype.getSentencePart=function(){return this._sentencePart},o.prototype.getType=function(){return this._attributes.type},o.prototype.getAuxiliaries=function(){return this._attributes.auxiliaries},o.prototype.getLanguage=function(){return this._attributes.language},o.prototype.determinesSentencePartIsPassive=function(){return this._determinesSentencePartIsPassive},o.prototype.setSentencePartPassiveness=function(e){if(!(0,i.isSameType)(e,"boolean"))throw Error("Passiveness had invalid type. Expected boolean, got "+(0,i.getType)(e)+".");this._determinesSentencePartIsPassive=e},o.prototype.serialize=function(){return{_parseClass:"Participle",attributes:this._attributes,participle:this._participle,sentencePart:this._sentencePart,determinesSentencePartIsPassive:this._determinesSentencePartIsPassive}},o.parse=function(e){var a=new o(e.participle,e.sentencePart,e.attributes);return a.setSentencePartPassiveness(e.determinesSentencePartIsPassive),a},a.default=o},function(e,a,t){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var n=function(e,a,t){this._sentencePartText=e,this._auxiliaries=a,this._locale=t,this._isPassive=!1};n.prototype.getSentencePartText=function(){return this._sentencePartText},n.prototype.isPassive=function(){return this._isPassive},n.prototype.getAuxiliaries=function(){return this._auxiliaries},n.prototype.getLocale=function(){return this._locale},n.prototype.setPassive=function(e){this._isPassive=e},n.prototype.serialize=function(){return{_parseClass:"SentencePart",sentencePartText:this._sentencePartText,auxiliaries:this._auxiliaries,locale:this._locale,isPassive:this._isPassive}},n.parse=function(e){var a=new n(e.sentencePartText,e.auxiliaries,e.locale);return a.setPassive(e.isPassive),a},a.default=n},function(e,a,t){"use strict";a.a=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},function(e,a,t){"use strict";var n=Object.prototype;a.a=function(e){var a=e&&e.constructor;return e===("function"==typeof a&&a.prototype||n)}},function(e,a,t){"use strict";e.exports=function(e){var a=[];return a.toString=function(){return this.map((function(a){var t=function(e,a){var t=e[1]||"",n=e[3];if(!n)return t;if(a&&"function"==typeof btoa){var i=(o=n,s=btoa(unescape(encodeURIComponent(JSON.stringify(o)))),l="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(s),"/*# ".concat(l," */")),r=n.sources.map((function(e){return"/*# sourceURL=".concat(n.sourceRoot||"").concat(e," */")}));return[t].concat(r).concat([i]).join("\n")}var o,s,l;return[t].join("\n")}(a,e);return a[2]?"@media ".concat(a[2]," {").concat(t,"}"):t})).join("")},a.i=function(e,t,n){"string"==typeof e&&(e=[[null,e,""]]);var i={};if(n)for(var r=0;rt;)i[t]=a[t++];return i},Te=function(e,a,t){B(e,a,{get:function(){return this._d[t]}})},Ae=function(e){var a,t,n,i,r,o,s=j(e),l=arguments.length,d=l>1?arguments[1]:void 0,u=void 0!==d,p=E(s);if(null!=p&&!_(p)){for(o=p.call(s),n=[],a=0;!(r=o.next()).done;a++)n.push(r.value);s=n}for(u&&l>2&&(d=c(d,arguments[2],2)),a=0,t=y(s.length),i=Se(this,t);t>a;a++)i[a]=u?d(s[a],a):s[a];return i},Ce=function(){for(var e=0,a=arguments.length,t=Se(this,a);a>e;)t[e]=arguments[e++];return t},qe=!!H&&o((function(){me.call(new H(1))})),Me=function(){return me.apply(qe?pe.call(Oe(this)):Oe(this),arguments)},Re={copyWithin:function(e,a){return N.call(Oe(this),e,a,arguments.length>2?arguments[2]:void 0)},every:function(e){return X(Oe(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return D.apply(Oe(this),arguments)},filter:function(e){return Ee(this,Z(Oe(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return ee(Oe(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return ae(Oe(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){Q(Oe(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return ne(Oe(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return te(Oe(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return ce.apply(Oe(this),arguments)},lastIndexOf:function(e){return se.apply(Oe(this),arguments)},map:function(e){return ke(Oe(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return le.apply(Oe(this),arguments)},reduceRight:function(e){return de.apply(Oe(this),arguments)},reverse:function(){for(var e,a=Oe(this).length,t=Math.floor(a/2),n=0;n1?arguments[1]:void 0)},sort:function(e){return ue.call(Oe(this),e)},subarray:function(e,a){var t=Oe(this),n=t.length,i=h(e,n);return new(q(t,t[he]))(t.buffer,t.byteOffset+i*t.BYTES_PER_ELEMENT,y((void 0===a?n:h(a,n))-i))}},$e=function(e,a){return Ee(this,pe.call(Oe(this),e,a))},Ie=function(e){Oe(this);var a=xe(arguments[1],1),t=this.length,n=j(e),i=y(n.length),r=0;if(i+a>t)throw U("Wrong length!");for(;r255?255:255&i),r.v[p](t*a+r.o,i,je)}(this,t,e)},enumerable:!0})};z?(m=t((function(e,t,n,i){u(e,m,d,"_d");var r,o,s,l,c=0,p=0;if(k(t)){if(!(t instanceof Y||"ArrayBuffer"==(l=v(t))||"SharedArrayBuffer"==l))return we in t?Pe(m,t):Ae.call(m,t);r=t,p=xe(n,a);var g=t.byteLength;if(void 0===i){if(g%a)throw U("Wrong length!");if((o=g-p)<0)throw U("Wrong length!")}else if((o=y(i)*a)+p>g)throw U("Wrong length!");s=o/a}else s=b(t),r=new Y(o=s*a);for(f(e,"_d",{b:r,o:p,l:o,e:s,v:new G(r)});c-1};var c=function(e,a){var t=this.__data__,n=r(t,e);return n<0?(++this.size,t.push([e,a])):t[n][1]=a,this};function u(e){var a=-1,t=null==e?0:e.length;for(this.clear();++a @@ -24,33 +24,33 @@ * Released under MIT license * Based on Underscore.js 1.8.3 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */(function(){var o="Expected a function",s="__lodash_placeholder__",l=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],d="[object Arguments]",c="[object Array]",u="[object Boolean]",p="[object Date]",f="[object Error]",m="[object Function]",g="[object GeneratorFunction]",y="[object Map]",z="[object Number]",h="[object Object]",b="[object RegExp]",w="[object Set]",v="[object String]",k="[object Symbol]",_="[object WeakMap]",j="[object ArrayBuffer]",x="[object DataView]",O="[object Float32Array]",S="[object Float64Array]",E="[object Int8Array]",P="[object Int16Array]",T="[object Int32Array]",A="[object Uint8Array]",C="[object Uint16Array]",q="[object Uint32Array]",R=/\b__p \+= '';/g,M=/\b(__p \+=) '' \+/g,$=/(__e\(.*?\)|\b__t\)) \+\n'';/g,D=/&(?:amp|lt|gt|quot|#39);/g,I=/[&<>"']/g,N=RegExp(D.source),F=RegExp(I.source),L=/<%-([\s\S]+?)%>/g,B=/<%([\s\S]+?)%>/g,W=/<%=([\s\S]+?)%>/g,U=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,V=/^\w*$/,H=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,K=/[\\^$.*+?()[\]{}|]/g,Y=RegExp(K.source),G=/^\s+/,Q=/\s/,Z=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,J=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,aa=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ea=/[()=,{}\[\]\/\s]/,ta=/\\(\\)?/g,na=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ia=/\w*$/,ra=/^[-+]0x[0-9a-f]+$/i,oa=/^0b[01]+$/i,sa=/^\[object .+?Constructor\]$/,la=/^0o[0-7]+$/i,da=/^(?:0|[1-9]\d*)$/,ca=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ua=/($^)/,pa=/['\n\r\u2028\u2029\\]/g,fa="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",ma="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",ga="[\\ud800-\\udfff]",ya="["+ma+"]",za="["+fa+"]",ha="\\d+",ba="[\\u2700-\\u27bf]",wa="[a-z\\xdf-\\xf6\\xf8-\\xff]",va="[^\\ud800-\\udfff"+ma+ha+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",ka="\\ud83c[\\udffb-\\udfff]",_a="[^\\ud800-\\udfff]",ja="(?:\\ud83c[\\udde6-\\uddff]){2}",xa="[\\ud800-\\udbff][\\udc00-\\udfff]",Oa="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Sa="(?:"+wa+"|"+va+")",Ea="(?:"+Oa+"|"+va+")",Pa="(?:"+za+"|"+ka+")"+"?",Ta="[\\ufe0e\\ufe0f]?"+Pa+("(?:\\u200d(?:"+[_a,ja,xa].join("|")+")[\\ufe0e\\ufe0f]?"+Pa+")*"),Aa="(?:"+[ba,ja,xa].join("|")+")"+Ta,Ca="(?:"+[_a+za+"?",za,ja,xa,ga].join("|")+")",qa=RegExp("['’]","g"),Ra=RegExp(za,"g"),Ma=RegExp(ka+"(?="+ka+")|"+Ca+Ta,"g"),$a=RegExp([Oa+"?"+wa+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[ya,Oa,"$"].join("|")+")",Ea+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[ya,Oa+Sa,"$"].join("|")+")",Oa+"?"+Sa+"+(?:['’](?:d|ll|m|re|s|t|ve))?",Oa+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ha,Aa].join("|"),"g"),Da=RegExp("[\\u200d\\ud800-\\udfff"+fa+"\\ufe0e\\ufe0f]"),Ia=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Na=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Fa=-1,La={};La[O]=La[S]=La[E]=La[P]=La[T]=La[A]=La["[object Uint8ClampedArray]"]=La[C]=La[q]=!0,La[d]=La[c]=La[j]=La[u]=La[x]=La[p]=La[f]=La[m]=La[y]=La[z]=La[h]=La[b]=La[w]=La[v]=La[_]=!1;var Ba={};Ba[d]=Ba[c]=Ba[j]=Ba[x]=Ba[u]=Ba[p]=Ba[O]=Ba[S]=Ba[E]=Ba[P]=Ba[T]=Ba[y]=Ba[z]=Ba[h]=Ba[b]=Ba[w]=Ba[v]=Ba[k]=Ba[A]=Ba["[object Uint8ClampedArray]"]=Ba[C]=Ba[q]=!0,Ba[f]=Ba[m]=Ba[_]=!1;var Wa={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Ua=parseFloat,Va=parseInt,Ha="object"==(void 0===a?"undefined":r(a))&&a&&a.Object===Object&&a,Ka="object"==("undefined"==typeof self?"undefined":r(self))&&self&&self.Object===Object&&self,Ya=Ha||Ka||Function("return this")(),Ga="object"==r(e)&&e&&!e.nodeType&&e,Qa=Ga&&"object"==r(n)&&n&&!n.nodeType&&n,Za=Qa&&Qa.exports===Ga,Ja=Za&&Ha.process,Xa=function(){try{var a=Qa&&Qa.require&&Qa.require("util").types;return a||Ja&&Ja.binding&&Ja.binding("util")}catch(a){}}(),ae=Xa&&Xa.isArrayBuffer,ee=Xa&&Xa.isDate,te=Xa&&Xa.isMap,ne=Xa&&Xa.isRegExp,ie=Xa&&Xa.isSet,re=Xa&&Xa.isTypedArray;function oe(a,e,t){switch(t.length){case 0:return a.call(e);case 1:return a.call(e,t[0]);case 2:return a.call(e,t[0],t[1]);case 3:return a.call(e,t[0],t[1],t[2])}return a.apply(e,t)}function se(a,e,t,n){for(var i=-1,r=null==a?0:a.length;++i-1}function fe(a,e,t){for(var n=-1,i=null==a?0:a.length;++n-1;);return t}function $e(a,e){for(var t=a.length;t--&&ke(e,a[t],0)>-1;);return t}function De(a,e){for(var t=a.length,n=0;t--;)a[t]===e&&++n;return n}var Ie=Se({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),Ne=Se({"&":"&","<":"<",">":">",'"':""","'":"'"});function Fe(a){return"\\"+Wa[a]}function Le(a){return Da.test(a)}function Be(a){var e=-1,t=Array(a.size);return a.forEach((function(a,n){t[++e]=[n,a]})),t}function We(a,e){return function(t){return a(e(t))}}function Ue(a,e){for(var t=-1,n=a.length,i=0,r=[];++t",""":'"',"'":"'"});var Ze=function a(e){var t,n=(e=null==e?Ya:Ze.defaults(Ya.Object(),e,Ze.pick(Ya,Na))).Array,i=e.Date,Q=e.Error,fa=e.Function,ma=e.Math,ga=e.Object,ya=e.RegExp,za=e.String,ha=e.TypeError,ba=n.prototype,wa=fa.prototype,va=ga.prototype,ka=e["__core-js_shared__"],_a=wa.toString,ja=va.hasOwnProperty,xa=0,Oa=(t=/[^.]+$/.exec(ka&&ka.keys&&ka.keys.IE_PROTO||""))?"Symbol(src)_1."+t:"",Sa=va.toString,Ea=_a.call(ga),Pa=Ya._,Ta=ya("^"+_a.call(ja).replace(K,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Aa=Za?e.Buffer:void 0,Ca=e.Symbol,Ma=e.Uint8Array,Da=Aa?Aa.allocUnsafe:void 0,Wa=We(ga.getPrototypeOf,ga),Ha=ga.create,Ka=va.propertyIsEnumerable,Ga=ba.splice,Qa=Ca?Ca.isConcatSpreadable:void 0,Ja=Ca?Ca.iterator:void 0,Xa=Ca?Ca.toStringTag:void 0,be=function(){try{var a=er(ga,"defineProperty");return a({},"",{}),a}catch(a){}}(),Se=e.clearTimeout!==Ya.clearTimeout&&e.clearTimeout,Je=i&&i.now!==Ya.Date.now&&i.now,Xe=e.setTimeout!==Ya.setTimeout&&e.setTimeout,at=ma.ceil,et=ma.floor,tt=ga.getOwnPropertySymbols,nt=Aa?Aa.isBuffer:void 0,it=e.isFinite,rt=ba.join,ot=We(ga.keys,ga),st=ma.max,lt=ma.min,dt=i.now,ct=e.parseInt,ut=ma.random,pt=ba.reverse,ft=er(e,"DataView"),mt=er(e,"Map"),gt=er(e,"Promise"),yt=er(e,"Set"),zt=er(e,"WeakMap"),ht=er(ga,"create"),bt=zt&&new zt,wt={},vt=Er(ft),kt=Er(mt),_t=Er(gt),jt=Er(yt),xt=Er(zt),Ot=Ca?Ca.prototype:void 0,St=Ot?Ot.valueOf:void 0,Et=Ot?Ot.toString:void 0;function Pt(a){if(Ho(a)&&!Mo(a)&&!(a instanceof qt)){if(a instanceof Ct)return a;if(ja.call(a,"__wrapped__"))return Pr(a)}return new Ct(a)}var Tt=function(){function a(){}return function(e){if(!Vo(e))return{};if(Ha)return Ha(e);a.prototype=e;var t=new a;return a.prototype=void 0,t}}();function At(){}function Ct(a,e){this.__wrapped__=a,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=void 0}function qt(a){this.__wrapped__=a,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Rt(a){var e=-1,t=null==a?0:a.length;for(this.clear();++e=e?a:e)),a}function Zt(a,e,t,n,i,r){var o,s=1&e,l=2&e,c=4&e;if(t&&(o=i?t(a,n,i,r):t(a)),void 0!==o)return o;if(!Vo(a))return a;var f=Mo(a);if(f){if(o=function(a){var e=a.length,t=new a.constructor(e);e&&"string"==typeof a[0]&&ja.call(a,"index")&&(t.index=a.index,t.input=a.input);return t}(a),!s)return bi(a,o)}else{var _=ir(a),R=_==m||_==g;if(No(a))return fi(a,s);if(_==h||_==d||R&&!i){if(o=l||R?{}:or(a),!s)return l?function(a,e){return wi(a,nr(a),e)}(a,function(a,e){return a&&wi(e,_s(e),a)}(o,a)):function(a,e){return wi(a,tr(a),e)}(a,Kt(o,a))}else{if(!Ba[_])return i?a:{};o=function(a,e,t){var n=a.constructor;switch(e){case j:return mi(a);case u:case p:return new n(+a);case x:return function(a,e){var t=e?mi(a.buffer):a.buffer;return new a.constructor(t,a.byteOffset,a.byteLength)}(a,t);case O:case S:case E:case P:case T:case A:case"[object Uint8ClampedArray]":case C:case q:return gi(a,t);case y:return new n;case z:case v:return new n(a);case b:return function(a){var e=new a.constructor(a.source,ia.exec(a));return e.lastIndex=a.lastIndex,e}(a);case w:return new n;case k:return i=a,St?ga(St.call(i)):{}}var i}(a,_,s)}}r||(r=new It);var M=r.get(a);if(M)return M;r.set(a,o),Zo(a)?a.forEach((function(n){o.add(Zt(n,e,t,n,a,r))})):Ko(a)&&a.forEach((function(n,i){o.set(i,Zt(n,e,t,i,a,r))}));var $=f?void 0:(c?l?Yi:Ki:l?_s:ks)(a);return le($||a,(function(n,i){$&&(n=a[i=n]),Ut(o,i,Zt(n,e,t,i,a,r))})),o}function Jt(a,e,t){var n=t.length;if(null==a)return!n;for(a=ga(a);n--;){var i=t[n],r=e[i],o=a[i];if(void 0===o&&!(i in a)||!r(o))return!1}return!0}function Xt(a,e,t){if("function"!=typeof a)throw new ha(o);return vr((function(){a.apply(void 0,t)}),e)}function an(a,e,t,n){var i=-1,r=pe,o=!0,s=a.length,l=[],d=e.length;if(!s)return l;t&&(e=me(e,Ce(t))),n?(r=fe,o=!1):e.length>=200&&(r=Re,o=!1,e=new Dt(e));a:for(;++i-1},Mt.prototype.set=function(a,e){var t=this.__data__,n=Vt(t,a);return n<0?(++this.size,t.push([a,e])):t[n][1]=e,this},$t.prototype.clear=function(){this.size=0,this.__data__={hash:new Rt,map:new(mt||Mt),string:new Rt}},$t.prototype.delete=function(a){var e=Xi(this,a).delete(a);return this.size-=e?1:0,e},$t.prototype.get=function(a){return Xi(this,a).get(a)},$t.prototype.has=function(a){return Xi(this,a).has(a)},$t.prototype.set=function(a,e){var t=Xi(this,a),n=t.size;return t.set(a,e),this.size+=t.size==n?0:1,this},Dt.prototype.add=Dt.prototype.push=function(a){return this.__data__.set(a,"__lodash_hash_undefined__"),this},Dt.prototype.has=function(a){return this.__data__.has(a)},It.prototype.clear=function(){this.__data__=new Mt,this.size=0},It.prototype.delete=function(a){var e=this.__data__,t=e.delete(a);return this.size=e.size,t},It.prototype.get=function(a){return this.__data__.get(a)},It.prototype.has=function(a){return this.__data__.has(a)},It.prototype.set=function(a,e){var t=this.__data__;if(t instanceof Mt){var n=t.__data__;if(!mt||n.length<199)return n.push([a,e]),this.size=++t.size,this;t=this.__data__=new $t(n)}return t.set(a,e),this.size=t.size,this};var en=_i(cn),tn=_i(un,!0);function nn(a,e){var t=!0;return en(a,(function(a,n,i){return t=!!e(a,n,i)})),t}function rn(a,e,t){for(var n=-1,i=a.length;++n0&&t(s)?e>1?sn(s,e-1,t,n,i):ge(i,s):n||(i[i.length]=s)}return i}var ln=ji(),dn=ji(!0);function cn(a,e){return a&&ln(a,e,ks)}function un(a,e){return a&&dn(a,e,ks)}function pn(a,e){return ue(e,(function(e){return Bo(a[e])}))}function fn(a,e){for(var t=0,n=(e=di(e,a)).length;null!=a&&te}function zn(a,e){return null!=a&&ja.call(a,e)}function hn(a,e){return null!=a&&e in ga(a)}function bn(a,e,t){for(var i=t?fe:pe,r=a[0].length,o=a.length,s=o,l=n(o),d=1/0,c=[];s--;){var u=a[s];s&&e&&(u=me(u,Ce(e))),d=lt(u.length,d),l[s]=!t&&(e||r>=120&&u.length>=120)?new Dt(s&&u):void 0}u=a[0];var p=-1,f=l[0];a:for(;++p=s)return l;var d=t[n];return l*("desc"==d?-1:1)}}return a.index-e.index}(a,e,t)}))}function Mn(a,e,t){for(var n=-1,i=e.length,r={};++n-1;)s!==a&&Ga.call(s,l,1),Ga.call(a,l,1);return a}function Dn(a,e){for(var t=a?e.length:0,n=t-1;t--;){var i=e[t];if(t==n||i!==r){var r=i;lr(i)?Ga.call(a,i,1):ei(a,i)}}return a}function In(a,e){return a+et(ut()*(e-a+1))}function Nn(a,e){var t="";if(!a||e<1||e>9007199254740991)return t;do{e%2&&(t+=a),(e=et(e/2))&&(a+=a)}while(e);return t}function Fn(a,e){return kr(yr(a,e,Ys),a+"")}function Ln(a){return Ft(As(a))}function Bn(a,e){var t=As(a);return xr(t,Qt(e,0,t.length))}function Wn(a,e,t,n){if(!Vo(a))return a;for(var i=-1,r=(e=di(e,a)).length,o=r-1,s=a;null!=s&&++ir?0:r+e),(t=t>r?r:t)<0&&(t+=r),r=e>t?0:t-e>>>0,e>>>=0;for(var o=n(r);++i>>1,o=a[r];null!==o&&!Xo(o)&&(t?o<=e:o=200){var d=e?null:Ni(a);if(d)return Ve(d);o=!1,i=Re,l=new Dt}else l=e?[]:s;a:for(;++n=n?a:Kn(a,e,t)}var pi=Se||function(a){return Ya.clearTimeout(a)};function fi(a,e){if(e)return a.slice();var t=a.length,n=Da?Da(t):new a.constructor(t);return a.copy(n),n}function mi(a){var e=new a.constructor(a.byteLength);return new Ma(e).set(new Ma(a)),e}function gi(a,e){var t=e?mi(a.buffer):a.buffer;return new a.constructor(t,a.byteOffset,a.length)}function yi(a,e){if(a!==e){var t=void 0!==a,n=null===a,i=a==a,r=Xo(a),o=void 0!==e,s=null===e,l=e==e,d=Xo(e);if(!s&&!d&&!r&&a>e||r&&o&&l&&!s&&!d||n&&o&&l||!t&&l||!i)return 1;if(!n&&!r&&!d&&a1?t[i-1]:void 0,o=i>2?t[2]:void 0;for(r=a.length>3&&"function"==typeof r?(i--,r):void 0,o&&dr(t[0],t[1],o)&&(r=i<3?void 0:r,i=1),e=ga(e);++n-1?i[r?e[o]:o]:void 0}}function Pi(a){return Hi((function(e){var t=e.length,n=t,i=Ct.prototype.thru;for(a&&e.reverse();n--;){var r=e[n];if("function"!=typeof r)throw new ha(o);if(i&&!s&&"wrapper"==Qi(r))var s=new Ct([],!0)}for(n=s?n:t;++n1&&b.reverse(),u&&ds))return!1;var d=r.get(a),c=r.get(e);if(d&&c)return d==e&&c==a;var u=-1,p=!0,f=2&t?new Dt:void 0;for(r.set(a,e),r.set(e,a);++u-1&&a%1==0&&a1?"& ":"")+e[n],e=e.join(t>2?", ":" "),a.replace(Z,"{\n/* [wrapped with "+e+"] */\n")}(n,function(a,e){return le(l,(function(t){var n="_."+t[0];e&t[1]&&!pe(a,n)&&a.push(n)})),a.sort()}(function(a){var e=a.match(J);return e?e[1].split(X):[]}(n),t)))}function jr(a){var e=0,t=0;return function(){var n=dt(),i=16-(n-t);if(t=n,i>0){if(++e>=800)return arguments[0]}else e=0;return a.apply(void 0,arguments)}}function xr(a,e){var t=-1,n=a.length,i=n-1;for(e=void 0===e?n:e;++t1?a[e-1]:void 0;return t="function"==typeof t?(a.pop(),t):void 0,Gr(a,t)}));function to(a){var e=Pt(a);return e.__chain__=!0,e}function no(a,e){return e(a)}var io=Hi((function(a){var e=a.length,t=e?a[0]:0,n=this.__wrapped__,i=function(e){return Gt(e,a)};return!(e>1||this.__actions__.length)&&n instanceof qt&&lr(t)?((n=n.slice(t,+t+(e?1:0))).__actions__.push({func:no,args:[i],thisArg:void 0}),new Ct(n,this.__chain__).thru((function(a){return e&&!a.length&&a.push(void 0),a}))):this.thru(i)}));var ro=vi((function(a,e,t){ja.call(a,t)?++a[t]:Yt(a,t,1)}));var oo=Ei(qr),so=Ei(Rr);function lo(a,e){return(Mo(a)?le:en)(a,Ji(e,3))}function co(a,e){return(Mo(a)?de:tn)(a,Ji(e,3))}var uo=vi((function(a,e,t){ja.call(a,t)?a[t].push(e):Yt(a,t,[e])}));var po=Fn((function(a,e,t){var i=-1,r="function"==typeof e,o=Do(a)?n(a.length):[];return en(a,(function(a){o[++i]=r?oe(e,a,t):wn(a,e,t)})),o})),fo=vi((function(a,e,t){Yt(a,t,e)}));function mo(a,e){return(Mo(a)?me:Pn)(a,Ji(e,3))}var go=vi((function(a,e,t){a[t?0:1].push(e)}),(function(){return[[],[]]}));var yo=Fn((function(a,e){if(null==a)return[];var t=e.length;return t>1&&dr(a,e[0],e[1])?e=[]:t>2&&dr(e[0],e[1],e[2])&&(e=[e[0]]),Rn(a,sn(e,1),[])})),zo=Je||function(){return Ya.Date.now()};function ho(a,e,t){return e=t?void 0:e,Li(a,128,void 0,void 0,void 0,void 0,e=a&&null==e?a.length:e)}function bo(a,e){var t;if("function"!=typeof e)throw new ha(o);return a=rs(a),function(){return--a>0&&(t=e.apply(this,arguments)),a<=1&&(e=void 0),t}}var wo=Fn((function(a,e,t){var n=1;if(t.length){var i=Ue(t,Zi(wo));n|=32}return Li(a,n,e,t,i)})),vo=Fn((function(a,e,t){var n=3;if(t.length){var i=Ue(t,Zi(vo));n|=32}return Li(e,n,a,t,i)}));function ko(a,e,t){var n,i,r,s,l,d,c=0,u=!1,p=!1,f=!0;if("function"!=typeof a)throw new ha(o);function m(e){var t=n,r=i;return n=i=void 0,c=e,s=a.apply(r,t)}function g(a){return c=a,l=vr(z,e),u?m(a):s}function y(a){var t=a-d;return void 0===d||t>=e||t<0||p&&a-c>=r}function z(){var a=zo();if(y(a))return h(a);l=vr(z,function(a){var t=e-(a-d);return p?lt(t,r-(a-c)):t}(a))}function h(a){return l=void 0,f&&n?m(a):(n=i=void 0,s)}function b(){var a=zo(),t=y(a);if(n=arguments,i=this,d=a,t){if(void 0===l)return g(d);if(p)return pi(l),l=vr(z,e),m(d)}return void 0===l&&(l=vr(z,e)),s}return e=ss(e)||0,Vo(t)&&(u=!!t.leading,r=(p="maxWait"in t)?st(ss(t.maxWait)||0,e):r,f="trailing"in t?!!t.trailing:f),b.cancel=function(){void 0!==l&&pi(l),c=0,n=d=i=l=void 0},b.flush=function(){return void 0===l?s:h(zo())},b}var _o=Fn((function(a,e){return Xt(a,1,e)})),jo=Fn((function(a,e,t){return Xt(a,ss(e)||0,t)}));function xo(a,e){if("function"!=typeof a||null!=e&&"function"!=typeof e)throw new ha(o);var t=function t(){var n=arguments,i=e?e.apply(this,n):n[0],r=t.cache;if(r.has(i))return r.get(i);var o=a.apply(this,n);return t.cache=r.set(i,o)||r,o};return t.cache=new(xo.Cache||$t),t}function Oo(a){if("function"!=typeof a)throw new ha(o);return function(){var e=arguments;switch(e.length){case 0:return!a.call(this);case 1:return!a.call(this,e[0]);case 2:return!a.call(this,e[0],e[1]);case 3:return!a.call(this,e[0],e[1],e[2])}return!a.apply(this,e)}}xo.Cache=$t;var So=ci((function(a,e){var t=(e=1==e.length&&Mo(e[0])?me(e[0],Ce(Ji())):me(sn(e,1),Ce(Ji()))).length;return Fn((function(n){for(var i=-1,r=lt(n.length,t);++i=e})),Ro=vn(function(){return arguments}())?vn:function(a){return Ho(a)&&ja.call(a,"callee")&&!Ka.call(a,"callee")},Mo=n.isArray,$o=ae?Ce(ae):function(a){return Ho(a)&&gn(a)==j};function Do(a){return null!=a&&Uo(a.length)&&!Bo(a)}function Io(a){return Ho(a)&&Do(a)}var No=nt||sl,Fo=ee?Ce(ee):function(a){return Ho(a)&&gn(a)==p};function Lo(a){if(!Ho(a))return!1;var e=gn(a);return e==f||"[object DOMException]"==e||"string"==typeof a.message&&"string"==typeof a.name&&!Go(a)}function Bo(a){if(!Vo(a))return!1;var e=gn(a);return e==m||e==g||"[object AsyncFunction]"==e||"[object Proxy]"==e}function Wo(a){return"number"==typeof a&&a==rs(a)}function Uo(a){return"number"==typeof a&&a>-1&&a%1==0&&a<=9007199254740991}function Vo(a){var e=r(a);return null!=a&&("object"==e||"function"==e)}function Ho(a){return null!=a&&"object"==r(a)}var Ko=te?Ce(te):function(a){return Ho(a)&&ir(a)==y};function Yo(a){return"number"==typeof a||Ho(a)&&gn(a)==z}function Go(a){if(!Ho(a)||gn(a)!=h)return!1;var e=Wa(a);if(null===e)return!0;var t=ja.call(e,"constructor")&&e.constructor;return"function"==typeof t&&t instanceof t&&_a.call(t)==Ea}var Qo=ne?Ce(ne):function(a){return Ho(a)&&gn(a)==b};var Zo=ie?Ce(ie):function(a){return Ho(a)&&ir(a)==w};function Jo(a){return"string"==typeof a||!Mo(a)&&Ho(a)&&gn(a)==v}function Xo(a){return"symbol"==r(a)||Ho(a)&&gn(a)==k}var as=re?Ce(re):function(a){return Ho(a)&&Uo(a.length)&&!!La[gn(a)]};var es=$i(En),ts=$i((function(a,e){return a<=e}));function ns(a){if(!a)return[];if(Do(a))return Jo(a)?Ye(a):bi(a);if(Ja&&a[Ja])return function(a){for(var e,t=[];!(e=a.next()).done;)t.push(e.value);return t}(a[Ja]());var e=ir(a);return(e==y?Be:e==w?Ve:As)(a)}function is(a){return a?(a=ss(a))===1/0||a===-1/0?17976931348623157e292*(a<0?-1:1):a==a?a:0:0===a?a:0}function rs(a){var e=is(a),t=e%1;return e==e?t?e-t:e:0}function os(a){return a?Qt(rs(a),0,4294967295):0}function ss(a){if("number"==typeof a)return a;if(Xo(a))return NaN;if(Vo(a)){var e="function"==typeof a.valueOf?a.valueOf():a;a=Vo(e)?e+"":e}if("string"!=typeof a)return 0===a?a:+a;a=Ae(a);var t=oa.test(a);return t||la.test(a)?Va(a.slice(2),t?2:8):ra.test(a)?NaN:+a}function ls(a){return wi(a,_s(a))}function ds(a){return null==a?"":Xn(a)}var cs=ki((function(a,e){if(fr(e)||Do(e))wi(e,ks(e),a);else for(var t in e)ja.call(e,t)&&Ut(a,t,e[t])})),us=ki((function(a,e){wi(e,_s(e),a)})),ps=ki((function(a,e,t,n){wi(e,_s(e),a,n)})),fs=ki((function(a,e,t,n){wi(e,ks(e),a,n)})),ms=Hi(Gt);var gs=Fn((function(a,e){a=ga(a);var t=-1,n=e.length,i=n>2?e[2]:void 0;for(i&&dr(e[0],e[1],i)&&(n=1);++t1),e})),wi(a,Yi(a),t),n&&(t=Zt(t,7,Ui));for(var i=e.length;i--;)ei(t,e[i]);return t}));var Ss=Hi((function(a,e){return null==a?{}:function(a,e){return Mn(a,e,(function(e,t){return hs(a,t)}))}(a,e)}));function Es(a,e){if(null==a)return{};var t=me(Yi(a),(function(a){return[a]}));return e=Ji(e),Mn(a,t,(function(a,t){return e(a,t[0])}))}var Ps=Fi(ks),Ts=Fi(_s);function As(a){return null==a?[]:qe(a,ks(a))}var Cs=Oi((function(a,e,t){return e=e.toLowerCase(),a+(t?qs(e):e)}));function qs(a){return Ls(ds(a).toLowerCase())}function Rs(a){return(a=ds(a))&&a.replace(ca,Ie).replace(Ra,"")}var Ms=Oi((function(a,e,t){return a+(t?"-":"")+e.toLowerCase()})),$s=Oi((function(a,e,t){return a+(t?" ":"")+e.toLowerCase()})),Ds=xi("toLowerCase");var Is=Oi((function(a,e,t){return a+(t?"_":"")+e.toLowerCase()}));var Ns=Oi((function(a,e,t){return a+(t?" ":"")+Ls(e)}));var Fs=Oi((function(a,e,t){return a+(t?" ":"")+e.toUpperCase()})),Ls=xi("toUpperCase");function Bs(a,e,t){return a=ds(a),void 0===(e=t?void 0:e)?function(a){return Ia.test(a)}(a)?function(a){return a.match($a)||[]}(a):function(a){return a.match(aa)||[]}(a):a.match(e)||[]}var Ws=Fn((function(a,e){try{return oe(a,void 0,e)}catch(a){return Lo(a)?a:new Q(a)}})),Us=Hi((function(a,e){return le(e,(function(e){e=Sr(e),Yt(a,e,wo(a[e],a))})),a}));function Vs(a){return function(){return a}}var Hs=Pi(),Ks=Pi(!0);function Ys(a){return a}function Gs(a){return xn("function"==typeof a?a:Zt(a,1))}var Qs=Fn((function(a,e){return function(t){return wn(t,a,e)}})),Zs=Fn((function(a,e){return function(t){return wn(a,t,e)}}));function Js(a,e,t){var n=ks(e),i=pn(e,n);null!=t||Vo(e)&&(i.length||!n.length)||(t=e,e=a,a=this,i=pn(e,ks(e)));var r=!(Vo(t)&&"chain"in t&&!t.chain),o=Bo(a);return le(i,(function(t){var n=e[t];a[t]=n,o&&(a.prototype[t]=function(){var e=this.__chain__;if(r||e){var t=a(this.__wrapped__),i=t.__actions__=bi(this.__actions__);return i.push({func:n,args:arguments,thisArg:a}),t.__chain__=e,t}return n.apply(a,ge([this.value()],arguments))})})),a}function Xs(){}var al=qi(me),el=qi(ce),tl=qi(he);function nl(a){return cr(a)?Oe(Sr(a)):function(a){return function(e){return fn(e,a)}}(a)}var il=Mi(),rl=Mi(!0);function ol(){return[]}function sl(){return!1}var ll=Ci((function(a,e){return a+e}),0),dl=Ii("ceil"),cl=Ci((function(a,e){return a/e}),1),ul=Ii("floor");var pl,fl=Ci((function(a,e){return a*e}),1),ml=Ii("round"),gl=Ci((function(a,e){return a-e}),0);return Pt.after=function(a,e){if("function"!=typeof e)throw new ha(o);return a=rs(a),function(){if(--a<1)return e.apply(this,arguments)}},Pt.ary=ho,Pt.assign=cs,Pt.assignIn=us,Pt.assignInWith=ps,Pt.assignWith=fs,Pt.at=ms,Pt.before=bo,Pt.bind=wo,Pt.bindAll=Us,Pt.bindKey=vo,Pt.castArray=function(){if(!arguments.length)return[];var a=arguments[0];return Mo(a)?a:[a]},Pt.chain=to,Pt.chunk=function(a,e,t){e=(t?dr(a,e,t):void 0===e)?1:st(rs(e),0);var i=null==a?0:a.length;if(!i||e<1)return[];for(var r=0,o=0,s=n(at(i/e));ri?0:i+t),(n=void 0===n||n>i?i:rs(n))<0&&(n+=i),n=t>n?0:os(n);t>>0)?(a=ds(a))&&("string"==typeof e||null!=e&&!Qo(e))&&!(e=Xn(e))&&Le(a)?ui(Ye(a),0,t):a.split(e,t):[]},Pt.spread=function(a,e){if("function"!=typeof a)throw new ha(o);return e=null==e?0:st(rs(e),0),Fn((function(t){var n=t[e],i=ui(t,0,e);return n&&ge(i,n),oe(a,this,i)}))},Pt.tail=function(a){var e=null==a?0:a.length;return e?Kn(a,1,e):[]},Pt.take=function(a,e,t){return a&&a.length?Kn(a,0,(e=t||void 0===e?1:rs(e))<0?0:e):[]},Pt.takeRight=function(a,e,t){var n=null==a?0:a.length;return n?Kn(a,(e=n-(e=t||void 0===e?1:rs(e)))<0?0:e,n):[]},Pt.takeRightWhile=function(a,e){return a&&a.length?ni(a,Ji(e,3),!1,!0):[]},Pt.takeWhile=function(a,e){return a&&a.length?ni(a,Ji(e,3)):[]},Pt.tap=function(a,e){return e(a),a},Pt.throttle=function(a,e,t){var n=!0,i=!0;if("function"!=typeof a)throw new ha(o);return Vo(t)&&(n="leading"in t?!!t.leading:n,i="trailing"in t?!!t.trailing:i),ko(a,e,{leading:n,maxWait:e,trailing:i})},Pt.thru=no,Pt.toArray=ns,Pt.toPairs=Ps,Pt.toPairsIn=Ts,Pt.toPath=function(a){return Mo(a)?me(a,Sr):Xo(a)?[a]:bi(Or(ds(a)))},Pt.toPlainObject=ls,Pt.transform=function(a,e,t){var n=Mo(a),i=n||No(a)||as(a);if(e=Ji(e,4),null==t){var r=a&&a.constructor;t=i?n?new r:[]:Vo(a)&&Bo(r)?Tt(Wa(a)):{}}return(i?le:cn)(a,(function(a,n,i){return e(t,a,n,i)})),t},Pt.unary=function(a){return ho(a,1)},Pt.union=Vr,Pt.unionBy=Hr,Pt.unionWith=Kr,Pt.uniq=function(a){return a&&a.length?ai(a):[]},Pt.uniqBy=function(a,e){return a&&a.length?ai(a,Ji(e,2)):[]},Pt.uniqWith=function(a,e){return e="function"==typeof e?e:void 0,a&&a.length?ai(a,void 0,e):[]},Pt.unset=function(a,e){return null==a||ei(a,e)},Pt.unzip=Yr,Pt.unzipWith=Gr,Pt.update=function(a,e,t){return null==a?a:ti(a,e,li(t))},Pt.updateWith=function(a,e,t,n){return n="function"==typeof n?n:void 0,null==a?a:ti(a,e,li(t),n)},Pt.values=As,Pt.valuesIn=function(a){return null==a?[]:qe(a,_s(a))},Pt.without=Qr,Pt.words=Bs,Pt.wrap=function(a,e){return Eo(li(e),a)},Pt.xor=Zr,Pt.xorBy=Jr,Pt.xorWith=Xr,Pt.zip=ao,Pt.zipObject=function(a,e){return oi(a||[],e||[],Ut)},Pt.zipObjectDeep=function(a,e){return oi(a||[],e||[],Wn)},Pt.zipWith=eo,Pt.entries=Ps,Pt.entriesIn=Ts,Pt.extend=us,Pt.extendWith=ps,Js(Pt,Pt),Pt.add=ll,Pt.attempt=Ws,Pt.camelCase=Cs,Pt.capitalize=qs,Pt.ceil=dl,Pt.clamp=function(a,e,t){return void 0===t&&(t=e,e=void 0),void 0!==t&&(t=(t=ss(t))==t?t:0),void 0!==e&&(e=(e=ss(e))==e?e:0),Qt(ss(a),e,t)},Pt.clone=function(a){return Zt(a,4)},Pt.cloneDeep=function(a){return Zt(a,5)},Pt.cloneDeepWith=function(a,e){return Zt(a,5,e="function"==typeof e?e:void 0)},Pt.cloneWith=function(a,e){return Zt(a,4,e="function"==typeof e?e:void 0)},Pt.conformsTo=function(a,e){return null==e||Jt(a,e,ks(e))},Pt.deburr=Rs,Pt.defaultTo=function(a,e){return null==a||a!=a?e:a},Pt.divide=cl,Pt.endsWith=function(a,e,t){a=ds(a),e=Xn(e);var n=a.length,i=t=void 0===t?n:Qt(rs(t),0,n);return(t-=e.length)>=0&&a.slice(t,i)==e},Pt.eq=Ao,Pt.escape=function(a){return(a=ds(a))&&F.test(a)?a.replace(I,Ne):a},Pt.escapeRegExp=function(a){return(a=ds(a))&&Y.test(a)?a.replace(K,"\\$&"):a},Pt.every=function(a,e,t){var n=Mo(a)?ce:nn;return t&&dr(a,e,t)&&(e=void 0),n(a,Ji(e,3))},Pt.find=oo,Pt.findIndex=qr,Pt.findKey=function(a,e){return we(a,Ji(e,3),cn)},Pt.findLast=so,Pt.findLastIndex=Rr,Pt.findLastKey=function(a,e){return we(a,Ji(e,3),un)},Pt.floor=ul,Pt.forEach=lo,Pt.forEachRight=co,Pt.forIn=function(a,e){return null==a?a:ln(a,Ji(e,3),_s)},Pt.forInRight=function(a,e){return null==a?a:dn(a,Ji(e,3),_s)},Pt.forOwn=function(a,e){return a&&cn(a,Ji(e,3))},Pt.forOwnRight=function(a,e){return a&&un(a,Ji(e,3))},Pt.get=zs,Pt.gt=Co,Pt.gte=qo,Pt.has=function(a,e){return null!=a&&rr(a,e,zn)},Pt.hasIn=hs,Pt.head=$r,Pt.identity=Ys,Pt.includes=function(a,e,t,n){a=Do(a)?a:As(a),t=t&&!n?rs(t):0;var i=a.length;return t<0&&(t=st(i+t,0)),Jo(a)?t<=i&&a.indexOf(e,t)>-1:!!i&&ke(a,e,t)>-1},Pt.indexOf=function(a,e,t){var n=null==a?0:a.length;if(!n)return-1;var i=null==t?0:rs(t);return i<0&&(i=st(n+i,0)),ke(a,e,i)},Pt.inRange=function(a,e,t){return e=is(e),void 0===t?(t=e,e=0):t=is(t),function(a,e,t){return a>=lt(e,t)&&a=-9007199254740991&&a<=9007199254740991},Pt.isSet=Zo,Pt.isString=Jo,Pt.isSymbol=Xo,Pt.isTypedArray=as,Pt.isUndefined=function(a){return void 0===a},Pt.isWeakMap=function(a){return Ho(a)&&ir(a)==_},Pt.isWeakSet=function(a){return Ho(a)&&"[object WeakSet]"==gn(a)},Pt.join=function(a,e){return null==a?"":rt.call(a,e)},Pt.kebabCase=Ms,Pt.last=Fr,Pt.lastIndexOf=function(a,e,t){var n=null==a?0:a.length;if(!n)return-1;var i=n;return void 0!==t&&(i=(i=rs(t))<0?st(n+i,0):lt(i,n-1)),e==e?function(a,e,t){for(var n=t+1;n--;)if(a[n]===e)return n;return n}(a,e,i):ve(a,je,i,!0)},Pt.lowerCase=$s,Pt.lowerFirst=Ds,Pt.lt=es,Pt.lte=ts,Pt.max=function(a){return a&&a.length?rn(a,Ys,yn):void 0},Pt.maxBy=function(a,e){return a&&a.length?rn(a,Ji(e,2),yn):void 0},Pt.mean=function(a){return xe(a,Ys)},Pt.meanBy=function(a,e){return xe(a,Ji(e,2))},Pt.min=function(a){return a&&a.length?rn(a,Ys,En):void 0},Pt.minBy=function(a,e){return a&&a.length?rn(a,Ji(e,2),En):void 0},Pt.stubArray=ol,Pt.stubFalse=sl,Pt.stubObject=function(){return{}},Pt.stubString=function(){return""},Pt.stubTrue=function(){return!0},Pt.multiply=fl,Pt.nth=function(a,e){return a&&a.length?qn(a,rs(e)):void 0},Pt.noConflict=function(){return Ya._===this&&(Ya._=Pa),this},Pt.noop=Xs,Pt.now=zo,Pt.pad=function(a,e,t){a=ds(a);var n=(e=rs(e))?Ke(a):0;if(!e||n>=e)return a;var i=(e-n)/2;return Ri(et(i),t)+a+Ri(at(i),t)},Pt.padEnd=function(a,e,t){a=ds(a);var n=(e=rs(e))?Ke(a):0;return e&&ne){var n=a;a=e,e=n}if(t||a%1||e%1){var i=ut();return lt(a+i*(e-a+Ua("1e-"+((i+"").length-1))),e)}return In(a,e)},Pt.reduce=function(a,e,t){var n=Mo(a)?ye:Ee,i=arguments.length<3;return n(a,Ji(e,4),t,i,en)},Pt.reduceRight=function(a,e,t){var n=Mo(a)?ze:Ee,i=arguments.length<3;return n(a,Ji(e,4),t,i,tn)},Pt.repeat=function(a,e,t){return e=(t?dr(a,e,t):void 0===e)?1:rs(e),Nn(ds(a),e)},Pt.replace=function(){var a=arguments,e=ds(a[0]);return a.length<3?e:e.replace(a[1],a[2])},Pt.result=function(a,e,t){var n=-1,i=(e=di(e,a)).length;for(i||(i=1,a=void 0);++n9007199254740991)return[];var t=4294967295,n=lt(a,4294967295);a-=4294967295;for(var i=Te(n,e=Ji(e));++t=r)return a;var s=t-Ke(n);if(s<1)return n;var l=o?ui(o,0,s).join(""):a.slice(0,s);if(void 0===i)return l+n;if(o&&(s+=l.length-s),Qo(i)){if(a.slice(s).search(i)){var d,c=l;for(i.global||(i=ya(i.source,ds(ia.exec(i))+"g")),i.lastIndex=0;d=i.exec(c);)var u=d.index;l=l.slice(0,void 0===u?s:u)}}else if(a.indexOf(Xn(i),s)!=s){var p=l.lastIndexOf(i);p>-1&&(l=l.slice(0,p))}return l+n},Pt.unescape=function(a){return(a=ds(a))&&N.test(a)?a.replace(D,Qe):a},Pt.uniqueId=function(a){var e=++xa;return ds(a)+e},Pt.upperCase=Fs,Pt.upperFirst=Ls,Pt.each=lo,Pt.eachRight=co,Pt.first=$r,Js(Pt,(pl={},cn(Pt,(function(a,e){ja.call(Pt.prototype,e)||(pl[e]=a)})),pl),{chain:!1}),Pt.VERSION="4.17.21",le(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(a){Pt[a].placeholder=Pt})),le(["drop","take"],(function(a,e){qt.prototype[a]=function(t){t=void 0===t?1:st(rs(t),0);var n=this.__filtered__&&!e?new qt(this):this.clone();return n.__filtered__?n.__takeCount__=lt(t,n.__takeCount__):n.__views__.push({size:lt(t,4294967295),type:a+(n.__dir__<0?"Right":"")}),n},qt.prototype[a+"Right"]=function(e){return this.reverse()[a](e).reverse()}})),le(["filter","map","takeWhile"],(function(a,e){var t=e+1,n=1==t||3==t;qt.prototype[a]=function(a){var e=this.clone();return e.__iteratees__.push({iteratee:Ji(a,3),type:t}),e.__filtered__=e.__filtered__||n,e}})),le(["head","last"],(function(a,e){var t="take"+(e?"Right":"");qt.prototype[a]=function(){return this[t](1).value()[0]}})),le(["initial","tail"],(function(a,e){var t="drop"+(e?"":"Right");qt.prototype[a]=function(){return this.__filtered__?new qt(this):this[t](1)}})),qt.prototype.compact=function(){return this.filter(Ys)},qt.prototype.find=function(a){return this.filter(a).head()},qt.prototype.findLast=function(a){return this.reverse().find(a)},qt.prototype.invokeMap=Fn((function(a,e){return"function"==typeof a?new qt(this):this.map((function(t){return wn(t,a,e)}))})),qt.prototype.reject=function(a){return this.filter(Oo(Ji(a)))},qt.prototype.slice=function(a,e){a=rs(a);var t=this;return t.__filtered__&&(a>0||e<0)?new qt(t):(a<0?t=t.takeRight(-a):a&&(t=t.drop(a)),void 0!==e&&(t=(e=rs(e))<0?t.dropRight(-e):t.take(e-a)),t)},qt.prototype.takeRightWhile=function(a){return this.reverse().takeWhile(a).reverse()},qt.prototype.toArray=function(){return this.take(4294967295)},cn(qt.prototype,(function(a,e){var t=/^(?:filter|find|map|reject)|While$/.test(e),n=/^(?:head|last)$/.test(e),i=Pt[n?"take"+("last"==e?"Right":""):e],r=n||/^find/.test(e);i&&(Pt.prototype[e]=function(){var e=this.__wrapped__,o=n?[1]:arguments,s=e instanceof qt,l=o[0],d=s||Mo(e),c=function(a){var e=i.apply(Pt,ge([a],o));return n&&u?e[0]:e};d&&t&&"function"==typeof l&&1!=l.length&&(s=d=!1);var u=this.__chain__,p=!!this.__actions__.length,f=r&&!u,m=s&&!p;if(!r&&d){e=m?e:new qt(this);var g=a.apply(e,o);return g.__actions__.push({func:no,args:[c],thisArg:void 0}),new Ct(g,u)}return f&&m?a.apply(this,o):(g=this.thru(c),f?n?g.value()[0]:g.value():g)})})),le(["pop","push","shift","sort","splice","unshift"],(function(a){var e=ba[a],t=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",n=/^(?:pop|shift)$/.test(a);Pt.prototype[a]=function(){var a=arguments;if(n&&!this.__chain__){var i=this.value();return e.apply(Mo(i)?i:[],a)}return this[t]((function(t){return e.apply(Mo(t)?t:[],a)}))}})),cn(qt.prototype,(function(a,e){var t=Pt[e];if(t){var n=t.name+"";ja.call(wt,n)||(wt[n]=[]),wt[n].push({name:e,func:t})}})),wt[Ti(void 0,2).name]=[{name:"wrapper",func:void 0}],qt.prototype.clone=function(){var a=new qt(this.__wrapped__);return a.__actions__=bi(this.__actions__),a.__dir__=this.__dir__,a.__filtered__=this.__filtered__,a.__iteratees__=bi(this.__iteratees__),a.__takeCount__=this.__takeCount__,a.__views__=bi(this.__views__),a},qt.prototype.reverse=function(){if(this.__filtered__){var a=new qt(this);a.__dir__=-1,a.__filtered__=!0}else(a=this.clone()).__dir__*=-1;return a},qt.prototype.value=function(){var a=this.__wrapped__.value(),e=this.__dir__,t=Mo(a),n=e<0,i=t?a.length:0,r=function(a,e,t){var n=-1,i=t.length;for(;++n=this.__values__.length;return{done:a,value:a?void 0:this.__values__[this.__index__++]}},Pt.prototype.plant=function(a){for(var e,t=this;t instanceof At;){var n=Pr(t);n.__index__=0,n.__values__=void 0,e?i.__wrapped__=n:e=n;var i=n;t=t.__wrapped__}return i.__wrapped__=a,e},Pt.prototype.reverse=function(){var a=this.__wrapped__;if(a instanceof qt){var e=a;return this.__actions__.length&&(e=new qt(this)),(e=e.reverse()).__actions__.push({func:no,args:[Ur],thisArg:void 0}),new Ct(e,this.__chain__)}return this.thru(Ur)},Pt.prototype.toJSON=Pt.prototype.valueOf=Pt.prototype.value=function(){return ii(this.__wrapped__,this.__actions__)},Pt.prototype.first=Pt.prototype.head,Ja&&(Pt.prototype[Ja]=function(){return this}),Pt}();"object"==r(t(139))&&t(139)?(Ya._=Ze,void 0===(i=function(){return Ze}.call(e,t,e,n))||(n.exports=i)):Qa?((Qa.exports=Ze)._=Ze,Ga._=Ze):Ya._=Ze}).call(this)}).call(this,t(97),t(119)(a))},function(a,e){a.exports=function(a,e){return{enumerable:!(1&a),configurable:!(2&a),writable:!(4&a),value:e}}},function(a,e){var t=0,n=Math.random();a.exports=function(a){return"Symbol(".concat(void 0===a?"":a,")_",(++t+n).toString(36))}},function(a,e){a.exports=!1},function(a,e,t){var n=t(294),i=t(214);a.exports=Object.keys||function(a){return n(a,i)}},function(a,e,t){var n=t(62),i=Math.max,r=Math.min;a.exports=function(a,e){return(a=n(a))<0?i(a+e,0):r(a,e)}},function(a,e,t){var n=t(16),i=t(295),r=t(214),o=t(213)("IE_PROTO"),s=function(){},l=function(){var a,e=t(211)("iframe"),n=r.length;for(e.style.display="none",t(215).appendChild(e),e.src="javascript:",(a=e.contentWindow.document).open(),a.write("'; } + /** + * @return array> + */ public function getStructuredData(): array { $structuredData = []; foreach ($this->getOrderedStructuredDataProviders() as $provider => $configuration) { $cacheIdentifier = $this->getTypoScriptFrontendController()->newHash . '-structured-data-' . $provider; - if ($this->pageCache instanceof FrontendInterface && $data = $this->pageCache->get($cacheIdentifier)) { - if (!empty($data)) { + if ($this->pageCache instanceof FrontendInterface) { + $data = $this->pageCache->get($cacheIdentifier); + if ($data !== false) { $structuredData[$provider] = $data; + continue; } - continue; } $structuredDataProviderObject = $this->getStructuredDataProviderObject($configuration); if ($structuredDataProviderObject === null) { @@ -71,7 +81,7 @@ public function getStructuredData(): array $this->pageCache->set( $cacheIdentifier, $data, - ['pageId_' . $this->getTypoScriptFrontendController()->page['uid']], + ['pageId_' . ($this->getTypoScriptFrontendController()->page['uid'] ?? $this->getTypoScriptFrontendController()->id)], // TODO: Fix this call, protected method since v13 //$this->getTypoScriptFrontendController()->get_cache_timeout() ); @@ -85,6 +95,9 @@ public function getStructuredData(): array return $structuredData; } + /** + * @param array $configuration + */ protected function getStructuredDataProviderObject(array $configuration): StructuredDataProviderInterface|null { if (!class_exists($configuration['provider']) || !is_subclass_of($configuration['provider'], StructuredDataProviderInterface::class)) { @@ -103,6 +116,9 @@ private function getTypoScriptFrontendController(): TypoScriptFrontendController return $GLOBALS['TSFE']; } + /** + * @return array> + */ private function getOrderedStructuredDataProviders(): array { $structuredDataProviders = $this->getStructuredDataProviderConfiguration(); @@ -112,6 +128,9 @@ private function getOrderedStructuredDataProviders(): array ->orderByDependencies($structuredDataProviders); } + /** + * @return array> + */ private function getStructuredDataProviderConfiguration(): array { $typoscriptService = GeneralUtility::makeInstance(TypoScriptService::class); @@ -122,6 +141,10 @@ private function getStructuredDataProviderConfiguration(): array return $config['structuredData']['providers'] ?? []; } + /** + * @param array> $orderInformation + * @return array> + */ protected function setProviderOrder(array $orderInformation): array { foreach ($orderInformation as $provider => &$configuration) { @@ -135,6 +158,10 @@ protected function setProviderOrder(array $orderInformation): array return $orderInformation; } + /** + * @param array $configuration + * @return string[] + */ private function getOrderConfiguration(string $provider, array $configuration, string $key): array { if (is_string($configuration[$key])) { diff --git a/Classes/Traits/BackendUserTrait.php b/Classes/Traits/BackendUserTrait.php new file mode 100644 index 00000000..6c6505a3 --- /dev/null +++ b/Classes/Traits/BackendUserTrait.php @@ -0,0 +1,15 @@ +> + */ public static function getFormEngineNodes(): array { return [ @@ -22,13 +24,15 @@ public static function getFormEngineNodes(): array ]; } + /** + * @return array + */ public static function getDefaultConfiguration(): array { - $llBackendOverview = 'LLL:EXT:yoast_seo/Resources/Private/Language/BackendModuleOverview.xlf'; return [ 'allowedDoktypes' => [ 'page' => 1, - 'backend_section' => 5 + 'backend_section' => 5, ], 'translations' => [ 'availableLocales' => [ @@ -83,7 +87,7 @@ public static function getDefaultConfiguration(): array 'vi', 'zh_CN', 'zh_HK', - 'zh_TW' + 'zh_TW', ], 'languageKeyToLocaleMapping' => [ 'bg' => 'bg_BG', @@ -102,46 +106,20 @@ public static function getDefaultConfiguration(): array 'ru' => 'ru_RU', 'sk' => 'sk_SK', 'sv' => 'sv_SE', - 'tr' => 'tr_TR' - ] + 'tr' => 'tr_TR', + ], ], 'previewSettings' => [ 'basicAuth' => [ 'username' => '', 'password' => '', - ] - ], - 'overview_filters' => [ - '10' => [ - 'key' => 'cornerstone', - 'label' => $llBackendOverview . ':cornerstoneContent', - 'description' => $llBackendOverview . ':cornerstoneContent.description', - 'link' => 'https://yoa.st/typo3-cornerstone-content', - 'dataProvider' => DataProviders\CornerstoneOverviewDataProvider::class . '->process', - 'countProvider' => DataProviders\CornerstoneOverviewDataProvider::class . '->numberOfItems' ], - '20' => [ - 'key' => 'withoutDescription', - 'label' => $llBackendOverview . ':withoutDescription', - 'description' => $llBackendOverview . ':withoutDescription.description', - 'link' => 'https://yoa.st/typo3-meta-description', - 'dataProvider' => DataProviders\PagesWithoutDescriptionOverviewDataProvider::class . '->process', - 'countProvider' => DataProviders\PagesWithoutDescriptionOverviewDataProvider::class . '->numberOfItems' - ], - '30' => [ - 'key' => 'orphaned', - 'label' => $llBackendOverview . ':orphanedContent', - 'description' => $llBackendOverview . ':orphanedContent.description', - 'link' => 'https://yoa.st/1ja', - 'dataProvider' => DataProviders\OrphanedContentDataProvider::class . '->process', - 'countProvider' => DataProviders\OrphanedContentDataProvider::class . '->numberOfItems' - ] ], 'recordMetaTags' => [ 'description' => Generator\DescriptionGenerator::class, 'opengraph' => Generator\OpenGraphGenerator::class, - 'twitter' => Generator\TwitterGenerator::class - ] + 'twitter' => Generator\TwitterGenerator::class, + ], ]; } } diff --git a/Classes/Utility/JsonConfigUtility.php b/Classes/Utility/JsonConfigUtility.php index 5dbd1097..861338f7 100644 --- a/Classes/Utility/JsonConfigUtility.php +++ b/Classes/Utility/JsonConfigUtility.php @@ -9,8 +9,12 @@ class JsonConfigUtility implements SingletonInterface { + /** @var array */ protected array $config = []; + /** + * @param array $config + */ public function addConfig(array $config): void { ArrayUtility::mergeRecursiveWithOverrule($this->config, $config, true, false); diff --git a/Classes/Utility/PageAccessUtility.php b/Classes/Utility/PageAccessUtility.php index e77fa07f..3841fa91 100644 --- a/Classes/Utility/PageAccessUtility.php +++ b/Classes/Utility/PageAccessUtility.php @@ -14,8 +14,12 @@ class PageAccessUtility { + /** @var int[] */ protected static array $cache = []; + /** + * @return int[] + */ public static function getPageIds(int $pid): array { if (self::$cache !== []) { @@ -33,12 +37,6 @@ public static function getPageIds(int $pid): array /** * Copied from EXT:core, removed in v12 - * - * @param int $id - * @param int $depth - * @param int $begin - * @param string $permClause - * @return string */ protected static function getTreeList(int $id, int $depth, int $begin = 0, string $permClause = ''): string { diff --git a/Classes/Utility/YoastRequestHash.php b/Classes/Utility/YoastRequestHash.php index 294c6748..486d7544 100644 --- a/Classes/Utility/YoastRequestHash.php +++ b/Classes/Utility/YoastRequestHash.php @@ -8,6 +8,9 @@ class YoastRequestHash { + /** + * @param array $serverParams + */ public static function isValid(array $serverParams): bool { return isset($serverParams['HTTP_X_YOAST_PAGE_REQUEST']) diff --git a/Classes/Utility/YoastUtility.php b/Classes/Utility/YoastUtility.php index bb4377db..97a7edae 100644 --- a/Classes/Utility/YoastUtility.php +++ b/Classes/Utility/YoastUtility.php @@ -15,7 +15,11 @@ class YoastUtility { protected const COLUMN_NAME_FOCUSKEYWORD = 'tx_yoastseo_focuskeyword'; - public static function getAllowedDoktypes(?array $configuration = null, bool $returnInString = false) + /** + * @param array|null $configuration + * @return int[] + */ + public static function getAllowedDoktypes(?array $configuration = null): array { $allowedDoktypes = array_map(function ($doktype) { return (int)$doktype; @@ -31,16 +35,22 @@ public static function getAllowedDoktypes(?array $configuration = null, bool $re } } - $allowedDoktypes = $allowedDoktypes ?: [1]; - - if ($returnInString) { - return implode(',', $allowedDoktypes); - } + return $allowedDoktypes ?: [1]; + } - return $allowedDoktypes; + /** + * @param array|null $configuration + */ + public static function getAllowedDoktypesList(?array $configuration = null): string + { + return implode(',', self::getAllowedDoktypes($configuration)); } - public static function snippetPreviewEnabled(int $pageId, array $pageRecord, $pageTs = null): bool + /** + * @param array $pageRecord + * @param array $pageTs + */ + public static function snippetPreviewEnabled(int $pageId, array $pageRecord, ?array $pageTs = null): bool { if (!$GLOBALS['BE_USER'] instanceof BackendUserAuthentication || !$GLOBALS['BE_USER']->check('non_exclude_fields', 'pages:tx_yoastseo_snippetpreview')) { @@ -78,6 +88,9 @@ public static function getFocusKeywordOfRecord(int $uid, string $table = 'pages' return $focusKeyword; } + /** + * @return array + */ public static function getRelatedKeyphrases(string $parentTable, int $parentId): array { $config = []; @@ -109,10 +122,10 @@ public static function getRelatedKeyphrases(string $parentTable, int $parentId): * * You can set development by using TypoScript "module.tx_yoastseo.settings.developmentMode = 1" * - * @param array|null $configuration + * @param array|null $configuration * @return bool */ - public static function inProductionMode(array $configuration = null): bool + public static function inProductionMode(?array $configuration = null): bool { if ($configuration === null) { $configuration = self::getTypoScriptConfiguration(); @@ -121,6 +134,9 @@ public static function inProductionMode(array $configuration = null): bool return !((int)($_ENV['YOAST_DEVELOPMENT_MODE'] ?? 0) === 1 || (int)($configuration['developmentMode'] ?? 0) === 1); } + /** + * @return array + */ protected static function getTypoScriptConfiguration(): array { $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); diff --git a/Classes/ViewHelpers/CrawlerProgressViewHelper.php b/Classes/ViewHelpers/CrawlerProgressViewHelper.php index 7ff3c14e..22aae60d 100644 --- a/Classes/ViewHelpers/CrawlerProgressViewHelper.php +++ b/Classes/ViewHelpers/CrawlerProgressViewHelper.php @@ -19,6 +19,9 @@ public function initializeArguments(): void $this->registerArgument('language', 'integer', 'Language id', true); } + /** + * @return array{percentage: int|float, offset: int, total: int}|null + */ public function render(): ?array { $progressInformation = $this->crawlerService->getProgressInformation( diff --git a/Classes/ViewHelpers/ModuleLayout/MetaInformationViewHelper.php b/Classes/ViewHelpers/ModuleLayout/MetaInformationViewHelper.php index 45ccd777..6bb67bd0 100644 --- a/Classes/ViewHelpers/ModuleLayout/MetaInformationViewHelper.php +++ b/Classes/ViewHelpers/ModuleLayout/MetaInformationViewHelper.php @@ -14,16 +14,19 @@ class MetaInformationViewHelper extends AbstractViewHelper { use CompileWithRenderStatic; - public function initializeArguments() + public function initializeArguments(): void { $this->registerArgument('pageInformation', 'array', 'Page information', true); } + /** + * @param array $arguments + */ public static function renderStatic( array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext - ) { + ): void { $viewHelperVariableContainer = $renderingContext->getViewHelperVariableContainer(); /** @var \TYPO3\CMS\Backend\Template\ModuleTemplate $moduleTemplate */ diff --git a/Classes/ViewHelpers/RecordIconViewHelper.php b/Classes/ViewHelpers/RecordIconViewHelper.php index 13d7e242..80d00db7 100644 --- a/Classes/ViewHelpers/RecordIconViewHelper.php +++ b/Classes/ViewHelpers/RecordIconViewHelper.php @@ -21,6 +21,9 @@ public function initializeArguments(): void $this->registerArgument('size', 'string', '', false, Icon::SIZE_DEFAULT); } + /** + * @param array $arguments + */ public static function renderStatic( array $arguments, \Closure $renderChildrenClosure, diff --git a/Classes/ViewHelpers/RecordLinksViewHelper.php b/Classes/ViewHelpers/RecordLinksViewHelper.php index dd5e1d25..7ee676b5 100644 --- a/Classes/ViewHelpers/RecordLinksViewHelper.php +++ b/Classes/ViewHelpers/RecordLinksViewHelper.php @@ -19,6 +19,9 @@ public function initializeArguments(): void $this->registerArgument('module', 'string', '', true, ''); } + /** + * @param array $arguments + */ public static function renderStatic( array $arguments, \Closure $renderChildrenClosure, diff --git a/Classes/Widgets/AbstractPageOverviewWidget.php b/Classes/Widgets/AbstractPageOverviewWidget.php index bc7449e1..f7fed3e9 100644 --- a/Classes/Widgets/AbstractPageOverviewWidget.php +++ b/Classes/Widgets/AbstractPageOverviewWidget.php @@ -6,6 +6,7 @@ use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Backend\View\BackendViewFactory; +use TYPO3\CMS\Core\View\ViewInterface; use TYPO3\CMS\Dashboard\Widgets\RequestAwareWidgetInterface; use TYPO3\CMS\Dashboard\Widgets\WidgetConfigurationInterface; use TYPO3\CMS\Dashboard\Widgets\WidgetInterface; @@ -15,9 +16,13 @@ if (interface_exists(RequestAwareWidgetInterface::class)) { abstract class AbstractPageOverviewWidget implements WidgetInterface, RequestAwareWidgetInterface { - protected ?ServerRequestInterface $request = null; + protected ServerRequestInterface $request; + /** @var array|string[] */ protected array $options; + /** + * @param array|string[] $options + */ public function __construct( protected WidgetConfigurationInterface $configuration, protected PageProviderInterface $dataProvider, @@ -44,13 +49,17 @@ public function renderWidgetContent(): string return $view->render($this->options['template']); } - abstract protected function assignToView($view): void; + abstract protected function assignToView(ViewInterface|StandaloneView $view): void; } } else { abstract class AbstractPageOverviewWidget implements WidgetInterface { + /** @var array|string[] */ protected array $options; + /** + * @param array|string[] $options + */ public function __construct( protected WidgetConfigurationInterface $configuration, protected PageProviderInterface $dataProvider, @@ -72,6 +81,6 @@ public function renderWidgetContent(): string return $this->view->render(); } - abstract protected function assignToView($view): void; + abstract protected function assignToView(ViewInterface|StandaloneView $view): void; } } diff --git a/Classes/Widgets/PageOverviewWidget.php b/Classes/Widgets/PageOverviewWidget.php index 625a53eb..9fafabaa 100644 --- a/Classes/Widgets/PageOverviewWidget.php +++ b/Classes/Widgets/PageOverviewWidget.php @@ -4,16 +4,23 @@ namespace YoastSeoForTypo3\YoastSeo\Widgets; -use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; +use TYPO3\CMS\Core\View\ViewInterface; +use TYPO3\CMS\Fluid\View\StandaloneView; +use YoastSeoForTypo3\YoastSeo\Traits\BackendUserTrait; class PageOverviewWidget extends AbstractPageOverviewWidget { + use BackendUserTrait; + + /** + * @return array|string[] + */ public function getOptions(): array { return []; } - protected function assignToView($view): void + protected function assignToView(ViewInterface|StandaloneView $view): void { $view->assignMultiple([ 'pages' => $this->dataProvider->getPages(), @@ -24,9 +31,4 @@ protected function assignToView($view): void 'timeFormat' => $GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'], ]); } - - protected function getBackendUser(): BackendUserAuthentication - { - return $GLOBALS['BE_USER']; - } } diff --git a/Classes/Widgets/Provider/OrphanedContentDataProvider.php b/Classes/Widgets/Provider/OrphanedContentDataProvider.php index 0fc8fea0..a0e95ae2 100644 --- a/Classes/Widgets/Provider/OrphanedContentDataProvider.php +++ b/Classes/Widgets/Provider/OrphanedContentDataProvider.php @@ -4,23 +4,27 @@ namespace YoastSeoForTypo3\YoastSeo\Widgets\Provider; -use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Type\Bitmask\Permission; use TYPO3\CMS\Core\Utility\GeneralUtility; +use YoastSeoForTypo3\YoastSeo\Traits\BackendUserTrait; class OrphanedContentDataProvider implements PageProviderInterface { - private array $excludedDoktypes; - private int $limit; + use BackendUserTrait; - public function __construct(array $excludedDoktypes, int $limit) - { - $this->excludedDoktypes = $excludedDoktypes; + public function __construct( + /** @var int[] */ + private array $excludedDoktypes, + private int $limit + ) { $this->limit = $limit ?: 5; } + /** + * @return array> + */ public function getPages(): array { $qb = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_refindex'); @@ -88,9 +92,4 @@ public function getPages(): array return $items; } - - protected function getBackendUser(): BackendUserAuthentication - { - return $GLOBALS['BE_USER']; - } } diff --git a/Classes/Widgets/Provider/PageProviderInterface.php b/Classes/Widgets/Provider/PageProviderInterface.php index 70788fc3..6469d1d0 100644 --- a/Classes/Widgets/Provider/PageProviderInterface.php +++ b/Classes/Widgets/Provider/PageProviderInterface.php @@ -6,5 +6,8 @@ interface PageProviderInterface { + /** + * @return array> + */ public function getPages(): array; } diff --git a/Classes/Widgets/Provider/PagesWithoutDescriptionDataProvider.php b/Classes/Widgets/Provider/PagesWithoutDescriptionDataProvider.php index 19d404a3..24dfc07e 100644 --- a/Classes/Widgets/Provider/PagesWithoutDescriptionDataProvider.php +++ b/Classes/Widgets/Provider/PagesWithoutDescriptionDataProvider.php @@ -8,21 +8,26 @@ use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Type\Bitmask\Permission; use TYPO3\CMS\Core\Utility\GeneralUtility; +use YoastSeoForTypo3\YoastSeo\Traits\BackendUserTrait; /** * @deprecated Will be removed once TYPO3 v11 support is dropped */ class PagesWithoutDescriptionDataProvider implements PageProviderInterface { - private array $excludedDoktypes; - private int $limit; + use BackendUserTrait; - public function __construct(array $excludedDoktypes, int $limit) - { - $this->excludedDoktypes = $excludedDoktypes; + public function __construct( + /** @var int[] */ + private array $excludedDoktypes, + private int $limit + ) { $this->limit = $limit ?: 5; } + /** + * @return array> + */ public function getPages(): array { $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); @@ -67,9 +72,4 @@ public function getPages(): array } return $items; } - - protected function getBackendUser(): BackendUserAuthentication - { - return $GLOBALS['BE_USER']; - } } diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml index c71de403..3471e743 100644 --- a/Configuration/Services.yaml +++ b/Configuration/Services.yaml @@ -19,6 +19,13 @@ services: YoastSeoForTypo3\YoastSeo\Controller\AjaxController: public: true + YoastSeoForTypo3\YoastSeo\Controller\OverviewController: + arguments: + $filters: + cornerstore: '@YoastSeoForTypo3\YoastSeo\DataProviders\CornerstoneOverviewDataProvider' + withoutDescription: '@YoastSeoForTypo3\YoastSeo\DataProviders\PagesWithoutDescriptionOverviewDataProvider' + orphaned: '@YoastSeoForTypo3\YoastSeo\DataProviders\OrphanedContentDataProvider' + YoastSeoForTypo3\YoastSeo\Service\CrawlerService: public: true arguments: @@ -57,12 +64,13 @@ services: method: 'setCanonical' YoastSeoForTypo3\YoastSeo\PageTitle\RecordPageTitleProvider: - arguments: - - '@YoastSeoForTypo3\YoastSeo\Record\RecordService' + public: true YoastSeoForTypo3\YoastSeo\MetaTag\RecordMetaTagGenerator: - arguments: - - '@YoastSeoForTypo3\YoastSeo\Record\RecordService' + public: true + + YoastSeoForTypo3\YoastSeo\MetaTag\AdvancedRobotsGenerator: + public: true YoastSeoForTypo3\YoastSeo\Backend\ModifyPageLayoutContentListener: tags: diff --git a/Configuration/TCA/Overrides/pages.php b/Configuration/TCA/Overrides/pages.php index 4db397cc..1815a2d2 100644 --- a/Configuration/TCA/Overrides/pages.php +++ b/Configuration/TCA/Overrides/pages.php @@ -7,7 +7,7 @@ GeneralUtility::makeInstance(TcaService::class) ->addYoastFields( 'pages', - YoastUtility::getAllowedDoktypes(null, true) + YoastUtility::getAllowedDoktypesList() ); // Remove description from metatags tab diff --git a/Resources/Private/Partials/Overview/View.html b/Resources/Private/Partials/Overview/View.html index 2c64daa2..4bd6fbf0 100644 --- a/Resources/Private/Partials/Overview/View.html +++ b/Resources/Private/Partials/Overview/View.html @@ -13,11 +13,11 @@
-

- {subtitle}

+

-

- - ({filter.numberOfItems}) + + ({filter.numberOfItems})
@@ -27,9 +27,9 @@

- - -

+ + +

From 80ff266db09cef5c0b76c01fa88491b57987353a Mon Sep 17 00:00:00 2001 From: Riny van Tiggelen Date: Thu, 26 Sep 2024 09:25:53 +0200 Subject: [PATCH 3/4] [BUGFIX] Fixed the ModuleTemplate template paths for all backend modules, added condition for tx_yoastseo_related_focuskeyword to not include auto generated columns in 13 --- CHANGELOG.md | 4 +++ .../Controller/AbstractBackendController.php | 4 +-- Classes/Controller/CrawlerController.php | 2 +- Classes/Controller/DashboardController.php | 2 +- Classes/Controller/OverviewController.php | 4 +-- .../TCA/tx_yoastseo_related_focuskeyword.php | 35 +++++++++++++------ Configuration/page.tsconfig | 3 ++ .../Private/Templates/Dashboard/Legacy.html | 10 ------ .../Private/Templates/Overview/Legacy.html | 24 ------------- .../Widget/OrphanedContentWidget.html | 2 +- .../PageWithoutMetaDescriptionWidget.html | 2 +- 11 files changed, 39 insertions(+), 53 deletions(-) create mode 100644 Configuration/page.tsconfig delete mode 100644 Resources/Private/Templates/Dashboard/Legacy.html delete mode 100644 Resources/Private/Templates/Overview/Legacy.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 7747dbe1..100212f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ We will follow [Semantic Versioning](http://semver.org/). - Dropped support for PHP 7 - Removed `DbalService` which was used to support older `doctrine/dbal` versions for TYPO3 10 - Removed `ArrayPaginator` which was used to support TYPO3 10 +- Changed the structure of the overview filters for the `Overview` backend module + - Instead of registering it in the `EXTCONF` the filters are now registered through the `Services.yaml` + - Extra methods have been added to the `OverviewDataProviderInterface` as a replacement of the array configuration + - DataProviders are now initialized with a new `DataProviderRequest` DTO object ### Added - Support for TYPO3 13 diff --git a/Classes/Controller/AbstractBackendController.php b/Classes/Controller/AbstractBackendController.php index 2d2dfd62..9799f72b 100644 --- a/Classes/Controller/AbstractBackendController.php +++ b/Classes/Controller/AbstractBackendController.php @@ -22,7 +22,7 @@ abstract class AbstractBackendController extends ActionController /** * @param array $data */ - protected function returnResponse(array $data = [], ModuleTemplate $moduleTemplate = null): ResponseInterface + protected function returnResponse(string $template, array $data = [], ModuleTemplate $moduleTemplate = null): ResponseInterface { $data['layout'] = GeneralUtility::makeInstance(Typo3Version::class) ->getMajorVersion() < 13 ? 'Default' : 'Module'; @@ -39,7 +39,7 @@ protected function returnResponse(array $data = [], ModuleTemplate $moduleTempla $moduleTemplate->getDocHeaderComponent()->setMetaInformation($this->getPageInformation()); $moduleTemplate->assignMultiple($data); - return $moduleTemplate->renderResponse(); + return $moduleTemplate->renderResponse($template); } protected function getModuleTemplate(): ModuleTemplate diff --git a/Classes/Controller/CrawlerController.php b/Classes/Controller/CrawlerController.php index 4016e0ff..47afcff2 100644 --- a/Classes/Controller/CrawlerController.php +++ b/Classes/Controller/CrawlerController.php @@ -23,7 +23,7 @@ public function __construct( public function indexAction(): ResponseInterface { $this->addYoastJavascriptConfig(); - return $this->returnResponse(['sites' => $this->siteFinder->getAllSites()]); + return $this->returnResponse('Crawler/Index', ['sites' => $this->siteFinder->getAllSites()]); } public function resetProgressAction(int $site, int $language):? ResponseInterface diff --git a/Classes/Controller/DashboardController.php b/Classes/Controller/DashboardController.php index c1b3b732..535a9b09 100644 --- a/Classes/Controller/DashboardController.php +++ b/Classes/Controller/DashboardController.php @@ -10,6 +10,6 @@ class DashboardController extends AbstractBackendController { public function indexAction(): ResponseInterface { - return $this->returnResponse(); + return $this->returnResponse('Dashboard/Index'); } } diff --git a/Classes/Controller/OverviewController.php b/Classes/Controller/OverviewController.php index 035e6c11..62ef6239 100644 --- a/Classes/Controller/OverviewController.php +++ b/Classes/Controller/OverviewController.php @@ -34,7 +34,7 @@ public function listAction(int $currentPage = 1): ResponseInterface $overviewData = $this->getOverviewData($currentPage) + ['action' => 'list']; $moduleTemplate = $this->getModuleTemplate(); if (!isset($overviewData['pageInformation'])) { - return $this->returnResponse($overviewData, $moduleTemplate); + return $this->returnResponse('Overview/List', $overviewData, $moduleTemplate); } $moduleTemplate->getDocHeaderComponent()->setMetaInformation($overviewData['pageInformation']); @@ -47,7 +47,7 @@ public function listAction(int $currentPage = 1): ResponseInterface $moduleTemplate->getDocHeaderComponent()->getMenuRegistry()->addMenu($languageMenu); } - return $this->returnResponse($overviewData, $moduleTemplate); + return $this->returnResponse('Overview/List', $overviewData, $moduleTemplate); } /** diff --git a/Configuration/TCA/tx_yoastseo_related_focuskeyword.php b/Configuration/TCA/tx_yoastseo_related_focuskeyword.php index 4b2da38a..00f0b264 100644 --- a/Configuration/TCA/tx_yoastseo_related_focuskeyword.php +++ b/Configuration/TCA/tx_yoastseo_related_focuskeyword.php @@ -1,8 +1,11 @@ [ 'title' => $llPrefix . 'tx_yoastseo_related_focuskeyword.title', 'label' => 'keyword', @@ -25,16 +28,6 @@ ], ], 'columns' => [ - 'sys_language_uid' => $GLOBALS['TCA']['tt_content']['columns']['sys_language_uid'], - 'l10n_parent' => array_replace_recursive($GLOBALS['TCA']['tt_content']['columns']['l18n_parent'], [ - 'config' => [ - 'foreign_table' => 'tx_yoastseo_related_focuskeyword', - 'foreign_table_where' => 'AND tx_yoastseo_related_focuskeyword.pid=###CURRENT_PID### AND tx_yoastseo_related_focuskeyword.sys_language_uid IN (-1,0)', - ] - ]), - 'l10n_source' => $GLOBALS['TCA']['tt_content']['columns']['l10n_source'], - 'l10n_diffsource' => $GLOBALS['TCA']['tt_content']['columns']['l18n_diffsource'], - 'hidden' => $GLOBALS['TCA']['tt_content']['columns']['hidden'], 'keyword' => [ 'exclude' => 1, 'l10n_mode' => 'prefixLangTitle', @@ -92,3 +85,23 @@ ] ], ]; + +if (GeneralUtility::makeInstance(Typo3Version::class)->getMajorVersion() < 13) { + $focusKeywordTca['columns'] = array_merge( + $focusKeywordTca['columns'], + [ + 'sys_language_uid' => $GLOBALS['TCA']['tt_content']['columns']['sys_language_uid'], + 'l10n_parent' => array_replace_recursive($GLOBALS['TCA']['tt_content']['columns']['l18n_parent'], [ + 'config' => [ + 'foreign_table' => 'tx_yoastseo_related_focuskeyword', + 'foreign_table_where' => 'AND tx_yoastseo_related_focuskeyword.pid=###CURRENT_PID### AND tx_yoastseo_related_focuskeyword.sys_language_uid IN (-1,0)', + ] + ]), + 'l10n_source' => $GLOBALS['TCA']['tt_content']['columns']['l10n_source'], + 'l10n_diffsource' => $GLOBALS['TCA']['tt_content']['columns']['l18n_diffsource'], + 'hidden' => $GLOBALS['TCA']['tt_content']['columns']['hidden'], + ] + ); +} + +return $focusKeywordTca; diff --git a/Configuration/page.tsconfig b/Configuration/page.tsconfig new file mode 100644 index 00000000..15795645 --- /dev/null +++ b/Configuration/page.tsconfig @@ -0,0 +1,3 @@ +templates.yoast-seo-for-typo3/yoast_seo { + 10 = yoast-seo-for-typo3/yoast_seo:Resources/Private +} diff --git a/Resources/Private/Templates/Dashboard/Legacy.html b/Resources/Private/Templates/Dashboard/Legacy.html deleted file mode 100644 index ceb644c5..00000000 --- a/Resources/Private/Templates/Dashboard/Legacy.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/Resources/Private/Templates/Overview/Legacy.html b/Resources/Private/Templates/Overview/Legacy.html deleted file mode 100644 index 5a20495e..00000000 --- a/Resources/Private/Templates/Overview/Legacy.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Resources/Private/Templates/Widget/OrphanedContentWidget.html b/Resources/Private/Templates/Widget/OrphanedContentWidget.html index d72a07a5..c49bd742 100644 --- a/Resources/Private/Templates/Widget/OrphanedContentWidget.html +++ b/Resources/Private/Templates/Widget/OrphanedContentWidget.html @@ -7,7 +7,7 @@
- +
diff --git a/Resources/Private/Templates/Widget/PageWithoutMetaDescriptionWidget.html b/Resources/Private/Templates/Widget/PageWithoutMetaDescriptionWidget.html index d72a07a5..c49bd742 100644 --- a/Resources/Private/Templates/Widget/PageWithoutMetaDescriptionWidget.html +++ b/Resources/Private/Templates/Widget/PageWithoutMetaDescriptionWidget.html @@ -7,7 +7,7 @@
-
+
From 9f509db7cd16dafcf391ac666f60f8444a539726 Mon Sep 17 00:00:00 2001 From: Riny van Tiggelen Date: Tue, 15 Oct 2024 19:00:07 +0200 Subject: [PATCH 4/4] [BUGFIX] Fixed heading and styling issues with v13 dark mode --- Resources/Private/Partials/Overview/View.html | 2 +- Resources/Public/CSS/yoast-seo-backend.min.css | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Resources/Private/Partials/Overview/View.html b/Resources/Private/Partials/Overview/View.html index 4bd6fbf0..1dcda38f 100644 --- a/Resources/Private/Partials/Overview/View.html +++ b/Resources/Private/Partials/Overview/View.html @@ -13,7 +13,7 @@
-

-

+

-

diff --git a/Resources/Public/CSS/yoast-seo-backend.min.css b/Resources/Public/CSS/yoast-seo-backend.min.css index c2092241..115efc4e 100644 --- a/Resources/Public/CSS/yoast-seo-backend.min.css +++ b/Resources/Public/CSS/yoast-seo-backend.min.css @@ -79,10 +79,8 @@ li.score:after { width: 33px; min-height: 1px; } -.yoast h1 { +.yoast h1 span { color: #a4286a; } - .yoast h1 span { - color: #000; } .yoast-list--usp { padding: 0; @@ -258,7 +256,6 @@ li.score:after { .yoast { line-height: 1.6; - color: #000; letter-spacing: 0.01em; } .yoast .callout-body a { font-weight: bold; } @@ -280,6 +277,7 @@ li.score:after { position: relative; margin-bottom: 20px; } .yoast-seo-academy__item p { + color: #000; position: absolute; right: 0; bottom: 0;